From 32c522e84fc9a9f20d972342e66e1d78ed0c3063 Mon Sep 17 00:00:00 2001
From: BB <boqi.ren@tu-dresden.de>
Date: Mon, 20 May 2019 12:05:35 +0200
Subject: [PATCH] implement interfaces

---
 .../model/InternalMachineLearningHandler.java |    4 +-
 eraser.iml                                    |    8 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../out/production/resources/log4j2.xml       |   26 +
 .../out/production/resources/preference.eg    |   24 +
 .../production/resources/skywriter-hue.eraser |   44 +
 .../out/production/resources/starter.eraser   |   28 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../out/production/resources/1.eg             |   24 +
 .../out/production/resources/NN_1             |   24 +
 .../out/production/resources/initial_data.csv |  418 +
 .../out/production/resources/log4j2.xml       |   22 +
 ...oderImpl.java => MachineLearningImpl.java} |   10 +-
 .../feedbackloop.learner_backup/Main.java     |    8 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../production/resources/skywriter-hue.eraser |   44 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../production/resources/openhab2-data.json   | 1297 +++
 learner_test/.gitignore                       |    1 +
 learner_test/build.gradle                     |   35 +
 .../out/production/resources/log4j2.xml       |   22 +
 .../inf/st/eraser/learner_test/Main.java      |  112 +
 .../inf/st/eraser/learner_test/final_data.csv |  418 +
 .../inf/st/eraser/learner_test/save_model.eg  |   24 +
 .../st/eraser/learner_test/save_model_test.eg |   24 +
 learner_test/src/main/resources/log4j2.xml    |   22 +
 .../inf/st/eraser/learner_test/ATest.java     |   18 +
 ml_test/out/production/resources/log4j2.xml   |   22 +
 ml_test_boqi/.gitignore                       |    1 +
 ml_test_boqi/build.gradle                     |   33 +
 .../inf/st/eraser/ml_test_boqi/Main.java      |  219 +
 ml_test_boqi/src/main/resources/log4j2.xml    |   22 +
 .../inf/st/eraser/ml_test_boqi/ATest.java     |   22 +
 .../out/production/resources/data1.csv        |    3 +
 .../out/production/resources/log4j2.xml       |   25 +
 .../out/production/resources/readme.txt       |    1 +
 .../out/production/resources/readme.txt       |    1 +
 .../out/production/resources/log4j2.xml       |   25 +
 .../production/resources/skywriter-hue.eraser |   44 +
 .../production/resources/smart_arrive.eraser  |   44 +
 .../src/main/resources/smart_arrive.eraser    |   44 +
 smart_ankunft_integration/.gitignore          |    1 +
 smart_ankunft_integration/build.gradle        |   39 +
 .../smart_ankunft_integration/Main.java       |  161 +
 .../src/main/resources/log4j2.xml             |   22 +
 .../src/main/resources/smart_ankunft.eraser   |   49 +
 .../smart_ankunft_integration/ATest.java      |   22 +
 .../out/production/resources/log4j2.xml       |   22 +
 venv/.Python                                  |    1 +
 venv/bin/activate                             |   78 +
 venv/bin/activate.csh                         |   36 +
 venv/bin/activate.fish                        |   76 +
 venv/bin/activate_this.py                     |   34 +
 venv/bin/easy_install                         |   11 +
 venv/bin/easy_install-2.7                     |   11 +
 venv/bin/pip                                  |   11 +
 venv/bin/pip2                                 |   11 +
 venv/bin/pip2.7                               |   11 +
 venv/bin/python                               |    1 +
 venv/bin/python-config                        |   78 +
 venv/bin/python2                              |    1 +
 venv/bin/python2.7                            |  Bin 0 -> 12568 bytes
 venv/bin/wheel                                |   11 +
 venv/include/python2.7                        |    1 +
 venv/lib/python2.7/UserDict.py                |    1 +
 venv/lib/python2.7/UserDict.pyc               |  Bin 0 -> 10791 bytes
 venv/lib/python2.7/_abcoll.py                 |    1 +
 venv/lib/python2.7/_abcoll.pyc                |  Bin 0 -> 28178 bytes
 venv/lib/python2.7/_weakrefset.py             |    1 +
 venv/lib/python2.7/_weakrefset.pyc            |  Bin 0 -> 10830 bytes
 venv/lib/python2.7/abc.py                     |    1 +
 venv/lib/python2.7/abc.pyc                    |  Bin 0 -> 6407 bytes
 venv/lib/python2.7/codecs.py                  |    1 +
 venv/lib/python2.7/codecs.pyc                 |  Bin 0 -> 38422 bytes
 venv/lib/python2.7/config                     |    1 +
 venv/lib/python2.7/copy_reg.py                |    1 +
 venv/lib/python2.7/copy_reg.pyc               |  Bin 0 -> 5431 bytes
 venv/lib/python2.7/distutils/__init__.py      |  101 +
 venv/lib/python2.7/distutils/distutils.cfg    |    6 +
 venv/lib/python2.7/encodings                  |    1 +
 venv/lib/python2.7/fnmatch.py                 |    1 +
 venv/lib/python2.7/genericpath.py             |    1 +
 venv/lib/python2.7/genericpath.pyc            |  Bin 0 -> 3781 bytes
 venv/lib/python2.7/lib-dynload                |    1 +
 venv/lib/python2.7/linecache.py               |    1 +
 venv/lib/python2.7/linecache.pyc              |  Bin 0 -> 3416 bytes
 venv/lib/python2.7/locale.py                  |    1 +
 .../lib/python2.7/no-global-site-packages.txt |    0
 venv/lib/python2.7/ntpath.py                  |    1 +
 venv/lib/python2.7/orig-prefix.txt            |    1 +
 venv/lib/python2.7/os.py                      |    1 +
 venv/lib/python2.7/os.pyc                     |  Bin 0 -> 26961 bytes
 venv/lib/python2.7/posixpath.py               |    1 +
 venv/lib/python2.7/posixpath.pyc              |  Bin 0 -> 11983 bytes
 venv/lib/python2.7/re.py                      |    1 +
 .../python2.7/site-packages/easy_install.py   |    5 +
 .../python2.7/site-packages/easy_install.pyc  |  Bin 0 -> 369 bytes
 .../pip-19.1.1.dist-info/INSTALLER            |    1 +
 .../pip-19.1.1.dist-info/LICENSE.txt          |   20 +
 .../pip-19.1.1.dist-info/METADATA             |   75 +
 .../site-packages/pip-19.1.1.dist-info/RECORD |  618 ++
 .../site-packages/pip-19.1.1.dist-info/WHEEL  |    6 +
 .../pip-19.1.1.dist-info/entry_points.txt     |    5 +
 .../pip-19.1.1.dist-info/top_level.txt        |    1 +
 .../python2.7/site-packages/pip/__init__.py   |    1 +
 .../python2.7/site-packages/pip/__init__.pyc  |  Bin 0 -> 215 bytes
 .../python2.7/site-packages/pip/__main__.py   |   19 +
 .../python2.7/site-packages/pip/__main__.pyc  |  Bin 0 -> 562 bytes
 .../site-packages/pip/_internal/__init__.py   |   78 +
 .../site-packages/pip/_internal/__init__.pyc  |  Bin 0 -> 2298 bytes
 .../site-packages/pip/_internal/build_env.py  |  215 +
 .../site-packages/pip/_internal/build_env.pyc |  Bin 0 -> 10038 bytes
 .../site-packages/pip/_internal/cache.py      |  224 +
 .../site-packages/pip/_internal/cache.pyc     |  Bin 0 -> 9463 bytes
 .../pip/_internal/cli/__init__.py             |    4 +
 .../pip/_internal/cli/__init__.pyc            |  Bin 0 -> 290 bytes
 .../pip/_internal/cli/autocompletion.py       |  152 +
 .../pip/_internal/cli/autocompletion.pyc      |  Bin 0 -> 5888 bytes
 .../pip/_internal/cli/base_command.py         |  340 +
 .../pip/_internal/cli/base_command.pyc        |  Bin 0 -> 10137 bytes
 .../pip/_internal/cli/cmdoptions.py           |  809 ++
 .../pip/_internal/cli/cmdoptions.pyc          |  Bin 0 -> 21201 bytes
 .../pip/_internal/cli/main_parser.py          |  104 +
 .../pip/_internal/cli/main_parser.pyc         |  Bin 0 -> 2974 bytes
 .../site-packages/pip/_internal/cli/parser.py |  261 +
 .../pip/_internal/cli/parser.pyc              |  Bin 0 -> 11512 bytes
 .../pip/_internal/cli/status_codes.py         |    8 +
 .../pip/_internal/cli/status_codes.pyc        |  Bin 0 -> 454 bytes
 .../pip/_internal/commands/__init__.py        |   79 +
 .../pip/_internal/commands/__init__.pyc       |  Bin 0 -> 3475 bytes
 .../pip/_internal/commands/check.py           |   41 +
 .../pip/_internal/commands/check.pyc          |  Bin 0 -> 1725 bytes
 .../pip/_internal/commands/completion.py      |   94 +
 .../pip/_internal/commands/completion.pyc     |  Bin 0 -> 3577 bytes
 .../pip/_internal/commands/configuration.py   |  253 +
 .../pip/_internal/commands/configuration.pyc  |  Bin 0 -> 8732 bytes
 .../pip/_internal/commands/download.py        |  176 +
 .../pip/_internal/commands/download.pyc       |  Bin 0 -> 5692 bytes
 .../pip/_internal/commands/freeze.py          |   96 +
 .../pip/_internal/commands/freeze.pyc         |  Bin 0 -> 3677 bytes
 .../pip/_internal/commands/hash.py            |   57 +
 .../pip/_internal/commands/hash.pyc           |  Bin 0 -> 2783 bytes
 .../pip/_internal/commands/help.py            |   37 +
 .../pip/_internal/commands/help.pyc           |  Bin 0 -> 1651 bytes
 .../pip/_internal/commands/install.py         |  587 ++
 .../pip/_internal/commands/install.pyc        |  Bin 0 -> 16064 bytes
 .../pip/_internal/commands/list.py            |  302 +
 .../pip/_internal/commands/list.pyc           |  Bin 0 -> 11104 bytes
 .../pip/_internal/commands/search.py          |  135 +
 .../pip/_internal/commands/search.pyc         |  Bin 0 -> 5521 bytes
 .../pip/_internal/commands/show.py            |  168 +
 .../pip/_internal/commands/show.pyc           |  Bin 0 -> 6415 bytes
 .../pip/_internal/commands/uninstall.py       |   78 +
 .../pip/_internal/commands/uninstall.pyc      |  Bin 0 -> 3344 bytes
 .../pip/_internal/commands/wheel.py           |  186 +
 .../pip/_internal/commands/wheel.pyc          |  Bin 0 -> 6127 bytes
 .../pip/_internal/configuration.py            |  384 +
 .../pip/_internal/configuration.pyc           |  Bin 0 -> 13105 bytes
 .../site-packages/pip/_internal/download.py   |  979 ++
 .../site-packages/pip/_internal/download.pyc  |  Bin 0 -> 28623 bytes
 .../site-packages/pip/_internal/exceptions.py |  274 +
 .../pip/_internal/exceptions.pyc              |  Bin 0 -> 16273 bytes
 .../site-packages/pip/_internal/index.py      | 1108 +++
 .../site-packages/pip/_internal/index.pyc     |  Bin 0 -> 36283 bytes
 .../site-packages/pip/_internal/locations.py  |  211 +
 .../site-packages/pip/_internal/locations.pyc |  Bin 0 -> 5685 bytes
 .../pip/_internal/models/__init__.py          |    2 +
 .../pip/_internal/models/__init__.pyc         |  Bin 0 -> 278 bytes
 .../pip/_internal/models/candidate.py         |   31 +
 .../pip/_internal/models/candidate.pyc        |  Bin 0 -> 1709 bytes
 .../pip/_internal/models/format_control.py    |   73 +
 .../pip/_internal/models/format_control.pyc   |  Bin 0 -> 3380 bytes
 .../pip/_internal/models/index.py             |   31 +
 .../pip/_internal/models/index.pyc            |  Bin 0 -> 1555 bytes
 .../pip/_internal/models/link.py              |  163 +
 .../pip/_internal/models/link.pyc             |  Bin 0 -> 7361 bytes
 .../pip/_internal/operations/__init__.py      |    0
 .../pip/_internal/operations/__init__.pyc     |  Bin 0 -> 203 bytes
 .../pip/_internal/operations/check.py         |  155 +
 .../pip/_internal/operations/check.pyc        |  Bin 0 -> 4985 bytes
 .../pip/_internal/operations/freeze.py        |  247 +
 .../pip/_internal/operations/freeze.pyc       |  Bin 0 -> 7528 bytes
 .../pip/_internal/operations/prepare.py       |  426 +
 .../pip/_internal/operations/prepare.pyc      |  Bin 0 -> 13680 bytes
 .../site-packages/pip/_internal/pep425tags.py |  381 +
 .../pip/_internal/pep425tags.pyc              |  Bin 0 -> 11553 bytes
 .../site-packages/pip/_internal/pyproject.py  |  171 +
 .../site-packages/pip/_internal/pyproject.pyc |  Bin 0 -> 4063 bytes
 .../pip/_internal/req/__init__.py             |   78 +
 .../pip/_internal/req/__init__.pyc            |  Bin 0 -> 1982 bytes
 .../pip/_internal/req/constructors.py         |  340 +
 .../pip/_internal/req/constructors.pyc        |  Bin 0 -> 9643 bytes
 .../pip/_internal/req/req_file.py             |  383 +
 .../pip/_internal/req/req_file.pyc            |  Bin 0 -> 11785 bytes
 .../pip/_internal/req/req_install.py          | 1028 +++
 .../pip/_internal/req/req_install.pyc         |  Bin 0 -> 32280 bytes
 .../pip/_internal/req/req_set.py              |  193 +
 .../pip/_internal/req/req_set.pyc             |  Bin 0 -> 6797 bytes
 .../pip/_internal/req/req_tracker.py          |   96 +
 .../pip/_internal/req/req_tracker.pyc         |  Bin 0 -> 4564 bytes
 .../pip/_internal/req/req_uninstall.py        |  633 ++
 .../pip/_internal/req/req_uninstall.pyc       |  Bin 0 -> 23635 bytes
 .../site-packages/pip/_internal/resolve.py    |  393 +
 .../site-packages/pip/_internal/resolve.pyc   |  Bin 0 -> 11222 bytes
 .../pip/_internal/utils/__init__.py           |    0
 .../pip/_internal/utils/__init__.pyc          |  Bin 0 -> 198 bytes
 .../pip/_internal/utils/appdirs.py            |  268 +
 .../pip/_internal/utils/appdirs.pyc           |  Bin 0 -> 9394 bytes
 .../pip/_internal/utils/compat.py             |  264 +
 .../pip/_internal/utils/compat.pyc            |  Bin 0 -> 8638 bytes
 .../pip/_internal/utils/deprecation.py        |   93 +
 .../pip/_internal/utils/deprecation.pyc       |  Bin 0 -> 3408 bytes
 .../pip/_internal/utils/encoding.py           |   39 +
 .../pip/_internal/utils/encoding.pyc          |  Bin 0 -> 1649 bytes
 .../pip/_internal/utils/filesystem.py         |   30 +
 .../pip/_internal/utils/filesystem.pyc        |  Bin 0 -> 912 bytes
 .../pip/_internal/utils/glibc.py              |   93 +
 .../pip/_internal/utils/glibc.pyc             |  Bin 0 -> 2406 bytes
 .../pip/_internal/utils/hashes.py             |  115 +
 .../pip/_internal/utils/hashes.pyc            |  Bin 0 -> 5026 bytes
 .../pip/_internal/utils/logging.py            |  371 +
 .../pip/_internal/utils/logging.pyc           |  Bin 0 -> 12627 bytes
 .../site-packages/pip/_internal/utils/misc.py | 1011 ++
 .../pip/_internal/utils/misc.pyc              |  Bin 0 -> 34905 bytes
 .../pip/_internal/utils/models.py             |   40 +
 .../pip/_internal/utils/models.pyc            |  Bin 0 -> 2950 bytes
 .../pip/_internal/utils/outdated.py           |  162 +
 .../pip/_internal/utils/outdated.pyc          |  Bin 0 -> 5214 bytes
 .../pip/_internal/utils/packaging.py          |   85 +
 .../pip/_internal/utils/packaging.pyc         |  Bin 0 -> 3489 bytes
 .../pip/_internal/utils/setuptools_build.py   |    8 +
 .../pip/_internal/utils/setuptools_build.pyc  |  Bin 0 -> 404 bytes
 .../pip/_internal/utils/temp_dir.py           |  155 +
 .../pip/_internal/utils/temp_dir.pyc          |  Bin 0 -> 6397 bytes
 .../pip/_internal/utils/typing.py             |   29 +
 .../pip/_internal/utils/typing.pyc            |  Bin 0 -> 1350 bytes
 .../site-packages/pip/_internal/utils/ui.py   |  424 +
 .../site-packages/pip/_internal/utils/ui.pyc  |  Bin 0 -> 17200 bytes
 .../pip/_internal/vcs/__init__.py             |  604 ++
 .../pip/_internal/vcs/__init__.pyc            |  Bin 0 -> 22654 bytes
 .../site-packages/pip/_internal/vcs/bazaar.py |  103 +
 .../pip/_internal/vcs/bazaar.pyc              |  Bin 0 -> 5097 bytes
 .../site-packages/pip/_internal/vcs/git.py    |  362 +
 .../site-packages/pip/_internal/vcs/git.pyc   |  Bin 0 -> 12401 bytes
 .../pip/_internal/vcs/mercurial.py            |  105 +
 .../pip/_internal/vcs/mercurial.pyc           |  Bin 0 -> 5221 bytes
 .../pip/_internal/vcs/subversion.py           |  234 +
 .../pip/_internal/vcs/subversion.pyc          |  Bin 0 -> 8818 bytes
 .../site-packages/pip/_internal/wheel.py      | 1098 +++
 .../site-packages/pip/_internal/wheel.pyc     |  Bin 0 -> 32820 bytes
 .../site-packages/pip/_vendor/__init__.py     |  109 +
 .../site-packages/pip/_vendor/__init__.pyc    |  Bin 0 -> 3389 bytes
 .../site-packages/pip/_vendor/appdirs.py      |  604 ++
 .../site-packages/pip/_vendor/appdirs.pyc     |  Bin 0 -> 23861 bytes
 .../pip/_vendor/cachecontrol/__init__.py      |   11 +
 .../pip/_vendor/cachecontrol/__init__.pyc     |  Bin 0 -> 630 bytes
 .../pip/_vendor/cachecontrol/_cmd.py          |   57 +
 .../pip/_vendor/cachecontrol/_cmd.pyc         |  Bin 0 -> 2288 bytes
 .../pip/_vendor/cachecontrol/adapter.py       |  133 +
 .../pip/_vendor/cachecontrol/adapter.pyc      |  Bin 0 -> 4042 bytes
 .../pip/_vendor/cachecontrol/cache.py         |   39 +
 .../pip/_vendor/cachecontrol/cache.pyc        |  Bin 0 -> 2923 bytes
 .../_vendor/cachecontrol/caches/__init__.py   |    2 +
 .../_vendor/cachecontrol/caches/__init__.pyc  |  Bin 0 -> 329 bytes
 .../_vendor/cachecontrol/caches/file_cache.py |  146 +
 .../cachecontrol/caches/file_cache.pyc        |  Bin 0 -> 4755 bytes
 .../cachecontrol/caches/redis_cache.py        |   33 +
 .../cachecontrol/caches/redis_cache.pyc       |  Bin 0 -> 2500 bytes
 .../pip/_vendor/cachecontrol/compat.py        |   29 +
 .../pip/_vendor/cachecontrol/compat.pyc       |  Bin 0 -> 849 bytes
 .../pip/_vendor/cachecontrol/controller.py    |  367 +
 .../pip/_vendor/cachecontrol/controller.pyc   |  Bin 0 -> 10121 bytes
 .../pip/_vendor/cachecontrol/filewrapper.py   |   80 +
 .../pip/_vendor/cachecontrol/filewrapper.pyc  |  Bin 0 -> 3043 bytes
 .../pip/_vendor/cachecontrol/heuristics.py    |  135 +
 .../pip/_vendor/cachecontrol/heuristics.pyc   |  Bin 0 -> 6673 bytes
 .../pip/_vendor/cachecontrol/serialize.py     |  186 +
 .../pip/_vendor/cachecontrol/serialize.pyc    |  Bin 0 -> 6411 bytes
 .../pip/_vendor/cachecontrol/wrapper.py       |   29 +
 .../pip/_vendor/cachecontrol/wrapper.pyc      |  Bin 0 -> 906 bytes
 .../pip/_vendor/certifi/__init__.py           |    3 +
 .../pip/_vendor/certifi/__init__.pyc          |  Bin 0 -> 287 bytes
 .../pip/_vendor/certifi/__main__.py           |    2 +
 .../pip/_vendor/certifi/__main__.pyc          |  Bin 0 -> 273 bytes
 .../pip/_vendor/certifi/cacert.pem            | 4658 ++++++++++
 .../site-packages/pip/_vendor/certifi/core.py |   15 +
 .../pip/_vendor/certifi/core.pyc              |  Bin 0 -> 633 bytes
 .../pip/_vendor/chardet/__init__.py           |   39 +
 .../pip/_vendor/chardet/__init__.pyc          |  Bin 0 -> 1088 bytes
 .../pip/_vendor/chardet/big5freq.py           |  386 +
 .../pip/_vendor/chardet/big5freq.pyc          |  Bin 0 -> 54748 bytes
 .../pip/_vendor/chardet/big5prober.py         |   47 +
 .../pip/_vendor/chardet/big5prober.pyc        |  Bin 0 -> 1592 bytes
 .../pip/_vendor/chardet/chardistribution.py   |  233 +
 .../pip/_vendor/chardet/chardistribution.pyc  |  Bin 0 -> 9073 bytes
 .../pip/_vendor/chardet/charsetgroupprober.py |  106 +
 .../_vendor/chardet/charsetgroupprober.pyc    |  Bin 0 -> 3249 bytes
 .../pip/_vendor/chardet/charsetprober.py      |  145 +
 .../pip/_vendor/chardet/charsetprober.pyc     |  Bin 0 -> 4666 bytes
 .../pip/_vendor/chardet/cli/__init__.py       |    1 +
 .../pip/_vendor/chardet/cli/__init__.pyc      |  Bin 0 -> 202 bytes
 .../pip/_vendor/chardet/cli/chardetect.py     |   85 +
 .../pip/_vendor/chardet/cli/chardetect.pyc    |  Bin 0 -> 3331 bytes
 .../pip/_vendor/chardet/codingstatemachine.py |   88 +
 .../_vendor/chardet/codingstatemachine.pyc    |  Bin 0 -> 3736 bytes
 .../pip/_vendor/chardet/compat.py             |   34 +
 .../pip/_vendor/chardet/compat.pyc            |  Bin 0 -> 451 bytes
 .../pip/_vendor/chardet/cp949prober.py        |   49 +
 .../pip/_vendor/chardet/cp949prober.pyc       |  Bin 0 -> 1600 bytes
 .../pip/_vendor/chardet/enums.py              |   76 +
 .../pip/_vendor/chardet/enums.pyc             |  Bin 0 -> 3505 bytes
 .../pip/_vendor/chardet/escprober.py          |  101 +
 .../pip/_vendor/chardet/escprober.pyc         |  Bin 0 -> 3607 bytes
 .../pip/_vendor/chardet/escsm.py              |  246 +
 .../pip/_vendor/chardet/escsm.pyc             |  Bin 0 -> 8062 bytes
 .../pip/_vendor/chardet/eucjpprober.py        |   92 +
 .../pip/_vendor/chardet/eucjpprober.pyc       |  Bin 0 -> 3422 bytes
 .../pip/_vendor/chardet/euckrfreq.py          |  195 +
 .../pip/_vendor/chardet/euckrfreq.pyc         |  Bin 0 -> 24134 bytes
 .../pip/_vendor/chardet/euckrprober.py        |   47 +
 .../pip/_vendor/chardet/euckrprober.pyc       |  Bin 0 -> 1601 bytes
 .../pip/_vendor/chardet/euctwfreq.py          |  387 +
 .../pip/_vendor/chardet/euctwfreq.pyc         |  Bin 0 -> 54757 bytes
 .../pip/_vendor/chardet/euctwprober.py        |   46 +
 .../pip/_vendor/chardet/euctwprober.pyc       |  Bin 0 -> 1601 bytes
 .../pip/_vendor/chardet/gb2312freq.py         |  283 +
 .../pip/_vendor/chardet/gb2312freq.pyc        |  Bin 0 -> 38399 bytes
 .../pip/_vendor/chardet/gb2312prober.py       |   46 +
 .../pip/_vendor/chardet/gb2312prober.pyc      |  Bin 0 -> 1610 bytes
 .../pip/_vendor/chardet/hebrewprober.py       |  292 +
 .../pip/_vendor/chardet/hebrewprober.pyc      |  Bin 0 -> 4331 bytes
 .../pip/_vendor/chardet/jisfreq.py            |  325 +
 .../pip/_vendor/chardet/jisfreq.pyc           |  Bin 0 -> 44543 bytes
 .../pip/_vendor/chardet/jpcntx.py             |  233 +
 .../pip/_vendor/chardet/jpcntx.pyc            |  Bin 0 -> 25988 bytes
 .../pip/_vendor/chardet/langbulgarianmodel.py |  228 +
 .../_vendor/chardet/langbulgarianmodel.pyc    |  Bin 0 -> 25011 bytes
 .../pip/_vendor/chardet/langcyrillicmodel.py  |  333 +
 .../pip/_vendor/chardet/langcyrillicmodel.pyc |  Bin 0 -> 30731 bytes
 .../pip/_vendor/chardet/langgreekmodel.py     |  225 +
 .../pip/_vendor/chardet/langgreekmodel.pyc    |  Bin 0 -> 24686 bytes
 .../pip/_vendor/chardet/langhebrewmodel.py    |  200 +
 .../pip/_vendor/chardet/langhebrewmodel.pyc   |  Bin 0 -> 23497 bytes
 .../pip/_vendor/chardet/langhungarianmodel.py |  225 +
 .../_vendor/chardet/langhungarianmodel.pyc    |  Bin 0 -> 24981 bytes
 .../pip/_vendor/chardet/langthaimodel.py      |  199 +
 .../pip/_vendor/chardet/langthaimodel.pyc     |  Bin 0 -> 23476 bytes
 .../pip/_vendor/chardet/langturkishmodel.py   |  193 +
 .../pip/_vendor/chardet/langturkishmodel.pyc  |  Bin 0 -> 23493 bytes
 .../pip/_vendor/chardet/latin1prober.py       |  145 +
 .../pip/_vendor/chardet/latin1prober.pyc      |  Bin 0 -> 4117 bytes
 .../pip/_vendor/chardet/mbcharsetprober.py    |   91 +
 .../pip/_vendor/chardet/mbcharsetprober.pyc   |  Bin 0 -> 3171 bytes
 .../pip/_vendor/chardet/mbcsgroupprober.py    |   54 +
 .../pip/_vendor/chardet/mbcsgroupprober.pyc   |  Bin 0 -> 1477 bytes
 .../pip/_vendor/chardet/mbcssm.py             |  572 ++
 .../pip/_vendor/chardet/mbcssm.pyc            |  Bin 0 -> 19168 bytes
 .../pip/_vendor/chardet/sbcharsetprober.py    |  132 +
 .../pip/_vendor/chardet/sbcharsetprober.pyc   |  Bin 0 -> 4050 bytes
 .../pip/_vendor/chardet/sbcsgroupprober.py    |   73 +
 .../pip/_vendor/chardet/sbcsgroupprober.pyc   |  Bin 0 -> 2070 bytes
 .../pip/_vendor/chardet/sjisprober.py         |   92 +
 .../pip/_vendor/chardet/sjisprober.pyc        |  Bin 0 -> 3443 bytes
 .../pip/_vendor/chardet/universaldetector.py  |  286 +
 .../pip/_vendor/chardet/universaldetector.pyc |  Bin 0 -> 7403 bytes
 .../pip/_vendor/chardet/utf8prober.py         |   82 +
 .../pip/_vendor/chardet/utf8prober.pyc        |  Bin 0 -> 2892 bytes
 .../pip/_vendor/chardet/version.py            |    9 +
 .../pip/_vendor/chardet/version.pyc           |  Bin 0 -> 478 bytes
 .../pip/_vendor/colorama/__init__.py          |    6 +
 .../pip/_vendor/colorama/__init__.pyc         |  Bin 0 -> 530 bytes
 .../pip/_vendor/colorama/ansi.py              |  102 +
 .../pip/_vendor/colorama/ansi.pyc             |  Bin 0 -> 5184 bytes
 .../pip/_vendor/colorama/ansitowin32.py       |  257 +
 .../pip/_vendor/colorama/ansitowin32.pyc      |  Bin 0 -> 11113 bytes
 .../pip/_vendor/colorama/initialise.py        |   80 +
 .../pip/_vendor/colorama/initialise.pyc       |  Bin 0 -> 2683 bytes
 .../pip/_vendor/colorama/win32.py             |  152 +
 .../pip/_vendor/colorama/win32.pyc            |  Bin 0 -> 5862 bytes
 .../pip/_vendor/colorama/winterm.py           |  169 +
 .../pip/_vendor/colorama/winterm.pyc          |  Bin 0 -> 6935 bytes
 .../pip/_vendor/distlib/__init__.py           |   23 +
 .../pip/_vendor/distlib/__init__.pyc          |  Bin 0 -> 1623 bytes
 .../pip/_vendor/distlib/_backport/__init__.py |    6 +
 .../_vendor/distlib/_backport/__init__.pyc    |  Bin 0 -> 498 bytes
 .../pip/_vendor/distlib/_backport/misc.py     |   41 +
 .../pip/_vendor/distlib/_backport/misc.pyc    |  Bin 0 -> 1616 bytes
 .../pip/_vendor/distlib/_backport/shutil.py   |  761 ++
 .../pip/_vendor/distlib/_backport/shutil.pyc  |  Bin 0 -> 28381 bytes
 .../_vendor/distlib/_backport/sysconfig.cfg   |   84 +
 .../_vendor/distlib/_backport/sysconfig.py    |  788 ++
 .../_vendor/distlib/_backport/sysconfig.pyc   |  Bin 0 -> 22259 bytes
 .../pip/_vendor/distlib/_backport/tarfile.py  | 2607 ++++++
 .../pip/_vendor/distlib/_backport/tarfile.pyc |  Bin 0 -> 86781 bytes
 .../pip/_vendor/distlib/compat.py             | 1120 +++
 .../pip/_vendor/distlib/compat.pyc            |  Bin 0 -> 44256 bytes
 .../pip/_vendor/distlib/database.py           | 1339 +++
 .../pip/_vendor/distlib/database.pyc          |  Bin 0 -> 53896 bytes
 .../pip/_vendor/distlib/index.py              |  516 ++
 .../pip/_vendor/distlib/index.pyc             |  Bin 0 -> 20987 bytes
 .../pip/_vendor/distlib/locators.py           | 1295 +++
 .../pip/_vendor/distlib/locators.pyc          |  Bin 0 -> 49754 bytes
 .../pip/_vendor/distlib/manifest.py           |  393 +
 .../pip/_vendor/distlib/manifest.pyc          |  Bin 0 -> 12906 bytes
 .../pip/_vendor/distlib/markers.py            |  131 +
 .../pip/_vendor/distlib/markers.pyc           |  Bin 0 -> 7112 bytes
 .../pip/_vendor/distlib/metadata.py           | 1094 +++
 .../pip/_vendor/distlib/metadata.pyc          |  Bin 0 -> 38836 bytes
 .../pip/_vendor/distlib/resources.py          |  355 +
 .../pip/_vendor/distlib/resources.pyc         |  Bin 0 -> 15896 bytes
 .../pip/_vendor/distlib/scripts.py            |  417 +
 .../pip/_vendor/distlib/scripts.pyc           |  Bin 0 -> 14496 bytes
 .../site-packages/pip/_vendor/distlib/t32.exe |  Bin 0 -> 92672 bytes
 .../site-packages/pip/_vendor/distlib/t64.exe |  Bin 0 -> 102400 bytes
 .../site-packages/pip/_vendor/distlib/util.py | 1756 ++++
 .../pip/_vendor/distlib/util.pyc              |  Bin 0 -> 67805 bytes
 .../pip/_vendor/distlib/version.py            |  736 ++
 .../pip/_vendor/distlib/version.pyc           |  Bin 0 -> 29783 bytes
 .../site-packages/pip/_vendor/distlib/w32.exe |  Bin 0 -> 89088 bytes
 .../site-packages/pip/_vendor/distlib/w64.exe |  Bin 0 -> 99328 bytes
 .../pip/_vendor/distlib/wheel.py              |  988 ++
 .../pip/_vendor/distlib/wheel.pyc             |  Bin 0 -> 33453 bytes
 .../site-packages/pip/_vendor/distro.py       | 1216 +++
 .../site-packages/pip/_vendor/distro.pyc      |  Bin 0 -> 42875 bytes
 .../pip/_vendor/html5lib/__init__.py          |   35 +
 .../pip/_vendor/html5lib/__init__.pyc         |  Bin 0 -> 1495 bytes
 .../pip/_vendor/html5lib/_ihatexml.py         |  288 +
 .../pip/_vendor/html5lib/_ihatexml.pyc        |  Bin 0 -> 16440 bytes
 .../pip/_vendor/html5lib/_inputstream.py      |  923 ++
 .../pip/_vendor/html5lib/_inputstream.pyc     |  Bin 0 -> 30522 bytes
 .../pip/_vendor/html5lib/_tokenizer.py        | 1721 ++++
 .../pip/_vendor/html5lib/_tokenizer.pyc       |  Bin 0 -> 57395 bytes
 .../pip/_vendor/html5lib/_trie/__init__.py    |   14 +
 .../pip/_vendor/html5lib/_trie/__init__.pyc   |  Bin 0 -> 489 bytes
 .../pip/_vendor/html5lib/_trie/_base.py       |   37 +
 .../pip/_vendor/html5lib/_trie/_base.pyc      |  Bin 0 -> 2266 bytes
 .../pip/_vendor/html5lib/_trie/datrie.py      |   44 +
 .../pip/_vendor/html5lib/_trie/datrie.pyc     |  Bin 0 -> 3296 bytes
 .../pip/_vendor/html5lib/_trie/py.py          |   67 +
 .../pip/_vendor/html5lib/_trie/py.pyc         |  Bin 0 -> 3489 bytes
 .../pip/_vendor/html5lib/_utils.py            |  124 +
 .../pip/_vendor/html5lib/_utils.pyc           |  Bin 0 -> 4808 bytes
 .../pip/_vendor/html5lib/constants.py         | 2947 ++++++
 .../pip/_vendor/html5lib/constants.pyc        |  Bin 0 -> 83207 bytes
 .../pip/_vendor/html5lib/filters/__init__.py  |    0
 .../pip/_vendor/html5lib/filters/__init__.pyc |  Bin 0 -> 207 bytes
 .../filters/alphabeticalattributes.py         |   29 +
 .../filters/alphabeticalattributes.pyc        |  Bin 0 -> 1876 bytes
 .../pip/_vendor/html5lib/filters/base.py      |   12 +
 .../pip/_vendor/html5lib/filters/base.pyc     |  Bin 0 -> 1341 bytes
 .../html5lib/filters/inject_meta_charset.py   |   73 +
 .../html5lib/filters/inject_meta_charset.pyc  |  Bin 0 -> 2648 bytes
 .../pip/_vendor/html5lib/filters/lint.py      |   93 +
 .../pip/_vendor/html5lib/filters/lint.pyc     |  Bin 0 -> 3500 bytes
 .../_vendor/html5lib/filters/optionaltags.py  |  207 +
 .../_vendor/html5lib/filters/optionaltags.pyc |  Bin 0 -> 4754 bytes
 .../pip/_vendor/html5lib/filters/sanitizer.py |  896 ++
 .../_vendor/html5lib/filters/sanitizer.pyc    |  Bin 0 -> 27270 bytes
 .../_vendor/html5lib/filters/whitespace.py    |   38 +
 .../_vendor/html5lib/filters/whitespace.pyc   |  Bin 0 -> 1941 bytes
 .../pip/_vendor/html5lib/html5parser.py       | 2791 ++++++
 .../pip/_vendor/html5lib/html5parser.pyc      |  Bin 0 -> 141299 bytes
 .../pip/_vendor/html5lib/serializer.py        |  409 +
 .../pip/_vendor/html5lib/serializer.pyc       |  Bin 0 -> 13932 bytes
 .../_vendor/html5lib/treeadapters/__init__.py |   30 +
 .../html5lib/treeadapters/__init__.pyc        |  Bin 0 -> 1022 bytes
 .../_vendor/html5lib/treeadapters/genshi.py   |   54 +
 .../_vendor/html5lib/treeadapters/genshi.pyc  |  Bin 0 -> 1973 bytes
 .../pip/_vendor/html5lib/treeadapters/sax.py  |   50 +
 .../pip/_vendor/html5lib/treeadapters/sax.pyc |  Bin 0 -> 1970 bytes
 .../_vendor/html5lib/treebuilders/__init__.py |   88 +
 .../html5lib/treebuilders/__init__.pyc        |  Bin 0 -> 3662 bytes
 .../pip/_vendor/html5lib/treebuilders/base.py |  417 +
 .../_vendor/html5lib/treebuilders/base.pyc    |  Bin 0 -> 16123 bytes
 .../pip/_vendor/html5lib/treebuilders/dom.py  |  236 +
 .../pip/_vendor/html5lib/treebuilders/dom.pyc |  Bin 0 -> 13400 bytes
 .../_vendor/html5lib/treebuilders/etree.py    |  340 +
 .../_vendor/html5lib/treebuilders/etree.pyc   |  Bin 0 -> 16763 bytes
 .../html5lib/treebuilders/etree_lxml.py       |  366 +
 .../html5lib/treebuilders/etree_lxml.pyc      |  Bin 0 -> 16913 bytes
 .../_vendor/html5lib/treewalkers/__init__.py  |  154 +
 .../_vendor/html5lib/treewalkers/__init__.pyc |  Bin 0 -> 5071 bytes
 .../pip/_vendor/html5lib/treewalkers/base.py  |  252 +
 .../pip/_vendor/html5lib/treewalkers/base.pyc |  Bin 0 -> 9693 bytes
 .../pip/_vendor/html5lib/treewalkers/dom.py   |   43 +
 .../pip/_vendor/html5lib/treewalkers/dom.pyc  |  Bin 0 -> 2517 bytes
 .../pip/_vendor/html5lib/treewalkers/etree.py |  130 +
 .../_vendor/html5lib/treewalkers/etree.pyc    |  Bin 0 -> 4770 bytes
 .../html5lib/treewalkers/etree_lxml.py        |  213 +
 .../html5lib/treewalkers/etree_lxml.pyc       |  Bin 0 -> 10584 bytes
 .../_vendor/html5lib/treewalkers/genshi.py    |   69 +
 .../_vendor/html5lib/treewalkers/genshi.pyc   |  Bin 0 -> 2626 bytes
 .../pip/_vendor/idna/__init__.py              |    2 +
 .../pip/_vendor/idna/__init__.pyc             |  Bin 0 -> 291 bytes
 .../site-packages/pip/_vendor/idna/codec.py   |  118 +
 .../site-packages/pip/_vendor/idna/codec.pyc  |  Bin 0 -> 4486 bytes
 .../site-packages/pip/_vendor/idna/compat.py  |   12 +
 .../site-packages/pip/_vendor/idna/compat.pyc |  Bin 0 -> 999 bytes
 .../site-packages/pip/_vendor/idna/core.py    |  396 +
 .../site-packages/pip/_vendor/idna/core.pyc   |  Bin 0 -> 13098 bytes
 .../pip/_vendor/idna/idnadata.py              | 1979 ++++
 .../pip/_vendor/idna/idnadata.pyc             |  Bin 0 -> 35078 bytes
 .../pip/_vendor/idna/intranges.py             |   53 +
 .../pip/_vendor/idna/intranges.pyc            |  Bin 0 -> 2452 bytes
 .../pip/_vendor/idna/package_data.py          |    2 +
 .../pip/_vendor/idna/package_data.pyc         |  Bin 0 -> 229 bytes
 .../pip/_vendor/idna/uts46data.py             | 8205 +++++++++++++++++
 .../pip/_vendor/idna/uts46data.pyc            |  Bin 0 -> 296556 bytes
 .../site-packages/pip/_vendor/ipaddress.py    | 2419 +++++
 .../site-packages/pip/_vendor/ipaddress.pyc   |  Bin 0 -> 85785 bytes
 .../pip/_vendor/lockfile/__init__.py          |  347 +
 .../pip/_vendor/lockfile/__init__.pyc         |  Bin 0 -> 13475 bytes
 .../pip/_vendor/lockfile/linklockfile.py      |   73 +
 .../pip/_vendor/lockfile/linklockfile.pyc     |  Bin 0 -> 3238 bytes
 .../pip/_vendor/lockfile/mkdirlockfile.py     |   84 +
 .../pip/_vendor/lockfile/mkdirlockfile.pyc    |  Bin 0 -> 3802 bytes
 .../pip/_vendor/lockfile/pidlockfile.py       |  190 +
 .../pip/_vendor/lockfile/pidlockfile.pyc      |  Bin 0 -> 6473 bytes
 .../pip/_vendor/lockfile/sqlitelockfile.py    |  156 +
 .../pip/_vendor/lockfile/sqlitelockfile.pyc   |  Bin 0 -> 5126 bytes
 .../pip/_vendor/lockfile/symlinklockfile.py   |   70 +
 .../pip/_vendor/lockfile/symlinklockfile.pyc  |  Bin 0 -> 3201 bytes
 .../pip/_vendor/msgpack/__init__.py           |   66 +
 .../pip/_vendor/msgpack/__init__.pyc          |  Bin 0 -> 2871 bytes
 .../pip/_vendor/msgpack/_version.py           |    1 +
 .../pip/_vendor/msgpack/_version.pyc          |  Bin 0 -> 251 bytes
 .../pip/_vendor/msgpack/exceptions.py         |   41 +
 .../pip/_vendor/msgpack/exceptions.pyc        |  Bin 0 -> 3313 bytes
 .../pip/_vendor/msgpack/fallback.py           |  977 ++
 .../pip/_vendor/msgpack/fallback.pyc          |  Bin 0 -> 32803 bytes
 .../pip/_vendor/packaging/__about__.py        |   27 +
 .../pip/_vendor/packaging/__about__.pyc       |  Bin 0 -> 841 bytes
 .../pip/_vendor/packaging/__init__.py         |   26 +
 .../pip/_vendor/packaging/__init__.pyc        |  Bin 0 -> 663 bytes
 .../pip/_vendor/packaging/_compat.py          |   31 +
 .../pip/_vendor/packaging/_compat.pyc         |  Bin 0 -> 1404 bytes
 .../pip/_vendor/packaging/_structures.py      |   68 +
 .../pip/_vendor/packaging/_structures.pyc     |  Bin 0 -> 5013 bytes
 .../pip/_vendor/packaging/markers.py          |  296 +
 .../pip/_vendor/packaging/markers.pyc         |  Bin 0 -> 13357 bytes
 .../pip/_vendor/packaging/requirements.py     |  138 +
 .../pip/_vendor/packaging/requirements.pyc    |  Bin 0 -> 5695 bytes
 .../pip/_vendor/packaging/specifiers.py       |  749 ++
 .../pip/_vendor/packaging/specifiers.pyc      |  Bin 0 -> 28139 bytes
 .../pip/_vendor/packaging/utils.py            |   57 +
 .../pip/_vendor/packaging/utils.pyc           |  Bin 0 -> 2143 bytes
 .../pip/_vendor/packaging/version.py          |  420 +
 .../pip/_vendor/packaging/version.pyc         |  Bin 0 -> 19012 bytes
 .../pip/_vendor/pep517/__init__.py            |    4 +
 .../pip/_vendor/pep517/__init__.pyc           |  Bin 0 -> 308 bytes
 .../pip/_vendor/pep517/_in_process.py         |  207 +
 .../pip/_vendor/pep517/_in_process.pyc        |  Bin 0 -> 7785 bytes
 .../site-packages/pip/_vendor/pep517/build.py |  108 +
 .../pip/_vendor/pep517/build.pyc              |  Bin 0 -> 3865 bytes
 .../site-packages/pip/_vendor/pep517/check.py |  202 +
 .../pip/_vendor/pep517/check.pyc              |  Bin 0 -> 6183 bytes
 .../pip/_vendor/pep517/colorlog.py            |  115 +
 .../pip/_vendor/pep517/colorlog.pyc           |  Bin 0 -> 3906 bytes
 .../pip/_vendor/pep517/compat.py              |   23 +
 .../pip/_vendor/pep517/compat.pyc             |  Bin 0 -> 1587 bytes
 .../pip/_vendor/pep517/envbuild.py            |  158 +
 .../pip/_vendor/pep517/envbuild.pyc           |  Bin 0 -> 5625 bytes
 .../pip/_vendor/pep517/wrappers.py            |  163 +
 .../pip/_vendor/pep517/wrappers.pyc           |  Bin 0 -> 7144 bytes
 .../pip/_vendor/pkg_resources/__init__.py     | 3286 +++++++
 .../pip/_vendor/pkg_resources/__init__.pyc    |  Bin 0 -> 137688 bytes
 .../pip/_vendor/pkg_resources/py31compat.py   |   23 +
 .../pip/_vendor/pkg_resources/py31compat.pyc  |  Bin 0 -> 881 bytes
 .../pip/_vendor/progress/__init__.py          |  177 +
 .../pip/_vendor/progress/__init__.pyc         |  Bin 0 -> 8933 bytes
 .../site-packages/pip/_vendor/progress/bar.py |   91 +
 .../pip/_vendor/progress/bar.pyc              |  Bin 0 -> 4043 bytes
 .../pip/_vendor/progress/counter.py           |   41 +
 .../pip/_vendor/progress/counter.pyc          |  Bin 0 -> 2422 bytes
 .../pip/_vendor/progress/spinner.py           |   43 +
 .../pip/_vendor/progress/spinner.pyc          |  Bin 0 -> 2211 bytes
 .../site-packages/pip/_vendor/pyparsing.py    | 6493 +++++++++++++
 .../site-packages/pip/_vendor/pyparsing.pyc   |  Bin 0 -> 277069 bytes
 .../pip/_vendor/pytoml/__init__.py            |    4 +
 .../pip/_vendor/pytoml/__init__.pyc           |  Bin 0 -> 448 bytes
 .../site-packages/pip/_vendor/pytoml/core.py  |   13 +
 .../site-packages/pip/_vendor/pytoml/core.pyc |  Bin 0 -> 1400 bytes
 .../pip/_vendor/pytoml/parser.py              |  341 +
 .../pip/_vendor/pytoml/parser.pyc             |  Bin 0 -> 14699 bytes
 .../site-packages/pip/_vendor/pytoml/test.py  |   30 +
 .../site-packages/pip/_vendor/pytoml/test.pyc |  Bin 0 -> 1551 bytes
 .../site-packages/pip/_vendor/pytoml/utils.py |   67 +
 .../pip/_vendor/pytoml/utils.pyc              |  Bin 0 -> 3298 bytes
 .../pip/_vendor/pytoml/writer.py              |  106 +
 .../pip/_vendor/pytoml/writer.pyc             |  Bin 0 -> 5606 bytes
 .../pip/_vendor/requests/__init__.py          |  133 +
 .../pip/_vendor/requests/__init__.pyc         |  Bin 0 -> 4332 bytes
 .../pip/_vendor/requests/__version__.py       |   14 +
 .../pip/_vendor/requests/__version__.pyc      |  Bin 0 -> 634 bytes
 .../pip/_vendor/requests/_internal_utils.py   |   42 +
 .../pip/_vendor/requests/_internal_utils.pyc  |  Bin 0 -> 1676 bytes
 .../pip/_vendor/requests/adapters.py          |  533 ++
 .../pip/_vendor/requests/adapters.pyc         |  Bin 0 -> 20399 bytes
 .../site-packages/pip/_vendor/requests/api.py |  158 +
 .../pip/_vendor/requests/api.pyc              |  Bin 0 -> 7499 bytes
 .../pip/_vendor/requests/auth.py              |  305 +
 .../pip/_vendor/requests/auth.pyc             |  Bin 0 -> 11699 bytes
 .../pip/_vendor/requests/certs.py             |   18 +
 .../pip/_vendor/requests/certs.pyc            |  Bin 0 -> 665 bytes
 .../pip/_vendor/requests/compat.py            |   74 +
 .../pip/_vendor/requests/compat.pyc           |  Bin 0 -> 2003 bytes
 .../pip/_vendor/requests/cookies.py           |  549 ++
 .../pip/_vendor/requests/cookies.pyc          |  Bin 0 -> 25235 bytes
 .../pip/_vendor/requests/exceptions.py        |  126 +
 .../pip/_vendor/requests/exceptions.pyc       |  Bin 0 -> 8345 bytes
 .../pip/_vendor/requests/help.py              |  119 +
 .../pip/_vendor/requests/help.pyc             |  Bin 0 -> 3572 bytes
 .../pip/_vendor/requests/hooks.py             |   34 +
 .../pip/_vendor/requests/hooks.pyc            |  Bin 0 -> 1398 bytes
 .../pip/_vendor/requests/models.py            |  953 ++
 .../pip/_vendor/requests/models.pyc           |  Bin 0 -> 31856 bytes
 .../pip/_vendor/requests/packages.py          |   16 +
 .../pip/_vendor/requests/packages.pyc         |  Bin 0 -> 625 bytes
 .../pip/_vendor/requests/sessions.py          |  770 ++
 .../pip/_vendor/requests/sessions.pyc         |  Bin 0 -> 24341 bytes
 .../pip/_vendor/requests/status_codes.py      |  120 +
 .../pip/_vendor/requests/status_codes.pyc     |  Bin 0 -> 6277 bytes
 .../pip/_vendor/requests/structures.py        |  103 +
 .../pip/_vendor/requests/structures.pyc       |  Bin 0 -> 6281 bytes
 .../pip/_vendor/requests/utils.py             |  977 ++
 .../pip/_vendor/requests/utils.pyc            |  Bin 0 -> 29347 bytes
 .../site-packages/pip/_vendor/retrying.py     |  267 +
 .../site-packages/pip/_vendor/retrying.pyc    |  Bin 0 -> 11662 bytes
 .../site-packages/pip/_vendor/six.py          |  952 ++
 .../site-packages/pip/_vendor/six.pyc         |  Bin 0 -> 37306 bytes
 .../pip/_vendor/urllib3/__init__.py           |   92 +
 .../pip/_vendor/urllib3/__init__.pyc          |  Bin 0 -> 2817 bytes
 .../pip/_vendor/urllib3/_collections.py       |  329 +
 .../pip/_vendor/urllib3/_collections.pyc      |  Bin 0 -> 15104 bytes
 .../pip/_vendor/urllib3/connection.py         |  391 +
 .../pip/_vendor/urllib3/connection.pyc        |  Bin 0 -> 13186 bytes
 .../pip/_vendor/urllib3/connectionpool.py     |  896 ++
 .../pip/_vendor/urllib3/connectionpool.pyc    |  Bin 0 -> 28575 bytes
 .../pip/_vendor/urllib3/contrib/__init__.py   |    0
 .../pip/_vendor/urllib3/contrib/__init__.pyc  |  Bin 0 -> 206 bytes
 .../urllib3/contrib/_appengine_environ.py     |   30 +
 .../urllib3/contrib/_appengine_environ.pyc    |  Bin 0 -> 1838 bytes
 .../contrib/_securetransport/__init__.py      |    0
 .../contrib/_securetransport/__init__.pyc     |  Bin 0 -> 223 bytes
 .../contrib/_securetransport/bindings.py      |  593 ++
 .../contrib/_securetransport/bindings.pyc     |  Bin 0 -> 12359 bytes
 .../contrib/_securetransport/low_level.py     |  346 +
 .../contrib/_securetransport/low_level.pyc    |  Bin 0 -> 10132 bytes
 .../pip/_vendor/urllib3/contrib/appengine.py  |  289 +
 .../pip/_vendor/urllib3/contrib/appengine.pyc |  Bin 0 -> 10129 bytes
 .../pip/_vendor/urllib3/contrib/ntlmpool.py   |  111 +
 .../pip/_vendor/urllib3/contrib/ntlmpool.pyc  |  Bin 0 -> 4173 bytes
 .../pip/_vendor/urllib3/contrib/pyopenssl.py  |  466 +
 .../pip/_vendor/urllib3/contrib/pyopenssl.pyc |  Bin 0 -> 19914 bytes
 .../urllib3/contrib/securetransport.py        |  804 ++
 .../urllib3/contrib/securetransport.pyc       |  Bin 0 -> 24494 bytes
 .../pip/_vendor/urllib3/contrib/socks.py      |  192 +
 .../pip/_vendor/urllib3/contrib/socks.pyc     |  Bin 0 -> 6298 bytes
 .../pip/_vendor/urllib3/exceptions.py         |  246 +
 .../pip/_vendor/urllib3/exceptions.pyc        |  Bin 0 -> 15502 bytes
 .../pip/_vendor/urllib3/fields.py             |  178 +
 .../pip/_vendor/urllib3/fields.pyc            |  Bin 0 -> 7346 bytes
 .../pip/_vendor/urllib3/filepost.py           |   98 +
 .../pip/_vendor/urllib3/filepost.pyc          |  Bin 0 -> 3780 bytes
 .../pip/_vendor/urllib3/packages/__init__.py  |    5 +
 .../pip/_vendor/urllib3/packages/__init__.pyc |  Bin 0 -> 369 bytes
 .../urllib3/packages/backports/__init__.py    |    0
 .../urllib3/packages/backports/__init__.pyc   |  Bin 0 -> 217 bytes
 .../urllib3/packages/backports/makefile.py    |   53 +
 .../urllib3/packages/backports/makefile.pyc   |  Bin 0 -> 1713 bytes
 .../pip/_vendor/urllib3/packages/six.py       |  868 ++
 .../pip/_vendor/urllib3/packages/six.pyc      |  Bin 0 -> 36102 bytes
 .../packages/ssl_match_hostname/__init__.py   |   19 +
 .../packages/ssl_match_hostname/__init__.pyc  |  Bin 0 -> 667 bytes
 .../ssl_match_hostname/_implementation.py     |  156 +
 .../ssl_match_hostname/_implementation.pyc    |  Bin 0 -> 4598 bytes
 .../pip/_vendor/urllib3/poolmanager.py        |  450 +
 .../pip/_vendor/urllib3/poolmanager.pyc       |  Bin 0 -> 16072 bytes
 .../pip/_vendor/urllib3/request.py            |  150 +
 .../pip/_vendor/urllib3/request.pyc           |  Bin 0 -> 6445 bytes
 .../pip/_vendor/urllib3/response.py           |  705 ++
 .../pip/_vendor/urllib3/response.pyc          |  Bin 0 -> 24614 bytes
 .../pip/_vendor/urllib3/util/__init__.py      |   54 +
 .../pip/_vendor/urllib3/util/__init__.pyc     |  Bin 0 -> 1324 bytes
 .../pip/_vendor/urllib3/util/connection.py    |  134 +
 .../pip/_vendor/urllib3/util/connection.pyc   |  Bin 0 -> 4192 bytes
 .../pip/_vendor/urllib3/util/queue.py         |   21 +
 .../pip/_vendor/urllib3/util/queue.pyc        |  Bin 0 -> 1665 bytes
 .../pip/_vendor/urllib3/util/request.py       |  118 +
 .../pip/_vendor/urllib3/util/request.pyc      |  Bin 0 -> 3945 bytes
 .../pip/_vendor/urllib3/util/response.py      |   87 +
 .../pip/_vendor/urllib3/util/response.pyc     |  Bin 0 -> 2583 bytes
 .../pip/_vendor/urllib3/util/retry.py         |  411 +
 .../pip/_vendor/urllib3/util/retry.pyc        |  Bin 0 -> 15622 bytes
 .../pip/_vendor/urllib3/util/ssl_.py          |  381 +
 .../pip/_vendor/urllib3/util/ssl_.pyc         |  Bin 0 -> 12270 bytes
 .../pip/_vendor/urllib3/util/timeout.py       |  242 +
 .../pip/_vendor/urllib3/util/timeout.pyc      |  Bin 0 -> 10233 bytes
 .../pip/_vendor/urllib3/util/url.py           |  230 +
 .../pip/_vendor/urllib3/util/url.pyc          |  Bin 0 -> 6901 bytes
 .../pip/_vendor/urllib3/util/wait.py          |  150 +
 .../pip/_vendor/urllib3/util/wait.pyc         |  Bin 0 -> 4842 bytes
 .../pip/_vendor/webencodings/__init__.py      |  342 +
 .../pip/_vendor/webencodings/__init__.pyc     |  Bin 0 -> 12364 bytes
 .../pip/_vendor/webencodings/labels.py        |  231 +
 .../pip/_vendor/webencodings/labels.pyc       |  Bin 0 -> 5361 bytes
 .../pip/_vendor/webencodings/mklabels.py      |   59 +
 .../pip/_vendor/webencodings/mklabels.pyc     |  Bin 0 -> 2486 bytes
 .../pip/_vendor/webencodings/tests.py         |  153 +
 .../pip/_vendor/webencodings/tests.pyc        |  Bin 0 -> 7345 bytes
 .../_vendor/webencodings/x_user_defined.py    |  325 +
 .../_vendor/webencodings/x_user_defined.pyc   |  Bin 0 -> 3842 bytes
 .../site-packages/pkg_resources/__init__.py   | 3286 +++++++
 .../site-packages/pkg_resources/__init__.pyc  |  Bin 0 -> 136262 bytes
 .../pkg_resources/_vendor/__init__.py         |    0
 .../pkg_resources/_vendor/__init__.pyc        |  Bin 0 -> 207 bytes
 .../pkg_resources/_vendor/appdirs.py          |  608 ++
 .../pkg_resources/_vendor/appdirs.pyc         |  Bin 0 -> 24286 bytes
 .../_vendor/packaging/__about__.py            |   21 +
 .../_vendor/packaging/__about__.pyc           |  Bin 0 -> 846 bytes
 .../_vendor/packaging/__init__.py             |   14 +
 .../_vendor/packaging/__init__.pyc            |  Bin 0 -> 668 bytes
 .../_vendor/packaging/_compat.py              |   30 +
 .../_vendor/packaging/_compat.pyc             |  Bin 0 -> 1472 bytes
 .../_vendor/packaging/_structures.py          |   68 +
 .../_vendor/packaging/_structures.pyc         |  Bin 0 -> 5370 bytes
 .../_vendor/packaging/markers.py              |  301 +
 .../_vendor/packaging/markers.pyc             |  Bin 0 -> 13957 bytes
 .../_vendor/packaging/requirements.py         |  127 +
 .../_vendor/packaging/requirements.pyc        |  Bin 0 -> 5683 bytes
 .../_vendor/packaging/specifiers.py           |  774 ++
 .../_vendor/packaging/specifiers.pyc          |  Bin 0 -> 29374 bytes
 .../pkg_resources/_vendor/packaging/utils.py  |   14 +
 .../pkg_resources/_vendor/packaging/utils.pyc |  Bin 0 -> 708 bytes
 .../_vendor/packaging/version.py              |  393 +
 .../_vendor/packaging/version.pyc             |  Bin 0 -> 17235 bytes
 .../pkg_resources/_vendor/pyparsing.py        | 5742 ++++++++++++
 .../pkg_resources/_vendor/pyparsing.pyc       |  Bin 0 -> 260224 bytes
 .../pkg_resources/_vendor/six.py              |  868 ++
 .../pkg_resources/_vendor/six.pyc             |  Bin 0 -> 36102 bytes
 .../pkg_resources/extern/__init__.py          |   73 +
 .../pkg_resources/extern/__init__.pyc         |  Bin 0 -> 3325 bytes
 .../site-packages/pkg_resources/py31compat.py |   23 +
 .../pkg_resources/py31compat.pyc              |  Bin 0 -> 866 bytes
 .../setuptools-41.0.1.dist-info/INSTALLER     |    1 +
 .../setuptools-41.0.1.dist-info/LICENSE       |   19 +
 .../setuptools-41.0.1.dist-info/METADATA      |   77 +
 .../setuptools-41.0.1.dist-info/RECORD        |  186 +
 .../setuptools-41.0.1.dist-info/WHEEL         |    6 +
 .../dependency_links.txt                      |    2 +
 .../entry_points.txt                          |   65 +
 .../setuptools-41.0.1.dist-info/top_level.txt |    3 +
 .../setuptools-41.0.1.dist-info/zip-safe      |    1 +
 .../site-packages/setuptools/__init__.py      |  228 +
 .../site-packages/setuptools/__init__.pyc     |  Bin 0 -> 10541 bytes
 .../setuptools/_deprecation_warning.py        |    7 +
 .../setuptools/_deprecation_warning.pyc       |  Bin 0 -> 690 bytes
 .../setuptools/_vendor/__init__.py            |    0
 .../setuptools/_vendor/__init__.pyc           |  Bin 0 -> 204 bytes
 .../setuptools/_vendor/packaging/__about__.py |   21 +
 .../_vendor/packaging/__about__.pyc           |  Bin 0 -> 843 bytes
 .../setuptools/_vendor/packaging/__init__.py  |   14 +
 .../setuptools/_vendor/packaging/__init__.pyc |  Bin 0 -> 665 bytes
 .../setuptools/_vendor/packaging/_compat.py   |   30 +
 .../setuptools/_vendor/packaging/_compat.pyc  |  Bin 0 -> 1460 bytes
 .../_vendor/packaging/_structures.py          |   68 +
 .../_vendor/packaging/_structures.pyc         |  Bin 0 -> 5307 bytes
 .../setuptools/_vendor/packaging/markers.py   |  301 +
 .../setuptools/_vendor/packaging/markers.pyc  |  Bin 0 -> 13849 bytes
 .../_vendor/packaging/requirements.py         |  127 +
 .../_vendor/packaging/requirements.pyc        |  Bin 0 -> 5650 bytes
 .../_vendor/packaging/specifiers.py           |  774 ++
 .../_vendor/packaging/specifiers.pyc          |  Bin 0 -> 29161 bytes
 .../setuptools/_vendor/packaging/utils.py     |   14 +
 .../setuptools/_vendor/packaging/utils.pyc    |  Bin 0 -> 702 bytes
 .../setuptools/_vendor/packaging/version.py   |  393 +
 .../setuptools/_vendor/packaging/version.pyc  |  Bin 0 -> 17088 bytes
 .../setuptools/_vendor/pyparsing.py           | 5742 ++++++++++++
 .../setuptools/_vendor/pyparsing.pyc          |  Bin 0 -> 258913 bytes
 .../site-packages/setuptools/_vendor/six.py   |  868 ++
 .../site-packages/setuptools/_vendor/six.pyc  |  Bin 0 -> 35865 bytes
 .../site-packages/setuptools/archive_util.py  |  173 +
 .../site-packages/setuptools/archive_util.pyc |  Bin 0 -> 6574 bytes
 .../site-packages/setuptools/build_meta.py    |  254 +
 .../site-packages/setuptools/build_meta.pyc   |  Bin 0 -> 10676 bytes
 .../site-packages/setuptools/cli-32.exe       |  Bin 0 -> 65536 bytes
 .../site-packages/setuptools/cli-64.exe       |  Bin 0 -> 74752 bytes
 .../site-packages/setuptools/cli.exe          |  Bin 0 -> 65536 bytes
 .../setuptools/command/__init__.py            |   18 +
 .../setuptools/command/__init__.pyc           |  Bin 0 -> 936 bytes
 .../site-packages/setuptools/command/alias.py |   80 +
 .../setuptools/command/alias.pyc              |  Bin 0 -> 3476 bytes
 .../setuptools/command/bdist_egg.py           |  502 +
 .../setuptools/command/bdist_egg.pyc          |  Bin 0 -> 19784 bytes
 .../setuptools/command/bdist_rpm.py           |   43 +
 .../setuptools/command/bdist_rpm.pyc          |  Bin 0 -> 2130 bytes
 .../setuptools/command/bdist_wininst.py       |   21 +
 .../setuptools/command/bdist_wininst.pyc      |  Bin 0 -> 1407 bytes
 .../setuptools/command/build_clib.py          |   98 +
 .../setuptools/command/build_clib.pyc         |  Bin 0 -> 3006 bytes
 .../setuptools/command/build_ext.py           |  321 +
 .../setuptools/command/build_ext.pyc          |  Bin 0 -> 13452 bytes
 .../setuptools/command/build_py.py            |  270 +
 .../setuptools/command/build_py.pyc           |  Bin 0 -> 11963 bytes
 .../setuptools/command/develop.py             |  221 +
 .../setuptools/command/develop.pyc            |  Bin 0 -> 8724 bytes
 .../setuptools/command/dist_info.py           |   36 +
 .../setuptools/command/dist_info.pyc          |  Bin 0 -> 2069 bytes
 .../setuptools/command/easy_install.py        | 2342 +++++
 .../setuptools/command/easy_install.pyc       |  Bin 0 -> 87905 bytes
 .../setuptools/command/egg_info.py            |  717 ++
 .../setuptools/command/egg_info.pyc           |  Bin 0 -> 29768 bytes
 .../setuptools/command/install.py             |  125 +
 .../setuptools/command/install.pyc            |  Bin 0 -> 5493 bytes
 .../setuptools/command/install_egg_info.py    |   62 +
 .../setuptools/command/install_egg_info.pyc   |  Bin 0 -> 3617 bytes
 .../setuptools/command/install_lib.py         |  121 +
 .../setuptools/command/install_lib.pyc        |  Bin 0 -> 5518 bytes
 .../setuptools/command/install_scripts.py     |   65 +
 .../setuptools/command/install_scripts.pyc    |  Bin 0 -> 3161 bytes
 .../setuptools/command/launcher manifest.xml  |   15 +
 .../setuptools/command/py36compat.py          |  136 +
 .../setuptools/command/py36compat.pyc         |  Bin 0 -> 6198 bytes
 .../setuptools/command/register.py            |   18 +
 .../setuptools/command/register.pyc           |  Bin 0 -> 1080 bytes
 .../setuptools/command/rotate.py              |   66 +
 .../setuptools/command/rotate.pyc             |  Bin 0 -> 3306 bytes
 .../setuptools/command/saveopts.py            |   22 +
 .../setuptools/command/saveopts.pyc           |  Bin 0 -> 1291 bytes
 .../site-packages/setuptools/command/sdist.py |  221 +
 .../setuptools/command/sdist.pyc              |  Bin 0 -> 9475 bytes
 .../setuptools/command/setopt.py              |  149 +
 .../setuptools/command/setopt.pyc             |  Bin 0 -> 6590 bytes
 .../site-packages/setuptools/command/test.py  |  271 +
 .../site-packages/setuptools/command/test.pyc |  Bin 0 -> 11758 bytes
 .../setuptools/command/upload.py              |  196 +
 .../setuptools/command/upload.pyc             |  Bin 0 -> 6906 bytes
 .../setuptools/command/upload_docs.py         |  206 +
 .../setuptools/command/upload_docs.pyc        |  Bin 0 -> 8436 bytes
 .../site-packages/setuptools/config.py        |  656 ++
 .../site-packages/setuptools/config.pyc       |  Bin 0 -> 22827 bytes
 .../site-packages/setuptools/dep_util.py      |   23 +
 .../site-packages/setuptools/dep_util.pyc     |  Bin 0 -> 1073 bytes
 .../site-packages/setuptools/depends.py       |  186 +
 .../site-packages/setuptools/depends.pyc      |  Bin 0 -> 7131 bytes
 .../site-packages/setuptools/dist.py          | 1278 +++
 .../site-packages/setuptools/dist.pyc         |  Bin 0 -> 51496 bytes
 .../site-packages/setuptools/extension.py     |   57 +
 .../site-packages/setuptools/extension.pyc    |  Bin 0 -> 2742 bytes
 .../setuptools/extern/__init__.py             |   73 +
 .../setuptools/extern/__init__.pyc            |  Bin 0 -> 3302 bytes
 .../site-packages/setuptools/glibc.py         |   86 +
 .../site-packages/setuptools/glibc.pyc        |  Bin 0 -> 2230 bytes
 .../site-packages/setuptools/glob.py          |  174 +
 .../site-packages/setuptools/glob.pyc         |  Bin 0 -> 5311 bytes
 .../site-packages/setuptools/gui-32.exe       |  Bin 0 -> 65536 bytes
 .../site-packages/setuptools/gui-64.exe       |  Bin 0 -> 75264 bytes
 .../site-packages/setuptools/gui.exe          |  Bin 0 -> 65536 bytes
 .../site-packages/setuptools/launch.py        |   35 +
 .../site-packages/setuptools/launch.pyc       |  Bin 0 -> 1108 bytes
 .../site-packages/setuptools/lib2to3_ex.py    |   62 +
 .../site-packages/setuptools/lib2to3_ex.pyc   |  Bin 0 -> 3490 bytes
 .../site-packages/setuptools/monkey.py        |  179 +
 .../site-packages/setuptools/monkey.pyc       |  Bin 0 -> 6451 bytes
 .../site-packages/setuptools/msvc.py          | 1301 +++
 .../site-packages/setuptools/msvc.pyc         |  Bin 0 -> 44714 bytes
 .../site-packages/setuptools/namespaces.py    |  107 +
 .../site-packages/setuptools/namespaces.pyc   |  Bin 0 -> 5681 bytes
 .../site-packages/setuptools/package_index.py | 1136 +++
 .../setuptools/package_index.pyc              |  Bin 0 -> 44733 bytes
 .../site-packages/setuptools/pep425tags.py    |  319 +
 .../site-packages/setuptools/pep425tags.pyc   |  Bin 0 -> 10272 bytes
 .../site-packages/setuptools/py27compat.py    |   28 +
 .../site-packages/setuptools/py27compat.pyc   |  Bin 0 -> 1261 bytes
 .../site-packages/setuptools/py31compat.py    |   32 +
 .../site-packages/setuptools/py31compat.pyc   |  Bin 0 -> 1712 bytes
 .../site-packages/setuptools/py33compat.py    |   55 +
 .../site-packages/setuptools/py33compat.pyc   |  Bin 0 -> 1962 bytes
 .../site-packages/setuptools/sandbox.py       |  491 +
 .../site-packages/setuptools/sandbox.pyc      |  Bin 0 -> 21816 bytes
 .../setuptools/script (dev).tmpl              |    6 +
 .../site-packages/setuptools/script.tmpl      |    3 +
 .../site-packages/setuptools/site-patch.py    |   74 +
 .../site-packages/setuptools/site-patch.pyc   |  Bin 0 -> 1847 bytes
 .../site-packages/setuptools/ssl_support.py   |  260 +
 .../site-packages/setuptools/ssl_support.pyc  |  Bin 0 -> 9597 bytes
 .../site-packages/setuptools/unicode_utils.py |   44 +
 .../setuptools/unicode_utils.pyc              |  Bin 0 -> 1688 bytes
 .../site-packages/setuptools/version.py       |    6 +
 .../site-packages/setuptools/version.pyc      |  Bin 0 -> 376 bytes
 .../site-packages/setuptools/wheel.py         |  211 +
 .../site-packages/setuptools/wheel.pyc        |  Bin 0 -> 9839 bytes
 .../setuptools/windows_support.py             |   29 +
 .../setuptools/windows_support.pyc            |  Bin 0 -> 1490 bytes
 .../wheel-0.33.1.dist-info/INSTALLER          |    1 +
 .../wheel-0.33.1.dist-info/LICENSE.txt        |   22 +
 .../wheel-0.33.1.dist-info/METADATA           |   60 +
 .../wheel-0.33.1.dist-info/RECORD             |   32 +
 .../wheel-0.33.1.dist-info/WHEEL              |    6 +
 .../wheel-0.33.1.dist-info/entry_points.txt   |    6 +
 .../wheel-0.33.1.dist-info/top_level.txt      |    1 +
 .../python2.7/site-packages/wheel/__init__.py |    2 +
 .../site-packages/wheel/__init__.pyc          |  Bin 0 -> 219 bytes
 .../python2.7/site-packages/wheel/__main__.py |   19 +
 .../site-packages/wheel/__main__.pyc          |  Bin 0 -> 811 bytes
 .../site-packages/wheel/bdist_wheel.py        |  372 +
 .../site-packages/wheel/bdist_wheel.pyc       |  Bin 0 -> 14280 bytes
 .../site-packages/wheel/cli/__init__.py       |   88 +
 .../site-packages/wheel/cli/__init__.pyc      |  Bin 0 -> 4405 bytes
 .../site-packages/wheel/cli/convert.py        |  269 +
 .../site-packages/wheel/cli/convert.pyc       |  Bin 0 -> 7962 bytes
 .../python2.7/site-packages/wheel/cli/pack.py |   58 +
 .../site-packages/wheel/cli/pack.pyc          |  Bin 0 -> 3102 bytes
 .../site-packages/wheel/cli/unpack.py         |   25 +
 .../site-packages/wheel/cli/unpack.pyc        |  Bin 0 -> 1182 bytes
 .../python2.7/site-packages/wheel/metadata.py |  141 +
 .../site-packages/wheel/metadata.pyc          |  Bin 0 -> 5114 bytes
 .../site-packages/wheel/pep425tags.py         |  185 +
 .../site-packages/wheel/pep425tags.pyc        |  Bin 0 -> 6669 bytes
 .../python2.7/site-packages/wheel/pkginfo.py  |   43 +
 .../python2.7/site-packages/wheel/pkginfo.pyc |  Bin 0 -> 2403 bytes
 .../lib/python2.7/site-packages/wheel/util.py |   46 +
 .../python2.7/site-packages/wheel/util.pyc    |  Bin 0 -> 2061 bytes
 .../site-packages/wheel/wheelfile.py          |  168 +
 .../site-packages/wheel/wheelfile.pyc         |  Bin 0 -> 7456 bytes
 venv/lib/python2.7/site.py                    |  758 ++
 venv/lib/python2.7/site.pyc                   |  Bin 0 -> 24823 bytes
 venv/lib/python2.7/sre.py                     |    1 +
 venv/lib/python2.7/sre_compile.py             |    1 +
 venv/lib/python2.7/sre_constants.py           |    1 +
 venv/lib/python2.7/sre_parse.py               |    1 +
 venv/lib/python2.7/stat.py                    |    1 +
 venv/lib/python2.7/stat.pyc                   |  Bin 0 -> 2991 bytes
 venv/lib/python2.7/types.py                   |    1 +
 venv/lib/python2.7/types.pyc                  |  Bin 0 -> 2893 bytes
 venv/lib/python2.7/warnings.py                |    1 +
 venv/lib/python2.7/warnings.pyc               |  Bin 0 -> 14062 bytes
 venv/pip-selfcheck.json                       |    1 +
 942 files changed, 148480 insertions(+), 6 deletions(-)
 create mode 100644 eraser.iml
 create mode 100644 eraser.spark/out/production/resources/log4j2.xml
 create mode 100644 eraser.starter/out/production/resources/log4j2.xml
 create mode 100644 eraser.starter/out/production/resources/preference.eg
 create mode 100644 eraser.starter/out/production/resources/skywriter-hue.eraser
 create mode 100644 eraser.starter/out/production/resources/starter.eraser
 create mode 100644 feedbackloop.analyze/out/production/resources/log4j2.xml
 create mode 100644 feedbackloop.api/out/production/resources/log4j2.xml
 create mode 100644 feedbackloop.execute/out/production/resources/log4j2.xml
 create mode 100644 feedbackloop.learner/out/production/resources/1.eg
 create mode 100644 feedbackloop.learner/out/production/resources/NN_1
 create mode 100644 feedbackloop.learner/out/production/resources/initial_data.csv
 create mode 100644 feedbackloop.learner/out/production/resources/log4j2.xml
 rename feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/{MachineLearningEncoderImpl.java => MachineLearningImpl.java} (91%)
 create mode 100644 feedbackloop.main/out/production/resources/log4j2.xml
 create mode 100644 feedbackloop.main/out/production/resources/skywriter-hue.eraser
 create mode 100644 feedbackloop.monitor/out/production/resources/log4j2.xml
 create mode 100644 feedbackloop.plan/out/production/resources/log4j2.xml
 create mode 100644 influx_test/out/production/resources/log4j2.xml
 create mode 100644 integration/out/production/resources/openhab2-data.json
 create mode 100644 learner_test/.gitignore
 create mode 100644 learner_test/build.gradle
 create mode 100644 learner_test/out/production/resources/log4j2.xml
 create mode 100644 learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java
 create mode 100644 learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv
 create mode 100644 learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg
 create mode 100644 learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg
 create mode 100644 learner_test/src/main/resources/log4j2.xml
 create mode 100644 learner_test/src/test/java/de/tudresden/inf/st/eraser/learner_test/ATest.java
 create mode 100644 ml_test/out/production/resources/log4j2.xml
 create mode 100644 ml_test_boqi/.gitignore
 create mode 100644 ml_test_boqi/build.gradle
 create mode 100644 ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java
 create mode 100644 ml_test_boqi/src/main/resources/log4j2.xml
 create mode 100644 ml_test_boqi/src/test/java/de/tudresden/inf/st/eraser/ml_test_boqi/ATest.java
 create mode 100644 openhab-mock/out/production/resources/data1.csv
 create mode 100644 openhab-mock/out/production/resources/log4j2.xml
 create mode 100644 org.openhab.action.machinelearn/out/production/resources/readme.txt
 create mode 100644 org.openlicht.action.reinforcementlearning/out/production/resources/readme.txt
 create mode 100644 skywriter-hue-integration/out/production/resources/log4j2.xml
 create mode 100644 skywriter-hue-integration/out/production/resources/skywriter-hue.eraser
 create mode 100644 skywriter-hue-integration/out/production/resources/smart_arrive.eraser
 create mode 100644 skywriter-hue-integration/src/main/resources/smart_arrive.eraser
 create mode 100644 smart_ankunft_integration/.gitignore
 create mode 100644 smart_ankunft_integration/build.gradle
 create mode 100644 smart_ankunft_integration/src/main/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/Main.java
 create mode 100644 smart_ankunft_integration/src/main/resources/log4j2.xml
 create mode 100644 smart_ankunft_integration/src/main/resources/smart_ankunft.eraser
 create mode 100644 smart_ankunft_integration/src/test/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/ATest.java
 create mode 100644 stub.org.openhab.core.scriptengine.action/out/production/resources/log4j2.xml
 create mode 120000 venv/.Python
 create mode 100644 venv/bin/activate
 create mode 100644 venv/bin/activate.csh
 create mode 100644 venv/bin/activate.fish
 create mode 100644 venv/bin/activate_this.py
 create mode 100755 venv/bin/easy_install
 create mode 100755 venv/bin/easy_install-2.7
 create mode 100755 venv/bin/pip
 create mode 100755 venv/bin/pip2
 create mode 100755 venv/bin/pip2.7
 create mode 120000 venv/bin/python
 create mode 100755 venv/bin/python-config
 create mode 120000 venv/bin/python2
 create mode 100755 venv/bin/python2.7
 create mode 100755 venv/bin/wheel
 create mode 120000 venv/include/python2.7
 create mode 120000 venv/lib/python2.7/UserDict.py
 create mode 100644 venv/lib/python2.7/UserDict.pyc
 create mode 120000 venv/lib/python2.7/_abcoll.py
 create mode 100644 venv/lib/python2.7/_abcoll.pyc
 create mode 120000 venv/lib/python2.7/_weakrefset.py
 create mode 100644 venv/lib/python2.7/_weakrefset.pyc
 create mode 120000 venv/lib/python2.7/abc.py
 create mode 100644 venv/lib/python2.7/abc.pyc
 create mode 120000 venv/lib/python2.7/codecs.py
 create mode 100644 venv/lib/python2.7/codecs.pyc
 create mode 120000 venv/lib/python2.7/config
 create mode 120000 venv/lib/python2.7/copy_reg.py
 create mode 100644 venv/lib/python2.7/copy_reg.pyc
 create mode 100644 venv/lib/python2.7/distutils/__init__.py
 create mode 100644 venv/lib/python2.7/distutils/distutils.cfg
 create mode 120000 venv/lib/python2.7/encodings
 create mode 120000 venv/lib/python2.7/fnmatch.py
 create mode 120000 venv/lib/python2.7/genericpath.py
 create mode 100644 venv/lib/python2.7/genericpath.pyc
 create mode 120000 venv/lib/python2.7/lib-dynload
 create mode 120000 venv/lib/python2.7/linecache.py
 create mode 100644 venv/lib/python2.7/linecache.pyc
 create mode 120000 venv/lib/python2.7/locale.py
 create mode 100644 venv/lib/python2.7/no-global-site-packages.txt
 create mode 120000 venv/lib/python2.7/ntpath.py
 create mode 100644 venv/lib/python2.7/orig-prefix.txt
 create mode 120000 venv/lib/python2.7/os.py
 create mode 100644 venv/lib/python2.7/os.pyc
 create mode 120000 venv/lib/python2.7/posixpath.py
 create mode 100644 venv/lib/python2.7/posixpath.pyc
 create mode 120000 venv/lib/python2.7/re.py
 create mode 100644 venv/lib/python2.7/site-packages/easy_install.py
 create mode 100644 venv/lib/python2.7/site-packages/easy_install.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/INSTALLER
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/METADATA
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt
 create mode 100644 venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt
 create mode 100644 venv/lib/python2.7/site-packages/pip/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/__main__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/__main__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/build_env.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cache.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cache.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/check.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/download.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/help.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/install.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/list.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/search.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/show.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/configuration.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/download.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/download.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/exceptions.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/locations.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/locations.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/index.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/link.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/check.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pep425tags.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pyproject.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_file.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolve.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolve.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/misc.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/models.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/wheel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/wheel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distro.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/retrying.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/six.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/six.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py
 create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/py31compat.py
 create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt
 create mode 100644 venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/six.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/archive_util.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/archive_util.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/build_meta.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/build_meta.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/cli-32.exe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/cli-64.exe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/cli.exe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/alias.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/alias.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_clib.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_ext.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_py.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/develop.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/develop.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/dist_info.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/easy_install.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/egg_info.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_lib.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/py36compat.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/register.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/register.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/rotate.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/saveopts.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/sdist.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/setopt.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/test.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/test.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/config.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/config.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/dep_util.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/dep_util.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/depends.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/depends.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/dist.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/dist.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/extension.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/extension.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/extern/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/glibc.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/glibc.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/glob.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/glob.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/gui-32.exe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/gui-64.exe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/gui.exe
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/launch.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/launch.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/monkey.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/monkey.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/msvc.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/msvc.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/namespaces.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/namespaces.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/package_index.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/package_index.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/pep425tags.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/pep425tags.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/py27compat.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/py27compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/py31compat.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/py31compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/py33compat.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/py33compat.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/sandbox.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/sandbox.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/script (dev).tmpl
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/script.tmpl
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/site-patch.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/site-patch.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/ssl_support.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/unicode_utils.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/version.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/version.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/wheel.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/wheel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/windows_support.py
 create mode 100644 venv/lib/python2.7/site-packages/setuptools/windows_support.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/INSTALLER
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/METADATA
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/RECORD
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/WHEEL
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt
 create mode 100644 venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/top_level.txt
 create mode 100644 venv/lib/python2.7/site-packages/wheel/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/__main__.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/__main__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/bdist_wheel.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/bdist_wheel.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/__init__.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/__init__.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/convert.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/convert.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/pack.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/pack.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/unpack.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/unpack.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/metadata.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/metadata.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/pep425tags.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/pep425tags.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/pkginfo.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/pkginfo.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/util.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/util.pyc
 create mode 100644 venv/lib/python2.7/site-packages/wheel/wheelfile.py
 create mode 100644 venv/lib/python2.7/site-packages/wheel/wheelfile.pyc
 create mode 100644 venv/lib/python2.7/site.py
 create mode 100644 venv/lib/python2.7/site.pyc
 create mode 120000 venv/lib/python2.7/sre.py
 create mode 120000 venv/lib/python2.7/sre_compile.py
 create mode 120000 venv/lib/python2.7/sre_constants.py
 create mode 120000 venv/lib/python2.7/sre_parse.py
 create mode 120000 venv/lib/python2.7/stat.py
 create mode 100644 venv/lib/python2.7/stat.pyc
 create mode 120000 venv/lib/python2.7/types.py
 create mode 100644 venv/lib/python2.7/types.pyc
 create mode 120000 venv/lib/python2.7/warnings.py
 create mode 100644 venv/lib/python2.7/warnings.pyc
 create mode 100644 venv/pip-selfcheck.json

diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java
index 2c59f46c..e642279c 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java
@@ -27,12 +27,12 @@ public class InternalMachineLearningHandler implements MachineLearningEncoder, M
   }
 
   @Override
-  public List<Item> getTargets() {
+  public List<Item> getTargets(Root model) {
     return model.getTargetItems();
   }
 
   @Override
-  public List<Item> getRelevantItems() {
+  public List<Item> getRelevantItems(Root model) {
     return model.getRelevantItems();
   }
 
diff --git a/eraser.iml b/eraser.iml
new file mode 100644
index 00000000..1cd15ad5
--- /dev/null
+++ b/eraser.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4">
+  <component name="FacetManager">
+    <facet type="Python" name="Python">
+      <configuration sdkName="" />
+    </facet>
+  </component>
+</module>
\ No newline at end of file
diff --git a/eraser.spark/out/production/resources/log4j2.xml b/eraser.spark/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/eraser.spark/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/eraser.starter/out/production/resources/log4j2.xml b/eraser.starter/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..900e8c30
--- /dev/null
+++ b/eraser.starter/out/production/resources/log4j2.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+        <Logger name="org.eclipse.jetty" level="info" additivity="false">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Logger>
+    </Loggers>
+</Configuration>
diff --git a/eraser.starter/out/production/resources/preference.eg b/eraser.starter/out/production/resources/preference.eg
new file mode 100644
index 00000000..9c5e508c
--- /dev/null
+++ b/eraser.starter/out/production/resources/preference.eg
@@ -0,0 +1,24 @@
+encog,BasicNetwork,java,3.4.0,1,1548842414446
+[BASIC]
+[BASIC:PARAMS]
+[BASIC:NETWORK]
+beginTraining=0
+connectionLimit=0
+contextTargetOffset=0,0,0
+contextTargetSize=0,0,0
+endTraining=2
+hasContext=f
+inputCount=4
+layerCounts=4,8,5
+layerFeedCounts=4,7,4
+layerContextCount=0,0,0
+layerIndex=0,4,12
+output=0.5121833792,-0.9601322536,-0.8758172535,-0.9979697503,0.9622664202,-0.9999734797,0.1592770336,0.799331477,-0.4541506621,0.9665504755,0.9965543485,1,0,0.9333333333,-0.2727272727,0.3898305085,1
+outputCount=4
+weightIndex=0,32,67
+weights=-1.0786840029,-2.2924792202,-1.9930859783,1.7958491576,0.1959961268,-2.0543645855,0.0362033078,0.2318024444,0.6379648215,0.6228614294,0.6327962466,1.4938586483,2.7154918438,-0.6821478373,-0.5520417752,-0.790812791,-0.6920871265,1.9974666857,2.3298834154,0.4485384863,-2.6899092835,0.031268515,-0.5795866919,-0.0980217125,-0.484143335,0.1511539927,0.420087673,-2.5050298291,0.2594955046,-1.095053346,1.3237034623,-1.0362683252,-1.4462851652,0.3753510899,-1.601258201,2.069584469,0.3818308747,1.9103650822,-1.0462844546,17.7814469175,0.6795954934,-0.0542764038,0.9582859267,0.3301209469,0.1352880767,0.0400876451,-0.1261986993,0.5055884018,0.6447792243,2.3674963793,1.1415287221,0.6956421989,0.3954445374,-0.0968051838,-5.3921438906,-1.0800675361,-1.4491070517,0.299983963,0.4432921269,-0.1229873384,0.3763334954,1.4430117456,2.3128771304,2.6904772398,-0.2334282302,2.656365234,-0.429273975
+biasActivation=0,1,1
+[BASIC:ACTIVATION]
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationLinear"
diff --git a/eraser.starter/out/production/resources/skywriter-hue.eraser b/eraser.starter/out/production/resources/skywriter-hue.eraser
new file mode 100644
index 00000000..b32c7a11
--- /dev/null
+++ b/eraser.starter/out/production/resources/skywriter-hue.eraser
@@ -0,0 +1,44 @@
+ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ;
+ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ;
+ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[];
+ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ;
+
+Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ;
+Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ;
+Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ;
+Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ;
+Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ;
+
+ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ;
+ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="Unknown" ;
+ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ;
+ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ;
+ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ;
+ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ;
+ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ;
+
+Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ;
+Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ;
+Channel: id="skywriter1-flick" type="flick-type" links=[];
+Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"];
+Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"];
+
+Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state";
+Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x";
+Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y";
+Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz";
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"];
+
+Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the &lt;broker&gt;.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ;
+
+// MqttHost is set programmatically
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" ;
diff --git a/eraser.starter/out/production/resources/starter.eraser b/eraser.starter/out/production/resources/starter.eraser
new file mode 100644
index 00000000..25505fe2
--- /dev/null
+++ b/eraser.starter/out/production/resources/starter.eraser
@@ -0,0 +1,28 @@
+Color Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item";
+Number Item: id="datetime_month" label="Month" state="1" topic="datetime_month";
+Number Item: id="datetime_day" label="Day" state="31" topic="datetime_day";
+Number Item: id="datetime_hour" label="Hour" state="13" topic="datetime_hour";
+Number Item: id="datetime_minute" label="Minute" state="37" topic="datetime_minute";
+Number Item: id="bias" label="bias item" state="1" ;
+Activity Item: id="activity" ;
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Datetime" items=["datetime_month", "datetime_day", "datetime_hour", "datetime_minute"];
+
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" host="localhost:2883" ;
+//Mqtt: incoming="oh2/out/" outgoing="oh2/in/" host="192.168.1.250" ;
+
+Influx: host="172.22.1.152" ;
+
+ML: activities={
+  0: "Open door in empty room",
+  1: "Door closed in empty room",
+  2: "Open door with person in room",
+  3: "Door closed with person in room",
+  4: "Working",
+  5: "Watch TV",
+  6: "Reading",
+  7: "Listening to music",
+  8: "Going to sleep",
+  9: "Wake up"
+} ;
diff --git a/feedbackloop.analyze/out/production/resources/log4j2.xml b/feedbackloop.analyze/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.analyze/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/feedbackloop.api/out/production/resources/log4j2.xml b/feedbackloop.api/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.api/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/feedbackloop.execute/out/production/resources/log4j2.xml b/feedbackloop.execute/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.execute/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/feedbackloop.learner/out/production/resources/1.eg b/feedbackloop.learner/out/production/resources/1.eg
new file mode 100644
index 00000000..03f16b27
--- /dev/null
+++ b/feedbackloop.learner/out/production/resources/1.eg
@@ -0,0 +1,24 @@
+encog,BasicNetwork,java,3.4.0,1,1549011876959
+[BASIC]
+[BASIC:PARAMS]
+[BASIC:NETWORK]
+beginTraining=0
+connectionLimit=0
+contextTargetOffset=0,0,0
+contextTargetSize=0,0,0
+endTraining=2
+hasContext=f
+inputCount=4
+layerCounts=4,8,5
+layerFeedCounts=4,7,4
+layerContextCount=0,0,0
+layerIndex=0,4,12
+output=0.7897697775,-0.4093295807,-0.9998836757,-1,0.8474456805,-0.2366377403,-0.9973602461,-0.9999999955,-0.4764290146,0.461275072,-0.0649442099,1,0,-0.6666666667,-0.4545454545,0.6949152542,1
+outputCount=4
+weightIndex=0,32,67
+weights=-1.1570349988,-0.8578879992,-1.0549159925,-3.7244521995,0.9574302229,-2.0931447828,0.896591315,-1.4483568363,1.4900254439,0.7366819855,0.6613521579,-0.609388338,-2.5552763401,1.2462544768,-0.6792334441,-3.3093626419,-2.155033701,-3.0549866186,-4.46456694,6.3689156226,-0.7553336123,-4.3167151702,-0.2075796591,-0.2387765659,-5.3558179654,0.3870219651,2.1254188856,-0.8070693427,16.3409581377,-0.0181269232,-3.5894371967,-0.6128690116,18.1886181385,-2.1919701152,0.7652143515,-0.5972333161,0.5485570992,2.8445160284,-3.1372144242,-6.0940916584,-12.1412546646,3.3344157392,-1.5344530226,4.1146550246,1.3873868104,1.3560253856,-0.8830370237,3.4646973293,0.45451005,19.2628819453,-1.4746031138,0.1239027404,0.5654616795,-0.3474956993,-0.7700441522,-0.2617909991,-0.9181158122,0.2756671819,0.0437957183,-7.3920564965,-0.4480327205,-2.520553979,-1.2363459836,-0.7189965057,1.2558119854,-0.5462053441,0.4060233037
+biasActivation=0,1,1
+[BASIC:ACTIVATION]
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationLinear"
diff --git a/feedbackloop.learner/out/production/resources/NN_1 b/feedbackloop.learner/out/production/resources/NN_1
new file mode 100644
index 00000000..03f16b27
--- /dev/null
+++ b/feedbackloop.learner/out/production/resources/NN_1
@@ -0,0 +1,24 @@
+encog,BasicNetwork,java,3.4.0,1,1549011876959
+[BASIC]
+[BASIC:PARAMS]
+[BASIC:NETWORK]
+beginTraining=0
+connectionLimit=0
+contextTargetOffset=0,0,0
+contextTargetSize=0,0,0
+endTraining=2
+hasContext=f
+inputCount=4
+layerCounts=4,8,5
+layerFeedCounts=4,7,4
+layerContextCount=0,0,0
+layerIndex=0,4,12
+output=0.7897697775,-0.4093295807,-0.9998836757,-1,0.8474456805,-0.2366377403,-0.9973602461,-0.9999999955,-0.4764290146,0.461275072,-0.0649442099,1,0,-0.6666666667,-0.4545454545,0.6949152542,1
+outputCount=4
+weightIndex=0,32,67
+weights=-1.1570349988,-0.8578879992,-1.0549159925,-3.7244521995,0.9574302229,-2.0931447828,0.896591315,-1.4483568363,1.4900254439,0.7366819855,0.6613521579,-0.609388338,-2.5552763401,1.2462544768,-0.6792334441,-3.3093626419,-2.155033701,-3.0549866186,-4.46456694,6.3689156226,-0.7553336123,-4.3167151702,-0.2075796591,-0.2387765659,-5.3558179654,0.3870219651,2.1254188856,-0.8070693427,16.3409581377,-0.0181269232,-3.5894371967,-0.6128690116,18.1886181385,-2.1919701152,0.7652143515,-0.5972333161,0.5485570992,2.8445160284,-3.1372144242,-6.0940916584,-12.1412546646,3.3344157392,-1.5344530226,4.1146550246,1.3873868104,1.3560253856,-0.8830370237,3.4646973293,0.45451005,19.2628819453,-1.4746031138,0.1239027404,0.5654616795,-0.3474956993,-0.7700441522,-0.2617909991,-0.9181158122,0.2756671819,0.0437957183,-7.3920564965,-0.4480327205,-2.520553979,-1.2363459836,-0.7189965057,1.2558119854,-0.5462053441,0.4060233037
+biasActivation=0,1,1
+[BASIC:ACTIVATION]
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationLinear"
diff --git a/feedbackloop.learner/out/production/resources/initial_data.csv b/feedbackloop.learner/out/production/resources/initial_data.csv
new file mode 100644
index 00000000..12c125ce
--- /dev/null
+++ b/feedbackloop.learner/out/production/resources/initial_data.csv
@@ -0,0 +1,418 @@
+7,20,12,13,2
+7,20,14,40,1
+7,20,14,40,2
+7,21,13,2,2
+7,21,13,2,2
+7,21,14,23,2
+7,21,14,23,2
+7,21,15,41,2
+7,21,16,54,2
+7,21,16,54,2
+7,21,17,45,3
+7,22,12,28,3
+7,22,15,35,2
+7,22,15,35,2
+7,22,18,59,3
+7,22,18,59,3
+7,23,12,32,2
+7,23,12,32,2
+7,23,16,7,2
+7,23,16,7,2
+7,23,16,7,2
+7,23,16,7,2
+7,23,16,7,2
+7,24,12,4,0
+7,24,12,4,0
+7,24,12,4,1
+7,24,14,38,2
+7,24,14,38,2
+7,24,18,54,3
+7,25,12,31,0
+7,25,12,32,1
+7,25,12,32,1
+7,25,15,6,3
+7,25,18,56,3
+7,26,13,41,2
+7,26,19,14,3
+7,27,11,39,2
+7,27,11,39,3
+7,27,11,46,3
+7,27,11,46,2
+7,27,13,8,2
+7,27,13,8,2
+7,27,13,9,2
+7,27,13,45,2
+7,27,13,45,2
+7,27,15,38,3
+7,28,12,12,2
+7,28,12,13,2
+7,28,12,41,2
+7,28,12,41,2
+7,28,12,41,2
+7,28,14,0,1
+7,28,14,0,2
+7,28,15,21,3
+7,28,18,56,3
+7,29,10,9,1
+7,29,10,9,1
+7,29,10,9,1
+7,29,11,54,0
+7,29,11,54,0
+7,29,11,54,0
+7,29,11,54,1
+7,29,14,10,2
+7,29,16,44,2
+7,29,16,44,2
+7,30,16,7,3
+7,30,18,45,3
+7,31,13,2,0
+7,31,13,2,1
+7,31,13,3,1
+7,31,13,3,1
+7,31,13,3,1
+7,31,18,39,3
+8,1,12,22,0
+8,1,12,22,1
+8,1,14,20,2
+8,1,14,20,2
+8,1,14,20,2
+8,1,15,55,3
+8,1,18,31,3
+8,1,18,37,3
+8,1,18,37,3
+8,1,19,2,3
+8,1,19,2,3
+8,1,20,5,3
+8,2,10,9,2
+8,2,10,9,1
+8,2,10,9,2
+8,2,10,9,2
+8,2,13,58,2
+8,2,13,58,2
+8,2,15,44,3
+8,2,15,44,3
+8,2,15,44,3
+8,2,17,21,3
+8,2,17,21,3
+8,2,17,21,3
+8,3,13,31,1
+8,3,13,31,2
+8,3,13,32,2
+8,3,16,43,3
+8,4,13,20,1
+8,4,13,20,2
+8,4,18,27,3
+8,5,13,37,2
+8,5,13,37,2
+8,5,18,33,3
+8,6,11,24,3
+8,6,11,24,3
+8,6,11,24,3
+8,6,13,50,3
+8,7,13,4,2
+8,7,13,4,2
+8,7,14,56,3
+8,8,12,13,2
+8,8,12,13,2
+8,8,15,51,2
+8,8,15,51,2
+8,8,15,51,3
+8,9,13,32,2
+8,9,13,32,2
+8,9,13,32,2
+8,9,15,8,2
+8,9,15,8,2
+8,9,15,8,2
+8,9,16,19,2
+8,10,11,32,0
+8,10,11,32,1
+8,10,11,32,1
+8,10,13,13,1
+8,10,13,13,1
+8,10,13,13,2
+8,10,16,42,3
+8,10,16,42,3
+8,11,14,6,2
+8,11,14,7,2
+8,11,18,54,3
+8,11,18,54,3
+8,11,18,54,3
+8,12,12,27,1
+8,12,12,27,1
+8,12,12,28,1
+8,12,13,53,2
+8,12,13,53,2
+8,12,13,53,2
+8,12,15,21,3
+8,13,13,16,1
+8,13,13,16,1
+8,13,13,16,1
+8,13,14,14,2
+8,13,14,14,2
+8,13,16,11,3
+8,13,17,18,3
+8,14,13,7,1
+8,14,13,7,1
+8,14,13,7,1
+8,14,13,7,1
+8,14,13,7,2
+8,14,13,7,2
+8,14,15,6,3
+8,15,14,5,2
+8,15,14,5,2
+8,15,14,6,2
+8,15,14,6,2
+8,15,16,41,3
+8,15,16,41,3
+8,15,17,30,3
+8,16,13,40,2
+8,16,13,40,2
+8,16,17,52,3
+8,16,17,53,3
+8,17,13,34,1
+8,17,13,35,2
+8,17,14,7,2
+8,17,19,2,3
+8,18,10,21,3
+8,18,11,14,2
+8,18,11,14,2
+8,18,11,14,2
+8,18,11,14,2
+8,18,14,25,2
+8,18,14,25,3
+8,18,14,25,2
+8,18,18,18,3
+8,18,18,19,3
+8,19,18,33,3
+8,19,18,33,3
+8,19,18,33,3
+8,19,18,33,3
+8,20,14,28,2
+8,20,14,28,2
+8,20,14,28,2
+8,20,14,28,2
+8,20,17,8,3
+8,20,18,22,3
+8,21,11,24,1
+8,21,11,24,1
+8,21,11,24,1
+8,21,15,34,3
+8,21,18,55,3
+8,22,12,3,1
+8,22,12,4,2
+8,22,12,4,2
+8,22,13,51,2
+8,22,13,51,2
+8,22,13,51,2
+8,22,18,12,3
+8,22,18,12,3
+8,22,18,12,3
+8,22,18,12,3
+8,22,18,40,3
+8,22,18,40,3
+8,23,13,42,1
+8,23,13,42,1
+8,23,17,32,3
+8,23,19,28,3
+8,23,20,27,3
+8,23,20,27,3
+8,23,21,49,3
+8,24,14,0,2
+8,24,14,0,2
+8,24,14,0,2
+8,24,14,0,2
+8,24,15,4,3
+8,24,15,4,3
+8,24,16,2,3
+8,24,16,3,3
+8,24,16,37,3
+8,24,17,9,3
+8,24,17,14,3
+8,25,13,34,1
+8,25,13,34,1
+8,25,13,34,1
+8,25,13,34,1
+8,25,13,34,1
+8,25,15,1,3
+8,25,17,58,3
+8,26,10,29,0
+8,26,10,29,0
+8,26,10,29,0
+8,26,10,29,0
+8,26,10,29,0
+8,26,16,42,3
+8,26,16,42,3
+8,26,18,41,3
+8,26,18,41,3
+8,27,13,41,2
+8,27,13,41,2
+8,27,13,41,2
+8,27,13,41,2
+8,27,17,42,3
+8,28,11,9,1
+8,28,11,9,1
+8,28,12,14,0
+8,28,12,14,1
+8,28,12,14,0
+8,28,15,3,2
+8,28,15,3,2
+8,28,16,31,3
+8,28,17,40,3
+8,29,14,44,3
+8,29,17,25,3
+8,30,12,5,0
+8,30,12,5,0
+8,30,12,5,0
+8,30,13,32,1
+8,30,13,32,1
+8,30,13,56,2
+8,30,14,23,2
+8,30,14,23,2
+8,30,14,23,2
+8,30,14,23,2
+8,30,14,41,2
+8,30,14,41,2
+8,30,14,41,2
+8,30,15,50,3
+8,30,17,0,3
+8,30,18,59,3
+8,30,18,59,3
+8,31,14,31,2
+8,31,14,31,2
+8,31,14,31,2
+8,31,17,59,3
+8,31,18,0,3
+9,1,16,13,3
+9,1,16,13,3
+9,1,16,13,3
+9,1,17,41,3
+9,2,13,44,1
+9,2,13,44,1
+9,2,13,44,1
+9,2,14,49,2
+9,2,14,49,2
+9,2,14,49,2
+9,2,16,6,3
+9,2,16,6,3
+9,2,17,2,3
+9,3,16,9,3
+9,3,17,35,3
+9,3,17,36,3
+9,4,12,57,1
+9,4,12,57,1
+9,4,15,8,3
+9,4,15,34,3
+9,4,16,26,3
+9,4,16,26,3
+9,4,18,37,3
+9,4,18,37,3
+9,4,18,37,3
+9,6,11,18,0
+9,6,11,18,0
+9,6,12,54,1
+9,6,12,54,1
+9,6,14,21,2
+9,6,14,21,2
+9,6,19,20,3
+9,7,11,50,0
+9,7,14,17,2
+9,7,14,57,3
+9,7,14,57,3
+9,7,16,56,3
+9,7,16,56,3
+9,7,16,56,3
+9,7,16,56,3
+9,7,18,38,3
+9,7,18,38,3
+9,8,11,4,2
+9,8,11,4,2
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,14,0
+9,8,11,14,1
+9,8,11,14,1
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,1
+9,8,12,36,0
+9,8,12,36,0
+9,8,12,36,0
+9,8,12,36,0
+9,8,12,36,0
+9,8,13,37,1
+9,8,13,37,1
+9,8,13,37,1
+9,8,14,20,2
+9,8,14,20,2
+9,8,18,20,3
+9,9,12,47,1
+9,9,12,47,2
+9,9,12,47,2
+9,9,19,5,3
+9,10,13,15,1
+9,10,13,15,1
+9,10,13,15,0
+9,10,16,49,3
+9,10,19,6,3
+9,10,21,5,3
+9,11,14,16,2
+9,11,14,16,2
+9,11,14,16,2
+9,11,18,41,3
+9,12,14,43,2
+9,12,14,43,2
+9,12,14,43,2
+9,12,16,14,3
+9,12,17,12,3
+9,12,17,12,2
+9,12,17,12,3
+9,12,17,12,2
+9,12,20,44,3
+9,13,19,52,3
+9,14,14,39,2
+9,14,14,39,2
+9,14,15,14,3
+9,14,17,29,3
+9,14,17,29,3
+9,14,17,29,3
+9,15,11,41,1
+9,15,11,41,1
+9,15,13,4,1
+9,15,14,3,1
+9,15,14,3,2
+9,16,12,36,1
+9,16,12,36,1
+9,16,12,36,1
+9,16,12,36,1
+9,16,12,48,1
+9,16,12,48,1
+9,16,13,51,1
+9,16,13,51,2
+9,16,13,51,1
+9,16,15,13,3
+9,16,15,14,3
+9,16,15,14,3
+9,17,10,27,0
+9,17,10,27,0
+9,17,11,10,0
+9,17,11,10,0
+9,17,11,10,0
+9,17,12,43,1
+9,17,12,43,1
+9,17,12,43,1
+9,17,13,32,1
+9,17,13,32,1
+9,17,14,5,1
+9,17,14,5,2
+9,17,14,6,2
+9,17,15,7,3
+9,17,15,49,3
+9,17,15,49,3
+9,17,18,12,3
+9,17,18,13,3
diff --git a/feedbackloop.learner/out/production/resources/log4j2.xml b/feedbackloop.learner/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.learner/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningEncoderImpl.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningImpl.java
similarity index 91%
rename from feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningEncoderImpl.java
rename to feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningImpl.java
index 86604d95..8361d5a3 100644
--- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningEncoderImpl.java
+++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningImpl.java
@@ -4,12 +4,14 @@ import de.tudresden.inf.st.eraser.jastadd.model.*;
 import java.time.Instant;
 import java.util.List;
 
-public class MachineLearningEncoderImpl implements MachineLearningDecoder,MachineLearningEncoder {
+public class MachineLearningImpl implements MachineLearningDecoder,MachineLearningEncoder {
 
     private String[] new_data = new String[13];
     private List<Item> target_item_list;
     private List<Item> relevant_item_list;
     private String[] result;
+    private MachineLearningResult ml_result;
+    private List<ItemPreference> item_preference_list;
 
     @Override
     public void newData(Root model, List<Item> changedItems) {
@@ -73,13 +75,12 @@ public class MachineLearningEncoderImpl implements MachineLearningDecoder,Machin
         relevant_item_list.add(w_rotation_y);
         relevant_item_list.add(w_rotation_z);
         relevant_item_list.add(w_brightness);
-        return null;
+        return relevant_item_list;
 
     }
 
     @Override
     public void triggerTraining() {
-
     }
 
     @Override
@@ -91,6 +92,7 @@ public class MachineLearningEncoderImpl implements MachineLearningDecoder,Machin
     public MachineLearningResult classify() {
         String activity=result[0];
         String[] preference= {result[1],result[2]};
-        return null;
+        ml_result.getPreferences();
+        return ml_result;
     }
 }
diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java
index 1169027d..f2b25690 100644
--- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java
+++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java
@@ -1,9 +1,13 @@
 package de.tudresden.inf.st.eraser.feedbackloop.learner_backup;
 
+import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import de.tudresden.inf.st.eraser.jastadd.model.*;
 import org.encog.util.csv.ReadCSV;
 import org.encog.util.csv.CSVFormat;
+
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 public class Main {
 
@@ -31,6 +35,10 @@ public class Main {
     System.out.println(result[1]);
     System.out.println(result[2]);
 
+    List k=new ArrayList();
+
+    k.add(new_data);
+
     //learner.preference_train("datasets/backup/preference_data.csv");
     //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv");
     //walking,medium,120,70
diff --git a/feedbackloop.main/out/production/resources/log4j2.xml b/feedbackloop.main/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.main/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/feedbackloop.main/out/production/resources/skywriter-hue.eraser b/feedbackloop.main/out/production/resources/skywriter-hue.eraser
new file mode 100644
index 00000000..b32c7a11
--- /dev/null
+++ b/feedbackloop.main/out/production/resources/skywriter-hue.eraser
@@ -0,0 +1,44 @@
+ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ;
+ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ;
+ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[];
+ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ;
+
+Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ;
+Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ;
+Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ;
+Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ;
+Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ;
+
+ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ;
+ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="Unknown" ;
+ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ;
+ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ;
+ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ;
+ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ;
+ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ;
+
+Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ;
+Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ;
+Channel: id="skywriter1-flick" type="flick-type" links=[];
+Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"];
+Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"];
+
+Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state";
+Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x";
+Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y";
+Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz";
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"];
+
+Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the &lt;broker&gt;.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ;
+
+// MqttHost is set programmatically
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" ;
diff --git a/feedbackloop.monitor/out/production/resources/log4j2.xml b/feedbackloop.monitor/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.monitor/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/feedbackloop.plan/out/production/resources/log4j2.xml b/feedbackloop.plan/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/feedbackloop.plan/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/influx_test/out/production/resources/log4j2.xml b/influx_test/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/influx_test/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/integration/out/production/resources/openhab2-data.json b/integration/out/production/resources/openhab2-data.json
new file mode 100644
index 00000000..eaeee6b3
--- /dev/null
+++ b/integration/out/production/resources/openhab2-data.json
@@ -0,0 +1,1297 @@
+{
+  "k" : "NT",
+  "t" : "Root",
+  "c" : {
+    "Item" : {
+      "k" : "List",
+      "c" : [ {
+        "k" : "NT",
+        "t" : "Item",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Iris 1"
+          },
+          "_impl_topic" : {
+            "k" : "t",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.MqttTopic",
+            "v" : {
+              "k" : "NTRef",
+              "t" : "MqttTopic",
+              "c" : {
+                "IncomingTopic" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "oh2/out/"
+                }
+              }
+            }
+          },
+          "State" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "121,88,68"
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "iris1_item"
+          }
+        }
+      } ]
+    },
+    "Thing" : {
+      "k" : "List",
+      "c" : [ {
+        "k" : "NT",
+        "t" : "Thing",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Philips hue (10.8.0.160)"
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:bridge:0017880adcf4"
+          },
+          "ThingType" : {
+            "k" : "t",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ThingType",
+            "v" : {
+              "k" : "NTRef",
+              "t" : "ThingType",
+              "c" : {
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:bridge"
+                }
+              }
+            }
+          },
+          "Channel" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "Thing",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Hue iris 1"
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0200:0017880adcf4:5"
+          },
+          "ThingType" : {
+            "k" : "t",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ThingType",
+            "v" : {
+              "k" : "NTRef",
+              "t" : "ThingType",
+              "c" : {
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0200"
+                }
+              }
+            }
+          },
+          "Channel" : {
+            "k" : "List",
+            "c" : [ {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ {
+                    "k" : "NT",
+                    "t" : "Link",
+                    "c" : {
+                      "Item" : {
+                        "k" : "t",
+                        "t" : "de.tudresden.inf.st.eraser.jastadd.model.Item",
+                        "v" : {
+                          "k" : "NTRef",
+                          "t" : "Item",
+                          "c" : {
+                            "ID" : {
+                              "k" : "t",
+                              "t" : "java.lang.String",
+                              "v" : "iris1_item"
+                            }
+                          }
+                        }
+                      }
+                    }
+                  } ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:color"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0200:0017880adcf4:5:color"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:alert"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0200:0017880adcf4:5:alert"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:effect"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0200:0017880adcf4:5:effect"
+                }
+              }
+            } ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "Thing",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Wohnzimmer"
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0210:0017880adcf4:1"
+          },
+          "ThingType" : {
+            "k" : "t",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ThingType",
+            "v" : {
+              "k" : "NTRef",
+              "t" : "ThingType",
+              "c" : {
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210"
+                }
+              }
+            }
+          },
+          "Channel" : {
+            "k" : "List",
+            "c" : [ {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:color"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:1:color"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:color_temperature"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:1:color_temperature"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:alert"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:1:alert"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:effect"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:1:effect"
+                }
+              }
+            } ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "Thing",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Hue go 1"
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0210:0017880adcf4:4"
+          },
+          "ThingType" : {
+            "k" : "t",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ThingType",
+            "v" : {
+              "k" : "NTRef",
+              "t" : "ThingType",
+              "c" : {
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210"
+                }
+              }
+            }
+          },
+          "Channel" : {
+            "k" : "List",
+            "c" : [ {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:color"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:4:color"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:color_temperature"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:4:color_temperature"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:alert"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:4:alert"
+                }
+              }
+            }, {
+              "k" : "NT",
+              "t" : "Channel",
+              "c" : {
+                "Link" : {
+                  "k" : "List",
+                  "c" : [ ]
+                },
+                "Type" : {
+                  "k" : "t",
+                  "t" : "de.tudresden.inf.st.eraser.jastadd.model.ChannelType",
+                  "v" : {
+                    "k" : "NTRef",
+                    "t" : "ChannelType",
+                    "c" : {
+                      "ID" : {
+                        "k" : "t",
+                        "t" : "java.lang.String",
+                        "v" : "hue:effect"
+                      }
+                    }
+                  }
+                },
+                "ID" : {
+                  "k" : "t",
+                  "t" : "java.lang.String",
+                  "v" : "hue:0210:0017880adcf4:4:effect"
+                }
+              }
+            } ]
+          }
+        }
+      } ]
+    },
+    "Group" : {
+      "k" : "List",
+      "c" : [ ]
+    },
+    "ThingType" : {
+      "k" : "List",
+      "c" : [ {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Color Light"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "A dimmable light with changeable colors."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0200"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Color Temperature Light"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "A dimmable light with tunable color temperature."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0220"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Dimmable Light"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "A dimmable light."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0100"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Dimmable Plug-in Unit"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "An outlet that can be dimmed."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0110"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Extended Color Light"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "A dimmable light with changeable colors and tunable color temperature."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0210"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "On/Off Light"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "A light that could be switched on and off."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0000"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "On/Off Plug-in Unit"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "An outlet that could be switched on and off."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:0010"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ThingType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Hue Bridge"
+          },
+          "Parameter" : {
+            "k" : "List",
+            "c" : [ ]
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The hue bridge represents the Philips hue bridge."
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:bridge"
+          },
+          "ChannelType" : {
+            "k" : "List",
+            "c" : [ ]
+          }
+        }
+      } ]
+    },
+    "ChannelType" : {
+      "k" : "List",
+      "c" : [ {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Color"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Color"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "DefaultChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "enum",
+                "t" : "de.tudresden.inf.st.eraser.jastadd.model.DefaultChannelCategoryValue",
+                "v" : "ColorLight"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off."
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:color"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Brightness"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Dimmer"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "SimpleChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "t",
+                "t" : "java.lang.String",
+                "v" : "DimmableLight"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The brightness channel allows to control the brightness of a light. It is also possible to switch the light on and off."
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:brightness"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Switch"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Switch"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "DefaultChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "enum",
+                "t" : "de.tudresden.inf.st.eraser.jastadd.model.DefaultChannelCategoryValue",
+                "v" : "Light"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The switch channel allows to switch the light on and off."
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:switch"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Color Temperature"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Dimmer"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "DefaultChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "enum",
+                "t" : "de.tudresden.inf.st.eraser.jastadd.model.DefaultChannelCategoryValue",
+                "v" : "ColorLight"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)."
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:color_temperature"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Alert"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "String"
+          },
+          "ChannelCategory" : null,
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The alert channel allows a temporary change to the bulb’s state."
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:alert"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Color Loop"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Switch"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "DefaultChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "enum",
+                "t" : "de.tudresden.inf.st.eraser.jastadd.model.DefaultChannelCategoryValue",
+                "v" : "ColorLight"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "The effect channel allows putting the bulb in a color looping mode."
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "hue:effect"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Signal Strength"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Number"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "DefaultChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "enum",
+                "t" : "de.tudresden.inf.st.eraser.jastadd.model.DefaultChannelCategoryValue",
+                "v" : "QualityOfService"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : true
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:signal-strength"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Low Battery"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Switch"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "SimpleChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "t",
+                "t" : "java.lang.String",
+                "v" : "Battery"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : true
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:low-battery"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Battery Level"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : "Number"
+          },
+          "ChannelCategory" : {
+            "k" : "NT",
+            "t" : "SimpleChannelCategory",
+            "c" : {
+              "Value" : {
+                "k" : "t",
+                "t" : "java.lang.String",
+                "v" : "Battery"
+              }
+            }
+          },
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : true
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:battery-level"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Trigger"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : null
+          },
+          "ChannelCategory" : null,
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:trigger"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Raw button"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : null
+          },
+          "ChannelCategory" : null,
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:rawbutton"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Button"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : null
+          },
+          "ChannelCategory" : null,
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:button"
+          }
+        }
+      }, {
+        "k" : "NT",
+        "t" : "ChannelType",
+        "c" : {
+          "Label" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "Raw rocker button"
+          },
+          "ItemType" : {
+            "k" : "enum",
+            "t" : "de.tudresden.inf.st.eraser.jastadd.model.ItemType",
+            "v" : null
+          },
+          "ChannelCategory" : null,
+          "Description" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : ""
+          },
+          "ReadOnly" : {
+            "k" : "t",
+            "t" : "boolean",
+            "v" : false
+          },
+          "ID" : {
+            "k" : "t",
+            "t" : "java.lang.String",
+            "v" : "system:rawrocker"
+          }
+        }
+      } ]
+    },
+    "MqttRoot" : {
+      "k" : "NT",
+      "t" : "MqttRoot",
+      "c" : {
+        "IncomingPrefix" : {
+          "k" : "t",
+          "t" : "java.lang.String",
+          "v" : "oh2/out/"
+        },
+        "OutgoingPrefix" : {
+          "k" : "t",
+          "t" : "java.lang.String",
+          "v" : ""
+        },
+        "Topic" : {
+          "k" : "List",
+          "c" : [ {
+            "k" : "NT",
+            "t" : "MqttTopic",
+            "c" : {
+              "Part" : {
+                "k" : "t",
+                "t" : "java.lang.String",
+                "v" : "iris1_item"
+              },
+              "_impl_item" : {
+                "k" : "t",
+                "t" : "de.tudresden.inf.st.eraser.jastadd.model.Item",
+                "v" : {
+                  "k" : "NTRef",
+                  "t" : "Item",
+                  "c" : {
+                    "ID" : {
+                      "k" : "t",
+                      "t" : "java.lang.String",
+                      "v" : "iris1_item"
+                    }
+                  }
+                }
+              },
+              "SubTopic" : {
+                "k" : "List",
+                "c" : [ ]
+              }
+            }
+          } ]
+        },
+        "Host" : {
+          "k" : "t",
+          "t" : "java.lang.String",
+          "v" : "localhost"
+        }
+      }
+    }
+  }
+}
diff --git a/learner_test/.gitignore b/learner_test/.gitignore
new file mode 100644
index 00000000..84c048a7
--- /dev/null
+++ b/learner_test/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/learner_test/build.gradle b/learner_test/build.gradle
new file mode 100644
index 00000000..64ba2586
--- /dev/null
+++ b/learner_test/build.gradle
@@ -0,0 +1,35 @@
+repositories {
+    mavenCentral()
+}
+
+sourceCompatibility = 1.8
+
+apply plugin: 'java'
+apply plugin: 'application'
+
+dependencies {
+    compile project(':eraser-base')
+    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.8.1'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0'
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+    testCompile group: 'org.hamcrest', name: 'hamcrest-junit', version: '1.0.0.0'
+
+    compile 'org.encog:encog-core:3.4'
+}
+
+run {
+    mainClassName = 'de.tudresden.inf.st.eraser.learner_test.Main'
+    standardInput = System.in
+    if (project.hasProperty("appArgs")) {
+        args Eval.me(appArgs)
+    }
+}
+
+sourceSets {
+    main {
+        java {
+            srcDir 'src/main/java'
+        }
+    }
+}
diff --git a/learner_test/out/production/resources/log4j2.xml b/learner_test/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..0594576f
--- /dev/null
+++ b/learner_test/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/jastadd-mquat.log"
+                    filePattern="logs/jastadd-mquat-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java
new file mode 100644
index 00000000..62f00cb6
--- /dev/null
+++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java
@@ -0,0 +1,112 @@
+package de.tudresden.inf.st.eraser.learner_test;
+import org.encog.Encog;
+import org.encog.ml.MLClassification;
+import org.encog.ml.data.MLData;
+import org.encog.persist.EncogDirectoryPersistence;
+import org.encog.util.csv.CSVFormat;
+import org.encog.util.csv.ReadCSV;
+import org.encog.util.simple.EncogUtility;
+
+import org.encog.ml.data.versatile.NormalizationHelper;
+import org.encog.ml.data.versatile.VersatileMLDataSet;
+import org.encog.ml.data.versatile.columns.ColumnDefinition;
+import org.encog.ml.data.versatile.columns.ColumnType;
+import org.encog.ml.data.versatile.sources.VersatileDataSource;
+import org.encog.ml.data.versatile.sources.CSVDataSource;
+import org.encog.ml.factory.MLMethodFactory;
+import org.encog.ml.model.EncogModel;
+import org.encog.ConsoleStatusReportable;
+import org.encog.ml.MLRegression;
+import java.io.File;
+import java.util.Arrays;
+import static org.encog.persist.EncogDirectoryPersistence.*;
+
+public class Main {
+
+  public static void main(String[] args) {
+    //mapping the data into model
+    String savefile = "src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg";
+    String File = "src/main/java/de/tudresden/inf/st/eraser/learner_test/preference_data.csv";
+    File file = new File(File);
+    VersatileDataSource source = new CSVDataSource(file, false, CSVFormat.DECIMAL_POINT);
+    VersatileMLDataSet data = new VersatileMLDataSet(source);
+    data.defineSourceColumn("monat", 0, ColumnType.continuous);
+    data.defineSourceColumn("day", 1, ColumnType.continuous);
+    data.defineSourceColumn("hour", 2, ColumnType.continuous);
+    data.defineSourceColumn("minute", 3, ColumnType.continuous);
+    ColumnDefinition outputColumn = data.defineSourceColumn("labels", 4, ColumnType.continuous);
+    data.defineSingleOutputOthersInput(outputColumn);
+    data.analyze();
+    System.out.println("get data ");
+    EncogModel model = new EncogModel(data);
+    model.selectMethod(data, MLMethodFactory.TYPE_FEEDFORWARD);
+    //model.setReport(new ConsoleStatusReportable());
+    data.normalize();
+    NormalizationHelper helper = data.getNormHelper();
+    System.out.println(helper.toString());
+    model.holdBackValidation(0.3, true, 1001);
+    model.selectTrainingType(data);
+    MLRegression bestMethod = (MLRegression)model.crossvalidate(5, true);
+    MLClassification bestMethodtest=(MLClassification)model.crossvalidate(5,true);
+    /**System.out.println( "Training error: " + EncogUtility.calculateRegressionError(bestMethod, model.getTrainingDataset()));
+    System.out.println( "testTraining error: " + EncogUtility.calculateClassificationError(bestMethodtest, model.getTrainingDataset()));
+    System.out.println( "Validation error: " + EncogUtility.calculateRegressionError(bestMethod, model.getValidationDataset()));
+    System.out.println( "testValidation error: " + EncogUtility.calculateClassificationError(bestMethodtest, model.getValidationDataset()));
+
+    System.out.println(helper.getClass());
+    System.out.println(helper.toString());
+    System.out.println("Final model: " + bestMethod);
+    System.out.println("Final testmodel: " + bestMethodtest);**/
+    //NormalizationHelper helper = data.getNormHelper();
+
+    //test
+    String helperstr=helper.toString();
+    String [] split=helperstr.split(";");
+    String [] finalStr = split[split.length-1].replace("]","").replace("[","").
+            split(",");
+    System.out.println(helper);
+
+    // save network...
+    //to delete
+    saveObject(new File(savefile), bestMethodtest);
+    ReadCSV csv = new ReadCSV(File, false, CSVFormat.DECIMAL_POINT);
+    String[] line = new String[4];
+    MLData input = helper.allocateInputVector();
+    System.out.println("input test---------------");
+    System.out.println(input);
+    while(csv.next()) {
+      StringBuilder result = new StringBuilder();
+      line[0] = csv.get(0);
+      line[1] = csv.get(1);
+      line[2] = csv.get(2);
+      line[3] = csv.get(3);
+      String correct = csv.get(4);
+      helper.normalizeInputVector(line,input.getData(),false);
+
+      MLData output = bestMethod.compute(input);
+      System.out.println("inputs:");
+      System.out.println(input);
+      System.out.println("outputs:");
+      System.out.println(output);
+      String brightnessChosen = helper.denormalizeOutputVectorToString(output)[0];
+
+      result.append(Arrays.toString(line));
+      result.append(" -> predicted: ");
+      result.append(brightnessChosen);
+      result.append("(correct: ");
+      result.append(correct);
+      result.append(")");
+      System.out.println(result.toString());
+      break;
+
+    }
+    // Delete data file and shut down.
+    //File.delete();
+    Encog.getInstance().shutdown();
+    /**Training error: 0.299928703107046
+    testTraining error: 0.9931740614334471
+    Validation error: 0.41277024952020763
+    testValidation error: 0.992*/
+
+  }
+}
diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv
new file mode 100644
index 00000000..a1e26319
--- /dev/null
+++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv
@@ -0,0 +1,418 @@
+7,20,12,13,2
+7,20,14,40,1
+7,20,14,40,2
+7,21,13,2,2
+7,21,13,2,2
+7,21,14,23,2
+7,21,14,23,2
+7,21,15,41,2
+7,21,16,54,2
+7,21,16,54,2
+7,21,17,45,3
+7,22,12,28,3
+7,22,15,35,2
+7,22,15,35,2
+7,22,18,59,3
+7,22,18,59,3
+7,23,12,32,2
+7,23,12,32,2
+7,23,16,7,2
+7,23,16,7,2
+7,23,16,7,2
+7,23,16,7,2
+7,23,16,7,2
+7,24,12,4,0
+7,24,12,4,0
+7,24,12,4,1
+7,24,14,38,2
+7,24,14,38,2
+7,24,18,54,3
+7,25,12,31,0
+7,25,12,32,1
+7,25,12,32,1
+7,25,15,6,3
+7,25,18,56,3
+7,26,13,41,2
+7,26,19,14,3
+7,27,11,39,2
+7,27,11,39,3
+7,27,11,46,3
+7,27,11,46,2
+7,27,13,8,2
+7,27,13,8,2
+7,27,13,9,2
+7,27,13,45,2
+7,27,13,45,2
+7,27,15,38,3
+7,28,12,12,2
+7,28,12,13,2
+7,28,12,41,2
+7,28,12,41,2
+7,28,12,41,2
+7,28,14,0,1
+7,28,14,0,2
+7,28,15,21,3
+7,28,18,56,3
+7,29,10,9,1
+7,29,10,9,1
+7,29,10,9,1
+7,29,11,54,0
+7,29,11,54,0
+7,29,11,54,0
+7,29,11,54,1
+7,29,14,10,2
+7,29,16,44,2
+7,29,16,44,2
+7,30,16,7,3
+7,30,18,45,3
+7,31,13,2,0
+7,31,13,2,1
+7,31,13,3,1
+7,31,13,3,1
+7,31,13,3,1
+7,31,18,39,3
+8,1,12,22,0
+8,1,12,22,1
+8,1,14,20,2
+8,1,14,20,2
+8,1,14,20,2
+8,1,15,55,3
+8,1,18,31,3
+8,1,18,37,3
+8,1,18,37,3
+8,1,19,2,3
+8,1,19,2,3
+8,1,20,5,3
+8,2,10,9,2
+8,2,10,9,1
+8,2,10,9,2
+8,2,10,9,2
+8,2,13,58,2
+8,2,13,58,2
+8,2,15,44,3
+8,2,15,44,3
+8,2,15,44,3
+8,2,17,21,3
+8,2,17,21,3
+8,2,17,21,3
+8,3,13,31,1
+8,3,13,31,2
+8,3,13,32,2
+8,3,16,43,3
+8,4,13,20,1
+8,4,13,20,2
+8,4,18,27,3
+8,5,13,37,2
+8,5,13,37,2
+8,5,18,33,3
+8,6,11,24,3
+8,6,11,24,3
+8,6,11,24,3
+8,6,13,50,3
+8,7,13,4,2
+8,7,13,4,2
+8,7,14,56,3
+8,8,12,13,2
+8,8,12,13,2
+8,8,15,51,2
+8,8,15,51,2
+8,8,15,51,3
+8,9,13,32,2
+8,9,13,32,2
+8,9,13,32,2
+8,9,15,8,2
+8,9,15,8,2
+8,9,15,8,2
+8,9,16,19,2
+8,10,11,32,0
+8,10,11,32,1
+8,10,11,32,1
+8,10,13,13,1
+8,10,13,13,1
+8,10,13,13,2
+8,10,16,42,3
+8,10,16,42,3
+8,11,14,6,2
+8,11,14,7,2
+8,11,18,54,3
+8,11,18,54,3
+8,11,18,54,3
+8,12,12,27,1
+8,12,12,27,1
+8,12,12,28,1
+8,12,13,53,2
+8,12,13,53,2
+8,12,13,53,2
+8,12,15,21,3
+8,13,13,16,1
+8,13,13,16,1
+8,13,13,16,1
+8,13,14,14,2
+8,13,14,14,2
+8,13,16,11,3
+8,13,17,18,3
+8,14,13,7,1
+8,14,13,7,1
+8,14,13,7,1
+8,14,13,7,1
+8,14,13,7,2
+8,14,13,7,2
+8,14,15,6,3
+8,15,14,5,2
+8,15,14,5,2
+8,15,14,6,2
+8,15,14,6,2
+8,15,16,41,3
+8,15,16,41,3
+8,15,17,30,3
+8,16,13,40,2
+8,16,13,40,2
+8,16,17,52,3
+8,16,17,53,3
+8,17,13,34,1
+8,17,13,35,2
+8,17,14,7,2
+8,17,19,2,3
+8,18,10,21,3
+8,18,11,14,2
+8,18,11,14,2
+8,18,11,14,2
+8,18,11,14,2
+8,18,14,25,2
+8,18,14,25,3
+8,18,14,25,2
+8,18,18,18,3
+8,18,18,19,3
+8,19,18,33,3
+8,19,18,33,3
+8,19,18,33,3
+8,19,18,33,3
+8,20,14,28,2
+8,20,14,28,2
+8,20,14,28,2
+8,20,14,28,2
+8,20,17,8,3
+8,20,18,22,3
+8,21,11,24,1
+8,21,11,24,1
+8,21,11,24,1
+8,21,15,34,3
+8,21,18,55,3
+8,22,12,3,1
+8,22,12,4,2
+8,22,12,4,2
+8,22,13,51,2
+8,22,13,51,2
+8,22,13,51,2
+8,22,18,12,3
+8,22,18,12,3
+8,22,18,12,3
+8,22,18,12,3
+8,22,18,40,3
+8,22,18,40,3
+8,23,13,42,1
+8,23,13,42,1
+8,23,17,32,3
+8,23,19,28,3
+8,23,20,27,3
+8,23,20,27,3
+8,23,21,49,3
+8,24,14,0,2
+8,24,14,0,2
+8,24,14,0,2
+8,24,14,0,2
+8,24,15,4,3
+8,24,15,4,3
+8,24,16,2,3
+8,24,16,3,3
+8,24,16,37,3
+8,24,17,9,3
+8,24,17,14,3
+8,25,13,34,1
+8,25,13,34,1
+8,25,13,34,1
+8,25,13,34,1
+8,25,13,34,1
+8,25,15,1,3
+8,25,17,58,3
+8,26,10,29,0
+8,26,10,29,0
+8,26,10,29,0
+8,26,10,29,0
+8,26,10,29,0
+8,26,16,42,3
+8,26,16,42,3
+8,26,18,41,3
+8,26,18,41,3
+8,27,13,41,2
+8,27,13,41,2
+8,27,13,41,2
+8,27,13,41,2
+8,27,17,42,3
+8,28,11,9,1
+8,28,11,9,1
+8,28,12,14,0
+8,28,12,14,1
+8,28,12,14,0
+8,28,15,3,2
+8,28,15,3,2
+8,28,16,31,3
+8,28,17,40,3
+8,29,14,44,3
+8,29,17,25,3
+8,30,12,5,0
+8,30,12,5,0
+8,30,12,5,0
+8,30,13,32,1
+8,30,13,32,1
+8,30,13,56,2
+8,30,14,23,2
+8,30,14,23,2
+8,30,14,23,2
+8,30,14,23,2
+8,30,14,41,2
+8,30,14,41,2
+8,30,14,41,2
+8,30,15,50,3
+8,30,17,0,3
+8,30,18,59,3
+8,30,18,59,3
+8,31,14,31,2
+8,31,14,31,2
+8,31,14,31,2
+8,31,17,59,3
+8,31,18,0,3
+9,1,16,13,3
+9,1,16,13,3
+9,1,16,13,3
+9,1,17,41,3
+9,2,13,44,1
+9,2,13,44,1
+9,2,13,44,1
+9,2,14,49,2
+9,2,14,49,2
+9,2,14,49,2
+9,2,16,6,3
+9,2,16,6,3
+9,2,17,2,3
+9,3,16,9,3
+9,3,17,35,3
+9,3,17,36,3
+9,4,12,57,1
+9,4,12,57,1
+9,4,15,8,3
+9,4,15,34,3
+9,4,16,26,3
+9,4,16,26,3
+9,4,18,37,3
+9,4,18,37,3
+9,4,18,37,3
+9,6,11,18,0
+9,6,11,18,0
+9,6,12,54,1
+9,6,12,54,1
+9,6,14,21,2
+9,6,14,21,2
+9,6,19,20,3
+9,7,11,50,0
+9,7,14,17,2
+9,7,14,57,3
+9,7,14,57,3
+9,7,16,56,3
+9,7,16,56,3
+9,7,16,56,3
+9,7,16,56,3
+9,7,18,38,3
+9,7,18,38,3
+9,8,11,4,2
+9,8,11,4,2
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,13,0
+9,8,11,14,0
+9,8,11,14,1
+9,8,11,14,1
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,0
+9,8,12,1,1
+9,8,12,36,0
+9,8,12,36,0
+9,8,12,36,0
+9,8,12,36,0
+9,8,12,36,0
+9,8,13,37,1
+9,8,13,37,1
+9,8,13,37,1
+9,8,14,20,2
+9,8,14,20,2
+9,8,18,20,3
+9,9,12,47,1
+9,9,12,47,2
+9,9,12,47,2
+9,9,19,5,3
+9,10,13,15,1
+9,10,13,15,1
+9,10,13,15,0
+9,10,16,49,3
+9,10,19,6,3
+9,10,21,5,3
+9,11,14,16,2
+9,11,14,16,2
+9,11,14,16,2
+9,11,18,41,3
+9,12,14,43,2
+9,12,14,43,2
+9,12,14,43,2
+9,12,16,14,3
+9,12,17,12,3
+9,12,17,12,2
+9,12,17,12,3
+9,12,17,12,2
+9,12,20,44,3
+9,13,19,52,3
+9,14,14,39,2
+9,14,14,39,2
+9,14,15,14,3
+9,14,17,29,3
+9,14,17,29,3
+9,14,17,29,3
+9,15,11,41,1
+9,15,11,41,1
+9,15,13,4,1
+9,15,14,3,1
+9,15,14,3,2
+9,16,12,36,1
+9,16,12,36,1
+9,16,12,36,1
+9,16,12,36,1
+9,16,12,48,1
+9,16,12,48,1
+9,16,13,51,1
+9,16,13,51,2
+9,16,13,51,1
+9,16,15,13,3
+9,16,15,14,3
+9,16,15,14,3
+9,17,10,27,0
+9,17,10,27,0
+9,17,11,10,0
+9,17,11,10,0
+9,17,11,10,0
+9,17,12,43,1
+9,17,12,43,1
+9,17,12,43,1
+9,17,13,32,1
+9,17,13,32,1
+9,17,14,5,1
+9,17,14,5,2
+9,17,14,6,2
+9,17,15,7,3
+9,17,15,49,3
+9,17,15,49,3
+9,17,18,12,3
+9,17,18,13,3
diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg
new file mode 100644
index 00000000..47c37ff2
--- /dev/null
+++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg
@@ -0,0 +1,24 @@
+encog,BasicNetwork,java,3.4.0,1,1554196571101
+[BASIC]
+[BASIC:PARAMS]
+[BASIC:NETWORK]
+beginTraining=0
+connectionLimit=0
+contextTargetOffset=0,0,0
+contextTargetSize=0,0,0
+endTraining=2
+hasContext=f
+inputCount=4
+layerCounts=1,8,5
+layerFeedCounts=1,7,4
+layerContextCount=0,0,0
+layerIndex=0,1,9
+output=0.2537517424,0.3154675575,-0.8739039638,-0.4408848221,-0.8484433638,-0.999915299,-0.6964984771,-0.208278439,1,0,0,-0.4545454545,0.3559322034,1
+outputCount=1
+weightIndex=0,8,43
+weights=0.5976774048,-0.7925906525,0.7127327881,-0.9611660362,0.8031350986,-0.7286657218,1.0990482817,-0.5985785536,-0.0783115433,0.575612931,1.1267500918,1.7184744034,0.2271044512,-1.0525796764,0.0900869671,1.1492323512,0.6141715555,-1.0455927965,-0.0925453451,0.2471651431,2.3634316872,0.3939369257,0.4607437082,-0.1435186798,0.8428535365,-0.0848896791,-0.070602589,-1.2640263565,2.4899996734,-0.2185394776,10.3421332361,-0.1650898311,-0.2750133571,-0.79680959,-0.8051139953,0.8219933747,-0.0727160299,-0.4609522002,-1.0410685492,-0.5354063412,0.3028724456,-0.6835374219,0.169591233
+biasActivation=0,1,1
+[BASIC:ACTIVATION]
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationLinear"
diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg
new file mode 100644
index 00000000..62fe6421
--- /dev/null
+++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg
@@ -0,0 +1,24 @@
+encog,BasicNetwork,java,3.4.0,1,1548158734516
+[BASIC]
+[BASIC:PARAMS]
+[BASIC:NETWORK]
+beginTraining=0
+connectionLimit=0
+contextTargetOffset=0,0,0
+contextTargetSize=0,0,0
+endTraining=2
+hasContext=f
+inputCount=4
+layerCounts=4,8,5
+layerFeedCounts=4,7,4
+layerContextCount=0,0,0
+layerIndex=0,4,12
+output=0.6991387348,-0.8711034513,-0.996886038,-0.832747291,-0.0935682806,-0.9996163977,0.5399150265,0.9411173394,-0.5084989975,0.4850010791,0.9999999957,1,0,-0.6666666667,-0.4545454545,0.6949152542,1
+outputCount=4
+weightIndex=0,32,67
+weights=-2.6901880743,0.6512821123,-1.2270002115,1.63124668,0.1982387305,-0.2994789552,1.5833040739,-0.9450411677,2.0541422847,-0.718279397,-1.1761952241,0.5028631512,0.0690323612,-1.496141565,-0.1955149568,-0.7453976822,-0.3691141073,0.9854755554,2.2113850088,-1.5216550292,0.9652087936,-1.3028209693,-1.3346156171,0.4142247818,1.0821207364,0.1987534858,0.6202881884,-0.2940331887,-1.4643282498,2.6960334656,-0.0167663298,-2.9907087565,0.3469960227,-0.0441249736,-2.5998575813,-0.7106361301,-0.8111809962,2.2216158678,-0.5482762437,-1.7996398291,-3.6734127565,-2.9102547958,0.4845401914,0.3760471288,-0.0124987546,0.3784047483,0.5860932613,-0.2682876707,0.7429004186,-7.559247176,-3.4421363532,1.1989747484,-2.3340717496,-1.4740773042,-0.7795788072,-1.8241693655,-0.630132295,-0.8191869009,-0.4060569987,-1.0997423162,-0.5495165849,0.1407829068,-2.2964930412,0.0798893221,-19.5271913755,2.0474187009,-0.2622671892
+biasActivation=0,1,1
+[BASIC:ACTIVATION]
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationTANH"
+"org.encog.engine.network.activation.ActivationLinear"
diff --git a/learner_test/src/main/resources/log4j2.xml b/learner_test/src/main/resources/log4j2.xml
new file mode 100644
index 00000000..0594576f
--- /dev/null
+++ b/learner_test/src/main/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/jastadd-mquat.log"
+                    filePattern="logs/jastadd-mquat-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/learner_test/src/test/java/de/tudresden/inf/st/eraser/learner_test/ATest.java b/learner_test/src/test/java/de/tudresden/inf/st/eraser/learner_test/ATest.java
new file mode 100644
index 00000000..a98338a9
--- /dev/null
+++ b/learner_test/src/test/java/de/tudresden/inf/st/eraser/learner_test/ATest.java
@@ -0,0 +1,18 @@
+package de.tudresden.inf.st.eraser.learner_test;
+
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+/**
+ * TODO: Add description.
+ *
+ * @author rschoene - Initial contribution
+ */
+public class ATest {
+
+  @Test
+  public void test1() {
+    fail();
+  }
+}
diff --git a/ml_test/out/production/resources/log4j2.xml b/ml_test/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..686c2a88
--- /dev/null
+++ b/ml_test/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/ml_test_boqi/.gitignore b/ml_test_boqi/.gitignore
new file mode 100644
index 00000000..84c048a7
--- /dev/null
+++ b/ml_test_boqi/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/ml_test_boqi/build.gradle b/ml_test_boqi/build.gradle
new file mode 100644
index 00000000..d07b5930
--- /dev/null
+++ b/ml_test_boqi/build.gradle
@@ -0,0 +1,33 @@
+repositories {
+    mavenCentral()
+}
+
+sourceCompatibility = 1.8
+
+apply plugin: 'java'
+apply plugin: 'application'
+
+dependencies {
+    compile project(':eraser-base')
+    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+    testCompile group: 'org.hamcrest', name: 'hamcrest-junit', version: '2.0.0.0'
+}
+
+run {
+    mainClassName = 'de.tudresden.inf.st.eraser.ml_test_boqi.Main'
+    standardInput = System.in
+    if (project.hasProperty("appArgs")) {
+        args Eval.me(appArgs)
+    }
+}
+
+sourceSets {
+    main {
+        java {
+            srcDir 'src/main/java'
+        }
+    }
+}
diff --git a/ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java b/ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java
new file mode 100644
index 00000000..f4266347
--- /dev/null
+++ b/ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java
@@ -0,0 +1,219 @@
+package de.tudresden.inf.st.eraser.ml_test_boqi;
+
+import de.tudresden.inf.st.eraser.jastadd.model.*;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.apache.commons.math3.stat.StatUtils;
+import de.tudresden.inf.st.eraser.jastadd.model.Item;
+
+
+public class Main {
+
+  private static final Logger logger = LogManager.getLogger(Main.class);
+
+  public static void main(String[] args) {
+
+    logger.info("Hello World!");
+    createAndTestBrightnessNetwork();
+  }
+  private static Root createModel() {
+    Root model = Root.createEmptyRoot();
+    Group group = new Group();
+    group.setID("Group1");
+    model.addGroup(group);
+
+    // inputs items muss normalize 1.0, 0.06666666666666665, 0.4545454545454546, -0.5593220338983051, 1(bias)
+
+    NumberItem monthItem = new NumberItem();
+    monthItem.setState(-1.0);
+    monthItem.setID("month");
+    monthItem.setLabel("datetime-month");
+
+    NumberItem dayItem = new NumberItem();
+    dayItem.setState(0.2666666666666666);
+    dayItem.setID("day");
+    dayItem.setLabel("datetime-day");
+
+    NumberItem hourItem = new NumberItem();
+    hourItem.setState(-0.6363636363636364);
+    hourItem.setID("hour");
+    hourItem.setLabel("datetime-hour");
+
+    NumberItem minuteItem = new NumberItem();
+    minuteItem.setState(-0.5593220338983051);
+    minuteItem.setID("minute");
+    minuteItem.setLabel("datetime-minute");
+
+    NumberItem biasItem = new NumberItem();
+    biasItem.setState(1);
+    biasItem.setID("bias");
+    biasItem.setLabel("bias");
+
+    group.addItem(monthItem);
+    group.addItem(dayItem);
+    group.addItem(hourItem);
+    group.addItem(minuteItem);
+    group.addItem(biasItem);
+    return model;
+  }
+  private static final int REPETITIONS = 1;
+  private static void classifyTimed(
+          NeuralNetworkRoot nn,
+          Function<NeuralNetworkRoot, DoubleNumber> classify,
+          Function<DoubleNumber, String> leafToString) {
+    List<String> results = new ArrayList<>();
+    List<Long> times = new ArrayList<>();
+    long before = System.nanoTime();
+    DoubleNumber classification = classify.apply(nn);
+    long diff = System.nanoTime() - before;
+    results.add(leafToString.apply(classification));
+    times.add(TimeUnit.NANOSECONDS.toMillis(diff));
+    logger.info("Classification results: {}", results);
+    logger.info("Took {}ms", String.join("ms, ", times.stream().map(l -> Long.toString(l)).collect(Collectors.toList())));
+    logger.info("Took on average: {}ms",
+            Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).average().orElse(-1));
+    logger.info("Took on median: {}ms",
+            Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).sorted()
+                    .skip((REPETITIONS - 1) / 2).limit(2 - REPETITIONS % 2).average().orElse(Double.NaN));
+  }
+
+  /**
+   * Purpose: Create a neural network with 3 layers (5 + 8 + 4 neurons)
+   */
+  private static void createAndTestBrightnessNetwork() {
+    Root model = createModel();
+    Item monthItem = model.resolveItem("month").orElseThrow(
+            () -> new RuntimeException("Month not found"));
+    Item dayItem = model.resolveItem("day").orElseThrow(
+            () -> new RuntimeException("Day not found"));
+    Item hourItem = model.resolveItem("hour").orElseThrow(
+            () -> new RuntimeException("Hour not found"));
+    Item minuteItem = model.resolveItem("minute").orElseThrow(
+            () -> new RuntimeException("Minute not found"));
+    Item biasItem = model.resolveItem("bias").orElseThrow(
+            () -> new RuntimeException("Bias not found"));
+
+    NeuralNetworkRoot nn = new NeuralNetworkRoot();
+
+    DoubleArrayDoubleFunction sigmoid = inputs -> Math.signum(Arrays.stream(inputs).sum());
+    DoubleArrayDoubleFunction tanh= inputs ->Math.tanh(Arrays.stream(inputs).sum());
+    DoubleArrayDoubleFunction function_one= inputs->function_one();
+
+    //Weights outputs from learner Module
+    ArrayList<Double> weights= new ArrayList<Double>(Arrays.asList(
+            -4.8288886204,0.6723236931,2.1451097188,-0.8551053267,-0.7858304445,4.1369566727,-3.3096691918,
+            -0.2190980261,2.6871317298,1.2272772167,-2.5292510941,-1.2860407542,-4.2280191541,1.004752063,
+            0.8345207039,0.0123185817,-0.5921808915,0.0967336988,-0.305892589,0.5572392781,-0.7190098073,
+            -1.6247354373,0.4589248822,-0.0269816271,2.2208040852,-3.6281085698,0.2204999381,4.7263701556,
+            -4.8348948698,0.231141867,8.7120706018,-1.4912707741,0.9482851705,0.1377551973,-6.6525856465,
+            -1.321197315,-2.7369948929,17.664289214,-3.1279212743,-0.8245974167,-1.4251924355,0.8370511414,
+            2.0841638143,-0.210152817,-1.9414132298,-1.7973688846,-2.1977997794,-3.6046836685,-3.3403186721,
+            -6.1556924635,-2.8952903587,-1.0773989561,0.2300429028,-0.2184650371,0.0297181797,0.5709092417,
+            1.3960358442,-3.1577981239,0.0423944625,-17.8143314027,-1.4439317172,-0.5137688896,1.0166045804,
+            0.3059149818,1.0938282764,0.6203368549,0.702449827));
+    // input layer
+    InputNeuron month = new InputNeuron();
+    month.setItem(monthItem);
+    InputNeuron day = new InputNeuron();
+    day.setItem(dayItem);
+    InputNeuron hour = new InputNeuron();
+    hour.setItem(hourItem);
+    InputNeuron minute = new InputNeuron();
+    minute.setItem(minuteItem);
+    InputNeuron bias = new InputNeuron();
+    bias.setItem(biasItem);
+
+    nn.addInputNeuron(month);
+    nn.addInputNeuron(day);
+    nn.addInputNeuron(hour);
+    nn.addInputNeuron(minute);
+    nn.addInputNeuron(bias);
+
+    // output layer
+    OutputLayer outputLayer = new OutputLayer();
+    OutputNeuron output0 = new OutputNeuron();
+    output0.setActivationFormula(tanh);
+    OutputNeuron output1 = new OutputNeuron();
+    output1.setActivationFormula(tanh);
+    OutputNeuron output2 = new OutputNeuron();
+    output2.setActivationFormula(tanh);
+    OutputNeuron output3 = new OutputNeuron();
+    output3.setActivationFormula(tanh);
+
+    outputLayer.addOutputNeuron(output0);
+    outputLayer.addOutputNeuron(output1);
+    outputLayer.addOutputNeuron(output2);
+    outputLayer.addOutputNeuron(output3);
+
+    outputLayer.setCombinator(inputs->predictor(inputs));
+    nn.setOutputLayer(outputLayer);
+
+    // hidden layer
+    HiddenNeuron[] hiddenNeurons = new HiddenNeuron[8];
+    for (int i = 0; i < (hiddenNeurons.length); i++) {
+
+      if (i==7){
+        HiddenNeuron hiddenNeuron = new HiddenNeuron();
+        hiddenNeuron.setActivationFormula(function_one);
+        hiddenNeurons[i] = hiddenNeuron;
+        nn.addHiddenNeuron(hiddenNeuron);
+        bias.connectTo(hiddenNeuron,1.0);
+        hiddenNeuron.connectTo(output0, weights.get(i));
+        hiddenNeuron.connectTo(output1, weights.get(i+8));
+        hiddenNeuron.connectTo(output2, weights.get(i+8*2));
+        hiddenNeuron.connectTo(output3, weights.get(i+8*3));
+      }
+     else{
+        HiddenNeuron hiddenNeuron = new HiddenNeuron();
+        hiddenNeuron.setActivationFormula(tanh);
+        hiddenNeurons[i] = hiddenNeuron;
+        nn.addHiddenNeuron(hiddenNeuron);
+
+        month.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4)+i*5));
+        day.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4+1)+i*5));
+        hour.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4+2)+i*5));
+        minute.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4+3)+i*5));
+        bias.connectTo(hiddenNeuron,weights.get((hiddenNeurons.length*4+4)+i*5));
+        hiddenNeuron.connectTo(output0, weights.get(i));
+        hiddenNeuron.connectTo(output1, weights.get(i+8));
+        hiddenNeuron.connectTo(output2, weights.get(i+8*2));
+        hiddenNeuron.connectTo(output3, weights.get(i+8*3));}
+    }
+
+    model.getMachineLearningRoot().setPreferenceLearning(nn);
+    System.out.println(model.prettyPrint());
+
+    classifyTimed(nn, NeuralNetworkRoot::classify,
+            classification -> Double.toString(classification.number));
+  }
+  private static double function_one() {
+    return 1.0;
+  }
+  private static double predictor(double[] inputs) {
+    int index=0;
+    double maxinput=StatUtils.max(inputs);
+    System.out.println(inputs);
+    for (int i = 0; i < inputs.length; i++)
+    {
+      if (inputs[i] == maxinput){
+        index=i;
+      }
+    }
+    //outputs from learner
+    ArrayList<Double> outputs= new ArrayList<Double>(Arrays.asList(2.0,1.0,3.0,0.0));
+    double output=outputs.get(index);
+    return output;
+  }
+}
+
+//inputs:
+//[BasicMLData:-1.0,0.2666666666666666,-0.6363636363636364,-0.5593220338983051]
+//outputs:
+//[BasicMLData:-0.9151867668336432,-0.1568555041251098,-0.9786996639280675,-0.9436628188408074]
+//[7, 20, 12, 13] -> predicted: 1(correct: 2)
\ No newline at end of file
diff --git a/ml_test_boqi/src/main/resources/log4j2.xml b/ml_test_boqi/src/main/resources/log4j2.xml
new file mode 100644
index 00000000..0594576f
--- /dev/null
+++ b/ml_test_boqi/src/main/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/jastadd-mquat.log"
+                    filePattern="logs/jastadd-mquat-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/ml_test_boqi/src/test/java/de/tudresden/inf/st/eraser/ml_test_boqi/ATest.java b/ml_test_boqi/src/test/java/de/tudresden/inf/st/eraser/ml_test_boqi/ATest.java
new file mode 100644
index 00000000..9354ced3
--- /dev/null
+++ b/ml_test_boqi/src/test/java/de/tudresden/inf/st/eraser/ml_test_boqi/ATest.java
@@ -0,0 +1,22 @@
+package de.tudresden.inf.st.eraser.ml_test_boqi;
+
+import de.tudresden.inf.st.eraser.jastadd.model.*;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.fail;
+
+/**
+ * TODO: Add description.
+ *
+ * @author rschoene - Initial contribution
+ */
+public class ATest {
+
+  @Test
+  public void test1() {
+    fail();
+  }
+}
diff --git a/openhab-mock/out/production/resources/data1.csv b/openhab-mock/out/production/resources/data1.csv
new file mode 100644
index 00000000..87864a1f
--- /dev/null
+++ b/openhab-mock/out/production/resources/data1.csv
@@ -0,0 +1,3 @@
+time,topic,qos,message
+0,oh2/out/iris1_item/state,0,1
+1,oh2/out/iris1_item/state,0,0
diff --git a/openhab-mock/out/production/resources/log4j2.xml b/openhab-mock/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..18175a02
--- /dev/null
+++ b/openhab-mock/out/production/resources/log4j2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+        <Logger name="de.tudresden.inf.st.eraser.openhab2.mqtt" level="DEBUG" additivity="false">
+            <Appender-ref ref="Console"/>
+        </Logger>
+    </Loggers>
+</Configuration>
diff --git a/org.openhab.action.machinelearn/out/production/resources/readme.txt b/org.openhab.action.machinelearn/out/production/resources/readme.txt
new file mode 100644
index 00000000..98698c67
--- /dev/null
+++ b/org.openhab.action.machinelearn/out/production/resources/readme.txt
@@ -0,0 +1 @@
+Bundle resources go in here!
\ No newline at end of file
diff --git a/org.openlicht.action.reinforcementlearning/out/production/resources/readme.txt b/org.openlicht.action.reinforcementlearning/out/production/resources/readme.txt
new file mode 100644
index 00000000..98698c67
--- /dev/null
+++ b/org.openlicht.action.reinforcementlearning/out/production/resources/readme.txt
@@ -0,0 +1 @@
+Bundle resources go in here!
\ No newline at end of file
diff --git a/skywriter-hue-integration/out/production/resources/log4j2.xml b/skywriter-hue-integration/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..5d1091ea
--- /dev/null
+++ b/skywriter-hue-integration/out/production/resources/log4j2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+        <Logger name="de.tudresden.inf.st.eraser.openhab2.mqtt" level="DEBUG" additivity="false">
+            <Appender-ref ref="Console"/>
+        </Logger>
+    </Loggers>
+</Configuration>
diff --git a/skywriter-hue-integration/out/production/resources/skywriter-hue.eraser b/skywriter-hue-integration/out/production/resources/skywriter-hue.eraser
new file mode 100644
index 00000000..b32c7a11
--- /dev/null
+++ b/skywriter-hue-integration/out/production/resources/skywriter-hue.eraser
@@ -0,0 +1,44 @@
+ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ;
+ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ;
+ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[];
+ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ;
+
+Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ;
+Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ;
+Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ;
+Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ;
+Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ;
+
+ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ;
+ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="Unknown" ;
+ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ;
+ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ;
+ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ;
+ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ;
+ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ;
+
+Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ;
+Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ;
+Channel: id="skywriter1-flick" type="flick-type" links=[];
+Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"];
+Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"];
+
+Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state";
+Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x";
+Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y";
+Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz";
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"];
+
+Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the &lt;broker&gt;.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ;
+
+// MqttHost is set programmatically
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" ;
diff --git a/skywriter-hue-integration/out/production/resources/smart_arrive.eraser b/skywriter-hue-integration/out/production/resources/smart_arrive.eraser
new file mode 100644
index 00000000..44b67cf9
--- /dev/null
+++ b/skywriter-hue-integration/out/production/resources/smart_arrive.eraser
@@ -0,0 +1,44 @@
+ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ;
+ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ;
+ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[];
+ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ;
+
+Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ;
+Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ;
+Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ;
+Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ;
+Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ;
+
+ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ;
+ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="Unknown" ;
+ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ;
+ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ;
+ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ;
+ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ;
+ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ;
+
+Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ;
+Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ;
+Channel: id="skywriter1-flick" type="flick-type" links=[];
+Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"];
+Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"];
+
+Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state";
+Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x";
+Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y";
+//Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz";
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"];
+
+Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the &lt;broker&gt;.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ;
+
+// MqttHost is set programmatically
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" ;
diff --git a/skywriter-hue-integration/src/main/resources/smart_arrive.eraser b/skywriter-hue-integration/src/main/resources/smart_arrive.eraser
new file mode 100644
index 00000000..44b67cf9
--- /dev/null
+++ b/skywriter-hue-integration/src/main/resources/smart_arrive.eraser
@@ -0,0 +1,44 @@
+ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ;
+ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ;
+ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[];
+ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ;
+
+Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ;
+Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ;
+Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ;
+Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ;
+Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ;
+
+ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ;
+ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="Unknown" ;
+ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ;
+ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ;
+ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ;
+ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ;
+ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ;
+
+Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ;
+Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ;
+Channel: id="skywriter1-flick" type="flick-type" links=[];
+Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"];
+Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"];
+
+Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state";
+Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x";
+Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y";
+//Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz";
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"];
+
+Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the &lt;broker&gt;.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ;
+
+// MqttHost is set programmatically
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" ;
diff --git a/smart_ankunft_integration/.gitignore b/smart_ankunft_integration/.gitignore
new file mode 100644
index 00000000..84c048a7
--- /dev/null
+++ b/smart_ankunft_integration/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/smart_ankunft_integration/build.gradle b/smart_ankunft_integration/build.gradle
new file mode 100644
index 00000000..5c153661
--- /dev/null
+++ b/smart_ankunft_integration/build.gradle
@@ -0,0 +1,39 @@
+repositories {
+    mavenCentral()
+}
+
+sourceCompatibility = 1.8
+
+apply plugin: 'java'
+apply plugin: 'application'
+
+dependencies {
+    compile project(':eraser-base')
+    compile project(':commons.color')
+    compile project(':feedbackloop.api')
+    compile project(':feedbackloop.monitor')
+    compile project(':feedbackloop.analyze')
+    compile project(':feedbackloop.plan')
+    compile project(':feedbackloop.execute')
+    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.8.1'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0'
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+    testCompile group: 'org.hamcrest', name: 'hamcrest-junit', version: '1.0.0.0'
+}
+
+run {
+    mainClassName = 'de.tudresden.inf.st.eraser.smart_ankunft_integration.Main'
+    standardInput = System.in
+    if (project.hasProperty("appArgs")) {
+        args Eval.me(appArgs)
+    }
+}
+
+sourceSets {
+    main {
+        java {
+            srcDir 'src/main/java'
+        }
+    }
+}
diff --git a/smart_ankunft_integration/src/main/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/Main.java b/smart_ankunft_integration/src/main/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/Main.java
new file mode 100644
index 00000000..2ca42a5a
--- /dev/null
+++ b/smart_ankunft_integration/src/main/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/Main.java
@@ -0,0 +1,161 @@
+package de.tudresden.inf.st.eraser.smart_ankunft_integration;
+
+import beaver.Parser;
+
+import de.tudresden.inf.st.eraser.commons.color.ColorUtils;
+import de.tudresden.inf.st.eraser.commons.color.ColorUtils.RGBvalues;
+import de.tudresden.inf.st.eraser.jastadd.model.Item;
+import de.tudresden.inf.st.eraser.jastadd.model.Root;
+import de.tudresden.inf.st.eraser.jastadd.model.Rule;
+import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater;
+import de.tudresden.inf.st.eraser.util.ParserUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
+import java.util.NoSuchElementException;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import beaver.Parser;
+import de.tudresden.inf.st.eraser.feedbackloop.analyze.AnalyzeImpl;
+import de.tudresden.inf.st.eraser.feedbackloop.api.Analyze;
+import de.tudresden.inf.st.eraser.feedbackloop.api.Execute;
+import de.tudresden.inf.st.eraser.feedbackloop.api.Monitor;
+import de.tudresden.inf.st.eraser.feedbackloop.api.Plan;
+import de.tudresden.inf.st.eraser.feedbackloop.execute.ExecuteImpl;
+import de.tudresden.inf.st.eraser.feedbackloop.monitor.MonitorImpl;
+import de.tudresden.inf.st.eraser.feedbackloop.plan.PlanImpl;
+
+public class Main {
+
+  private static Logger logger = LogManager.getLogger(Main.class);
+
+  /** Use thread to make random edits */
+  private static final boolean USE_RANDOM_EDITS = false;
+  /** Time to wait between random edits (only used, if USE_RANDOM_EDITS is true) */
+  private static final int STD_WAIT_IN_MILLI_SECONDS = 2 * 1000;
+  /** Use thread to read changes from openHAB */
+  private static final boolean USE_READ_FROM_OPENHAB = true;
+  /** Use real MQTT sender to propagate changes to openHAB */
+  private static final boolean SEND_TO_OPENHAB = true;
+  /** Host of MQTT broker (only used, if USE_READ_FROM_OPENHAB is true) */
+  //
+  private static final String MQTT_HOST = "localhost";
+
+  private static Analyze analyze;
+  private static Plan plan;
+  private static Execute execute;
+
+
+  // ignore, that result of System.in.read() is not used
+  @SuppressWarnings("ResultOfMethodCallIgnored")
+  public static void main(String[] args) throws IOException, Parser.Exception {
+    // use openHAB-eraser-connection to update hue (automatically done with UpdatingItem)
+    Root model = ParserUtils.load("smart_ankunft.eraser", Main.class);
+    System.out.println(model.currentActivity());
+    Item irisItem = model.resolveItem("iris1_item").orElseThrow(() ->
+            new NoSuchElementException("Iris1_item not found"));
+    Item userItem = model.resolveItem("user1").orElseThrow(() ->
+            new NoSuchElementException("User 1 not found"));
+    // define rule to switch color, based on xyz-to-rgb-to-hsb mapping
+    Rule userChanged = new Rule();
+    model.addRule(userChanged);
+    userChanged.addEventFor(userItem, "on/off changed");
+//    mapXYtoIrisState.addEventFor(skywriter1_y, "y changed");
+    userChanged.setCondition(root -> true); // always fire
+    userChanged.setAction(root -> updateBrightness(userItem, irisItem, model));
+
+    // get mqtt message directly from skywriter, not via binding (which is not working atm)
+    Lock abortLock = new ReentrantLock();
+    Condition abortCondition = abortLock.newCondition();
+    Thread readFromOpenHABThread = new Thread(() -> {
+      try (MQTTUpdater updater = new MQTTUpdater(model)) {
+        updater.start();
+        if (!updater.waitUntilReady(3, TimeUnit.SECONDS)) {
+          logger.error("openHAB reader not ready. Aborting.");
+          return;
+        }
+        try {
+          logger.debug("oh-read, attempt to lock");
+          abortLock.lock();
+          abortCondition.await();
+        } catch (InterruptedException e) {
+          logger.info("Premature exit of openHAB reader thread!");
+        } finally {
+          abortLock.unlock();
+        }
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    });
+    if (USE_READ_FROM_OPENHAB || SEND_TO_OPENHAB) {
+      model.getMqttRoot().setHostByName(MQTT_HOST);
+    }
+    if (USE_READ_FROM_OPENHAB) {
+      readFromOpenHABThread.start();
+    }
+
+
+    //excute...
+    Monitor monitor = new MonitorImpl();
+    Analyze analyze = new AnalyzeImpl();
+    Plan plan = new PlanImpl();
+    Execute execute = new ExecuteImpl();
+
+    monitor.setAnalyze(analyze);
+    analyze.setPlan(plan);
+    plan.setExecute(execute);
+
+    monitor.setKnowledgeBase(model);
+    analyze.setKnowledgeBase(model);
+    plan.setKnowledgeBase(model);
+    execute.setKnowledgeBase(model);
+
+    startMAPE(userItem);
+    System.out.println("Press [Enter] to exit!");
+    System.in.read();
+    // wait for user to press enter
+    System.out.println("Stopping...");
+    analyze.stop();
+
+    // and then cancel the threads
+    try {
+      abortLock.lock();
+      abortCondition.signalAll();
+    } finally {
+      abortLock.unlock();
+    }
+
+    // and join everything
+    try {
+      readFromOpenHABThread.join();
+    } catch (InterruptedException e) {
+      logger.catching(e);
+    }
+  }
+  private  static void startMAPE(Item userItem){
+    String user_state= userItem.getStateAsString();
+    if (user_state.equals("on")){
+      analyze.startAsThread(1, TimeUnit.SECONDS);
+
+    }
+  }
+  private static void updateBrightness(Item userItem, Item irisItem, Root model) {
+
+    String user_state= userItem.getStateAsString();
+    Integer brightness = 10;
+    if (user_state.equals("on")){
+      System.out.println("user 1 is on");
+      irisItem.setStateFromString(String.format("%d,%d,%d", 10, 10, brightness));
+      logger.info(model.currentActivity());
+    }else {
+      System.out.println("user 1 is off");
+    }
+
+    logger.info("update");
+  }
+}
diff --git a/smart_ankunft_integration/src/main/resources/log4j2.xml b/smart_ankunft_integration/src/main/resources/log4j2.xml
new file mode 100644
index 00000000..0594576f
--- /dev/null
+++ b/smart_ankunft_integration/src/main/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/jastadd-mquat.log"
+                    filePattern="logs/jastadd-mquat-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/smart_ankunft_integration/src/main/resources/smart_ankunft.eraser b/smart_ankunft_integration/src/main/resources/smart_ankunft.eraser
new file mode 100644
index 00000000..cd559468
--- /dev/null
+++ b/smart_ankunft_integration/src/main/resources/smart_ankunft.eraser
@@ -0,0 +1,49 @@
+ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ;
+ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ;
+ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[];
+ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ;
+
+Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ;
+Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ;
+Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ;
+Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ;
+Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ;
+
+ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ;
+ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="ColorLight" ;
+ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ;
+ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ;
+ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ;
+ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ;
+ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ;
+
+Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ;
+Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ;
+Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ;
+Channel: id="skywriter1-flick" type="flick-type" links=[];
+Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"];
+Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"];
+
+Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state";
+Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x";
+Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y";
+Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz";
+
+
+Item: id="user1" label="User 1" state="off" topic="user1/state";
+
+Group: id="Lights" items=["iris1_item"];
+Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"];
+
+Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the &lt;broker&gt;.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ;
+
+// MqttHost is set programmatically
+Mqtt: incoming="oh2/out/" outgoing="oh2/in/" host="localhost";
+
+
diff --git a/smart_ankunft_integration/src/test/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/ATest.java b/smart_ankunft_integration/src/test/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/ATest.java
new file mode 100644
index 00000000..f5a19b7c
--- /dev/null
+++ b/smart_ankunft_integration/src/test/java/de/tudresden/inf/st/eraser/smart_ankunft_integration/ATest.java
@@ -0,0 +1,22 @@
+package de.tudresden.inf.st.eraser.smart_ankunft_integration;
+
+import de.tudresden.inf.st.eraser.jastadd.model.*;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.fail;
+
+/**
+ * TODO: Add description.
+ *
+ * @author rschoene - Initial contribution
+ */
+public class ATest {
+
+  @Test
+  public void test1() {
+    fail();
+  }
+}
diff --git a/stub.org.openhab.core.scriptengine.action/out/production/resources/log4j2.xml b/stub.org.openhab.core.scriptengine.action/out/production/resources/log4j2.xml
new file mode 100644
index 00000000..867ec439
--- /dev/null
+++ b/stub.org.openhab.core.scriptengine.action/out/production/resources/log4j2.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console">
+            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
+        </Console>
+        <RollingFile name="RollingFile" fileName="logs/eraser.log"
+                    filePattern="logs/eraser-%i.log">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <OnStartupTriggeringPolicy/>
+            </Policies>
+            <DefaultRolloverStrategy max="20"/>
+        </RollingFile>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/venv/.Python b/venv/.Python
new file mode 120000
index 00000000..91eab5c4
--- /dev/null
+++ b/venv/.Python
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/Python
\ No newline at end of file
diff --git a/venv/bin/activate b/venv/bin/activate
new file mode 100644
index 00000000..89f98fca
--- /dev/null
+++ b/venv/bin/activate
@@ -0,0 +1,78 @@
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+    unset -f pydoc >/dev/null 2>&1
+
+    # reset old environment variables
+    # ! [ -z ${VAR+_} ] returns true if VAR is declared at all
+    if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then
+        PATH="$_OLD_VIRTUAL_PATH"
+        export PATH
+        unset _OLD_VIRTUAL_PATH
+    fi
+    if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then
+        PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
+        export PYTHONHOME
+        unset _OLD_VIRTUAL_PYTHONHOME
+    fi
+
+    # This should detect bash and zsh, which have a hash command that must
+    # be called to get it to forget past commands.  Without forgetting
+    # past commands the $PATH changes we made may not be respected
+    if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
+        hash -r 2>/dev/null
+    fi
+
+    if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then
+        PS1="$_OLD_VIRTUAL_PS1"
+        export PS1
+        unset _OLD_VIRTUAL_PS1
+    fi
+
+    unset VIRTUAL_ENV
+    if [ ! "${1-}" = "nondestructive" ] ; then
+    # Self destruct!
+        unset -f deactivate
+    fi
+}
+
+# unset irrelevant variables
+deactivate nondestructive
+
+VIRTUAL_ENV="/Users/boqi/eraser/venv"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/bin:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+if ! [ -z "${PYTHONHOME+_}" ] ; then
+    _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
+    unset PYTHONHOME
+fi
+
+if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
+    _OLD_VIRTUAL_PS1="$PS1"
+    if [ "x" != x ] ; then
+        PS1="$PS1"
+    else
+        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+    fi
+    export PS1
+fi
+
+# Make sure to unalias pydoc if it's already there
+alias pydoc 2>/dev/null >/dev/null && unalias pydoc
+
+pydoc () {
+    python -m pydoc "$@"
+}
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands.  Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
+    hash -r 2>/dev/null
+fi
diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh
new file mode 100644
index 00000000..d9598694
--- /dev/null
+++ b/venv/bin/activate.csh
@@ -0,0 +1,36 @@
+# 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>.
+
+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 && unalias pydoc'
+
+# Unset irrelevant variables.
+deactivate nondestructive
+
+setenv VIRTUAL_ENV "/Users/boqi/eraser/venv"
+
+set _OLD_VIRTUAL_PATH="$PATH"
+setenv PATH "$VIRTUAL_ENV/bin:$PATH"
+
+
+
+if ("" != "") then
+    set env_name = ""
+else
+    set env_name = `basename "$VIRTUAL_ENV"`
+endif
+
+# Could be in a non-interactive environment,
+# in which case, $prompt is undefined and we wouldn't
+# care about the prompt anyway.
+if ( $?prompt ) then
+    set _OLD_VIRTUAL_PROMPT="$prompt"
+    set prompt = "[$env_name] $prompt"
+endif
+
+unset env_name
+
+alias pydoc python -m pydoc
+
+rehash
+
diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish
new file mode 100644
index 00000000..835a867e
--- /dev/null
+++ b/venv/bin/activate.fish
@@ -0,0 +1,76 @@
+# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*.
+# Do not run it directly.
+
+function deactivate -d 'Exit virtualenv mode and return to the normal environment.'
+    # reset old environment variables
+    if test -n "$_OLD_VIRTUAL_PATH"
+        set -gx PATH $_OLD_VIRTUAL_PATH
+        set -e _OLD_VIRTUAL_PATH
+    end
+
+    if test -n "$_OLD_VIRTUAL_PYTHONHOME"
+        set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
+        set -e _OLD_VIRTUAL_PYTHONHOME
+    end
+
+    if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
+        # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`.
+        set -l fish_function_path
+
+        # Erase virtualenv's `fish_prompt` and restore the original.
+        functions -e fish_prompt
+        functions -c _old_fish_prompt fish_prompt
+        functions -e _old_fish_prompt
+        set -e _OLD_FISH_PROMPT_OVERRIDE
+    end
+
+    set -e VIRTUAL_ENV
+
+    if test "$argv[1]" != 'nondestructive'
+        # Self-destruct!
+        functions -e pydoc
+        functions -e deactivate
+    end
+end
+
+# Unset irrelevant variables.
+deactivate nondestructive
+
+set -gx VIRTUAL_ENV "/Users/boqi/eraser/venv"
+
+set -gx _OLD_VIRTUAL_PATH $PATH
+set -gx PATH "$VIRTUAL_ENV/bin" $PATH
+
+# Unset `$PYTHONHOME` if set.
+if set -q PYTHONHOME
+    set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
+    set -e PYTHONHOME
+end
+
+function pydoc
+    python -m pydoc $argv
+end
+
+if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
+    # Copy the current `fish_prompt` function as `_old_fish_prompt`.
+    functions -c fish_prompt _old_fish_prompt
+
+    function fish_prompt
+        # Save the current $status, for fish_prompts that display it.
+        set -l old_status $status
+
+        # Prompt override provided?
+        # If not, just prepend the environment name.
+        if test -n ""
+            printf '%s%s' "" (set_color normal)
+        else
+            printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV")
+        end
+
+        # Restore the original $status
+        echo "exit $old_status" | source
+        _old_fish_prompt
+    end
+
+    set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
+end
diff --git a/venv/bin/activate_this.py b/venv/bin/activate_this.py
new file mode 100644
index 00000000..f18193bf
--- /dev/null
+++ b/venv/bin/activate_this.py
@@ -0,0 +1,34 @@
+"""By using execfile(this_file, dict(__file__=this_file)) you will
+activate this virtualenv environment.
+
+This can be used when you must use an existing Python interpreter, not
+the virtualenv bin/python
+"""
+
+try:
+    __file__
+except NameError:
+    raise AssertionError(
+        "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")
+import sys
+import os
+
+old_os_path = os.environ.get('PATH', '')
+os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
+base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+if sys.platform == 'win32':
+    site_packages = os.path.join(base, 'Lib', 'site-packages')
+else:
+    site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
+prev_sys_path = list(sys.path)
+import site
+site.addsitedir(site_packages)
+sys.real_prefix = sys.prefix
+sys.prefix = base
+# Move the added items to the front of the path:
+new_sys_path = []
+for item in list(sys.path):
+    if item not in prev_sys_path:
+        new_sys_path.append(item)
+        sys.path.remove(item)
+sys.path[:0] = new_sys_path
diff --git a/venv/bin/easy_install b/venv/bin/easy_install
new file mode 100755
index 00000000..2cc7082b
--- /dev/null
+++ b/venv/bin/easy_install
@@ -0,0 +1,11 @@
+#!/Users/boqi/eraser/venv/bin/python2.7
+
+# -*- 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-2.7 b/venv/bin/easy_install-2.7
new file mode 100755
index 00000000..2cc7082b
--- /dev/null
+++ b/venv/bin/easy_install-2.7
@@ -0,0 +1,11 @@
+#!/Users/boqi/eraser/venv/bin/python2.7
+
+# -*- 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/pip b/venv/bin/pip
new file mode 100755
index 00000000..4507d9a2
--- /dev/null
+++ b/venv/bin/pip
@@ -0,0 +1,11 @@
+#!/Users/boqi/eraser/venv/bin/python2.7
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from pip._internal 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/pip2 b/venv/bin/pip2
new file mode 100755
index 00000000..4507d9a2
--- /dev/null
+++ b/venv/bin/pip2
@@ -0,0 +1,11 @@
+#!/Users/boqi/eraser/venv/bin/python2.7
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from pip._internal 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/pip2.7 b/venv/bin/pip2.7
new file mode 100755
index 00000000..4507d9a2
--- /dev/null
+++ b/venv/bin/pip2.7
@@ -0,0 +1,11 @@
+#!/Users/boqi/eraser/venv/bin/python2.7
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from pip._internal 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
new file mode 120000
index 00000000..8f7a3c1a
--- /dev/null
+++ b/venv/bin/python
@@ -0,0 +1 @@
+python2.7
\ No newline at end of file
diff --git a/venv/bin/python-config b/venv/bin/python-config
new file mode 100755
index 00000000..13a28453
--- /dev/null
+++ b/venv/bin/python-config
@@ -0,0 +1,78 @@
+#!/Users/boqi/eraser/venv/bin/python
+
+import sys
+import getopt
+import sysconfig
+
+valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
+              'ldflags', 'help']
+
+if sys.version_info >= (3, 2):
+    valid_opts.insert(-1, 'extension-suffix')
+    valid_opts.append('abiflags')
+if sys.version_info >= (3, 3):
+    valid_opts.append('configdir')
+
+
+def exit_with_usage(code=1):
+    sys.stderr.write("Usage: {0} [{1}]\n".format(
+        sys.argv[0], '|'.join('--'+opt for opt in valid_opts)))
+    sys.exit(code)
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
+except getopt.error:
+    exit_with_usage()
+
+if not opts:
+    exit_with_usage()
+
+pyver = sysconfig.get_config_var('VERSION')
+getvar = sysconfig.get_config_var
+
+opt_flags = [flag for (flag, val) in opts]
+
+if '--help' in opt_flags:
+    exit_with_usage(code=0)
+
+for opt in opt_flags:
+    if opt == '--prefix':
+        print(sysconfig.get_config_var('prefix'))
+
+    elif opt == '--exec-prefix':
+        print(sysconfig.get_config_var('exec_prefix'))
+
+    elif opt in ('--includes', '--cflags'):
+        flags = ['-I' + sysconfig.get_path('include'),
+                 '-I' + sysconfig.get_path('platinclude')]
+        if opt == '--cflags':
+            flags.extend(getvar('CFLAGS').split())
+        print(' '.join(flags))
+
+    elif opt in ('--libs', '--ldflags'):
+        abiflags = getattr(sys, 'abiflags', '')
+        libs = ['-lpython' + pyver + abiflags]
+        libs += getvar('LIBS').split()
+        libs += getvar('SYSLIBS').split()
+        # add the prefix/lib/pythonX.Y/config dir, but only if there is no
+        # shared library in prefix/lib/.
+        if opt == '--ldflags':
+            if not getvar('Py_ENABLE_SHARED'):
+                libs.insert(0, '-L' + getvar('LIBPL'))
+            if not getvar('PYTHONFRAMEWORK'):
+                libs.extend(getvar('LINKFORSHARED').split())
+        print(' '.join(libs))
+
+    elif opt == '--extension-suffix':
+        ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
+        if ext_suffix is None:
+            ext_suffix = sysconfig.get_config_var('SO')
+        print(ext_suffix)
+
+    elif opt == '--abiflags':
+        if not getattr(sys, 'abiflags', None):
+            exit_with_usage()
+        print(sys.abiflags)
+
+    elif opt == '--configdir':
+        print(sysconfig.get_config_var('LIBPL'))
diff --git a/venv/bin/python2 b/venv/bin/python2
new file mode 120000
index 00000000..8f7a3c1a
--- /dev/null
+++ b/venv/bin/python2
@@ -0,0 +1 @@
+python2.7
\ No newline at end of file
diff --git a/venv/bin/python2.7 b/venv/bin/python2.7
new file mode 100755
index 0000000000000000000000000000000000000000..c788c9919ff2f5634d2cdc294c7c557b85694dce
GIT binary patch
literal 12568
zcmX^A>+L^w1_nlE28ISE1_lN}1_lNTRtAPv1_cHXkYr$B@L*tIh>s6&ba#z%4e|$x
zqGCo=E><4MoDN2iIU%kQA*f2g`XSaKB%pkD1_lOJ1_lNes7!o(Noqw2lmm7bs(C%~
z3=AOixS&cvd?*t_u`o117!Wc(zPO|`sTjh+V%{{Ud2CP>Fg}#azyUQ6CJ!+$J|i`!
zAhigKd2^uVNkI(&@j>AZ<$^ql=DyOr^31%H_{_Ytd@SbefSL!2Baj&&K8krDK_m={
zhZkUTTpU9jkt7r#;l>~U6@!L9j1P(jW(EcZnA!31c{%aLmAOgzIq?N0MGW!r*v*3(
z2TD#L{ZP{xK;Z?7Cm26IJ|_{Mc>+-PaX>YI_{iqL+y|9r0QnOXCh_q;o_^l0E}pP7
zX8`f11k7>+hz=MZWDZOUB%{Q@&;V9qz`y{qo5O&CK>{QJ#R>)t;2<(EU|;~L1BDMr
zKEnW#Zci96Fa$6#FmN+KXplCL`7jJpkL(YSJTl&407??bA`mto0|O{X8F&~N81zev
zi}Z6clk`(6b5bDE4AKk`cW&8Yl6X<na$CoeHlGv+Pb(D$h<h1$xfnoL3&w})(_mm|
z0J$GM-+=5XfSL(%GXpyl0|+~$R-`7EmLw+Sq{bH{mSpJb>FMhQRF-7q=P~G+>lvEH
z8|u3iCFZ7<=NDxc>qBJp(qJO`VW~yMnfZCe`bK)@P+71`K=xT6*~en^gas6HaKGkc
zCIwd(m!#(EIq9WT=42*;wSmJU14$o)_!?FQhG`7?5XJgFnMp;7MU}{Ia?USGb;~c!
zOGzxr%+JH-Hb;F_H4F?4YS3^?fTjygC?6E>5SNUSqaiRF0;3@?8UmvsFd71*Aut*O
zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OBRvE{JvyJpz66EB
ze^t;Fw@<HZDgy(9WAJ~~PzDBu37~l`hL_L&|Njq~31eW80V!obr9pFZpt(B}1_lNY
zo-Pkj1Y(2c8F?5O83e#H<X~~oG$fb-Bi2CYlVSW(dNc$^Ltr!nMnhmU1V%$(Gz3ON
zU^E0qLtr!nMnhmU1V%$(=!bxyl0YEH7eWr8#lzsm@bO8Rc`2zy41q-q6BvpF1Rdf7
zD&u_<GxHcGFfcGM#>eMo#6wp7rp9NaCW4fTgN7YI#$ezcdx#K-vSDCgaB@uqE$0WX
z=jUgHtPTeaLV(sBGeU+nz#3FRRw42AAbhwzps@_-o&X0B8>9)F%i;qneG`-8U5kqH
cix}V@!SHKQVoH&fzP_oMp^2%95d#AQ0B5!3KmY&$

literal 0
HcmV?d00001

diff --git a/venv/bin/wheel b/venv/bin/wheel
new file mode 100755
index 00000000..c55eaa3c
--- /dev/null
+++ b/venv/bin/wheel
@@ -0,0 +1,11 @@
+#!/Users/boqi/eraser/venv/bin/python2.7
+
+# -*- coding: utf-8 -*-
+import re
+import sys
+
+from wheel.cli import main
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+    sys.exit(main())
diff --git a/venv/include/python2.7 b/venv/include/python2.7
new file mode 120000
index 00000000..f94bf624
--- /dev/null
+++ b/venv/include/python2.7
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/include/python2.7
\ No newline at end of file
diff --git a/venv/lib/python2.7/UserDict.py b/venv/lib/python2.7/UserDict.py
new file mode 120000
index 00000000..0eb44908
--- /dev/null
+++ b/venv/lib/python2.7/UserDict.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/UserDict.pyc b/venv/lib/python2.7/UserDict.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8d8860dd10ede0b77a851eebbb10d3aa5b3bd734
GIT binary patch
literal 10791
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
Q(hwVyaIP2&52FAx09x?m?EnA(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/_abcoll.py b/venv/lib/python2.7/_abcoll.py
new file mode 120000
index 00000000..000981a9
--- /dev/null
+++ b/venv/lib/python2.7/_abcoll.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_abcoll.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/_abcoll.pyc b/venv/lib/python2.7/_abcoll.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5006ecd107bb0f5563727f554fe83aed5d17c92c
GIT binary patch
literal 28178
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
QMf0-B=<qUvA+wk{0A5nOy#N3J

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/_weakrefset.py b/venv/lib/python2.7/_weakrefset.py
new file mode 120000
index 00000000..ba2be02c
--- /dev/null
+++ b/venv/lib/python2.7/_weakrefset.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_weakrefset.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/_weakrefset.pyc b/venv/lib/python2.7/_weakrefset.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ce51575eaafb19531182064160ae08003fa926d4
GIT binary patch
literal 10830
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
Wn_TcpGds{s4tN!q023#(m?Qw7#rLoP

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/abc.py b/venv/lib/python2.7/abc.py
new file mode 120000
index 00000000..291b0bb2
--- /dev/null
+++ b/venv/lib/python2.7/abc.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/abc.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/abc.pyc b/venv/lib/python2.7/abc.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3b1f012c08a14d7ef747d1f49189afbefc491ded
GIT binary patch
literal 6407
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/codecs.py b/venv/lib/python2.7/codecs.py
new file mode 120000
index 00000000..5f584bb1
--- /dev/null
+++ b/venv/lib/python2.7/codecs.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/codecs.pyc b/venv/lib/python2.7/codecs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ec88268a370e9e823e861800db065d11cb610d24
GIT binary patch
literal 38422
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
MKrDV19%cz<0G&y?2LJ#7

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/config b/venv/lib/python2.7/config
new file mode 120000
index 00000000..4718b838
--- /dev/null
+++ b/venv/lib/python2.7/config
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config
\ No newline at end of file
diff --git a/venv/lib/python2.7/copy_reg.py b/venv/lib/python2.7/copy_reg.py
new file mode 120000
index 00000000..eafe9cac
--- /dev/null
+++ b/venv/lib/python2.7/copy_reg.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/copy_reg.pyc b/venv/lib/python2.7/copy_reg.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e1b7a5c446f681575247329c056129042a9ca836
GIT binary patch
literal 5431
zcmZSn%**vS=vh=U0~D|_FfceUFfbHfV_;xNVPJ@2U`SzPNMT~gVPwc<Vu)g9U`%0V
zNMT_}VP!~RV@P3VNM~h;VqwT+V2EO6ND*O3;b3TCWQbyCNa18?VPJ^jV5sC^NabW;
z49^o}U`gd-$mU`wN@QSUWXzLdh)CfAE8=EIWd|ur<pz<>AWOKx5<Cnkq6|^I3@LnI
zE+0b*KbXPKkRkwP2!L%C1d~EwQkWq{5G*CakRk+Th%%%IgBfBV2L@}1f&90Ifq}sz
zHK!o8NTDQOp`a+gEHfolA+@3;HLo}`DKjUtq*5U*zeu4VGdVjaRX;fZOzUxRg=AzF
zD`XZc<mcs7DwGzdrj_P^Oh`;gfvQy~E-fg?FDe0RhZ>llr%+N^kXo#elA4y8mztuG
znaAa<qmY*mQI(ljT#}fVoLa1qp9V6sNEfCqIVZ8WIJH=hEA#*V|Nk`@85kH!I2jli
zoI&Ctl?ACKYzzzx5J#49GcYhD=jRod6qP2I<QJ9jGB7YCrliEf9Z@2{z`#(Hnwwvi
ziX<os(w38&ScDLZPfkqENKIyDU|@h@XHcl6f$V2ss9|7eW@IQ~WXR@VC{ko7VFD$R
zW=4i4Mut2Fh7x9m8gQCvW@0F|2g@>p)I(%z7#T`fKqlDKFo9B7HYY<-5<>|aLk$y1
z5n~=W-34o~FfcIq73+fBmS0dAUzC~-3UyG3W#*Nn=B1>jfCIR+I8~uMvm`?S8d4=3
z3=9nM@yUrfIq~tuDq#PnlqQ#C=I1G-mF9sN#R|El#U%<!sR|%viAg!B8tfpCfvf~Y
zQwbNy3`7uv0vr_9u0=)pMI|7m8HvS-B_%~Ae4t#CSzM4<lAIA=0y3!tWQbpWUTP2%
z0|SEwDD=QO@{{7hM)Sj?D<0+?uqjCK7N4J_0m_bGqS%6gfk8jCIJKx)KPkU3Q$MvR
zu{gCzzbrMcOg||zPhU?@KPNLuzo4=tBR|hb&s;wl8eDn>l|i8N0&-(9h+tq8V&rGy
zXXIz(V&P#-2FZai$cf;{RRV<pIC4`M89;F-2a4hpaI`?;E`@<180;m#AW*U^mIcQS
zJi%cJS5P1Xfr2v#6o`=Y3(}gOl$DxX0`?)8pv;>fTcknh6BPIijQm(U2g>v%V9#YS
zf>K`=6GIvp1%n;s2lf^?rjqk>3vyB`z!6!LnwSG-WacKOgB6y5f-D*AW-vjK!@)5R
z$-MDUYt=#C0QrZ35uE)%K7z+kBm)B|Yn3p7GoBnn2?GPfH_eO;wag58<{(*!2q-r(
zfdp$98M2tbDw!CvnHh>g!D^ToYM8+}j)?)3<7${0ki#JeR8D{cBR)PawLCr^nyWJN
zGE3s)!CA8e<f!DFVsPjrB^IZafU1t-lEji!uvC6h7C3ys1m%GgUzCcJL-as_!~@DB
zj694&OhSx8jKYkWpqR<z1SLsO_<^!1$VuR&ZNUf*xD-Z)YzBs6Ay9BMF)~zGgHr-H
zfLvnL8ETopWfv2uzH4S;D3S+-P!<bA2`hsGPmw%BK%qQCp*%x)2^&ah4HKx;0+oQN
zpmGcp{(2w{HQ-1AiMKP9a4@8R!#RtSL9B@hR65o$fh>hY7(^*Zgqb0YnW2`2p^_IQ
zo5jUY%gPX*7s<d<!VRu5c^MfQ8B2ITlAy|$fuWh1q3AK#d{$7g3CW*O-MkF7Yz*Or
z;*2oeoFLsP3?Sh`amI)|E{2F2R)%J<Kn)v1krrbKA43fbLk%0q8Nm=v8WTe>IKzYT
zt6wH4Ou<!8e0*9?VtR3We6ctvtP}IpOJFshYOw+&V;4hJ7U$%bfK>W{Y9dGxtx%GY
zSOTpFixuMIp-RAocz!8VCNnQxAwE7mwFI1?;^P&P6Z1ete^M&csuT@SK?=@4j>W~P
zMWFH>QapnaKzuy7Hi(ahrs3S8{P=iCF$5~IAdd5JbqolJ3~&V}_8?Gd0+&(Hq@I_U
zn;IWq0un}c2*k#clA_F{(vnn&ji8j4o>~H~5FoWrN@j9Ne0-1$s0IMZf-^~RYEBwB
zlN1!?m*fXYGB7X%Nr8%7P!>-tN-qZ64D&Ns3&<RB1_Be5<svRnomP~ZQko2^`>jDa
z$N-#!KzT=&k%Nhik%y6!iJwszl&2V(8F?9b!4(FC#mB_S$i~Ra1g<tfX#te~-9e^+
z$_h|I1{bb1j0`=D@UjGyBZELCuLej*kOaufTA)AySxhZIfl8?Sq^$V(7?5i~7BN7|
ze^9ywVQ>jx0xAI*7_z{b6I8!3GSo7Hioz5Q22c}33B(RgX8?(U8ZZpdLZH}+A@4pz
z#T`)2%VJ@0iM<HQ`zcJIoSwzNkj=(W<N{@<FfmBhGJ{Hs8fH+@04hQnLFH^3q;zIr
zsF(=iy2Q4DvU&{*sErIVU;#s62ME=$Fl4cVTGq{s3`LBLAT9@#%LC#wF=TNvWO0ES
z-k|b>m7#`}q39#X;aS|Erg#l2C=;hKF^DxYGB6hMF@nl|Zjcz5-vL!w!vZQX7z;ZX
z!V6s(3SAh&LFEP`$cOPf4B>g~;MO@KLqrWICPC?@cs3&gLr`i-X;Gd+qC!q)aS5oQ
z3d*?(pnOscZiyu-q-U0;=0S3~9v7E_f`S6Lv7DEhno_J#lCO}KnU|sf(uHUTCsitx
zWTZm$C?w{kC}frtD}bt#VjYFze1-B<urbNtLZ&z~w;-odp$Os*kTyi=0m^*fEUBlU
z5S|KY-<2okWGkfPm*;`a0IBy)Ey>7FQ3y&c&d(_Y6&VWtMJcI8V2hLU^O6%wQu7i^
zQo&9_n4O=dkeZmB0X79(t|+ACm*%B_R28M_DJW=weVJHXT$-C&4Dkx6rJoNf7<2Pe
zGSk3*%q#*MfG`&BWKhuLW)>Hv78Ioxr{<M_49+Zq22^5N38;$#52MUturbj7fu1Iq
z2X5&@Oa{kCe0-1`D6fGU6X0G!e0+IoVs=q#T6}y7D2K$ygWECj#h@B8UbR@Y*bkCL
zK{|p!<$?yN^AH5$f~)iN)DlP$2}%w@ilAZ(#L6s&bzQ)1W^lxn6lLb6gSo{eiA5#F
zpw>CKXiLpY0ds<sLE1q%GpD$uD6;_Eg-I+ZNX<(L(g&3eASrNR0WL1VJ_-^6=>fSG
zoPNNiBS->lFxZrW)D&=u0w$<XRD$dQ*-#u0Dprg@B^HkmBM&1BGaDm66Em{_BR?ZA
z6F(ylBQFyVBO8-EqYxt-qZE?>lLRxU$Yf?@VS=~dKn@2NLpMO)U;q^upd1YDH`OpP
zurOycGUO|RikxglhCC()CdOhDaO0bq0orN+w_no0ExHmWhAd`KLDI|!GANsgp(qd3
zrveFr8|yX93=qK-7KUI@S;Pb`r>28VWCiIg0k{7op+yCx@c?Siuz(dF04oId$Ut2+
zCI(D}VEr~AvsplHumRZw?nD)X+TlT|>6yi#beot5>r&_EDJ18or0PLhY5)KKuP+t^
zH6QX*QWZeeetw!lQDR<ts$a1t0|P^LYNdiIxSO4rQ<R#R0?PFeBU4krEd{V)3aZ86
z9v;YGH07Cjpnf#CT!NUT0g3`}QqIgP0jJKe#GF!S4K56-8{xfVP+v2%xTL5u$QTq`
zLLkY^yt34ylGGHq9HbEpN~yW|DWy57K{g<@psF0?8n8v#sg>Zw2qq{>kwKu!b|EMo
zg0eLO6Az;dBM&1FqbQ>&BMT!BBO9YQl;lG68bEFVr@3-auK_vzfa|~-aG$&e+$ktF
z1NG8D9S3;&VP+`u2epP%7(wZ!2HaHwRV$FR0_sUIGuVQX5fg(gBIOi=(qRn~gDt2R
z&jjr(7K6%@(7Ynti9$iaEx$;iB(=B%)bIn1tmqZ1q9g-Q;}2#4S`zRBM{STJsK5h7
zSdbHl1scQx4|kvsYJejy2ox~jC<}4{sdfbwJD@C1g}4HR`({vFff5cVu0XNG#wg6l
z&dAQl!w4U012v97&H(q#Aw9Wf1_nlOlN%%lEs@<o=?av1lR-l?VD}*i%2E}`)cqir
zf~o`tM!!r3CI$u#P^%u=ZcfQhj*kZy!l1E>;vi561%aBlP<ikmOAu(-2~s(LoDClL
z2m<A8a5LL4F&C1_f<VJe;3jbpXrLhoG_n%}>c|Dzfnoq0ec+e_c^I7FgFqn}1ac(8
z!(bLgz6RGAHjqqf2Qs`E<Ont<0VYtn&c?*U%gM&f$ic|V$imFYEWpCa$;QH|$jQuU
P!^X(Q$i~7c#K{8yt<J-e

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/distutils/__init__.py b/venv/lib/python2.7/distutils/__init__.py
new file mode 100644
index 00000000..29fc1da4
--- /dev/null
+++ b/venv/lib/python2.7/distutils/__init__.py
@@ -0,0 +1,101 @@
+import os
+import sys
+import warnings 
+import imp
+import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib
+              # Important! To work on pypy, this must be a module that resides in the
+              # lib-python/modified-x.y.z directory
+
+dirname = os.path.dirname
+
+distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
+if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)):
+    warnings.warn(
+        "The virtualenv distutils package at %s appears to be in the same location as the system distutils?")
+else:
+    __path__.insert(0, distutils_path)
+    real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY))
+    # Copy the relevant attributes
+    try:
+        __revision__ = real_distutils.__revision__
+    except AttributeError:
+        pass
+    __version__ = real_distutils.__version__
+
+from distutils import dist, sysconfig
+
+try:
+    basestring
+except NameError:
+    basestring = str
+
+## patch build_ext (distutils doesn't know how to get the libs directory
+## path on windows - it hardcodes the paths around the patched sys.prefix)
+
+if sys.platform == 'win32':
+    from distutils.command.build_ext import build_ext as old_build_ext
+    class build_ext(old_build_ext):
+        def finalize_options (self):
+            if self.library_dirs is None:
+                self.library_dirs = []
+            elif isinstance(self.library_dirs, basestring):
+                self.library_dirs = self.library_dirs.split(os.pathsep)
+            
+            self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs"))
+            old_build_ext.finalize_options(self)
+            
+    from distutils.command import build_ext as build_ext_module 
+    build_ext_module.build_ext = build_ext
+
+## distutils.dist patches:
+
+old_find_config_files = dist.Distribution.find_config_files
+def find_config_files(self):
+    found = old_find_config_files(self)
+    system_distutils = os.path.join(distutils_path, 'distutils.cfg')
+    #if os.path.exists(system_distutils):
+    #    found.insert(0, system_distutils)
+        # What to call the per-user config file
+    if os.name == 'posix':
+        user_filename = ".pydistutils.cfg"
+    else:
+        user_filename = "pydistutils.cfg"
+    user_filename = os.path.join(sys.prefix, user_filename)
+    if os.path.isfile(user_filename):
+        for item in list(found):
+            if item.endswith('pydistutils.cfg'):
+                found.remove(item)
+        found.append(user_filename)
+    return found
+dist.Distribution.find_config_files = find_config_files
+
+## distutils.sysconfig patches:
+
+old_get_python_inc = sysconfig.get_python_inc
+def sysconfig_get_python_inc(plat_specific=0, prefix=None):
+    if prefix is None:
+        prefix = sys.real_prefix
+    return old_get_python_inc(plat_specific, prefix)
+sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__
+sysconfig.get_python_inc = sysconfig_get_python_inc
+
+old_get_python_lib = sysconfig.get_python_lib
+def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+    if standard_lib and prefix is None:
+        prefix = sys.real_prefix
+    return old_get_python_lib(plat_specific, standard_lib, prefix)
+sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__
+sysconfig.get_python_lib = sysconfig_get_python_lib
+
+old_get_config_vars = sysconfig.get_config_vars
+def sysconfig_get_config_vars(*args):
+    real_vars = old_get_config_vars(*args)
+    if sys.platform == 'win32':
+        lib_dir = os.path.join(sys.real_prefix, "libs")
+        if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars:
+            real_vars['LIBDIR'] = lib_dir # asked for all
+        elif isinstance(real_vars, list) and 'LIBDIR' in args:
+            real_vars = real_vars + [lib_dir] # asked for list
+    return real_vars
+sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__
+sysconfig.get_config_vars = sysconfig_get_config_vars
diff --git a/venv/lib/python2.7/distutils/distutils.cfg b/venv/lib/python2.7/distutils/distutils.cfg
new file mode 100644
index 00000000..1af230ec
--- /dev/null
+++ b/venv/lib/python2.7/distutils/distutils.cfg
@@ -0,0 +1,6 @@
+# This is a config file local to this virtualenv installation
+# You may include options that will be used by all distutils commands,
+# and by easy_install.  For instance:
+#
+#   [easy_install]
+#   find_links = http://mylocalsite
diff --git a/venv/lib/python2.7/encodings b/venv/lib/python2.7/encodings
new file mode 120000
index 00000000..7bc90b94
--- /dev/null
+++ b/venv/lib/python2.7/encodings
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings
\ No newline at end of file
diff --git a/venv/lib/python2.7/fnmatch.py b/venv/lib/python2.7/fnmatch.py
new file mode 120000
index 00000000..d4655555
--- /dev/null
+++ b/venv/lib/python2.7/fnmatch.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fnmatch.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/genericpath.py b/venv/lib/python2.7/genericpath.py
new file mode 120000
index 00000000..f8256242
--- /dev/null
+++ b/venv/lib/python2.7/genericpath.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/genericpath.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/genericpath.pyc b/venv/lib/python2.7/genericpath.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c8173edb927c9523c0773f617a51d5e21537e424
GIT binary patch
literal 3781
zcmZSn%**vS=vh=U0~ByDFfceUFfbG!Wnf@PVPJ@2U`SzPNMT~gVPuG6gt3_zqL>&`
zm>E)77*bdnQrH+$*cnnd7*aSHQn(n>IT)gt87jFLQdt<HSQ*0e)EQV(*%-397>e>4
z7#SH;xEWH}8PXUTQg|3z7#Nxv7$T!s8S)qzB2suk0#O_cDSTiCCqoK9n8C%6A^>J^
zGo%QD89WRrLSP0jLy9n%!N-sy0%q_tq=<qU0w8w>YlwloGlPMFfh!=fBts#;Ahjs5
zBr`v+SRpw-H#a{|p(I}+H@_%Vp(G<QPa!`qRlz@)%OzhSFTX^gv^Z5EC9^0sxg@7j
zPeCCh10<<XT#%ZanU<NXkei=Unv+_rkeOSMUsR${l98&ASWr-uUr>~pSdz+>R+^U#
zu_>)6KUbk7BeNK)1*9~$I5np%wOEfU^Z)<<|NTmM7#J8JE-ENWP0Oq(VPjxmNUg{$
zE-5YnMN4{WNn%N6ZYqqEjLgXebJ!Ue7}8TqiZiQHOIR5g7&41fGK;|GWEQ7o=0LQ@
zm*!<A=clB?<D8L!fx!tBNFZBM89?zI6s!SC5E@Jj3=ClV;^XrYb5rBvOSl*q7~<n|
z!5)u~ho}N81rf#83=9nVp~b01#rjG4g_-)PMTy0!Mfzo_d1d-ZnR)tpdipt;N%{qq
zB^mj7MtbJ@>8W|CMVZM3i6t3&1(iV{7YKoz0<xHmF&X4E5C(b186>XDz`#%`$WX$-
zkj2PQ!@$tY$iNt$C(6JA5@7--G7V57D`92`jwoSa2-W~;FLq&IU<gSqE>S4YNG-`o
zEmBBS09mP!3JzX91%;s0lG38QVg<LvoZ?i4wEQB4q@w)n)I5da%G{*<oXli}oXouJ
zVhxZ(N<fawFD_vLIjAJD1RT_<MMe2VU>4X2uw+P4X)4%$Fb`xQBD^RLDv-a#K`sEr
z2m=!{qadRIBP%4xKn?`C6dYurIH?py39?#72DCuaLIfHkLlz4|4I@JqD=2iK0jP>2
z05gjf5*3P4(@S#_ixfafOaqi^gSZ(O7=l0vI*1p<;sYfkP~r@Z_Y4klbuR(2i%USs
zC>5N>f&@S+K+Y~Mp<)<;tWiP^BVk&GkqyYJ;B=%=QdF9%keLR`=HP?|$~+21scET2
z#h~IQF%OdRGV{`*#Y=usr5@p+bMXuc0%Z?yn3aH1Kyi>T0|NsUgA5dXdN_g%WFaVy
zz{v_6V@TOBiwTz543WYiBUJ%Z8Y$$bDI|i^hmJx~DyXnbO;JdyRLC#ZD=tYa(a_Y>
zU<T=eryE!b0cnP0AyCl(N?@R%q@sU8*~A>=Uy#QbnBXN2h)ckqAZbXs0gmUK#NrZA
z@eZmPz!i)Fs7xl^=OB-Q@&-sZ*y}-{Y)(ZlgUT&XS}g|oku)#cf+7i;#4}PAz+O&F
zPEIW@rp&Y8ij5|o1^LmDy!ZuaLyF(r)RM%M#F9jX<c!3;^i;|`46eLs;$cueazpbl
zD3OC=9h72=qZt@LHD@sws5KW{0_HR`GSo6Ml)$RgS|)}HBZd+tP&LrZ$lwyI!Vts6
zP|M6v%fe8@!cfD+P{Yh1na#{lqz_V3!_1%%T&T|wUc<-`3@)3B-5D4d+%wBk^Ar*l
zax#lcK-mCP0fKUGF{liHRJWiOQ%-(fI;d)fw0#tEQWH}^<zjMvZb5!tYF<eRsAT~z
z9!fxd%gxM#(1{f#oS+s`UTH3<MVAVxn?Yq%F1Us+HiS?{;DRy}OeRw?8-bkV0}5zR
zNyxy&#=yeJ!^p!Z$tb|c!<Y;TZct7JIT;-6%OSy@#Q+L1P<VsGvB(S*7a&0<P;Fbw
z3XTL8h8k9eW+qT@=Yit~q<|T$fQ_Ms4HO62EDS|+L5vhe2Ju>Uh6;Oz8g`IeHUmS^
zOpu{9><p4M%nYDd>H+iF7!+z4KuYA(m>7a<*g^4cUdzr<7{?F}u_lFy0VD+u?BXR1
z3=F{qIhl}lZE8hHYF=?>ex3rjEemNsfnrmSi%UU4LBSO+pINMsT9#T=S&{*YMzCsd
zG=qxAl>8Efl6-J+nVOfPqmY@NmtT~bmku@p7V|0jCB;ZhG9`_o{QMFfh17}?O(km(
zrI4FgsgRVakeXXiQmK~-it-?7P&Ek3?BF(7QCenRN{}o_3=|3AxGw-Fo8r_0aDzB8
zrv%1KtpGDY3X4+<Jo8dgD@s5W5kv`u50XsDFM)7CZ5mir1QwxQssbnJ_+n77r&g52
zf|8d6D50_OGqN%AGYT>BGx9KTG4eACFbXjWGHD2c+D)KlPJDbyesX*~qU8myLF3~S
zb8_P2!E9)=AKb<UTjQ6Qo9YT~wt_1C{G_bZ<dPt8V1f(`0tp6zN{%2<S`Gq*Z4f9m
z2Z7uZ1Zs#QybWei+N1?{G;DIgT?;#q#l@hu8yhHBG4V6<Gcz-CG4e7?v2t>A@^Er;
KvVtKSryu~FdsjjL

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/lib-dynload b/venv/lib/python2.7/lib-dynload
new file mode 120000
index 00000000..a4d0f96a
--- /dev/null
+++ b/venv/lib/python2.7/lib-dynload
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload
\ No newline at end of file
diff --git a/venv/lib/python2.7/linecache.py b/venv/lib/python2.7/linecache.py
new file mode 120000
index 00000000..b6f36cff
--- /dev/null
+++ b/venv/lib/python2.7/linecache.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/linecache.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/linecache.pyc b/venv/lib/python2.7/linecache.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..69dc3e4381fd0ebcec81ade5475b349c7aad904a
GIT binary patch
literal 3416
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/locale.py b/venv/lib/python2.7/locale.py
new file mode 120000
index 00000000..3e19abbd
--- /dev/null
+++ b/venv/lib/python2.7/locale.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/no-global-site-packages.txt b/venv/lib/python2.7/no-global-site-packages.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/ntpath.py b/venv/lib/python2.7/ntpath.py
new file mode 120000
index 00000000..c0879d3d
--- /dev/null
+++ b/venv/lib/python2.7/ntpath.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ntpath.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/orig-prefix.txt b/venv/lib/python2.7/orig-prefix.txt
new file mode 100644
index 00000000..9f5ff2be
--- /dev/null
+++ b/venv/lib/python2.7/orig-prefix.txt
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7
\ No newline at end of file
diff --git a/venv/lib/python2.7/os.py b/venv/lib/python2.7/os.py
new file mode 120000
index 00000000..a2fba2b2
--- /dev/null
+++ b/venv/lib/python2.7/os.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/os.pyc b/venv/lib/python2.7/os.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c01f3420f6d85c61ee6ec4c8692e9b0c8bcd959
GIT binary patch
literal 26961
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
TOV*ef#X%teWrG%_@G=4bx~8@%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/posixpath.py b/venv/lib/python2.7/posixpath.py
new file mode 120000
index 00000000..0a9e25a7
--- /dev/null
+++ b/venv/lib/python2.7/posixpath.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/posixpath.pyc b/venv/lib/python2.7/posixpath.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f456830a5ec2f18b37b9efe3d9a1a96371085e78
GIT binary patch
literal 11983
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/re.py b/venv/lib/python2.7/re.py
new file mode 120000
index 00000000..df80b700
--- /dev/null
+++ b/venv/lib/python2.7/re.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/site-packages/easy_install.py b/venv/lib/python2.7/site-packages/easy_install.py
new file mode 100644
index 00000000..d87e9840
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/easy_install.py
@@ -0,0 +1,5 @@
+"""Run the EasyInstall command"""
+
+if __name__ == '__main__':
+    from setuptools.command.easy_install import main
+    main()
diff --git a/venv/lib/python2.7/site-packages/easy_install.pyc b/venv/lib/python2.7/site-packages/easy_install.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5c11014a1e1a0d0dd5ee5ddf8cb331a6fcb391f0
GIT binary patch
literal 369
zcmZSn%*&NH<x)&C0~9bZFfceUFfbGwFfcHrFfc?hFr+dvq%bmMGcgqDFr+Xsq%bq&
zFfrsZGej{nFs3pyG&3+T<}om&urLH`u!3|-GcYg&mF6jwWTYy%CKgwE<`tJD=Hw_O
z=jY}o=B1QyFfcI0$LA(y=EcWn{{R2~zXl@%149W50|Ns{&`$%zDq#n!O36=-kB92W
zOUzA;k1vr2*^ydOT2PXopHr*{HB~P)vA8lm6Jk{m$UqH{j}Sz08Uq7^enC-YSz<}5
zepzCXep-G`N@`KDes-aLcCnGUxnW_Jk$IV+g?VvKWqNtMNs5Vyfq{WRdY*oWenDn|
wF4S<{@<hwhzzqFjxEu75?ba)(1iRNJH$SB`C)Ez*lwvjp1_m}J9!3F10GYmD8vp<R

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/INSTALLER b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt
new file mode 100644
index 00000000..737fec5c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/METADATA b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/METADATA
new file mode 100644
index 00000000..d7aa9a4e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/METADATA
@@ -0,0 +1,75 @@
+Metadata-Version: 2.1
+Name: pip
+Version: 19.1.1
+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
+License: MIT
+Keywords: distutils easy_install egg setuptools wheel virtualenv
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Topic :: Software Development :: Build Tools
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
+
+pip - The Python Package Installer
+==================================
+
+.. image:: https://img.shields.io/pypi/v/pip.svg
+   :target: https://pypi.org/project/pip/
+
+.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
+   :target: https://pip.pypa.io/en/latest
+
+pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
+
+Please take a look at our documentation for how to install and use pip:
+
+* `Installation`_
+* `Usage`_
+* `Release notes`_
+
+If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms:
+
+* `Issue tracking`_
+* `Discourse channel`_
+* `User IRC`_
+
+If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms:
+
+* `GitHub page`_
+* `Dev mailing list`_
+* `Dev IRC`_
+
+Code of Conduct
+---------------
+
+Everyone interacting in the pip project's codebases, issue trackers, chat
+rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
+
+.. _package installer: https://packaging.python.org/en/latest/current/
+.. _Python Package Index: https://pypi.org
+.. _Installation: https://pip.pypa.io/en/stable/installing.html
+.. _Usage: https://pip.pypa.io/en/stable/
+.. _Release notes: https://pip.pypa.io/en/stable/news.html
+.. _GitHub page: https://github.com/pypa/pip
+.. _Issue tracking: https://github.com/pypa/pip/issues
+.. _Discourse channel: https://discuss.python.org/c/packaging
+.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev
+.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
+.. _Dev 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/python2.7/site-packages/pip-19.1.1.dist-info/RECORD b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD
new file mode 100644
index 00000000..f85eaeb8
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/RECORD
@@ -0,0 +1,618 @@
+pip/__init__.py,sha256=A9ZYTNji94NmcmoIbn-XLsEni4ac8BoiAt7guiAW27g,23
+pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623
+pip/_internal/__init__.py,sha256=Di4rpoQhA2Kx0Dm0THczf61CDOXcPokR2FIpyKkRm1Y,2870
+pip/_internal/build_env.py,sha256=ZUpR-00pxQc-Mw750jyBVA-oWb4WHtpK63pfiTHd8qU,7392
+pip/_internal/cache.py,sha256=PQesJm1JrjgAya3VyV6qkbnfACG23c1wQ7PaSw_0F-Y,7656
+pip/_internal/configuration.py,sha256=xit1f8ZdnHz-AHzWAKTUa_gZzlIIM-5AgK30glB71ik,13115
+pip/_internal/download.py,sha256=0_8jUtL4SLZe4qo8Fe66qkbO69gUG-IPbp932WOHyFs,35147
+pip/_internal/exceptions.py,sha256=ryXWmEJpSHr3yXXk1efWHSzQwAjBdBJiKR5kCQvjgPA,9117
+pip/_internal/index.py,sha256=BO6jpJRvb_6HaS4meE8Lj_lyAX7IRP6pRof-zG-_hYw,42268
+pip/_internal/locations.py,sha256=-N3f1I24gcPTdW52onPnySDoQUIn_TtPYV99WwsjxRE,6932
+pip/_internal/pep425tags.py,sha256=jyBorYxepVJeHNo69TE-3UxJXsGO2XvGxveSWQDi_Wo,13128
+pip/_internal/pyproject.py,sha256=OlCw7pSqST68hUF_eV-YVaqJ4I7z_ROJwvgra-2C_5I,6464
+pip/_internal/resolve.py,sha256=rZDMkyhUIbaytY9KsYQVez8nl21xLXgaDt8xuHvyGMI,15128
+pip/_internal/wheel.py,sha256=-MijhN1BIuaQkb3909smA63wkbvdRrdtr1CUDxnQTqA,41189
+pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
+pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083
+pip/_internal/cli/base_command.py,sha256=2SbVZ2o3KmVdeJlK4l1lP6y_ZMFZ8VkDp9ns1ByZ-xM,12629
+pip/_internal/cli/cmdoptions.py,sha256=IA1XAgTJ1oWXp1oF3CkE8mpUx8vqIysyd7hlEZk7wWE,23813
+pip/_internal/cli/main_parser.py,sha256=YH_w_hApq2pyS_G5tZlbIe7g_HUIcKE820jhnv0piVA,3002
+pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378
+pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156
+pip/_internal/commands/__init__.py,sha256=7fscm9bUGJInZwWY7VjH2pPC7HUWQWyjYMEIB33L9CY,2223
+pip/_internal/commands/check.py,sha256=liigNVif0iz2mBfhvsajrLZT5zM5KIvgmKvhAW91EzA,1430
+pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929
+pip/_internal/commands/configuration.py,sha256=Il76e-ERfEHtW2GbV1aTR6o-xurh-LVv2NCea7erP4s,8020
+pip/_internal/commands/download.py,sha256=XPe3Kuj9iZfXwOiJq70mYVYNZD5lJCLnGT_C61cOsKw,6623
+pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259
+pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681
+pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090
+pip/_internal/commands/install.py,sha256=vSb8TfUHwz3HJ5cA-JnPP3X84ONQ0wkCztw0pHFbmsc,22841
+pip/_internal/commands/list.py,sha256=EtKEUotPbLCzzcWrZqEiEXi4ic00dgUOKUeNU0y7Pfg,10166
+pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728
+pip/_internal/commands/show.py,sha256=bE-ucu8fAjTTENpRRKhwD3QSWR8Rss7YgKAbMJoxock,6273
+pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963
+pip/_internal/commands/wheel.py,sha256=7MNPZqK9WWxZC3TgzvMBH-RPRlOFLpwq927lkzUiUjI,7167
+pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
+pip/_internal/models/candidate.py,sha256=_IzS-yw0h2UHfZALsZ2mxkeGNSNuNGspjSn2JfZ-ZHM,1045
+pip/_internal/models/format_control.py,sha256=ap8Swa26ocSXBxIuCvaDBRZjxdKUFuwC-bfqXQHWtKw,2250
+pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060
+pip/_internal/models/link.py,sha256=Hqu72UgH266njr2z2kTnIG-sQiPtjENDbPqXFzT-84s,4783
+pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/operations/check.py,sha256=CZHaksHKUMo58wGHGhhKlPrpcRMHObouzzyd9pMRFt8,5109
+pip/_internal/operations/freeze.py,sha256=_Ffl2HpoWLLHaiB1XyTjKIA3QWC8H-E1ib6xJgX_mRE,9279
+pip/_internal/operations/prepare.py,sha256=jQ6FaxA2u_MYnDQxcu6YCfmJ9sfhqrKN9vdd4-5N6lU,16931
+pip/_internal/req/__init__.py,sha256=Y2SjAuMFsSt3dkiK8kkiQAfv8sHrjl0PAT63FKFT0tM,2364
+pip/_internal/req/constructors.py,sha256=4KlO_-G89XYZW1VnzHwV34oCvR6ilmxFqSSGLgv4PEw,11399
+pip/_internal/req/req_file.py,sha256=mZoQvhHZJwgljrXDH8CLXaNoUK4sM8_bRfK9Po2fM80,13714
+pip/_internal/req/req_install.py,sha256=SGJLNpyZwzOL_EqfviIvAoZgxAoivxmFBN1cOU7DX9s,40061
+pip/_internal/req/req_set.py,sha256=PaDc5EswLQhxBMFbuKbJ0frZbMNKocmA8OGqIWT-9EY,7860
+pip/_internal/req/req_tracker.py,sha256=wBpDzSDSYwpUfW4K43NrEOCCp1r6stuubfLc65Y95EM,3129
+pip/_internal/req/req_uninstall.py,sha256=rVOk8BRM_L9rsUUr9lmkV6Lm9N1Os7TEIDir6tT1Q7U,23105
+pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/utils/appdirs.py,sha256=r9i0BZLK9KcvrzI5tqlw8ehRTtSehWGERFLy7YppG3g,9398
+pip/_internal/utils/compat.py,sha256=Q0cmYGBaKB4tV5E0CG11339YLxuCaqdUCSJd9vinMc8,8551
+pip/_internal/utils/deprecation.py,sha256=HYUvfCZUxwLIFlYHeZM3VmuFhXTdlw0rk4-cC14bKw4,3080
+pip/_internal/utils/encoding.py,sha256=tudXCoAPe9fZvNK4cmWQs2frREZ-QuGCwF_SlTyz6cI,1218
+pip/_internal/utils/filesystem.py,sha256=ojaIDvOFOtkpKme5se6X2N8ARmQxu8cxvaaI-NFqVtk,990
+pip/_internal/utils/glibc.py,sha256=9_1wY9Lmca4xzOQDF1A6ITW_N80j_BXwN7Sx7vBqP4k,3282
+pip/_internal/utils/hashes.py,sha256=_6l8M_nqmLZjs-o2lP2rB7ZleAT05WOuqgwBa8uFYR8,3527
+pip/_internal/utils/logging.py,sha256=qSYK7Wf_oiCr1VR4qvAq_TtpY3SIKSlVDgnAeQqSjHc,11671
+pip/_internal/utils/misc.py,sha256=QsYl2j5rU5Mh_CEsSf1W8GB6HvPOfioj30Emqz7mg7s,32434
+pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042
+pip/_internal/utils/outdated.py,sha256=sEe1l902jiOl3tArf6omqVd44s4BT9DOk3a3CXtJNNI,5868
+pip/_internal/utils/packaging.py,sha256=frr5M-ORe30rRKbH6pwqp_jkX1T8rx-UGDlj8vG5HII,2743
+pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278
+pip/_internal/utils/temp_dir.py,sha256=0Xq5ZlOd2OOeHwKM6hGy66gnMGAbyhio7DtjLHd7DFg,5339
+pip/_internal/utils/typing.py,sha256=bF73ImJzIaxLLEVwfEaSJzFGqV9LaxkQBvDULIyr1jI,1125
+pip/_internal/utils/ui.py,sha256=yRqmi2V4OeTYP9SnXhuXKlyRx8xJ79AjLRgvLCZ4E1E,13812
+pip/_internal/vcs/__init__.py,sha256=kgwOhkt6ddbKosZytktLydMUb_e-JpXMstJF9YpSOwM,19205
+pip/_internal/vcs/bazaar.py,sha256=3lA6CKyrYpoJuxjTa8oTozszNcqdYILqEhKLJ41RMug,3231
+pip/_internal/vcs/git.py,sha256=x0PQDgzWho544gfqtE9CXoUkN34zE4YkpgrbTcWEte4,12960
+pip/_internal/vcs/mercurial.py,sha256=AbH4IWdLCsjUxFnIHRvijV-7SNhfjDZJJFzQ1e_b48Q,3355
+pip/_internal/vcs/subversion.py,sha256=cMH4MEobSj68gaSiBD53KXVJnEbhtuUJjL8U1Kk_v70,8167
+pip/_vendor/__init__.py,sha256=iip2nWwH_riYqnDnM0q4BJFrWE-XWjYfxCejJKct0WM,4654
+pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547
+pip/_vendor/distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251
+pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852
+pip/_vendor/pyparsing.py,sha256=sxGUe_YcWBB5ZoHec0m1iJtgcj4iKv_SGfdA_zVCYII,245385
+pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972
+pip/_vendor/six.py,sha256=h9jch2pS86y4R36pKRS3LOYUCVFNIJMRwjZ4fJDtJ44,32452
+pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302
+pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295
+pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863
+pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805
+pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695
+pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698
+pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533
+pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070
+pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954
+pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671
+pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86
+pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177
+pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856
+pip/_vendor/certifi/__init__.py,sha256=-M1moep9D6jZnOAT0qnM1dpoEHMPage7Osv5xLRLyFg,52
+pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53
+pip/_vendor/certifi/cacert.pem,sha256=OXuDPlrPiaJwm5ZEAamspo0ktiNJtyu-OGhOWGqgeic,284518
+pip/_vendor/certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218
+pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559
+pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254
+pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757
+pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411
+pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787
+pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110
+pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590
+pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134
+pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855
+pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661
+pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950
+pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510
+pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749
+pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546
+pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748
+pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621
+pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747
+pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715
+pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754
+pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838
+pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777
+pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643
+pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839
+pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948
+pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688
+pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345
+pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592
+pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290
+pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102
+pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370
+pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413
+pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012
+pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481
+pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657
+pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546
+pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774
+pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485
+pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766
+pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242
+pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
+pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774
+pip/_vendor/colorama/__init__.py,sha256=lJdY6COz9uM_pXwuk9oLr0fp8H8q2RrUqN16GKabvq4,239
+pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524
+pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462
+pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915
+pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404
+pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438
+pip/_vendor/distlib/__init__.py,sha256=7uthK6m96pTekk8hjlT-MybcwYmmxwP8gEOxXVg1f2s,581
+pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404
+pip/_vendor/distlib/database.py,sha256=-KJH63AJ7hqjLtGCwOTrionhKr2Vsytdwkjyo8UdEco,51029
+pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073
+pip/_vendor/distlib/locators.py,sha256=S9G2IsZp0RnMMbXGrT-gu7892pNpy1XMlUEuUHX3OI8,51828
+pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811
+pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387
+pip/_vendor/distlib/metadata.py,sha256=BNCnpRfFVslyZcosr4vnE_YbkRb3TNxXtk7TrDszJdc,40172
+pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766
+pip/_vendor/distlib/scripts.py,sha256=NYqRJ2uuEuJwr_NNLzWH0m_s_YsobDFQb6HqxuQ2Sew,16638
+pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672
+pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400
+pip/_vendor/distlib/util.py,sha256=gwKL5geJKmtR4GeIUnoMAWjsPPG3tVP_mFxw_Sx-isc,59681
+pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391
+pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088
+pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328
+pip/_vendor/distlib/wheel.py,sha256=gV53KDG7BgbxsdeKjnATbP47gTEJRNylcIeE1TFin1o,39880
+pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274
+pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971
+pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647
+pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617
+pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964
+pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628
+pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162
+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/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015
+pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518
+pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963
+pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758
+pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289
+pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930
+pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178
+pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775
+pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919
+pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286
+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/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214
+pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679
+pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715
+pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776
+pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592
+pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579
+pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835
+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/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/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309
+pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58
+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=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733
+pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899
+pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749
+pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21
+pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292
+pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371
+pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652
+pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096
+pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090
+pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506
+pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616
+pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677
+pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20
+pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056
+pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411
+pip/_vendor/packaging/__about__.py,sha256=Wg0-hNgTU2_lBZcGBh5pm1R9yroQ3rv-X0rig8KjA6o,744
+pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562
+pip/_vendor/packaging/_compat.py,sha256=Ugdm-qcneSchW25JrtMIKgUxfEEBcCAz6WrEeXeqz9o,865
+pip/_vendor/packaging/_structures.py,sha256=pVd90XcXRGwpZRB_qdFuVEibhCHpX_bL5zYr9-N0mc8,1416
+pip/_vendor/packaging/markers.py,sha256=-QjvJkhSJBxBogO9J_EpPQudHaaLV3rgVYsBDqn-ZLc,8234
+pip/_vendor/packaging/requirements.py,sha256=grcnFU8x7KD230JaFLXtWl3VClLuOmsOy4c-m55tOWs,4700
+pip/_vendor/packaging/specifiers.py,sha256=0ZzQpcUnvrQ6LjR-mQRLzMr8G6hdRv-mY0VSf_amFtI,27778
+pip/_vendor/packaging/utils.py,sha256=VaTC0Ei7zO2xl9ARiWmz2YFLFt89PuuhLbAlXMyAGms,1520
+pip/_vendor/packaging/version.py,sha256=Npdwnb8OHedj_2L86yiUqscujb7w_i5gmSK1PhOAFzg,11978
+pip/_vendor/pep517/__init__.py,sha256=nOY747zTld3oTdEetBG6DWxEcZXTeOQk0aHvbR-sa5w,84
+pip/_vendor/pep517/_in_process.py,sha256=xMY2kLutkjCti5WqTmKOLRRL3o8Ds_k-fObFyuMv1tk,6061
+pip/_vendor/pep517/build.py,sha256=-n8PT-ugS1TdqoTUY1vatDQjrLtx48K_-Quu2MuQBiA,2699
+pip/_vendor/pep517/check.py,sha256=Lu7nMdYu1JVV58fE3hv-d_avTy5h0yO9LsIzAt82Clk,5885
+pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098
+pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631
+pip/_vendor/pep517/envbuild.py,sha256=9-u4KffexPMEm52rTaIjEOxsCAd2DMByxzv5H566QLw,5763
+pip/_vendor/pep517/wrappers.py,sha256=9dZn-q7F5KyQKUJMie2uKwur2FG0CLXz_kLZzkJOhZc,5912
+pip/_vendor/pkg_resources/__init__.py,sha256=ZVHzk7ZiFIIgE2RTJj8F7wwjdMGrAngMWtQo-rGNsm4,107910
+pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562
+pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857
+pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854
+pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372
+pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380
+pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127
+pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509
+pip/_vendor/pytoml/parser.py,sha256=2tDXkldqPQJhyadXzL2rGhVbjUyBNeXXhaEfncHl2iQ,10326
+pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021
+pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665
+pip/_vendor/pytoml/writer.py,sha256=WbNNQg3sh_V-s3kt88LkNNbxEq6pPDdhRE-daJzArcI,3198
+pip/_vendor/requests/__init__.py,sha256=ZI8kbaEzLAxsqex3MmMPr-v24d1RfZbNAOY8fUxg2Xw,4074
+pip/_vendor/requests/__version__.py,sha256=8KG3anaNCi-PEclPPOHJ_cv1udY_L1_njVr84gRZ9HM,436
+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=hWZgfD7OriCZFOnpeq0bv2pbXDl8YXfxDwAcU036qDs,6253
+pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206
+pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465
+pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941
+pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430
+pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197
+pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578
+pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757
+pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275
+pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
+pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332
+pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129
+pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981
+pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049
+pip/_vendor/urllib3/__init__.py,sha256=EZviRQA_iuL_94EeJHY4JAArRXbRCkAzA0HH9iXZ15s,2722
+pip/_vendor/urllib3/_collections.py,sha256=-CAKsDE-WdubAjlBSZLx7b0e7WKenaNGwWvGLDEF1TM,10746
+pip/_vendor/urllib3/connection.py,sha256=KLFvknLgllcMkgJ-zUsFjCzOt9P03fDoIpTPz_vqXCw,13839
+pip/_vendor/urllib3/connectionpool.py,sha256=rgc_3D0VsD5VDxr4KzzA8Plee0Rmerm5WKb71FcxWu8,35097
+pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604
+pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943
+pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436
+pip/_vendor/urllib3/poolmanager.py,sha256=csE6Bh6L0FJ3iNOHk2z8KhMT8Eiq976b6pk8I6vrOC8,16853
+pip/_vendor/urllib3/request.py,sha256=OfelFYzPnxGlU3amEz9uBLjCBOriwgJh4QC_aW9SF3U,5991
+pip/_vendor/urllib3/response.py,sha256=ta1jp4B5PGBWzoAV1s48WLuHCRICQnK7F9m_kyK4Z8g,25609
+pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=lhYXvB5_oGKSeurX7za3XhcGyERvNjXRQ3eJp2GmQ3M,717
+pip/_vendor/urllib3/contrib/appengine.py,sha256=VvDpkc5gf9dTXNxXmyG1mPdON_3DrYG_eW4uOqN98oQ,10938
+pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=5ZpMF7N9B6NEjVU-r-xjDOV_-hkNvsDoNc84J2yqauI,4459
+pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=-kI_9y99Iwybv6Wy8IF8PugVl61BeMBEEqGwrDYNCuc,15823
+pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309
+pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391
+pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560
+pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162
+pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109
+pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
+pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/packages/backports/makefile.py,sha256=so2z9BiNM8kh38Ve5tomQP_mp2_ubEqzdlCpLZKzzCI,1456
+pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688
+pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=E-9J-kAaUn76WMZ4PpzKUxM4C3yjY7mopOpbPIy3Dso,5700
+pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044
+pip/_vendor/urllib3/util/connection.py,sha256=-AyqcRTuNUHuo5ndtsU0Og_nMyCGATC-kYqOUdBHwIQ,4639
+pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497
+pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705
+pip/_vendor/urllib3/util/response.py,sha256=028PNXDZhwBtnm2uXvnAHi_l9_AAGrAMH2Igh2AbgWg,2586
+pip/_vendor/urllib3/util/retry.py,sha256=kFQTesNiwPp6ZeQo9VHeUO7b8qA-_l3BnErCAOEPo4Q,15105
+pip/_vendor/urllib3/util/ssl_.py,sha256=4qqBDM82bufhqqEd0b-99sObz95XmEVEXDVi5iAyCeE,13172
+pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757
+pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487
+pip/_vendor/urllib3/util/wait.py,sha256=p4BZo_Ukp5JF0Dn6jro7cUfqIjnU6WFtuoA6poaV5Jk,5403
+pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
+pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979
+pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305
+pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563
+pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307
+pip-19.1.1.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090
+pip-19.1.1.dist-info/METADATA,sha256=bLFqR8At4rsCvM1hJTM98bOrT26dNZLeTLo_0PYIZCs,2892
+pip-19.1.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110
+pip-19.1.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98
+pip-19.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip-19.1.1.dist-info/RECORD,,
+../../../bin/pip,sha256=M8RrKKA9E8uMa5xlEyjlZXDT0NsxbIOGbxtA_eap-1A,237
+../../../bin/pip2,sha256=M8RrKKA9E8uMa5xlEyjlZXDT0NsxbIOGbxtA_eap-1A,237
+../../../bin/pip2.7,sha256=M8RrKKA9E8uMa5xlEyjlZXDT0NsxbIOGbxtA_eap-1A,237
+pip-19.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip/_internal/models/link.pyc,,
+pip/_vendor/urllib3/util/queue.pyc,,
+pip/_vendor/requests/compat.pyc,,
+pip/_internal/utils/models.pyc,,
+pip/_vendor/requests/certs.pyc,,
+pip/_vendor/distlib/util.pyc,,
+pip/_vendor/progress/spinner.pyc,,
+pip/_vendor/html5lib/_tokenizer.pyc,,
+pip/_internal/cli/autocompletion.pyc,,
+pip/__init__.pyc,,
+pip/_vendor/chardet/euckrprober.pyc,,
+pip/_vendor/urllib3/connection.pyc,,
+pip/_internal/utils/packaging.pyc,,
+pip/_internal/utils/logging.pyc,,
+pip/_vendor/cachecontrol/cache.pyc,,
+pip/_vendor/distlib/_backport/__init__.pyc,,
+pip/_vendor/html5lib/_trie/_base.pyc,,
+pip/_vendor/pytoml/utils.pyc,,
+pip/_vendor/distlib/metadata.pyc,,
+pip/_vendor/webencodings/tests.pyc,,
+pip/_vendor/html5lib/treebuilders/__init__.pyc,,
+pip/_vendor/html5lib/filters/alphabeticalattributes.pyc,,
+pip/_internal/req/req_file.pyc,,
+pip/_vendor/requests/adapters.pyc,,
+pip/_vendor/chardet/euctwprober.pyc,,
+pip/_vendor/msgpack/exceptions.pyc,,
+pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc,,
+pip/_vendor/chardet/cli/chardetect.pyc,,
+pip/_internal/models/candidate.pyc,,
+pip/_vendor/html5lib/filters/lint.pyc,,
+pip/_internal/models/__init__.pyc,,
+pip/_vendor/html5lib/_trie/datrie.pyc,,
+pip/_vendor/packaging/__init__.pyc,,
+pip/_vendor/lockfile/symlinklockfile.pyc,,
+pip/_vendor/urllib3/contrib/_appengine_environ.pyc,,
+pip/_vendor/packaging/utils.pyc,,
+pip/_vendor/html5lib/treewalkers/etree.pyc,,
+pip/_vendor/html5lib/filters/whitespace.pyc,,
+pip/_vendor/idna/codec.pyc,,
+pip/_vendor/distlib/database.pyc,,
+pip/_vendor/urllib3/contrib/socks.pyc,,
+pip/_vendor/requests/auth.pyc,,
+pip/_vendor/packaging/__about__.pyc,,
+pip/_vendor/progress/__init__.pyc,,
+pip/_internal/resolve.pyc,,
+pip/_vendor/chardet/__init__.pyc,,
+pip/_vendor/webencodings/__init__.pyc,,
+pip/_vendor/urllib3/exceptions.pyc,,
+pip/_internal/utils/appdirs.pyc,,
+pip/_vendor/distlib/scripts.pyc,,
+pip/_vendor/chardet/langhebrewmodel.pyc,,
+pip/_vendor/html5lib/filters/sanitizer.pyc,,
+pip/_internal/pyproject.pyc,,
+pip/_internal/utils/ui.pyc,,
+pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc,,
+pip/_vendor/pytoml/core.pyc,,
+pip/_internal/commands/hash.pyc,,
+pip/_internal/commands/list.pyc,,
+pip/_internal/cli/status_codes.pyc,,
+pip/_vendor/lockfile/linklockfile.pyc,,
+pip/_internal/utils/temp_dir.pyc,,
+pip/_vendor/certifi/__main__.pyc,,
+pip/_internal/commands/wheel.pyc,,
+pip/_vendor/chardet/sbcharsetprober.pyc,,
+pip/_internal/commands/__init__.pyc,,
+pip/_vendor/urllib3/filepost.pyc,,
+pip/_internal/cli/__init__.pyc,,
+pip/_internal/commands/freeze.pyc,,
+pip/_vendor/chardet/big5freq.pyc,,
+pip/_vendor/certifi/core.pyc,,
+pip/_vendor/urllib3/connectionpool.pyc,,
+pip/_vendor/distlib/resources.pyc,,
+pip/_vendor/lockfile/__init__.pyc,,
+pip/_vendor/chardet/langgreekmodel.pyc,,
+pip/_internal/utils/compat.pyc,,
+pip/_vendor/colorama/win32.pyc,,
+pip/_vendor/lockfile/pidlockfile.pyc,,
+pip/_vendor/ipaddress.pyc,,
+pip/_vendor/pep517/_in_process.pyc,,
+pip/_vendor/pyparsing.pyc,,
+pip/_vendor/html5lib/__init__.pyc,,
+pip/_vendor/urllib3/response.pyc,,
+pip/_internal/req/req_tracker.pyc,,
+pip/_vendor/urllib3/contrib/securetransport.pyc,,
+pip/_vendor/distlib/_backport/misc.pyc,,
+pip/_vendor/chardet/universaldetector.pyc,,
+pip/_vendor/requests/__version__.pyc,,
+pip/_vendor/chardet/jpcntx.pyc,,
+pip/_vendor/chardet/enums.pyc,,
+pip/_vendor/urllib3/__init__.pyc,,
+pip/_vendor/chardet/big5prober.pyc,,
+pip/_vendor/cachecontrol/controller.pyc,,
+pip/_vendor/chardet/version.pyc,,
+pip/_vendor/cachecontrol/_cmd.pyc,,
+pip/_internal/cli/parser.pyc,,
+pip/_vendor/distlib/_backport/sysconfig.pyc,,
+pip/_vendor/chardet/escprober.pyc,,
+pip/_internal/commands/completion.pyc,,
+pip/_vendor/pytoml/test.pyc,,
+pip/_vendor/urllib3/packages/six.pyc,,
+pip/_internal/utils/typing.pyc,,
+pip/_internal/build_env.pyc,,
+pip/_vendor/html5lib/_utils.pyc,,
+pip/_vendor/chardet/langthaimodel.pyc,,
+pip/_internal/configuration.pyc,,
+pip/_vendor/pkg_resources/py31compat.pyc,,
+pip/_vendor/chardet/latin1prober.pyc,,
+pip/_vendor/msgpack/_version.pyc,,
+pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc,,
+pip/_internal/req/__init__.pyc,,
+pip/_internal/utils/misc.pyc,,
+pip/_vendor/html5lib/treeadapters/genshi.pyc,,
+pip/_vendor/idna/__init__.pyc,,
+pip/_vendor/lockfile/mkdirlockfile.pyc,,
+pip/_vendor/requests/utils.pyc,,
+pip/_internal/wheel.pyc,,
+pip/_vendor/urllib3/util/__init__.pyc,,
+pip/_vendor/colorama/__init__.pyc,,
+pip/_internal/commands/download.pyc,,
+pip/_vendor/packaging/_compat.pyc,,
+pip/_vendor/distlib/version.pyc,,
+pip/_vendor/distlib/wheel.pyc,,
+pip/_vendor/urllib3/util/url.pyc,,
+pip/_vendor/pytoml/writer.pyc,,
+pip/_vendor/idna/uts46data.pyc,,
+pip/_vendor/distlib/index.pyc,,
+pip/_vendor/requests/_internal_utils.pyc,,
+pip/_vendor/cachecontrol/heuristics.pyc,,
+pip/_vendor/requests/sessions.pyc,,
+pip/_internal/download.pyc,,
+pip/_vendor/urllib3/util/wait.pyc,,
+pip/_internal/commands/show.pyc,,
+pip/_vendor/html5lib/treewalkers/__init__.pyc,,
+pip/_internal/models/format_control.pyc,,
+pip/_vendor/distlib/_backport/tarfile.pyc,,
+pip/_vendor/idna/package_data.pyc,,
+pip/_vendor/html5lib/treewalkers/etree_lxml.pyc,,
+pip/_vendor/pytoml/__init__.pyc,,
+pip/_vendor/chardet/hebrewprober.pyc,,
+pip/_vendor/idna/core.pyc,,
+pip/_vendor/msgpack/__init__.pyc,,
+pip/_vendor/urllib3/util/connection.pyc,,
+pip/_vendor/urllib3/util/request.pyc,,
+pip/_vendor/chardet/euctwfreq.pyc,,
+pip/_vendor/cachecontrol/serialize.pyc,,
+pip/_vendor/cachecontrol/wrapper.pyc,,
+pip/_vendor/html5lib/html5parser.pyc,,
+pip/_vendor/pep517/check.pyc,,
+pip/_vendor/distlib/__init__.pyc,,
+pip/_vendor/msgpack/fallback.pyc,,
+pip/_vendor/urllib3/fields.pyc,,
+pip/_vendor/pkg_resources/__init__.pyc,,
+pip/_internal/cli/main_parser.pyc,,
+pip/_vendor/html5lib/_ihatexml.pyc,,
+pip/_vendor/urllib3/_collections.pyc,,
+pip/_vendor/pep517/__init__.pyc,,
+pip/_vendor/urllib3/contrib/pyopenssl.pyc,,
+pip/_vendor/html5lib/treebuilders/etree_lxml.pyc,,
+pip/_internal/operations/prepare.pyc,,
+pip/_vendor/requests/structures.pyc,,
+pip/_vendor/packaging/version.pyc,,
+pip/_internal/operations/freeze.pyc,,
+pip/_internal/commands/search.pyc,,
+pip/_vendor/cachecontrol/adapter.pyc,,
+pip/_internal/__init__.pyc,,
+pip/_internal/cli/cmdoptions.pyc,,
+pip/_vendor/html5lib/filters/base.pyc,,
+pip/_vendor/packaging/specifiers.pyc,,
+pip/_vendor/idna/idnadata.pyc,,
+pip/_vendor/html5lib/treewalkers/genshi.pyc,,
+pip/_vendor/pep517/compat.pyc,,
+pip/_vendor/html5lib/treebuilders/base.pyc,,
+pip/_vendor/distlib/compat.pyc,,
+pip/_internal/req/req_set.pyc,,
+pip/_vendor/urllib3/util/retry.pyc,,
+pip/_internal/vcs/__init__.pyc,,
+pip/_vendor/pep517/colorlog.pyc,,
+pip/_vendor/chardet/gb2312prober.pyc,,
+pip/_internal/operations/__init__.pyc,,
+pip/_vendor/requests/help.pyc,,
+pip/_internal/commands/install.pyc,,
+pip/_vendor/chardet/cp949prober.pyc,,
+pip/_vendor/requests/status_codes.pyc,,
+pip/_vendor/requests/exceptions.pyc,,
+pip/_internal/utils/outdated.pyc,,
+pip/_vendor/distlib/markers.pyc,,
+pip/_vendor/html5lib/_inputstream.pyc,,
+pip/_vendor/requests/hooks.pyc,,
+pip/_vendor/urllib3/poolmanager.pyc,,
+pip/_vendor/html5lib/treeadapters/sax.pyc,,
+pip/_vendor/appdirs.pyc,,
+pip/_vendor/chardet/sjisprober.pyc,,
+pip/_internal/vcs/subversion.pyc,,
+pip/_vendor/chardet/langcyrillicmodel.pyc,,
+pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc,,
+pip/_vendor/chardet/charsetgroupprober.pyc,,
+pip/_vendor/packaging/requirements.pyc,,
+pip/_internal/index.pyc,,
+pip/_internal/vcs/bazaar.pyc,,
+pip/_vendor/requests/api.pyc,,
+pip/_vendor/html5lib/treebuilders/etree.pyc,,
+pip/_vendor/cachecontrol/caches/file_cache.pyc,,
+pip/_internal/exceptions.pyc,,
+pip/_vendor/distlib/_backport/shutil.pyc,,
+pip/_vendor/html5lib/filters/__init__.pyc,,
+pip/__main__.pyc,,
+pip/_internal/operations/check.pyc,,
+pip/_vendor/cachecontrol/compat.pyc,,
+pip/_internal/cache.pyc,,
+pip/_vendor/chardet/charsetprober.pyc,,
+pip/_vendor/urllib3/packages/__init__.pyc,,
+pip/_vendor/requests/models.pyc,,
+pip/_vendor/lockfile/sqlitelockfile.pyc,,
+pip/_vendor/progress/counter.pyc,,
+pip/_vendor/urllib3/util/response.pyc,,
+pip/_vendor/chardet/cli/__init__.pyc,,
+pip/_vendor/six.pyc,,
+pip/_vendor/colorama/initialise.pyc,,
+pip/_vendor/html5lib/_trie/py.pyc,,
+pip/_vendor/urllib3/packages/backports/makefile.pyc,,
+pip/_vendor/chardet/utf8prober.pyc,,
+pip/_vendor/retrying.pyc,,
+pip/_internal/commands/configuration.pyc,,
+pip/_internal/vcs/git.pyc,,
+pip/_vendor/pep517/wrappers.pyc,,
+pip/_internal/vcs/mercurial.pyc,,
+pip/_internal/utils/__init__.pyc,,
+pip/_vendor/packaging/_structures.pyc,,
+pip/_vendor/chardet/langbulgarianmodel.pyc,,
+pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc,,
+pip/_vendor/requests/packages.pyc,,
+pip/_internal/commands/check.pyc,,
+pip/_vendor/pep517/envbuild.pyc,,
+pip/_vendor/chardet/sbcsgroupprober.pyc,,
+pip/_internal/locations.pyc,,
+pip/_internal/models/index.pyc,,
+pip/_vendor/idna/intranges.pyc,,
+pip/_vendor/distlib/locators.pyc,,
+pip/_internal/req/req_uninstall.pyc,,
+pip/_internal/utils/hashes.pyc,,
+pip/_vendor/html5lib/treewalkers/dom.pyc,,
+pip/_internal/utils/glibc.pyc,,
+pip/_vendor/cachecontrol/caches/__init__.pyc,,
+pip/_internal/cli/base_command.pyc,,
+pip/_vendor/html5lib/treebuilders/dom.pyc,,
+pip/_vendor/webencodings/labels.pyc,,
+pip/_vendor/webencodings/x_user_defined.pyc,,
+pip/_vendor/chardet/mbcssm.pyc,,
+pip/_vendor/urllib3/util/timeout.pyc,,
+pip/_vendor/urllib3/request.pyc,,
+pip/_vendor/chardet/mbcharsetprober.pyc,,
+pip/_vendor/html5lib/serializer.pyc,,
+pip/_vendor/chardet/eucjpprober.pyc,,
+pip/_vendor/idna/compat.pyc,,
+pip/_internal/req/constructors.pyc,,
+pip/_vendor/colorama/ansitowin32.pyc,,
+pip/_vendor/cachecontrol/filewrapper.pyc,,
+pip/_vendor/chardet/euckrfreq.pyc,,
+pip/_vendor/html5lib/_trie/__init__.pyc,,
+pip/_vendor/urllib3/contrib/ntlmpool.pyc,,
+pip/_vendor/chardet/langhungarianmodel.pyc,,
+pip/_vendor/requests/cookies.pyc,,
+pip/_vendor/requests/__init__.pyc,,
+pip/_vendor/webencodings/mklabels.pyc,,
+pip/_vendor/certifi/__init__.pyc,,
+pip/_vendor/html5lib/treewalkers/base.pyc,,
+pip/_vendor/distlib/manifest.pyc,,
+pip/_vendor/chardet/codingstatemachine.pyc,,
+pip/_internal/commands/help.pyc,,
+pip/_internal/pep425tags.pyc,,
+pip/_vendor/html5lib/treeadapters/__init__.pyc,,
+pip/_vendor/cachecontrol/caches/redis_cache.pyc,,
+pip/_vendor/html5lib/filters/inject_meta_charset.pyc,,
+pip/_vendor/pep517/build.pyc,,
+pip/_internal/utils/setuptools_build.pyc,,
+pip/_vendor/cachecontrol/__init__.pyc,,
+pip/_vendor/urllib3/contrib/appengine.pyc,,
+pip/_vendor/chardet/chardistribution.pyc,,
+pip/_vendor/urllib3/contrib/__init__.pyc,,
+pip/_vendor/__init__.pyc,,
+pip/_vendor/html5lib/constants.pyc,,
+pip/_vendor/colorama/winterm.pyc,,
+pip/_vendor/pytoml/parser.pyc,,
+pip/_vendor/chardet/gb2312freq.pyc,,
+pip/_vendor/urllib3/packages/backports/__init__.pyc,,
+pip/_internal/commands/uninstall.pyc,,
+pip/_vendor/colorama/ansi.pyc,,
+pip/_vendor/packaging/markers.pyc,,
+pip/_vendor/chardet/mbcsgroupprober.pyc,,
+pip/_internal/utils/encoding.pyc,,
+pip/_vendor/distro.pyc,,
+pip/_vendor/chardet/escsm.pyc,,
+pip/_vendor/progress/bar.pyc,,
+pip/_vendor/chardet/compat.pyc,,
+pip/_internal/req/req_install.pyc,,
+pip/_vendor/urllib3/util/ssl_.pyc,,
+pip/_vendor/html5lib/filters/optionaltags.pyc,,
+pip/_vendor/chardet/langturkishmodel.pyc,,
+pip/_internal/utils/deprecation.pyc,,
+pip/_internal/utils/filesystem.pyc,,
+pip/_vendor/chardet/jisfreq.pyc,,
diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL
new file mode 100644
index 00000000..c8240f03
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt
new file mode 100644
index 00000000..f5809cb4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/entry_points.txt
@@ -0,0 +1,5 @@
+[console_scripts]
+pip = pip._internal:main
+pip3 = pip._internal:main
+pip3.7 = pip._internal:main
+
diff --git a/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip-19.1.1.dist-info/top_level.txt
@@ -0,0 +1 @@
+pip
diff --git a/venv/lib/python2.7/site-packages/pip/__init__.py b/venv/lib/python2.7/site-packages/pip/__init__.py
new file mode 100644
index 00000000..5d05da31
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/__init__.py
@@ -0,0 +1 @@
+__version__ = "19.1.1"
diff --git a/venv/lib/python2.7/site-packages/pip/__init__.pyc b/venv/lib/python2.7/site-packages/pip/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..329f674c88d88d1f82596b031a0e4e419f5e7c04
GIT binary patch
literal 215
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#Ml@Z7z{1-4D}5C
zG(ZYVxEUB2;^WIwi;6Sz^Wx(*K!zZQ;&=uI2K|Df%(BFiRQ<BVBK@@doRrj}V*Ttw
z{p?~Rb92MOEF<$WLksiboXYg_c#{+p69WSSgY-Q85dDJ80^Q8K;*!Li9NqFn%hJFM
lkPsNh$7kkcmc+;F6;zgRFfcIK<mRW8=A_zz+*Ay50|2JhGh+Y%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/__main__.py b/venv/lib/python2.7/site-packages/pip/__main__.py
new file mode 100644
index 00000000..0c223f8c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/__main__.py
@@ -0,0 +1,19 @@
+from __future__ import absolute_import
+
+import os
+import sys
+
+# If we are running from a wheel, add the wheel to sys.path
+# This allows the usage python pip-*.whl/pip install pip-*.whl
+if __package__ == '':
+    # __file__ is pip-*.whl/pip/__main__.py
+    # first dirname call strips of '/__main__.py', second strips off '/pip'
+    # Resulting path is the name of the wheel itself
+    # Add that to sys.path so we can import pip
+    path = os.path.dirname(os.path.dirname(__file__))
+    sys.path.insert(0, path)
+
+from pip._internal import main as _main  # isort:skip # noqa
+
+if __name__ == '__main__':
+    sys.exit(_main())
diff --git a/venv/lib/python2.7/site-packages/pip/__main__.pyc b/venv/lib/python2.7/site-packages/pip/__main__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..db78369a34643f2566842215d661478ea24e73c4
GIT binary patch
literal 562
zcmZSn%*&NH<x)&C0~9bbFfcecFfbI)W?*1QVPHsMWXNG)$Yo@RVq{<h@tGKMm>8m%
zz;a9sIm`@E%nYe43@OYE*-Q*Y84RgR3|XuUS!_rQc7|p~5Q<`DNM#1ga)7j_vNAL?
zF)-#q>|tTZ;bh3=Vu<2qU`*v<NMQw=Hyx~lmm!s#p_u_>23R>0L$C%L0|P@Q$k7^%
z3=9k<{0s~XiAlxzIi)43@tL^=`9&puB?xI21_p-Q#LT=B4h9B>_;?UAK3;<lq>~FQ
zl2%$$T9g_e9|Y1<!o<M9kY8K^3XI~);u3DKl7htK?8Nlc`1lf#X$6TT871tXK*}u2
zOUzA$nw*xI15yEYU0!i&QAr6e0|P@rW`SOOW?o5ZQC?zB5XkfrR*;z>cR)3Q%zzr5
zT9H|z0dfa|D2``fV9+lp$}CGPN!2e)EYeTQ&q+xwD%Q^~)Xy$9GB-CY%rY`BGqf--
z&Z$f<k2gs%F)=VOFi6kS5795kEYQu&D=taQ$<ZxOv@8wG011IHEG+a2D!~r1$<0qG
d%}KQb1!}PX0|SEq6AvQ~3lFOtqZkv24FFwYcys^&

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/__init__.py
new file mode 100644
index 00000000..9c1637cf
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/__init__.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+from __future__ import absolute_import
+
+import locale
+import logging
+import os
+import warnings
+
+import sys
+
+# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks,
+# but if invoked (i.e. imported), it will issue a warning to stderr if socks
+# isn't available.  requests unconditionally imports urllib3's socks contrib
+# module, triggering this warning.  The warning breaks DEP-8 tests (because of
+# the stderr output) and is just plain annoying in normal usage.  I don't want
+# to add socks as yet another dependency for pip, nor do I want to allow-stderr
+# in the DEP-8 tests, so just suppress the warning.  pdb tells me this has to
+# be done before the import of pip.vcs.
+from pip._vendor.urllib3.exceptions import DependencyWarning
+warnings.filterwarnings("ignore", category=DependencyWarning)  # noqa
+
+# We want to inject the use of SecureTransport as early as possible so that any
+# references or sessions or what have you are ensured to have it, however we
+# only want to do this in the case that we're running on macOS and the linked
+# OpenSSL is too old to handle TLSv1.2
+try:
+    import ssl
+except ImportError:
+    pass
+else:
+    # Checks for OpenSSL 1.0.1 on MacOS
+    if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f:
+        try:
+            from pip._vendor.urllib3.contrib import securetransport
+        except (ImportError, OSError):
+            pass
+        else:
+            securetransport.inject_into_urllib3()
+
+from pip._internal.cli.autocompletion import autocomplete
+from pip._internal.cli.main_parser import parse_command
+from pip._internal.commands import commands_dict
+from pip._internal.exceptions import PipError
+from pip._internal.utils import deprecation
+from pip._internal.vcs import git, mercurial, subversion, bazaar  # noqa
+from pip._vendor.urllib3.exceptions import InsecureRequestWarning
+
+logger = logging.getLogger(__name__)
+
+# Hide the InsecureRequestWarning from urllib3
+warnings.filterwarnings("ignore", category=InsecureRequestWarning)
+
+
+def main(args=None):
+    if args is None:
+        args = sys.argv[1:]
+
+    # Configure our deprecation warnings to be sent through loggers
+    deprecation.install_warning_logger()
+
+    autocomplete()
+
+    try:
+        cmd_name, cmd_args = parse_command(args)
+    except PipError as exc:
+        sys.stderr.write("ERROR: %s" % exc)
+        sys.stderr.write(os.linesep)
+        sys.exit(1)
+
+    # Needed for locale.getpreferredencoding(False) to work
+    # in pip._internal.utils.encoding.auto_decode
+    try:
+        locale.setlocale(locale.LC_ALL, '')
+    except locale.Error as e:
+        # setlocale can apparently crash if locale are uninitialized
+        logger.debug("Ignoring error %s when setting locale", e)
+    command = commands_dict[cmd_name](isolated=("--isolated" in cmd_args))
+    return command.main(cmd_args)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cc315cdcfcfd40f79bf7840873d80a2f30df0b72
GIT binary patch
literal 2298
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/build_env.py b/venv/lib/python2.7/site-packages/pip/_internal/build_env.py
new file mode 100644
index 00000000..89830e72
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/build_env.py
@@ -0,0 +1,215 @@
+"""Build Environment used for isolation during sdist building
+"""
+
+import logging
+import os
+import sys
+import textwrap
+from collections import OrderedDict
+from distutils.sysconfig import get_python_lib
+from sysconfig import get_paths
+
+from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet
+
+from pip import __file__ as pip_location
+from pip._internal.utils.misc import call_subprocess
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.ui import open_spinner
+
+if MYPY_CHECK_RUNNING:
+    from typing import Tuple, Set, Iterable, Optional, List
+    from pip._internal.index import PackageFinder
+
+logger = logging.getLogger(__name__)
+
+
+class _Prefix:
+
+    def __init__(self, path):
+        # type: (str) -> None
+        self.path = path
+        self.setup = False
+        self.bin_dir = get_paths(
+            'nt' if os.name == 'nt' else 'posix_prefix',
+            vars={'base': path, 'platbase': path}
+        )['scripts']
+        # Note: prefer distutils' sysconfig to get the
+        # library paths so PyPy is correctly supported.
+        purelib = get_python_lib(plat_specific=False, prefix=path)
+        platlib = get_python_lib(plat_specific=True, prefix=path)
+        if purelib == platlib:
+            self.lib_dirs = [purelib]
+        else:
+            self.lib_dirs = [purelib, platlib]
+
+
+class BuildEnvironment(object):
+    """Creates and manages an isolated environment to install build deps
+    """
+
+    def __init__(self):
+        # type: () -> None
+        self._temp_dir = TempDirectory(kind="build-env")
+        self._temp_dir.create()
+
+        self._prefixes = OrderedDict((
+            (name, _Prefix(os.path.join(self._temp_dir.path, name)))
+            for name in ('normal', 'overlay')
+        ))
+
+        self._bin_dirs = []  # type: List[str]
+        self._lib_dirs = []  # type: List[str]
+        for prefix in reversed(list(self._prefixes.values())):
+            self._bin_dirs.append(prefix.bin_dir)
+            self._lib_dirs.extend(prefix.lib_dirs)
+
+        # Customize site to:
+        # - ensure .pth files are honored
+        # - prevent access to system site packages
+        system_sites = {
+            os.path.normcase(site) for site in (
+                get_python_lib(plat_specific=False),
+                get_python_lib(plat_specific=True),
+            )
+        }
+        self._site_dir = os.path.join(self._temp_dir.path, 'site')
+        if not os.path.exists(self._site_dir):
+            os.mkdir(self._site_dir)
+        with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp:
+            fp.write(textwrap.dedent(
+                '''
+                import os, site, sys
+
+                # First, drop system-sites related paths.
+                original_sys_path = sys.path[:]
+                known_paths = set()
+                for path in {system_sites!r}:
+                    site.addsitedir(path, known_paths=known_paths)
+                system_paths = set(
+                    os.path.normcase(path)
+                    for path in sys.path[len(original_sys_path):]
+                )
+                original_sys_path = [
+                    path for path in original_sys_path
+                    if os.path.normcase(path) not in system_paths
+                ]
+                sys.path = original_sys_path
+
+                # Second, add lib directories.
+                # ensuring .pth file are processed.
+                for path in {lib_dirs!r}:
+                    assert not path in sys.path
+                    site.addsitedir(path)
+                '''
+            ).format(system_sites=system_sites, lib_dirs=self._lib_dirs))
+
+    def __enter__(self):
+        self._save_env = {
+            name: os.environ.get(name, None)
+            for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH')
+        }
+
+        path = self._bin_dirs[:]
+        old_path = self._save_env['PATH']
+        if old_path:
+            path.extend(old_path.split(os.pathsep))
+
+        pythonpath = [self._site_dir]
+
+        os.environ.update({
+            'PATH': os.pathsep.join(path),
+            'PYTHONNOUSERSITE': '1',
+            'PYTHONPATH': os.pathsep.join(pythonpath),
+        })
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        for varname, old_value in self._save_env.items():
+            if old_value is None:
+                os.environ.pop(varname, None)
+            else:
+                os.environ[varname] = old_value
+
+    def cleanup(self):
+        # type: () -> None
+        self._temp_dir.cleanup()
+
+    def check_requirements(self, reqs):
+        # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]]
+        """Return 2 sets:
+            - conflicting requirements: set of (installed, wanted) reqs tuples
+            - missing requirements: set of reqs
+        """
+        missing = set()
+        conflicting = set()
+        if reqs:
+            ws = WorkingSet(self._lib_dirs)
+            for req in reqs:
+                try:
+                    if ws.find(Requirement.parse(req)) is None:
+                        missing.add(req)
+                except VersionConflict as e:
+                    conflicting.add((str(e.args[0].as_requirement()),
+                                     str(e.args[1])))
+        return conflicting, missing
+
+    def install_requirements(
+        self,
+        finder,  # type: PackageFinder
+        requirements,  # type: Iterable[str]
+        prefix_as_string,  # type: str
+        message  # type: Optional[str]
+    ):
+        # type: (...) -> None
+        prefix = self._prefixes[prefix_as_string]
+        assert not prefix.setup
+        prefix.setup = True
+        if not requirements:
+            return
+        args = [
+            sys.executable, os.path.dirname(pip_location), 'install',
+            '--ignore-installed', '--no-user', '--prefix', prefix.path,
+            '--no-warn-script-location',
+        ]  # type: List[str]
+        if logger.getEffectiveLevel() <= logging.DEBUG:
+            args.append('-v')
+        for format_control in ('no_binary', 'only_binary'):
+            formats = getattr(finder.format_control, format_control)
+            args.extend(('--' + format_control.replace('_', '-'),
+                         ','.join(sorted(formats or {':none:'}))))
+        if finder.index_urls:
+            args.extend(['-i', finder.index_urls[0]])
+            for extra_index in finder.index_urls[1:]:
+                args.extend(['--extra-index-url', extra_index])
+        else:
+            args.append('--no-index')
+        for link in finder.find_links:
+            args.extend(['--find-links', link])
+        for _, host, _ in finder.secure_origins:
+            args.extend(['--trusted-host', host])
+        if finder.allow_all_prereleases:
+            args.append('--pre')
+        args.append('--')
+        args.extend(requirements)
+        with open_spinner(message) as spinner:
+            call_subprocess(args, spinner=spinner)
+
+
+class NoOpBuildEnvironment(BuildEnvironment):
+    """A no-op drop-in replacement for BuildEnvironment
+    """
+
+    def __init__(self):
+        pass
+
+    def __enter__(self):
+        pass
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        pass
+
+    def cleanup(self):
+        pass
+
+    def install_requirements(self, finder, requirements, prefix, message):
+        raise NotImplementedError()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc b/venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bc3383934cc69482457946c98a39f9592538bbb3
GIT binary patch
literal 10038
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cache.py b/venv/lib/python2.7/site-packages/pip/_internal/cache.py
new file mode 100644
index 00000000..9379343c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cache.py
@@ -0,0 +1,224 @@
+"""Cache Management
+"""
+
+import errno
+import hashlib
+import logging
+import os
+
+from pip._vendor.packaging.utils import canonicalize_name
+
+from pip._internal.download import path_to_url
+from pip._internal.models.link import Link
+from pip._internal.utils.compat import expanduser
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.wheel import InvalidWheelFilename, Wheel
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional, Set, List, Any
+    from pip._internal.index import FormatControl
+
+logger = logging.getLogger(__name__)
+
+
+class Cache(object):
+    """An abstract class - provides cache directories for data from links
+
+
+        :param cache_dir: The root of the cache.
+        :param format_control: An object of FormatControl class to limit
+            binaries being read from the cache.
+        :param allowed_formats: which formats of files the cache should store.
+            ('binary' and 'source' are the only allowed values)
+    """
+
+    def __init__(self, cache_dir, format_control, allowed_formats):
+        # type: (str, FormatControl, Set[str]) -> None
+        super(Cache, self).__init__()
+        self.cache_dir = expanduser(cache_dir) if cache_dir else None
+        self.format_control = format_control
+        self.allowed_formats = allowed_formats
+
+        _valid_formats = {"source", "binary"}
+        assert self.allowed_formats.union(_valid_formats) == _valid_formats
+
+    def _get_cache_path_parts(self, link):
+        # type: (Link) -> List[str]
+        """Get parts of part that must be os.path.joined with cache_dir
+        """
+
+        # We want to generate an url to use as our cache key, we don't want to
+        # just re-use the URL because it might have other items in the fragment
+        # and we don't care about those.
+        key_parts = [link.url_without_fragment]
+        if link.hash_name is not None and link.hash is not None:
+            key_parts.append("=".join([link.hash_name, link.hash]))
+        key_url = "#".join(key_parts)
+
+        # Encode our key url with sha224, we'll use this because it has similar
+        # security properties to sha256, but with a shorter total output (and
+        # thus less secure). However the differences don't make a lot of
+        # difference for our use case here.
+        hashed = hashlib.sha224(key_url.encode()).hexdigest()
+
+        # We want to nest the directories some to prevent having a ton of top
+        # level directories where we might run out of sub directories on some
+        # FS.
+        parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
+
+        return parts
+
+    def _get_candidates(self, link, package_name):
+        # type: (Link, Optional[str]) -> List[Any]
+        can_not_cache = (
+            not self.cache_dir or
+            not package_name or
+            not link
+        )
+        if can_not_cache:
+            return []
+
+        canonical_name = canonicalize_name(package_name)
+        formats = self.format_control.get_allowed_formats(
+            canonical_name
+        )
+        if not self.allowed_formats.intersection(formats):
+            return []
+
+        root = self.get_path_for_link(link)
+        try:
+            return os.listdir(root)
+        except OSError as err:
+            if err.errno in {errno.ENOENT, errno.ENOTDIR}:
+                return []
+            raise
+
+    def get_path_for_link(self, link):
+        # type: (Link) -> str
+        """Return a directory to store cached items in for link.
+        """
+        raise NotImplementedError()
+
+    def get(self, link, package_name):
+        # type: (Link, Optional[str]) -> Link
+        """Returns a link to a cached item if it exists, otherwise returns the
+        passed link.
+        """
+        raise NotImplementedError()
+
+    def _link_for_candidate(self, link, candidate):
+        # type: (Link, str) -> Link
+        root = self.get_path_for_link(link)
+        path = os.path.join(root, candidate)
+
+        return Link(path_to_url(path))
+
+    def cleanup(self):
+        # type: () -> None
+        pass
+
+
+class SimpleWheelCache(Cache):
+    """A cache of wheels for future installs.
+    """
+
+    def __init__(self, cache_dir, format_control):
+        # type: (str, FormatControl) -> None
+        super(SimpleWheelCache, self).__init__(
+            cache_dir, format_control, {"binary"}
+        )
+
+    def get_path_for_link(self, link):
+        # type: (Link) -> str
+        """Return a directory to store cached wheels for link
+
+        Because there are M wheels for any one sdist, we provide a directory
+        to cache them in, and then consult that directory when looking up
+        cache hits.
+
+        We only insert things into the cache if they have plausible version
+        numbers, so that we don't contaminate the cache with things that were
+        not unique. E.g. ./package might have dozens of installs done for it
+        and build a version of 0.0...and if we built and cached a wheel, we'd
+        end up using the same wheel even if the source has been edited.
+
+        :param link: The link of the sdist for which this will cache wheels.
+        """
+        parts = self._get_cache_path_parts(link)
+
+        # Store wheels within the root cache_dir
+        return os.path.join(self.cache_dir, "wheels", *parts)
+
+    def get(self, link, package_name):
+        # type: (Link, Optional[str]) -> Link
+        candidates = []
+
+        for wheel_name in self._get_candidates(link, package_name):
+            try:
+                wheel = Wheel(wheel_name)
+            except InvalidWheelFilename:
+                continue
+            if not wheel.supported():
+                # Built for a different python/arch/etc
+                continue
+            candidates.append((wheel.support_index_min(), wheel_name))
+
+        if not candidates:
+            return link
+
+        return self._link_for_candidate(link, min(candidates)[1])
+
+
+class EphemWheelCache(SimpleWheelCache):
+    """A SimpleWheelCache that creates it's own temporary cache directory
+    """
+
+    def __init__(self, format_control):
+        # type: (FormatControl) -> None
+        self._temp_dir = TempDirectory(kind="ephem-wheel-cache")
+        self._temp_dir.create()
+
+        super(EphemWheelCache, self).__init__(
+            self._temp_dir.path, format_control
+        )
+
+    def cleanup(self):
+        # type: () -> None
+        self._temp_dir.cleanup()
+
+
+class WheelCache(Cache):
+    """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
+
+    This Cache allows for gracefully degradation, using the ephem wheel cache
+    when a certain link is not found in the simple wheel cache first.
+    """
+
+    def __init__(self, cache_dir, format_control):
+        # type: (str, FormatControl) -> None
+        super(WheelCache, self).__init__(
+            cache_dir, format_control, {'binary'}
+        )
+        self._wheel_cache = SimpleWheelCache(cache_dir, format_control)
+        self._ephem_cache = EphemWheelCache(format_control)
+
+    def get_path_for_link(self, link):
+        # type: (Link) -> str
+        return self._wheel_cache.get_path_for_link(link)
+
+    def get_ephem_path_for_link(self, link):
+        # type: (Link) -> str
+        return self._ephem_cache.get_path_for_link(link)
+
+    def get(self, link, package_name):
+        # type: (Link, Optional[str]) -> Link
+        retval = self._wheel_cache.get(link, package_name)
+        if retval is link:
+            retval = self._ephem_cache.get(link, package_name)
+        return retval
+
+    def cleanup(self):
+        # type: () -> None
+        self._wheel_cache.cleanup()
+        self._ephem_cache.cleanup()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cache.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cache.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fc19cf5994cf55ba8e3c99409fe1262d92e1c83a
GIT binary patch
literal 9463
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
N#Lq02C}u1s1OR{<xQPG&

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py
new file mode 100644
index 00000000..e589bb91
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py
@@ -0,0 +1,4 @@
+"""Subpackage containing all of pip's command line interface related code
+"""
+
+# This file intentionally does not import submodules
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..35bf7ac215eca0c97719d137a76ca614e1784952
GIT binary patch
literal 290
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#M~Je7=lZa3KEmE
z6Vp=_lJoOQ5;OBM^U@U(b8-~&(-aCa3)G7hlJj$O6Z29Oax(K$6*BWmQj5|OlT#In
zQgaeZQd1O?^HWl}{4_u|m9R4~FvQ2F<R{0+Yk*vUAc}Jt7#Q>miZaU*OH%dA5{vZH
z@^eyBi;DHL3-z;$jm*sr3$u*O%M2~di*qW|%i~Q_OiT<63=Goq^h5LuG7EGw^NLFn
zb8>Xc6D>;vGeAOM91nI;USf`Za!#gxe0*kJW=VX!UO{CE2Ll6xO>TZlX-=vg*uNkb
F0RV}tPxt@;

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py
new file mode 100644
index 00000000..0a04199e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py
@@ -0,0 +1,152 @@
+"""Logic that powers autocompletion installed by ``pip completion``.
+"""
+
+import optparse
+import os
+import sys
+
+from pip._internal.cli.main_parser import create_main_parser
+from pip._internal.commands import commands_dict, get_summaries
+from pip._internal.utils.misc import get_installed_distributions
+
+
+def autocomplete():
+    """Entry Point for completion of main and subcommand options.
+    """
+    # Don't complete if user hasn't sourced bash_completion file.
+    if 'PIP_AUTO_COMPLETE' not in os.environ:
+        return
+    cwords = os.environ['COMP_WORDS'].split()[1:]
+    cword = int(os.environ['COMP_CWORD'])
+    try:
+        current = cwords[cword - 1]
+    except IndexError:
+        current = ''
+
+    subcommands = [cmd for cmd, summary in get_summaries()]
+    options = []
+    # subcommand
+    try:
+        subcommand_name = [w for w in cwords if w in subcommands][0]
+    except IndexError:
+        subcommand_name = None
+
+    parser = create_main_parser()
+    # subcommand options
+    if subcommand_name:
+        # special case: 'help' subcommand has no options
+        if subcommand_name == 'help':
+            sys.exit(1)
+        # special case: list locally installed dists for show and uninstall
+        should_list_installed = (
+            subcommand_name in ['show', 'uninstall'] and
+            not current.startswith('-')
+        )
+        if should_list_installed:
+            installed = []
+            lc = current.lower()
+            for dist in get_installed_distributions(local_only=True):
+                if dist.key.startswith(lc) and dist.key not in cwords[1:]:
+                    installed.append(dist.key)
+            # if there are no dists installed, fall back to option completion
+            if installed:
+                for dist in installed:
+                    print(dist)
+                sys.exit(1)
+
+        subcommand = commands_dict[subcommand_name]()
+
+        for opt in subcommand.parser.option_list_all:
+            if opt.help != optparse.SUPPRESS_HELP:
+                for opt_str in opt._long_opts + opt._short_opts:
+                    options.append((opt_str, opt.nargs))
+
+        # filter out previously specified options from available options
+        prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]]
+        options = [(x, v) for (x, v) in options if x not in prev_opts]
+        # filter options by current input
+        options = [(k, v) for k, v in options if k.startswith(current)]
+        # get completion type given cwords and available subcommand options
+        completion_type = get_path_completion_type(
+            cwords, cword, subcommand.parser.option_list_all,
+        )
+        # get completion files and directories if ``completion_type`` is
+        # ``<file>``, ``<dir>`` or ``<path>``
+        if completion_type:
+            options = auto_complete_paths(current, completion_type)
+            options = ((opt, 0) for opt in options)
+        for option in options:
+            opt_label = option[0]
+            # append '=' to options which require args
+            if option[1] and option[0][:2] == "--":
+                opt_label += '='
+            print(opt_label)
+    else:
+        # show main parser options only when necessary
+
+        opts = [i.option_list for i in parser.option_groups]
+        opts.append(parser.option_list)
+        opts = (o for it in opts for o in it)
+        if current.startswith('-'):
+            for opt in opts:
+                if opt.help != optparse.SUPPRESS_HELP:
+                    subcommands += opt._long_opts + opt._short_opts
+        else:
+            # get completion type given cwords and all available options
+            completion_type = get_path_completion_type(cwords, cword, opts)
+            if completion_type:
+                subcommands = auto_complete_paths(current, completion_type)
+
+        print(' '.join([x for x in subcommands if x.startswith(current)]))
+    sys.exit(1)
+
+
+def get_path_completion_type(cwords, cword, opts):
+    """Get the type of path completion (``file``, ``dir``, ``path`` or None)
+
+    :param cwords: same as the environmental variable ``COMP_WORDS``
+    :param cword: same as the environmental variable ``COMP_CWORD``
+    :param opts: The available options to check
+    :return: path completion type (``file``, ``dir``, ``path`` or None)
+    """
+    if cword < 2 or not cwords[cword - 2].startswith('-'):
+        return
+    for opt in opts:
+        if opt.help == optparse.SUPPRESS_HELP:
+            continue
+        for o in str(opt).split('/'):
+            if cwords[cword - 2].split('=')[0] == o:
+                if not opt.metavar or any(
+                        x in ('path', 'file', 'dir')
+                        for x in opt.metavar.split('/')):
+                    return opt.metavar
+
+
+def auto_complete_paths(current, completion_type):
+    """If ``completion_type`` is ``file`` or ``path``, list all regular files
+    and directories starting with ``current``; otherwise only list directories
+    starting with ``current``.
+
+    :param current: The word to be completed
+    :param completion_type: path completion type(`file`, `path` or `dir`)i
+    :return: A generator of regular files and/or directories
+    """
+    directory, filename = os.path.split(current)
+    current_path = os.path.abspath(directory)
+    # Don't complete paths if they can't be accessed
+    if not os.access(current_path, os.R_OK):
+        return
+    filename = os.path.normcase(filename)
+    # list all files that start with ``filename``
+    file_list = (x for x in os.listdir(current_path)
+                 if os.path.normcase(x).startswith(filename))
+    for f in file_list:
+        opt = os.path.join(current_path, f)
+        comp_file = os.path.normcase(os.path.join(directory, f))
+        # complete regular files when there is not ``<dir>`` after option
+        # complete directories when there is ``<file>``, ``<path>`` or
+        # ``<dir>``after option
+        if completion_type != 'dir' and os.path.isfile(opt):
+            yield comp_file
+        elif os.path.isdir(opt):
+            yield os.path.join(comp_file, '')
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..89007d699f0fd0b79e314e4e10cda17207167c20
GIT binary patch
literal 5888
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
Q!z92c#wftd8O<pQ01c648vp<R

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py
new file mode 100644
index 00000000..f6108c96
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py
@@ -0,0 +1,340 @@
+"""Base Command class, and related routines"""
+from __future__ import absolute_import, print_function
+
+import logging
+import logging.config
+import optparse
+import os
+import platform
+import sys
+import traceback
+
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.parser import (
+    ConfigOptionParser, UpdatingDefaultsHelpFormatter,
+)
+from pip._internal.cli.status_codes import (
+    ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR,
+    VIRTUALENV_NOT_FOUND,
+)
+from pip._internal.download import PipSession
+from pip._internal.exceptions import (
+    BadCommand, CommandError, InstallationError, PreviousBuildDirError,
+    UninstallationError,
+)
+from pip._internal.index import PackageFinder
+from pip._internal.locations import running_under_virtualenv
+from pip._internal.req.constructors import (
+    install_req_from_editable, install_req_from_line,
+)
+from pip._internal.req.req_file import parse_requirements
+from pip._internal.utils.deprecation import deprecated
+from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
+from pip._internal.utils.misc import (
+    get_prog, normalize_path, redact_password_from_url,
+)
+from pip._internal.utils.outdated import pip_version_check
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional, List, Tuple, Any
+    from optparse import Values
+    from pip._internal.cache import WheelCache
+    from pip._internal.req.req_set import RequirementSet
+
+__all__ = ['Command']
+
+logger = logging.getLogger(__name__)
+
+
+class Command(object):
+    name = None  # type: Optional[str]
+    usage = None  # type: Optional[str]
+    ignore_require_venv = False  # type: bool
+
+    def __init__(self, isolated=False):
+        # type: (bool) -> None
+        parser_kw = {
+            'usage': self.usage,
+            'prog': '%s %s' % (get_prog(), self.name),
+            'formatter': UpdatingDefaultsHelpFormatter(),
+            'add_help_option': False,
+            'name': self.name,
+            'description': self.__doc__,
+            'isolated': isolated,
+        }
+
+        self.parser = ConfigOptionParser(**parser_kw)
+
+        # Commands should add options to this option group
+        optgroup_name = '%s Options' % self.name.capitalize()
+        self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
+
+        # Add the general options
+        gen_opts = cmdoptions.make_option_group(
+            cmdoptions.general_group,
+            self.parser,
+        )
+        self.parser.add_option_group(gen_opts)
+
+    def run(self, options, args):
+        # type: (Values, List[Any]) -> Any
+        raise NotImplementedError
+
+    def _build_session(self, options, retries=None, timeout=None):
+        # type: (Values, Optional[int], Optional[int]) -> PipSession
+        session = PipSession(
+            cache=(
+                normalize_path(os.path.join(options.cache_dir, "http"))
+                if options.cache_dir else None
+            ),
+            retries=retries if retries is not None else options.retries,
+            insecure_hosts=options.trusted_hosts,
+        )
+
+        # Handle custom ca-bundles from the user
+        if options.cert:
+            session.verify = options.cert
+
+        # Handle SSL client certificate
+        if options.client_cert:
+            session.cert = options.client_cert
+
+        # Handle timeouts
+        if options.timeout or timeout:
+            session.timeout = (
+                timeout if timeout is not None else options.timeout
+            )
+
+        # Handle configured proxies
+        if options.proxy:
+            session.proxies = {
+                "http": options.proxy,
+                "https": options.proxy,
+            }
+
+        # Determine if we can prompt the user for authentication or not
+        session.auth.prompting = not options.no_input
+
+        return session
+
+    def parse_args(self, args):
+        # type: (List[str]) -> Tuple
+        # factored out for testability
+        return self.parser.parse_args(args)
+
+    def main(self, args):
+        # type: (List[str]) -> int
+        options, args = self.parse_args(args)
+
+        # Set verbosity so that it can be used elsewhere.
+        self.verbosity = options.verbose - options.quiet
+
+        level_number = setup_logging(
+            verbosity=self.verbosity,
+            no_color=options.no_color,
+            user_log_file=options.log,
+        )
+
+        if sys.version_info[:2] == (3, 4):
+            deprecated(
+                "Python 3.4 support has been deprecated. pip 19.1 will be the "
+                "last one supporting it. Please upgrade your Python as Python "
+                "3.4 won't be maintained after March 2019 (cf PEP 429).",
+                replacement=None,
+                gone_in='19.2',
+            )
+        elif sys.version_info[:2] == (2, 7):
+            message = (
+                "A future version of pip will drop support for Python 2.7."
+            )
+            if platform.python_implementation() == "CPython":
+                message = (
+                    "Python 2.7 will reach the end of its life on January "
+                    "1st, 2020. Please upgrade your Python as Python 2.7 "
+                    "won't be maintained after that date. "
+                ) + message
+            deprecated(message, replacement=None, gone_in=None)
+
+        # TODO: Try to get these passing down from the command?
+        #       without resorting to os.environ to hold these.
+        #       This also affects isolated builds and it should.
+
+        if options.no_input:
+            os.environ['PIP_NO_INPUT'] = '1'
+
+        if options.exists_action:
+            os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action)
+
+        if options.require_venv and not self.ignore_require_venv:
+            # If a venv is required check if it can really be found
+            if not running_under_virtualenv():
+                logger.critical(
+                    'Could not find an activated virtualenv (required).'
+                )
+                sys.exit(VIRTUALENV_NOT_FOUND)
+
+        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
+        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:
+            logger.critical(str(exc))
+            logger.debug('Exception information:', exc_info=True)
+
+            return ERROR
+        except CommandError as exc:
+            logger.critical('%s', exc)
+            logger.debug('Exception information:', exc_info=True)
+
+            return ERROR
+        except BrokenStdoutLoggingError:
+            # Bypass our logger and write any remaining messages to stderr
+            # because stdout no longer works.
+            print('ERROR: Pipe to stdout was broken', file=sys.stderr)
+            if level_number <= logging.DEBUG:
+                traceback.print_exc(file=sys.stderr)
+
+            return ERROR
+        except KeyboardInterrupt:
+            logger.critical('Operation cancelled by user')
+            logger.debug('Exception information:', exc_info=True)
+
+            return ERROR
+        except BaseException:
+            logger.critical('Exception:', exc_info=True)
+
+            return UNKNOWN_ERROR
+        finally:
+            allow_version_check = (
+                # Does this command have the index_group options?
+                hasattr(options, "no_index") and
+                # Is this command allowed to perform this check?
+                not (options.disable_pip_version_check or options.no_index)
+            )
+            # Check if we're using the latest version of pip available
+            if allow_version_check:
+                session = self._build_session(
+                    options,
+                    retries=0,
+                    timeout=min(5, options.timeout)
+                )
+                with session:
+                    pip_version_check(session, options)
+
+            # Shutdown the logging module
+            logging.shutdown()
+
+        return SUCCESS
+
+
+class RequirementCommand(Command):
+
+    @staticmethod
+    def populate_requirement_set(requirement_set,  # type: RequirementSet
+                                 args,             # type: List[str]
+                                 options,          # type: Values
+                                 finder,           # type: PackageFinder
+                                 session,          # type: PipSession
+                                 name,             # type: str
+                                 wheel_cache       # type: Optional[WheelCache]
+                                 ):
+        # type: (...) -> None
+        """
+        Marshal cmd line args into a requirement set.
+        """
+        # NOTE: As a side-effect, options.require_hashes and
+        #       requirement_set.require_hashes may be updated
+
+        for filename in options.constraints:
+            for req_to_add in parse_requirements(
+                    filename,
+                    constraint=True, finder=finder, options=options,
+                    session=session, wheel_cache=wheel_cache):
+                req_to_add.is_direct = True
+                requirement_set.add_requirement(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,
+                wheel_cache=wheel_cache
+            )
+            req_to_add.is_direct = True
+            requirement_set.add_requirement(req_to_add)
+
+        for req in options.editables:
+            req_to_add = install_req_from_editable(
+                req,
+                isolated=options.isolated_mode,
+                use_pep517=options.use_pep517,
+                wheel_cache=wheel_cache
+            )
+            req_to_add.is_direct = True
+            requirement_set.add_requirement(req_to_add)
+
+        for filename in options.requirements:
+            for req_to_add in parse_requirements(
+                    filename,
+                    finder=finder, options=options, session=session,
+                    wheel_cache=wheel_cache,
+                    use_pep517=options.use_pep517):
+                req_to_add.is_direct = True
+                requirement_set.add_requirement(req_to_add)
+        # If --require-hashes was a line in a requirements file, tell
+        # RequirementSet about it:
+        requirement_set.require_hashes = options.require_hashes
+
+        if not (args or options.editables or options.requirements):
+            opts = {'name': name}
+            if options.find_links:
+                raise CommandError(
+                    'You must give at least one requirement to %(name)s '
+                    '(maybe you meant "pip %(name)s %(links)s"?)' %
+                    dict(opts, links=' '.join(options.find_links)))
+            else:
+                raise CommandError(
+                    'You must give at least one requirement to %(name)s '
+                    '(see "pip help %(name)s")' % opts)
+
+    def _build_package_finder(
+        self,
+        options,               # type: Values
+        session,               # type: PipSession
+        platform=None,         # type: Optional[str]
+        python_versions=None,  # type: Optional[List[str]]
+        abi=None,              # type: Optional[str]
+        implementation=None    # type: Optional[str]
+    ):
+        # type: (...) -> PackageFinder
+        """
+        Create a package finder appropriate to this requirement command.
+        """
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index:
+            logger.debug(
+                'Ignoring indexes: %s',
+                ','.join(redact_password_from_url(url) for url in index_urls),
+            )
+            index_urls = []
+
+        return PackageFinder(
+            find_links=options.find_links,
+            format_control=options.format_control,
+            index_urls=index_urls,
+            trusted_hosts=options.trusted_hosts,
+            allow_all_prereleases=options.pre,
+            session=session,
+            platform=platform,
+            versions=python_versions,
+            abi=abi,
+            implementation=implementation,
+            prefer_binary=options.prefer_binary,
+        )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..090ab67fd08cfe39311cb8b2f304c784e4288b50
GIT binary patch
literal 10137
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
Pj3B-+6DJctv)CR0EW|xD

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py
new file mode 100644
index 00000000..a09e38f7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py
@@ -0,0 +1,809 @@
+"""
+shared options and groups
+
+The principle here is to define options once, but *not* instantiate them
+globally. One reason being that options with action='append' can carry state
+between parses. pip parses general options twice internally, and shouldn't
+pass on state. To be consistent, all options will follow this design.
+
+"""
+from __future__ import absolute_import
+
+import textwrap
+import warnings
+from distutils.util import strtobool
+from functools import partial
+from optparse import SUPPRESS_HELP, Option, OptionGroup
+
+from pip._internal.exceptions import CommandError
+from pip._internal.locations import USER_CACHE_DIR, src_prefix
+from pip._internal.models.format_control import FormatControl
+from pip._internal.models.index import PyPI
+from pip._internal.utils.hashes import STRONG_HASHES
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.ui import BAR_TYPES
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Callable, Dict, Optional
+    from optparse import OptionParser, Values
+    from pip._internal.cli.parser import ConfigOptionParser
+
+
+def raise_option_error(parser, option, msg):
+    """
+    Raise an option parsing error using parser.error().
+
+    Args:
+      parser: an OptionParser instance.
+      option: an Option instance.
+      msg: the error text.
+    """
+    msg = '{} error: {}'.format(option, msg)
+    msg = textwrap.fill(' '.join(msg.split()))
+    parser.error(msg)
+
+
+def make_option_group(group, parser):
+    # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup
+    """
+    Return an OptionGroup object
+    group  -- assumed to be dict with 'name' and 'options' keys
+    parser -- an optparse Parser
+    """
+    option_group = OptionGroup(parser, group['name'])
+    for option in group['options']:
+        option_group.add_option(option())
+    return option_group
+
+
+def check_install_build_global(options, check_options=None):
+    # type: (Values, Optional[Values]) -> None
+    """Disable wheels if per-setup.py call options are set.
+
+    :param options: The OptionParser options to update.
+    :param check_options: The options to check, if not supplied defaults to
+        options.
+    """
+    if check_options is None:
+        check_options = options
+
+    def getname(n):
+        return getattr(check_options, n, None)
+    names = ["build_options", "global_options", "install_options"]
+    if any(map(getname, names)):
+        control = options.format_control
+        control.disallow_binaries()
+        warnings.warn(
+            'Disabling all use of wheels due to the use of --build-options '
+            '/ --global-options / --install-options.', stacklevel=2,
+        )
+
+
+def check_dist_restriction(options, check_target=False):
+    # type: (Values, bool) -> None
+    """Function for determining if custom platform options are allowed.
+
+    :param options: The OptionParser options.
+    :param check_target: Whether or not to check if --target is being used.
+    """
+    dist_restriction_set = any([
+        options.python_version,
+        options.platform,
+        options.abi,
+        options.implementation,
+    ])
+
+    binary_only = FormatControl(set(), {':all:'})
+    sdist_dependencies_allowed = (
+        options.format_control != binary_only and
+        not options.ignore_dependencies
+    )
+
+    # Installations or downloads using dist restrictions must not combine
+    # source distributions and dist-specific wheels, as they are not
+    # guaranteed to be locally compatible.
+    if dist_restriction_set and sdist_dependencies_allowed:
+        raise CommandError(
+            "When restricting platform and interpreter constraints using "
+            "--python-version, --platform, --abi, or --implementation, "
+            "either --no-deps must be set, or --only-binary=:all: must be "
+            "set and --no-binary must not be set (or must be set to "
+            ":none:)."
+        )
+
+    if check_target:
+        if dist_restriction_set and not options.target_dir:
+            raise CommandError(
+                "Can not use any platform or abi specific options unless "
+                "installing via '--target'"
+            )
+
+
+###########
+# options #
+###########
+
+help_ = partial(
+    Option,
+    '-h', '--help',
+    dest='help',
+    action='help',
+    help='Show help.',
+)  # type: Callable[..., Option]
+
+isolated_mode = partial(
+    Option,
+    "--isolated",
+    dest="isolated_mode",
+    action="store_true",
+    default=False,
+    help=(
+        "Run pip in an isolated mode, ignoring environment variables and user "
+        "configuration."
+    ),
+)  # type: Callable[..., Option]
+
+require_virtualenv = partial(
+    Option,
+    # Run only if inside a virtualenv, bail if not.
+    '--require-virtualenv', '--require-venv',
+    dest='require_venv',
+    action='store_true',
+    default=False,
+    help=SUPPRESS_HELP
+)  # type: Callable[..., Option]
+
+verbose = partial(
+    Option,
+    '-v', '--verbose',
+    dest='verbose',
+    action='count',
+    default=0,
+    help='Give more output. Option is additive, and can be used up to 3 times.'
+)  # type: Callable[..., Option]
+
+no_color = partial(
+    Option,
+    '--no-color',
+    dest='no_color',
+    action='store_true',
+    default=False,
+    help="Suppress colored output",
+)  # type: Callable[..., Option]
+
+version = partial(
+    Option,
+    '-V', '--version',
+    dest='version',
+    action='store_true',
+    help='Show version and exit.',
+)  # type: Callable[..., Option]
+
+quiet = partial(
+    Option,
+    '-q', '--quiet',
+    dest='quiet',
+    action='count',
+    default=0,
+    help=(
+        'Give less output. Option is additive, and can be used up to 3'
+        ' times (corresponding to WARNING, ERROR, and CRITICAL logging'
+        ' levels).'
+    ),
+)  # type: Callable[..., Option]
+
+progress_bar = partial(
+    Option,
+    '--progress-bar',
+    dest='progress_bar',
+    type='choice',
+    choices=list(BAR_TYPES.keys()),
+    default='on',
+    help=(
+        'Specify type of progress to be displayed [' +
+        '|'.join(BAR_TYPES.keys()) + '] (default: %default)'
+    ),
+)  # type: Callable[..., Option]
+
+log = partial(
+    Option,
+    "--log", "--log-file", "--local-log",
+    dest="log",
+    metavar="path",
+    help="Path to a verbose appending log."
+)  # type: Callable[..., Option]
+
+no_input = partial(
+    Option,
+    # Don't ask for input
+    '--no-input',
+    dest='no_input',
+    action='store_true',
+    default=False,
+    help=SUPPRESS_HELP
+)  # type: Callable[..., Option]
+
+proxy = partial(
+    Option,
+    '--proxy',
+    dest='proxy',
+    type='str',
+    default='',
+    help="Specify a proxy in the form [user:passwd@]proxy.server:port."
+)  # type: Callable[..., Option]
+
+retries = partial(
+    Option,
+    '--retries',
+    dest='retries',
+    type='int',
+    default=5,
+    help="Maximum number of retries each connection should attempt "
+         "(default %default times).",
+)  # type: Callable[..., Option]
+
+timeout = partial(
+    Option,
+    '--timeout', '--default-timeout',
+    metavar='sec',
+    dest='timeout',
+    type='float',
+    default=15,
+    help='Set the socket timeout (default %default seconds).',
+)  # type: Callable[..., Option]
+
+skip_requirements_regex = partial(
+    Option,
+    # A regex to be used to skip requirements
+    '--skip-requirements-regex',
+    dest='skip_requirements_regex',
+    type='str',
+    default='',
+    help=SUPPRESS_HELP,
+)  # type: Callable[..., Option]
+
+
+def exists_action():
+    # type: () -> Option
+    return Option(
+        # Option when path already exist
+        '--exists-action',
+        dest='exists_action',
+        type='choice',
+        choices=['s', 'i', 'w', 'b', 'a'],
+        default=[],
+        action='append',
+        metavar='action',
+        help="Default action when a path already exists: "
+             "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
+    )
+
+
+cert = partial(
+    Option,
+    '--cert',
+    dest='cert',
+    type='str',
+    metavar='path',
+    help="Path to alternate CA bundle.",
+)  # type: Callable[..., Option]
+
+client_cert = partial(
+    Option,
+    '--client-cert',
+    dest='client_cert',
+    type='str',
+    default=None,
+    metavar='path',
+    help="Path to SSL client certificate, a single file containing the "
+         "private key and the certificate in PEM format.",
+)  # type: Callable[..., Option]
+
+index_url = partial(
+    Option,
+    '-i', '--index-url', '--pypi-url',
+    dest='index_url',
+    metavar='URL',
+    default=PyPI.simple_url,
+    help="Base URL of Python Package Index (default %default). "
+         "This should point to a repository compliant with PEP 503 "
+         "(the simple repository API) or a local directory laid out "
+         "in the same format.",
+)  # type: Callable[..., Option]
+
+
+def extra_index_url():
+    return Option(
+        '--extra-index-url',
+        dest='extra_index_urls',
+        metavar='URL',
+        action='append',
+        default=[],
+        help="Extra URLs of package indexes to use in addition to "
+             "--index-url. Should follow the same rules as "
+             "--index-url.",
+    )
+
+
+no_index = partial(
+    Option,
+    '--no-index',
+    dest='no_index',
+    action='store_true',
+    default=False,
+    help='Ignore package index (only looking at --find-links URLs instead).',
+)  # type: Callable[..., Option]
+
+
+def find_links():
+    # type: () -> Option
+    return Option(
+        '-f', '--find-links',
+        dest='find_links',
+        action='append',
+        default=[],
+        metavar='url',
+        help="If a url or path to an html file, then parse for links to "
+             "archives. If a local path or file:// url that's a directory, "
+             "then look for archives in the directory listing.",
+    )
+
+
+def trusted_host():
+    # type: () -> Option
+    return Option(
+        "--trusted-host",
+        dest="trusted_hosts",
+        action="append",
+        metavar="HOSTNAME",
+        default=[],
+        help="Mark this host as trusted, even though it does not have valid "
+             "or any HTTPS.",
+    )
+
+
+def constraints():
+    # type: () -> Option
+    return Option(
+        '-c', '--constraint',
+        dest='constraints',
+        action='append',
+        default=[],
+        metavar='file',
+        help='Constrain versions using the given constraints file. '
+        'This option can be used multiple times.'
+    )
+
+
+def requirements():
+    # type: () -> Option
+    return Option(
+        '-r', '--requirement',
+        dest='requirements',
+        action='append',
+        default=[],
+        metavar='file',
+        help='Install from the given requirements file. '
+        'This option can be used multiple times.'
+    )
+
+
+def editable():
+    # type: () -> Option
+    return Option(
+        '-e', '--editable',
+        dest='editables',
+        action='append',
+        default=[],
+        metavar='path/url',
+        help=('Install a project in editable mode (i.e. setuptools '
+              '"develop mode") from a local project path or a VCS url.'),
+    )
+
+
+src = partial(
+    Option,
+    '--src', '--source', '--source-dir', '--source-directory',
+    dest='src_dir',
+    metavar='dir',
+    default=src_prefix,
+    help='Directory to check out editable projects into. '
+    'The default in a virtualenv is "<venv path>/src". '
+    'The default for global installs is "<current dir>/src".'
+)  # type: Callable[..., Option]
+
+
+def _get_format_control(values, option):
+    # type: (Values, Option) -> Any
+    """Get a format_control object."""
+    return getattr(values, option.dest)
+
+
+def _handle_no_binary(option, opt_str, value, parser):
+    # type: (Option, str, str, OptionParser) -> None
+    existing = _get_format_control(parser.values, option)
+    FormatControl.handle_mutual_excludes(
+        value, existing.no_binary, existing.only_binary,
+    )
+
+
+def _handle_only_binary(option, opt_str, value, parser):
+    # type: (Option, str, str, OptionParser) -> None
+    existing = _get_format_control(parser.values, option)
+    FormatControl.handle_mutual_excludes(
+        value, existing.only_binary, existing.no_binary,
+    )
+
+
+def no_binary():
+    # type: () -> Option
+    format_control = FormatControl(set(), set())
+    return Option(
+        "--no-binary", dest="format_control", action="callback",
+        callback=_handle_no_binary, type="str",
+        default=format_control,
+        help="Do not use binary packages. Can be supplied multiple times, and "
+             "each time adds to the existing value. Accepts either :all: to "
+             "disable all binary packages, :none: to empty the set, or one or "
+             "more package names with commas between them. Note that some "
+             "packages are tricky to compile and may fail to install when "
+             "this option is used on them.",
+    )
+
+
+def only_binary():
+    # type: () -> Option
+    format_control = FormatControl(set(), set())
+    return Option(
+        "--only-binary", dest="format_control", action="callback",
+        callback=_handle_only_binary, type="str",
+        default=format_control,
+        help="Do not use source packages. Can be supplied multiple times, and "
+             "each time adds to the existing value. Accepts either :all: to "
+             "disable all source packages, :none: to empty the set, or one or "
+             "more package names with commas between them. Packages without "
+             "binary distributions will fail to install when this option is "
+             "used on them.",
+    )
+
+
+platform = partial(
+    Option,
+    '--platform',
+    dest='platform',
+    metavar='platform',
+    default=None,
+    help=("Only use wheels compatible with <platform>. "
+          "Defaults to the platform of the running system."),
+)  # type: Callable[..., Option]
+
+
+python_version = partial(
+    Option,
+    '--python-version',
+    dest='python_version',
+    metavar='python_version',
+    default=None,
+    help=("Only use wheels compatible with Python "
+          "interpreter version <version>. If not specified, then the "
+          "current system interpreter minor version is used. A major "
+          "version (e.g. '2') can be specified to match all "
+          "minor revs of that major version.  A minor version "
+          "(e.g. '34') can also be specified."),
+)  # type: Callable[..., Option]
+
+
+implementation = partial(
+    Option,
+    '--implementation',
+    dest='implementation',
+    metavar='implementation',
+    default=None,
+    help=("Only use wheels compatible with Python "
+          "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
+          " or 'ip'. If not specified, then the current "
+          "interpreter implementation is used.  Use 'py' to force "
+          "implementation-agnostic wheels."),
+)  # type: Callable[..., Option]
+
+
+abi = partial(
+    Option,
+    '--abi',
+    dest='abi',
+    metavar='abi',
+    default=None,
+    help=("Only use wheels compatible with Python "
+          "abi <abi>, e.g. 'pypy_41'.  If not specified, then the "
+          "current interpreter abi tag is used.  Generally "
+          "you will need to specify --implementation, "
+          "--platform, and --python-version when using "
+          "this option."),
+)  # type: Callable[..., Option]
+
+
+def prefer_binary():
+    # type: () -> Option
+    return Option(
+        "--prefer-binary",
+        dest="prefer_binary",
+        action="store_true",
+        default=False,
+        help="Prefer older binary packages over newer source packages."
+    )
+
+
+cache_dir = partial(
+    Option,
+    "--cache-dir",
+    dest="cache_dir",
+    default=USER_CACHE_DIR,
+    metavar="dir",
+    help="Store the cache data in <dir>."
+)  # type: Callable[..., Option]
+
+
+def no_cache_dir_callback(option, opt, value, parser):
+    """
+    Process a value provided for the --no-cache-dir option.
+
+    This is an optparse.Option callback for the --no-cache-dir option.
+    """
+    # The value argument will be None if --no-cache-dir is passed via the
+    # command-line, since the option doesn't accept arguments.  However,
+    # the value can be non-None if the option is triggered e.g. by an
+    # environment variable, like PIP_NO_CACHE_DIR=true.
+    if value is not None:
+        # Then parse the string value to get argument error-checking.
+        try:
+            strtobool(value)
+        except ValueError as exc:
+            raise_option_error(parser, option=option, msg=str(exc))
+
+    # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
+    # converted to 0 (like "false" or "no") caused cache_dir to be disabled
+    # rather than enabled (logic would say the latter).  Thus, we disable
+    # the cache directory not just on values that parse to True, but (for
+    # backwards compatibility reasons) also on values that parse to False.
+    # In other words, always set it to False if the option is provided in
+    # some (valid) form.
+    parser.values.cache_dir = False
+
+
+no_cache = partial(
+    Option,
+    "--no-cache-dir",
+    dest="cache_dir",
+    action="callback",
+    callback=no_cache_dir_callback,
+    help="Disable the cache.",
+)  # type: Callable[..., Option]
+
+no_deps = partial(
+    Option,
+    '--no-deps', '--no-dependencies',
+    dest='ignore_dependencies',
+    action='store_true',
+    default=False,
+    help="Don't install package dependencies.",
+)  # type: Callable[..., Option]
+
+build_dir = partial(
+    Option,
+    '-b', '--build', '--build-dir', '--build-directory',
+    dest='build_dir',
+    metavar='dir',
+    help='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. '
+         'When passed, build directories are not cleaned in case of failures.'
+)  # type: Callable[..., Option]
+
+ignore_requires_python = partial(
+    Option,
+    '--ignore-requires-python',
+    dest='ignore_requires_python',
+    action='store_true',
+    help='Ignore the Requires-Python information.'
+)  # type: Callable[..., Option]
+
+no_build_isolation = partial(
+    Option,
+    '--no-build-isolation',
+    dest='build_isolation',
+    action='store_false',
+    default=True,
+    help='Disable isolation when building a modern source distribution. '
+         'Build dependencies specified by PEP 518 must be already installed '
+         'if this option is used.'
+)  # type: Callable[..., Option]
+
+
+def no_use_pep517_callback(option, opt, value, parser):
+    """
+    Process a value provided for the --no-use-pep517 option.
+
+    This is an optparse.Option callback for the no_use_pep517 option.
+    """
+    # Since --no-use-pep517 doesn't accept arguments, the value argument
+    # will be None if --no-use-pep517 is passed via the command-line.
+    # However, the value can be non-None if the option is triggered e.g.
+    # by an environment variable, for example "PIP_NO_USE_PEP517=true".
+    if value is not None:
+        msg = """A value was passed for --no-use-pep517,
+        probably using either the PIP_NO_USE_PEP517 environment variable
+        or the "no-use-pep517" config file option. Use an appropriate value
+        of the PIP_USE_PEP517 environment variable or the "use-pep517"
+        config file option instead.
+        """
+        raise_option_error(parser, option=option, msg=msg)
+
+    # Otherwise, --no-use-pep517 was passed via the command-line.
+    parser.values.use_pep517 = False
+
+
+use_pep517 = partial(
+    Option,
+    '--use-pep517',
+    dest='use_pep517',
+    action='store_true',
+    default=None,
+    help='Use PEP 517 for building source distributions '
+         '(use --no-use-pep517 to force legacy behaviour).'
+)  # type: Any
+
+no_use_pep517 = partial(
+    Option,
+    '--no-use-pep517',
+    dest='use_pep517',
+    action='callback',
+    callback=no_use_pep517_callback,
+    default=None,
+    help=SUPPRESS_HELP
+)  # type: Any
+
+install_options = partial(
+    Option,
+    '--install-option',
+    dest='install_options',
+    action='append',
+    metavar='options',
+    help="Extra arguments to be supplied to the setup.py install "
+         "command (use like --install-option=\"--install-scripts=/usr/local/"
+         "bin\"). Use multiple --install-option options to pass multiple "
+         "options to setup.py install. If you are using an option with a "
+         "directory path, be sure to use absolute path.",
+)  # type: Callable[..., Option]
+
+global_options = partial(
+    Option,
+    '--global-option',
+    dest='global_options',
+    action='append',
+    metavar='options',
+    help="Extra global options to be supplied to the setup.py "
+         "call before the install command.",
+)  # type: Callable[..., Option]
+
+no_clean = partial(
+    Option,
+    '--no-clean',
+    action='store_true',
+    default=False,
+    help="Don't clean up build directories."
+)  # type: Callable[..., Option]
+
+pre = partial(
+    Option,
+    '--pre',
+    action='store_true',
+    default=False,
+    help="Include pre-release and development versions. By default, "
+         "pip only finds stable versions.",
+)  # type: Callable[..., Option]
+
+disable_pip_version_check = partial(
+    Option,
+    "--disable-pip-version-check",
+    dest="disable_pip_version_check",
+    action="store_true",
+    default=False,
+    help="Don't periodically check PyPI to determine whether a new version "
+         "of pip is available for download. Implied with --no-index.",
+)  # 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 _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
+    pointed to in a dict by the algo name."""
+    if not parser.values.hashes:
+        parser.values.hashes = {}
+    try:
+        algo, digest = value.split(':', 1)
+    except ValueError:
+        parser.error('Arguments to %s must be a hash name '
+                     'followed by a value, like --hash=sha256:abcde...' %
+                     opt_str)
+    if algo not in STRONG_HASHES:
+        parser.error('Allowed hash algorithms for %s are %s.' %
+                     (opt_str, ', '.join(STRONG_HASHES)))
+    parser.values.hashes.setdefault(algo, []).append(digest)
+
+
+hash = partial(
+    Option,
+    '--hash',
+    # Hash values eventually end up in InstallRequirement.hashes due to
+    # __dict__ copying in process_line().
+    dest='hashes',
+    action='callback',
+    callback=_merge_hash,
+    type='string',
+    help="Verify that the package's archive matches this "
+         'hash before installing. Example: --hash=sha256:abcdef...',
+)  # type: Callable[..., Option]
+
+
+require_hashes = partial(
+    Option,
+    '--require-hashes',
+    dest='require_hashes',
+    action='store_true',
+    default=False,
+    help='Require a hash to check each requirement against, for '
+         'repeatable installs. This option is implied when any package in a '
+         'requirements file has a --hash option.',
+)  # type: Callable[..., Option]
+
+
+##########
+# groups #
+##########
+
+general_group = {
+    'name': 'General Options',
+    'options': [
+        help_,
+        isolated_mode,
+        require_virtualenv,
+        verbose,
+        version,
+        quiet,
+        log,
+        no_input,
+        proxy,
+        retries,
+        timeout,
+        skip_requirements_regex,
+        exists_action,
+        trusted_host,
+        cert,
+        client_cert,
+        cache_dir,
+        no_cache,
+        disable_pip_version_check,
+        no_color,
+    ]
+}  # type: Dict[str, Any]
+
+index_group = {
+    'name': 'Package Index Options',
+    'options': [
+        index_url,
+        extra_index_url,
+        no_index,
+        find_links,
+    ]
+}  # type: Dict[str, Any]
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bf55789c8b8bf6062928b732dabeecc5854a9b10
GIT binary patch
literal 21201
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
IWkIL~09;hk-2eap

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py
new file mode 100644
index 00000000..767f35d5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py
@@ -0,0 +1,104 @@
+"""A single place for constructing and exposing the main parser
+"""
+
+import os
+import sys
+
+from pip import __version__
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.parser import (
+    ConfigOptionParser, UpdatingDefaultsHelpFormatter,
+)
+from pip._internal.commands import (
+    commands_dict, get_similar_commands, get_summaries,
+)
+from pip._internal.exceptions import CommandError
+from pip._internal.utils.misc import get_prog
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Tuple, List
+
+
+__all__ = ["create_main_parser", "parse_command"]
+
+
+def create_main_parser():
+    # type: () -> ConfigOptionParser
+    """Creates and returns the main parser for pip's CLI
+    """
+
+    parser_kw = {
+        'usage': '\n%prog <command> [options]',
+        'add_help_option': False,
+        'formatter': UpdatingDefaultsHelpFormatter(),
+        'name': 'global',
+        'prog': get_prog(),
+    }
+
+    parser = ConfigOptionParser(**parser_kw)
+    parser.disable_interspersed_args()
+
+    pip_pkg_dir = os.path.abspath(os.path.join(
+        os.path.dirname(__file__), "..", "..",
+    ))
+    parser.version = 'pip %s from %s (python %s)' % (
+        __version__, pip_pkg_dir, sys.version[:3],
+    )
+
+    # add the general options
+    gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
+    parser.add_option_group(gen_opts)
+
+    # so the help formatter knows
+    parser.main = True  # type: ignore
+
+    # create command listing for description
+    command_summaries = get_summaries()
+    description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries]
+    parser.description = '\n'.join(description)
+
+    return parser
+
+
+def parse_command(args):
+    # type: (List[str]) -> Tuple[str, List[str]]
+    parser = create_main_parser()
+
+    # Note: parser calls disable_interspersed_args(), so the result of this
+    # call is to split the initial args into the general options before the
+    # subcommand and everything else.
+    # For example:
+    #  args: ['--timeout=5', 'install', '--user', 'INITools']
+    #  general_options: ['--timeout==5']
+    #  args_else: ['install', '--user', 'INITools']
+    general_options, args_else = parser.parse_args(args)
+
+    # --version
+    if general_options.version:
+        sys.stdout.write(parser.version)  # type: ignore
+        sys.stdout.write(os.linesep)
+        sys.exit()
+
+    # pip || pip help -> print_help()
+    if not args_else or (args_else[0] == 'help' and len(args_else) == 1):
+        parser.print_help()
+        sys.exit()
+
+    # the subcommand name
+    cmd_name = args_else[0]
+
+    if cmd_name not in commands_dict:
+        guess = get_similar_commands(cmd_name)
+
+        msg = ['unknown command "%s"' % cmd_name]
+        if guess:
+            msg.append('maybe you meant "%s"' % guess)
+
+        raise CommandError(' - '.join(msg))
+
+    # all the args without the subcommand
+    cmd_args = args[:]
+    cmd_args.remove(cmd_name)
+
+    return cmd_name, cmd_args
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..359d9019aa08201110595de4dcc449683493e9a6
GIT binary patch
literal 2974
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py
new file mode 100644
index 00000000..e1eaac42
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py
@@ -0,0 +1,261 @@
+"""Base option parser setup"""
+from __future__ import absolute_import
+
+import logging
+import optparse
+import sys
+import textwrap
+from distutils.util import strtobool
+
+from pip._vendor.six import string_types
+
+from pip._internal.cli.status_codes import UNKNOWN_ERROR
+from pip._internal.configuration import Configuration, ConfigurationError
+from pip._internal.utils.compat import get_terminal_size
+
+logger = logging.getLogger(__name__)
+
+
+class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
+    """A prettier/less verbose help formatter for optparse."""
+
+    def __init__(self, *args, **kwargs):
+        # help position must be aligned with __init__.parseopts.description
+        kwargs['max_help_position'] = 30
+        kwargs['indent_increment'] = 1
+        kwargs['width'] = get_terminal_size()[0] - 2
+        optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs)
+
+    def format_option_strings(self, option):
+        return self._format_option_strings(option, ' <%s>', ', ')
+
+    def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '):
+        """
+        Return a comma-separated list of option strings and metavars.
+
+        :param option:  tuple of (short opt, long opt), e.g: ('-f', '--format')
+        :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar
+        :param optsep:  separator
+        """
+        opts = []
+
+        if option._short_opts:
+            opts.append(option._short_opts[0])
+        if option._long_opts:
+            opts.append(option._long_opts[0])
+        if len(opts) > 1:
+            opts.insert(1, optsep)
+
+        if option.takes_value():
+            metavar = option.metavar or option.dest.lower()
+            opts.append(mvarfmt % metavar.lower())
+
+        return ''.join(opts)
+
+    def format_heading(self, heading):
+        if heading == 'Options':
+            return ''
+        return heading + ':\n'
+
+    def format_usage(self, usage):
+        """
+        Ensure there is only one newline between usage and the first heading
+        if there is no description.
+        """
+        msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), "  ")
+        return msg
+
+    def format_description(self, description):
+        # leave full control over description to us
+        if description:
+            if hasattr(self.parser, 'main'):
+                label = 'Commands'
+            else:
+                label = 'Description'
+            # some doc strings have initial newlines, some don't
+            description = description.lstrip('\n')
+            # some doc strings have final newlines and spaces, some don't
+            description = description.rstrip()
+            # dedent, then reindent
+            description = self.indent_lines(textwrap.dedent(description), "  ")
+            description = '%s:\n%s\n' % (label, description)
+            return description
+        else:
+            return ''
+
+    def format_epilog(self, epilog):
+        # leave full control over epilog to us
+        if epilog:
+            return epilog
+        else:
+            return ''
+
+    def indent_lines(self, text, indent):
+        new_lines = [indent + line for line in text.split('\n')]
+        return "\n".join(new_lines)
+
+
+class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
+    """Custom help formatter for use in ConfigOptionParser.
+
+    This is updates the defaults before expanding them, allowing
+    them to show up correctly in the help listing.
+    """
+
+    def expand_default(self, option):
+        if self.parser is not None:
+            self.parser._update_defaults(self.parser.defaults)
+        return optparse.IndentedHelpFormatter.expand_default(self, option)
+
+
+class CustomOptionParser(optparse.OptionParser):
+
+    def insert_option_group(self, idx, *args, **kwargs):
+        """Insert an OptionGroup at a given position."""
+        group = self.add_option_group(*args, **kwargs)
+
+        self.option_groups.pop()
+        self.option_groups.insert(idx, group)
+
+        return group
+
+    @property
+    def option_list_all(self):
+        """Get a list of all options, including those in option groups."""
+        res = self.option_list[:]
+        for i in self.option_groups:
+            res.extend(i.option_list)
+
+        return res
+
+
+class ConfigOptionParser(CustomOptionParser):
+    """Custom option parser which updates its defaults by checking the
+    configuration files and environmental variables"""
+
+    def __init__(self, *args, **kwargs):
+        self.name = kwargs.pop('name')
+
+        isolated = kwargs.pop("isolated", False)
+        self.config = Configuration(isolated)
+
+        assert self.name
+        optparse.OptionParser.__init__(self, *args, **kwargs)
+
+    def check_default(self, option, key, val):
+        try:
+            return option.check_value(key, val)
+        except optparse.OptionValueError as exc:
+            print("An error occurred during configuration: %s" % exc)
+            sys.exit(3)
+
+    def _get_ordered_configuration_items(self):
+        # Configuration gives keys in an unordered manner. Order them.
+        override_order = ["global", self.name, ":env:"]
+
+        # Pool the options into different groups
+        section_items = {name: [] for name in override_order}
+        for section_key, val in self.config.items():
+            # ignore empty values
+            if not val:
+                logger.debug(
+                    "Ignoring configuration key '%s' as it's value is empty.",
+                    section_key
+                )
+                continue
+
+            section, key = section_key.split(".", 1)
+            if section in override_order:
+                section_items[section].append((key, val))
+
+        # Yield each group in their override order
+        for section in override_order:
+            for key, val in section_items[section]:
+                yield key, val
+
+    def _update_defaults(self, defaults):
+        """Updates the given defaults with values from the config files and
+        the environ. Does a little special handling for certain types of
+        options (lists)."""
+
+        # Accumulate complex default state.
+        self.values = optparse.Values(self.defaults)
+        late_eval = set()
+        # Then set the options with those values
+        for key, val in self._get_ordered_configuration_items():
+            # '--' because configuration supports only long names
+            option = self.get_option('--' + key)
+
+            # Ignore options not present in this parser. E.g. non-globals put
+            # in [global] by users that want them to apply to all applicable
+            # commands.
+            if option is None:
+                continue
+
+            if option.action in ('store_true', 'store_false', 'count'):
+                try:
+                    val = strtobool(val)
+                except ValueError:
+                    error_msg = invalid_config_error_message(
+                        option.action, key, val
+                    )
+                    self.error(error_msg)
+
+            elif option.action == 'append':
+                val = val.split()
+                val = [self.check_default(option, key, v) for v in val]
+            elif option.action == 'callback':
+                late_eval.add(option.dest)
+                opt_str = option.get_opt_string()
+                val = option.convert_value(opt_str, val)
+                # From take_action
+                args = option.callback_args or ()
+                kwargs = option.callback_kwargs or {}
+                option.callback(option, opt_str, val, self, *args, **kwargs)
+            else:
+                val = self.check_default(option, key, val)
+
+            defaults[option.dest] = val
+
+        for key in late_eval:
+            defaults[key] = getattr(self.values, key)
+        self.values = None
+        return defaults
+
+    def get_default_values(self):
+        """Overriding to make updating the defaults after instantiation of
+        the option parser possible, _update_defaults() does the dirty work."""
+        if not self.process_default_values:
+            # Old, pre-Optik 1.5 behaviour.
+            return optparse.Values(self.defaults)
+
+        # Load the configuration, or error out in case of an error
+        try:
+            self.config.load()
+        except ConfigurationError as err:
+            self.exit(UNKNOWN_ERROR, str(err))
+
+        defaults = self._update_defaults(self.defaults.copy())  # ours
+        for option in self._get_all_options():
+            default = defaults.get(option.dest)
+            if isinstance(default, string_types):
+                opt_str = option.get_opt_string()
+                defaults[option.dest] = option.check_value(opt_str, default)
+        return optparse.Values(defaults)
+
+    def error(self, msg):
+        self.print_usage(sys.stderr)
+        self.exit(UNKNOWN_ERROR, "%s\n" % msg)
+
+
+def invalid_config_error_message(action, key, val):
+    """Returns a better error message when invalid configuration option
+    is provided."""
+    if action in ('store_true', 'store_false'):
+        return ("{0} is not a valid value for {1} option, "
+                "please specify a boolean value like yes/no, "
+                "true/false or 1/0 instead.").format(val, key)
+
+    return ("{0} is not a valid value for {1} option, "
+            "please specify a numerical value like 1/0 "
+            "instead.").format(val, key)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f9e27313a6f0d5929b53f9b0849dfb6bc33f2c95
GIT binary patch
literal 11512
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py
new file mode 100644
index 00000000..275360a3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py
@@ -0,0 +1,8 @@
+from __future__ import absolute_import
+
+SUCCESS = 0
+ERROR = 1
+UNKNOWN_ERROR = 2
+VIRTUALENV_NOT_FOUND = 3
+PREVIOUS_BUILD_DIR_ERROR = 4
+NO_MATCHES_FOUND = 23
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2830b6624bd86e3152b92ce1198a417aacd86768
GIT binary patch
literal 454
zcmZSn%*&NH<x)&C0~9bZFfcecFfbHbFfcHrFfgPrGUPBY<T5fuF)}cwFfc?hF{Cgt
zL@_g@Ff&B4Fr=_BM6oiYurfrkF{H3DM6olZurmZ}a4;}1WP(i8U}RumDB)*dU`R|V
z&d(_=NsZ6UEyyn_$plGcf^5rV1}SC%5#kIC41QqEC0q;)4Ds=4r6r|BsqyhaAhSx?
z85kIXL!F&ngM&+085kH`gM$2nN_ZI<7()HL{rtoI;vpg;3=9lmo<Sj@jy|q_Vex+c
zA@Oehp?)qU5)2Fs0YR=|p8lc1@lK(hJ}&Vto<UGu0wBx%<9!`NoIPBFAv!cb_9BSl
zLIwr~{eq&*vc!^9{j$U&{j~g?l+>bP{p>>h>|!HxbHl<cBl9vt3-jWf%JlMhlN1vZ
z0|Ntt^gR6#{esK_-ORk=lEj=G-SR}s(!dOm5E#d2=9Q!t<t66mC+B497ndZKlorP)
k=cl9=>lIX%fI`zIH$SB`C)ExVY{fhb3=9HHY>Y4n0HLX7g8%>k

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py
new file mode 100644
index 00000000..2e90db34
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py
@@ -0,0 +1,79 @@
+"""
+Package containing all pip commands
+"""
+from __future__ import absolute_import
+
+from pip._internal.commands.completion import CompletionCommand
+from pip._internal.commands.configuration import ConfigurationCommand
+from pip._internal.commands.download import DownloadCommand
+from pip._internal.commands.freeze import FreezeCommand
+from pip._internal.commands.hash import HashCommand
+from pip._internal.commands.help import HelpCommand
+from pip._internal.commands.list import ListCommand
+from pip._internal.commands.check import CheckCommand
+from pip._internal.commands.search import SearchCommand
+from pip._internal.commands.show import ShowCommand
+from pip._internal.commands.install import InstallCommand
+from pip._internal.commands.uninstall import UninstallCommand
+from pip._internal.commands.wheel import WheelCommand
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import List, Type
+    from pip._internal.cli.base_command import Command
+
+commands_order = [
+    InstallCommand,
+    DownloadCommand,
+    UninstallCommand,
+    FreezeCommand,
+    ListCommand,
+    ShowCommand,
+    CheckCommand,
+    ConfigurationCommand,
+    SearchCommand,
+    WheelCommand,
+    HashCommand,
+    CompletionCommand,
+    HelpCommand,
+]  # type: List[Type[Command]]
+
+commands_dict = {c.name: c for c in commands_order}
+
+
+def get_summaries(ordered=True):
+    """Yields sorted (command name, command summary) tuples."""
+
+    if ordered:
+        cmditems = _sort_commands(commands_dict, commands_order)
+    else:
+        cmditems = commands_dict.items()
+
+    for name, command_class in cmditems:
+        yield (name, command_class.summary)
+
+
+def get_similar_commands(name):
+    """Command name auto-correct."""
+    from difflib import get_close_matches
+
+    name = name.lower()
+
+    close_commands = get_close_matches(name, commands_dict.keys())
+
+    if close_commands:
+        return close_commands[0]
+    else:
+        return False
+
+
+def _sort_commands(cmddict, order):
+    def keyfn(key):
+        try:
+            return order.index(key[1])
+        except ValueError:
+            # unordered items should come last
+            return 0xff
+
+    return sorted(cmddict.items(), key=keyfn)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2f31a6c3cae0cedf1390bb8b04ce99fe5be6727a
GIT binary patch
literal 3475
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
DI4VTD

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/check.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/check.py
new file mode 100644
index 00000000..801cecc0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/check.py
@@ -0,0 +1,41 @@
+import logging
+
+from pip._internal.cli.base_command import Command
+from pip._internal.operations.check import (
+    check_package_set, create_package_set_from_installed,
+)
+
+logger = logging.getLogger(__name__)
+
+
+class CheckCommand(Command):
+    """Verify installed packages have compatible dependencies."""
+    name = 'check'
+    usage = """
+      %prog [options]"""
+    summary = 'Verify installed packages have compatible dependencies.'
+
+    def run(self, options, args):
+        package_set, parsing_probs = create_package_set_from_installed()
+        missing, conflicting = check_package_set(package_set)
+
+        for project_name in missing:
+            version = package_set[project_name].version
+            for dependency in missing[project_name]:
+                logger.info(
+                    "%s %s requires %s, which is not installed.",
+                    project_name, version, dependency[0],
+                )
+
+        for project_name in conflicting:
+            version = package_set[project_name].version
+            for dep_name, dep_version, req in conflicting[project_name]:
+                logger.info(
+                    "%s %s has requirement %s, but you have %s %s.",
+                    project_name, version, req, dep_name, dep_version,
+                )
+
+        if missing or conflicting or parsing_probs:
+            return 1
+        else:
+            logger.info("No broken requirements found.")
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8b314fe8dfbc2e74fd8f2a901e1510e44c363c34
GIT binary patch
literal 1725
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHHGcYiuFfgPrGUPBYL_ye03^|Mpxl9aEObm=5
zIcA0&W`<lAhA0+>TvmoCRtCmY28Jv)hE#TjW=4i64u%vKhEyhoG)9ILR)!V^hGqta
z$S6*bnZX)t3=9mJ|NsC0@2A1Yz`#(#&cMLnoS&PUn3tl#1QHNrU|>kjNKMX;FGx(z
zPE1dYFHS8fQ3Qz=r6!i7A`8c-73Jr~XXX``B<AF#rj+o23<K$fnh5tE$SNn0_cR$8
z7*ZJ+q8LG*jA8=0DT<jPg$d-B6b6uAQkX$bj$&g73f5o&X)$MDU<gYs%1o<NfZL=1
zbz8AQMq*j2LUMj?L1IZ}QckKuN@_uBUP@|Sa%O6=UI{D6*&qiMi!m@Ta4CR+YC%zc
zx<Yh*K}lwQUU6(PDC~I|7#KJ~t_Rup78DNPV2fd5sAXoTWnm~`WT;^Vg)T^hm7$i6
zp~8!yhLyo3)`_8(9VA!7&LEk^#8At@P@w~o0r6d86&Pwc8A_NLvRFV~tzl=V;b5rY
z1bJApnT3I|(2XIyP=g`7B9x(qjlm_>7t=6vkPO5yZH5?ThFUI$T5g6~9+;`j3{X>f
z7;3l}YPcDi*%%lLCo_Z>mNJCburd_i02u%xSs04$fRaWq)IF>q|9}z{BvtqoYcVh|
zs1_@z7Aq8`7M5lfrGnTx3gsD@$r%cn#R_@(C5R}{%LFCeVqLhNj6}G;+|;}h1=V65
zg{0CFh06R=NGySk*2@H?g<@F-1_r-;g`}eV?9@D%bs%lU3TgSJc`14tpr{K1rN|(V
z25>qpOD!tS%+D(UrQw|X^z_uC5>N`s%uCDH07W2}SDc!Y238G?U$9_eQF?I+Hv<C$
zG~IyHG)PN9Vo`BsUV3~%QGQY}SX*vpF-QcgIypZtEhjU%Br`7^oVE*!^0QKtOXBkq
zb5nyr4lLmUWmi~|t1RJwaKQ?|CZwbm#KW8oN@qo>g&Lr60~5vh3=9nV1x1-<i6yD}
zWr;=lY56%RsYS*5*@gPq#YX1lhJ{&1=4FN!=EXUc>E-bzDJCWc1_lP{dHNyx1(^l9
z&<vqlo@iMbm;n+3<M_<HlGLKS#2o!(NY*aa2WM%$g31!GD@yZ(KnYz5<P=7JMj<9%
zMqWliMm9!fMoDH6TMEpUW)@;(VbTDV5n!*ygFO}>5B7F^d~SY9X-;Z<JUHCq<5TjJ
z<Kw}>4GJG{-YYFmOiu+%7nkPdCKgo&i7+rQfIW{O1|k@OK*0b?5XGPvWMgDwWMcwh
z4G<UXU{C@B#k(9R)npdv!NXK9IVV#uDX};;9vZkopinHqRF_|nT9gPbWAwnG4^GJ7
zBwYe3YSL3ne87n~NR)wrAqbSH!LC9C445?#p#zR=8%XrpfwEsQC}Hz32{4MW@G}Dd
DO1P%J

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py
new file mode 100644
index 00000000..2fcdd393
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py
@@ -0,0 +1,94 @@
+from __future__ import absolute_import
+
+import sys
+import textwrap
+
+from pip._internal.cli.base_command import Command
+from pip._internal.utils.misc import get_prog
+
+BASE_COMPLETION = """
+# pip %(shell)s completion start%(script)s# pip %(shell)s completion end
+"""
+
+COMPLETION_SCRIPTS = {
+    'bash': """
+        _pip_completion()
+        {
+            COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\
+                           COMP_CWORD=$COMP_CWORD \\
+                           PIP_AUTO_COMPLETE=1 $1 ) )
+        }
+        complete -o default -F _pip_completion %(prog)s
+    """,
+    'zsh': """
+        function _pip_completion {
+          local words cword
+          read -Ac words
+          read -cn cword
+          reply=( $( COMP_WORDS="$words[*]" \\
+                     COMP_CWORD=$(( cword-1 )) \\
+                     PIP_AUTO_COMPLETE=1 $words[1] ) )
+        }
+        compctl -K _pip_completion %(prog)s
+    """,
+    'fish': """
+        function __fish_complete_pip
+            set -lx COMP_WORDS (commandline -o) ""
+            set -lx COMP_CWORD ( \\
+                math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
+            )
+            set -lx PIP_AUTO_COMPLETE 1
+            string split \\  -- (eval $COMP_WORDS[1])
+        end
+        complete -fa "(__fish_complete_pip)" -c %(prog)s
+    """,
+}
+
+
+class CompletionCommand(Command):
+    """A helper command to be used for command completion."""
+    name = 'completion'
+    summary = 'A helper command used for command completion.'
+    ignore_require_venv = True
+
+    def __init__(self, *args, **kw):
+        super(CompletionCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(
+            '--bash', '-b',
+            action='store_const',
+            const='bash',
+            dest='shell',
+            help='Emit completion code for bash')
+        cmd_opts.add_option(
+            '--zsh', '-z',
+            action='store_const',
+            const='zsh',
+            dest='shell',
+            help='Emit completion code for zsh')
+        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)
+
+    def run(self, options, args):
+        """Prints the completion code of the given shell"""
+        shells = COMPLETION_SCRIPTS.keys()
+        shell_options = ['--' + shell for shell in sorted(shells)]
+        if options.shell in shells:
+            script = textwrap.dedent(
+                COMPLETION_SCRIPTS.get(options.shell, '') % {
+                    'prog': get_prog(),
+                }
+            )
+            print(BASE_COMPLETION % {'script': script, 'shell': options.shell})
+        else:
+            sys.stderr.write(
+                'ERROR: You must pass %s\n' % ' or '.join(shell_options)
+            )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fc16dce5dd41aa5e76cf2f7063c1fd38f067c66f
GIT binary patch
literal 3577
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py
new file mode 100644
index 00000000..950e2057
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py
@@ -0,0 +1,253 @@
+import logging
+import os
+import subprocess
+
+from pip._internal.cli.base_command import Command
+from pip._internal.cli.status_codes import ERROR, SUCCESS
+from pip._internal.configuration import Configuration, kinds
+from pip._internal.exceptions import PipError
+from pip._internal.locations import running_under_virtualenv, site_config_file
+from pip._internal.utils.deprecation import deprecated
+from pip._internal.utils.misc import get_prog
+
+logger = logging.getLogger(__name__)
+
+
+class ConfigurationCommand(Command):
+    """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
+
+        If none of --user, --global and --site are passed, a virtual
+        environment configuration file is used if one is active and the file
+        exists. Otherwise, all modifications happen on the to the user file by
+        default.
+    """
+
+    name = 'config'
+    usage = """
+        %prog [<file-option>] list
+        %prog [<file-option>] [--editor <editor-path>] edit
+
+        %prog [<file-option>] get name
+        %prog [<file-option>] set name value
+        %prog [<file-option>] unset name
+    """
+
+    summary = "Manage local and global configuration."
+
+    def __init__(self, *args, **kwargs):
+        super(ConfigurationCommand, self).__init__(*args, **kwargs)
+
+        self.configuration = None
+
+        self.cmd_opts.add_option(
+            '--editor',
+            dest='editor',
+            action='store',
+            default=None,
+            help=(
+                'Editor to use to edit the file. Uses VISUAL or EDITOR '
+                'environment variables if not provided.'
+            )
+        )
+
+        self.cmd_opts.add_option(
+            '--global',
+            dest='global_file',
+            action='store_true',
+            default=False,
+            help='Use the system-wide configuration file only'
+        )
+
+        self.cmd_opts.add_option(
+            '--user',
+            dest='user_file',
+            action='store_true',
+            default=False,
+            help='Use the user configuration file only'
+        )
+
+        self.cmd_opts.add_option(
+            '--site',
+            dest='site_file',
+            action='store_true',
+            default=False,
+            help='Use the current environment configuration file only'
+        )
+
+        self.cmd_opts.add_option(
+            '--venv',
+            dest='venv_file',
+            action='store_true',
+            default=False,
+            help=(
+                '[Deprecated] Use the current environment configuration '
+                'file in a virtual environment only'
+            )
+        )
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        handlers = {
+            "list": self.list_values,
+            "edit": self.open_in_editor,
+            "get": self.get_name,
+            "set": self.set_name_value,
+            "unset": self.unset_name
+        }
+
+        # Determine action
+        if not args or args[0] not in handlers:
+            logger.error("Need an action ({}) to perform.".format(
+                ", ".join(sorted(handlers)))
+            )
+            return ERROR
+
+        action = args[0]
+
+        # Determine which configuration files are to be loaded
+        #    Depends on whether the command is modifying.
+        try:
+            load_only = self._determine_file(
+                options, need_value=(action in ["get", "set", "unset", "edit"])
+            )
+        except PipError as e:
+            logger.error(e.args[0])
+            return ERROR
+
+        # Load a new configuration
+        self.configuration = Configuration(
+            isolated=options.isolated_mode, load_only=load_only
+        )
+        self.configuration.load()
+
+        # Error handling happens here, not in the action-handlers.
+        try:
+            handlers[action](options, args[1:])
+        except PipError as e:
+            logger.error(e.args[0])
+            return ERROR
+
+        return SUCCESS
+
+    def _determine_file(self, options, need_value):
+        # Convert legacy venv_file option to site_file or error
+        if options.venv_file and not options.site_file:
+            if running_under_virtualenv():
+                options.site_file = True
+                deprecated(
+                    "The --venv option has been deprecated.",
+                    replacement="--site",
+                    gone_in="19.3",
+                )
+            else:
+                raise PipError(
+                    "Legacy --venv option requires a virtual environment. "
+                    "Use --site instead."
+                )
+
+        file_options = [key for key, value in (
+            (kinds.USER, options.user_file),
+            (kinds.GLOBAL, options.global_file),
+            (kinds.SITE, options.site_file),
+        ) if value]
+
+        if not file_options:
+            if not need_value:
+                return None
+            # Default to user, unless there's a site file.
+            elif os.path.exists(site_config_file):
+                return kinds.SITE
+            else:
+                return kinds.USER
+        elif len(file_options) == 1:
+            return file_options[0]
+
+        raise PipError(
+            "Need exactly one file to operate upon "
+            "(--user, --site, --global) to perform."
+        )
+
+    def list_values(self, options, args):
+        self._get_n_args(args, "list", n=0)
+
+        for key, value in sorted(self.configuration.items()):
+            logger.info("%s=%r", key, value)
+
+    def get_name(self, options, args):
+        key = self._get_n_args(args, "get [name]", n=1)
+        value = self.configuration.get_value(key)
+
+        logger.info("%s", value)
+
+    def set_name_value(self, options, args):
+        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):
+        key = self._get_n_args(args, "unset [name]", n=1)
+        self.configuration.unset_value(key)
+
+        self._save_configuration()
+
+    def open_in_editor(self, options, args):
+        editor = self._determine_editor(options)
+
+        fname = self.configuration.get_file_to_edit()
+        if fname is None:
+            raise PipError("Could not determine appropriate file.")
+
+        try:
+            subprocess.check_call([editor, fname])
+        except subprocess.CalledProcessError as e:
+            raise PipError(
+                "Editor Subprocess exited with exit code {}"
+                .format(e.returncode)
+            )
+
+    def _get_n_args(self, args, example, n):
+        """Helper to make sure the command got the right number of arguments
+        """
+        if len(args) != n:
+            msg = (
+                'Got unexpected number of arguments, expected {}. '
+                '(example: "{} config {}")'
+            ).format(n, get_prog(), example)
+            raise PipError(msg)
+
+        if n == 1:
+            return args[0]
+        else:
+            return args
+
+    def _save_configuration(self):
+        # 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
+            )
+            raise PipError("Internal Error.")
+
+    def _determine_editor(self, options):
+        if options.editor is not None:
+            return options.editor
+        elif "VISUAL" in os.environ:
+            return os.environ["VISUAL"]
+        elif "EDITOR" in os.environ:
+            return os.environ["EDITOR"]
+        else:
+            raise PipError("Could not determine editor to use.")
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d31ac35b3e8c884a182c28423d8ce245e4da367d
GIT binary patch
literal 8732
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
L6krr!;%5c`dAJ`J

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py
new file mode 100644
index 00000000..a57e4bc4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py
@@ -0,0 +1,176 @@
+from __future__ import absolute_import
+
+import logging
+import os
+
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.base_command import RequirementCommand
+from pip._internal.operations.prepare import RequirementPreparer
+from pip._internal.req import RequirementSet
+from pip._internal.req.req_tracker import RequirementTracker
+from pip._internal.resolve import Resolver
+from pip._internal.utils.filesystem import check_path_owner
+from pip._internal.utils.misc import ensure_dir, normalize_path
+from pip._internal.utils.temp_dir import TempDirectory
+
+logger = logging.getLogger(__name__)
+
+
+class DownloadCommand(RequirementCommand):
+    """
+    Download packages from:
+
+    - PyPI (and other indexes) using requirement specifiers.
+    - VCS project urls.
+    - Local project directories.
+    - Local or remote source archives.
+
+    pip also supports downloading from "requirements files", which provide
+    an easy way to specify a whole environment to be downloaded.
+    """
+    name = 'download'
+
+    usage = """
+      %prog [options] <requirement specifier> [package-index-options] ...
+      %prog [options] -r <requirements file> [package-index-options] ...
+      %prog [options] <vcs project url> ...
+      %prog [options] <local project path> ...
+      %prog [options] <archive url/path> ..."""
+
+    summary = 'Download packages.'
+
+    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.no_clean())
+        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(
+            '-d', '--dest', '--destination-dir', '--destination-directory',
+            dest='download_dir',
+            metavar='dir',
+            default=os.curdir,
+            help=("Download packages into <dir>."),
+        )
+
+        cmd_opts.add_option(cmdoptions.platform())
+        cmd_opts.add_option(cmdoptions.python_version())
+        cmd_opts.add_option(cmdoptions.implementation())
+        cmd_opts.add_option(cmdoptions.abi())
+
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.index_group,
+            self.parser,
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def run(self, options, args):
+        options.ignore_installed = True
+        # editable doesn't really make sense for `pip download`, but the bowels
+        # of the RequirementSet code require that property.
+        options.editables = []
+
+        if options.python_version:
+            python_versions = [options.python_version]
+        else:
+            python_versions = None
+
+        cmdoptions.check_dist_restriction(options)
+
+        options.src_dir = os.path.abspath(options.src_dir)
+        options.download_dir = normalize_path(options.download_dir)
+
+        ensure_dir(options.download_dir)
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(
+                options=options,
+                session=session,
+                platform=options.platform,
+                python_versions=python_versions,
+                abi=options.abi,
+                implementation=options.implementation,
+            )
+            build_delete = (not (options.no_clean or options.build_dir))
+            if options.cache_dir and not check_path_owner(options.cache_dir):
+                logger.warning(
+                    "The directory '%s' or its parent directory is not owned "
+                    "by the current user and caching wheels has been "
+                    "disabled. check the permissions and owner of that "
+                    "directory. If executing pip with sudo, you may want "
+                    "sudo's -H flag.",
+                    options.cache_dir,
+                )
+                options.cache_dir = None
+
+            with RequirementTracker() as req_tracker, TempDirectory(
+                options.build_dir, delete=build_delete, kind="download"
+            ) as directory:
+
+                requirement_set = RequirementSet(
+                    require_hashes=options.require_hashes,
+                )
+                self.populate_requirement_set(
+                    requirement_set,
+                    args,
+                    options,
+                    finder,
+                    session,
+                    self.name,
+                    None
+                )
+
+                preparer = RequirementPreparer(
+                    build_dir=directory.path,
+                    src_dir=options.src_dir,
+                    download_dir=options.download_dir,
+                    wheel_download_dir=None,
+                    progress_bar=options.progress_bar,
+                    build_isolation=options.build_isolation,
+                    req_tracker=req_tracker,
+                )
+
+                resolver = Resolver(
+                    preparer=preparer,
+                    finder=finder,
+                    session=session,
+                    wheel_cache=None,
+                    use_user_site=False,
+                    upgrade_strategy="to-satisfy-only",
+                    force_reinstall=False,
+                    ignore_dependencies=options.ignore_dependencies,
+                    ignore_requires_python=False,
+                    ignore_installed=True,
+                    isolated=options.isolated_mode,
+                )
+                resolver.resolve(requirement_set)
+
+                downloaded = ' '.join([
+                    req.name for req in requirement_set.successfully_downloaded
+                ])
+                if downloaded:
+                    logger.info('Successfully downloaded %s', downloaded)
+
+                # Clean up
+                if not options.no_clean:
+                    requirement_set.cleanup_files()
+
+        return requirement_set
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..91b970b80b26fe6529ddd9222ccb4ef5e5c677ba
GIT binary patch
literal 5692
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
E0cpu?CIA2c

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py
new file mode 100644
index 00000000..dc9c53a6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py
@@ -0,0 +1,96 @@
+from __future__ import absolute_import
+
+import sys
+
+from pip._internal.cache import WheelCache
+from pip._internal.cli.base_command import Command
+from pip._internal.models.format_control import FormatControl
+from pip._internal.operations.freeze import freeze
+from pip._internal.utils.compat import stdlib_pkgs
+
+DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'}
+
+
+class FreezeCommand(Command):
+    """
+    Output installed packages in requirements format.
+
+    packages are listed in a case-insensitive sorted order.
+    """
+    name = 'freeze'
+    usage = """
+      %prog [options]"""
+    summary = 'Output installed packages in requirements format.'
+    log_streams = ("ext://sys.stderr", "ext://sys.stderr")
+
+    def __init__(self, *args, **kw):
+        super(FreezeCommand, self).__init__(*args, **kw)
+
+        self.cmd_opts.add_option(
+            '-r', '--requirement',
+            dest='requirements',
+            action='append',
+            default=[],
+            metavar='file',
+            help="Use the order in the given requirements file and its "
+                 "comments when generating output. This option can be "
+                 "used multiple times.")
+        self.cmd_opts.add_option(
+            '-f', '--find-links',
+            dest='find_links',
+            action='append',
+            default=[],
+            metavar='URL',
+            help='URL for finding packages, which will be added to the '
+                 'output.')
+        self.cmd_opts.add_option(
+            '-l', '--local',
+            dest='local',
+            action='store_true',
+            default=False,
+            help='If in a virtualenv that has global access, do not output '
+                 'globally-installed packages.')
+        self.cmd_opts.add_option(
+            '--user',
+            dest='user',
+            action='store_true',
+            default=False,
+            help='Only output packages installed in user-site.')
+        self.cmd_opts.add_option(
+            '--all',
+            dest='freeze_all',
+            action='store_true',
+            help='Do not skip these packages in the output:'
+                 ' %s' % ', '.join(DEV_PKGS))
+        self.cmd_opts.add_option(
+            '--exclude-editable',
+            dest='exclude_editable',
+            action='store_true',
+            help='Exclude editable package from output.')
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        format_control = FormatControl(set(), set())
+        wheel_cache = WheelCache(options.cache_dir, format_control)
+        skip = set(stdlib_pkgs)
+        if not options.freeze_all:
+            skip.update(DEV_PKGS)
+
+        freeze_kwargs = dict(
+            requirement=options.requirements,
+            find_links=options.find_links,
+            local_only=options.local,
+            user_only=options.user,
+            skip_regex=options.skip_requirements_regex,
+            isolated=options.isolated_mode,
+            wheel_cache=wheel_cache,
+            skip=skip,
+            exclude_editable=options.exclude_editable,
+        )
+
+        try:
+            for line in freeze(**freeze_kwargs):
+                sys.stdout.write(line + '\n')
+        finally:
+            wheel_cache.cleanup()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..53b10e0c610808bb42afad760d0c407d81512a79
GIT binary patch
literal 3677
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
RlcfL?50d~R6fy}h0|0pre_sFq

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py
new file mode 100644
index 00000000..423440e9
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py
@@ -0,0 +1,57 @@
+from __future__ import absolute_import
+
+import hashlib
+import logging
+import sys
+
+from pip._internal.cli.base_command import Command
+from pip._internal.cli.status_codes import ERROR
+from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES
+from pip._internal.utils.misc import read_chunks
+
+logger = logging.getLogger(__name__)
+
+
+class HashCommand(Command):
+    """
+    Compute a hash of a local package archive.
+
+    These can be used with --hash in a requirements file to do repeatable
+    installs.
+
+    """
+    name = 'hash'
+    usage = '%prog [options] <file> ...'
+    summary = 'Compute hashes of package archives.'
+    ignore_require_venv = True
+
+    def __init__(self, *args, **kw):
+        super(HashCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-a', '--algorithm',
+            dest='algorithm',
+            choices=STRONG_HASHES,
+            action='store',
+            default=FAVORITE_HASH,
+            help='The hash algorithm to use: one of %s' %
+                 ', '.join(STRONG_HASHES))
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        if not args:
+            self.parser.print_usage(sys.stderr)
+            return ERROR
+
+        algorithm = options.algorithm
+        for path in args:
+            logger.info('%s:\n--hash=%s:%s',
+                        path, algorithm, _hash_of_file(path, algorithm))
+
+
+def _hash_of_file(path, algorithm):
+    """Return the hash digest of a file."""
+    with open(path, 'rb') as archive:
+        hash = hashlib.new(algorithm)
+        for chunk in read_chunks(archive):
+            hash.update(chunk)
+    return hash.hexdigest()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..787936ed19329c8c0af3254928aee5bd02324b14
GIT binary patch
literal 2783
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/help.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.py
new file mode 100644
index 00000000..49a81cbb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.py
@@ -0,0 +1,37 @@
+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
+
+
+class HelpCommand(Command):
+    """Show help for commands"""
+    name = 'help'
+    usage = """
+      %prog <command>"""
+    summary = 'Show help for commands.'
+    ignore_require_venv = True
+
+    def run(self, options, args):
+        from pip._internal.commands import commands_dict, get_similar_commands
+
+        try:
+            # 'pip help' with no args is handled by pip.__init__.parseopt()
+            cmd_name = args[0]  # the command we need help for
+        except IndexError:
+            return SUCCESS
+
+        if cmd_name not in commands_dict:
+            guess = get_similar_commands(cmd_name)
+
+            msg = ['unknown command "%s"' % cmd_name]
+            if guess:
+                msg.append('maybe you meant "%s"' % guess)
+
+            raise CommandError(' - '.join(msg))
+
+        command = commands_dict[cmd_name]()
+        command.parser.print_help()
+
+        return SUCCESS
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..13da60d08e24934f2f52cf97a7cbcf41080e769e
GIT binary patch
literal 1651
zcmZSn%*&NH<x)&C0~9bbFfcecFfbHHF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XH{Gn8M1C%FK|)$dJOu(89pb%)k&C#leum
z&Je7@!N9<f39?gzk%57sgr9+dAu*{qKc}=LH9j-9Ait;tBEinUz~G#po12)If)EG}
zb#`_Q4u%NuAXK;(73CL|a5FG4c%<eOK()cW2C~Qr<TZT;28L7ykdIOr7^0X!evD#f
zNMT}#Vqr*O2KgkF4dnh57Lco>I2eM0HCP!K7>dOh7#M;x^2-%6QgaFv((;QGk|9nj
zE@5F{U;v4N)o>|*foeffe!7AURE=G+I8N<)$)IrOWME(b+2agy<T_CJGlE<N3IAGV
zhFm6wS{4SzN<M}fu%jhwSsB9fgcw*#m>IIU7>X<y7#SH$SQvsMYFHU+m>II!8Hy$_
z)UYtrurf3=GSsqxd{@KDAePR^P|MCx!^Til!BE4_kj2W7!UE!oH8V0W<}omourZ{t
zGGwuXB%2vQdYc#-@)$s7*03^2HZw5Paxm0zFl2EsWO0I`6>O^p8v_G_A0$$lK#|JJ
zz`y|Yd~tkAW^zf12m=E{dTL30ab|92PGV6!Otu&#QJR;XmtUR-3sVIp)nX;EL~deb
zQmR5_eyKukYGPgqL;@6G3c3m!Tp*i35mS&^pckK+SCU$kmzbjmGdT$4s31@(DgmkV
z%u7kF04I|muoFSDi3J6zc_~341HsXlm7kec0+J|5EGkYd0_!U%%FHW?2Su<3D3-wL
zic@paN<b#(7nEe?=RwjyVo`cAlAWMro}8N!pO=`MS^|pO^wQMg;u4Tuxy9*V-B6cm
zfHMP#D9&SGV9+lp$}CGPN!2e)EYeTQ&q+xwD%Q^~)Xy$9GB-CY%rY`BGqf--&Z$f<
zk2gs%F)=VOFi6kS5795kEYQu&D=taQ$<ZxOv@8wG011IHJaqJ-b{6Y{e56-U33gCX
zX`TQmmCJw}!6?SW%*4mY%gD;a!^p$L%gDwk!X&}O%gD<F2?3DL;=%rkj|T@)e0*+x
zN@-4Nd_34&@$o77$?@^vkb?WZv^X(66)as`nwy(gR0)<2DJo4Z5e5|q>3R7@sqsar
zg{7HAsqtm0d1XPO3=9m2umQ6MAb^5E`5WZrVo-6z#>mFV#sne#Ai)7jT=DT~r6r|B
zsqyhapdc)fV_;xFOO-j9dP#}Jsj!3}1S*qos4Ff>EGaFHPtH$CErujk2@La6E0R+o
ni4UB7!L9@c5rP<iz$yU+lno>`*nxal3=$Av5?~Zy6krAbUW0>F

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/install.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/install.py
new file mode 100644
index 00000000..c13da44c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/install.py
@@ -0,0 +1,587 @@
+from __future__ import absolute_import
+
+import errno
+import logging
+import operator
+import os
+import shutil
+from optparse import SUPPRESS_HELP
+
+from pip._vendor import pkg_resources
+
+from pip._internal.cache import WheelCache
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.base_command import RequirementCommand
+from pip._internal.cli.status_codes import ERROR
+from pip._internal.exceptions import (
+    CommandError, InstallationError, PreviousBuildDirError,
+)
+from pip._internal.locations import distutils_scheme, virtualenv_no_global
+from pip._internal.operations.check import check_install_conflicts
+from pip._internal.operations.prepare import RequirementPreparer
+from pip._internal.req import RequirementSet, install_given_reqs
+from pip._internal.req.req_tracker import RequirementTracker
+from pip._internal.resolve import Resolver
+from pip._internal.utils.filesystem import check_path_owner
+from pip._internal.utils.misc import (
+    ensure_dir, get_installed_version,
+    protect_pip_from_modification_on_windows,
+)
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.wheel import WheelBuilder
+
+logger = logging.getLogger(__name__)
+
+
+def is_wheel_installed():
+    """
+    Return whether the wheel package is installed.
+    """
+    try:
+        import wheel  # noqa: F401
+    except ImportError:
+        return False
+
+    return True
+
+
+def build_wheels(builder, pep517_requirements, legacy_requirements, session):
+    """
+    Build wheels for requirements, depending on whether wheel is installed.
+    """
+    # We don't build wheels for legacy requirements if wheel is not installed.
+    should_build_legacy = is_wheel_installed()
+
+    # Always build PEP 517 requirements
+    build_failures = builder.build(
+        pep517_requirements,
+        session=session, autobuilding=True
+    )
+
+    if should_build_legacy:
+        # We don't care about failures building legacy
+        # requirements, as we'll fall through to a direct
+        # install for those.
+        builder.build(
+            legacy_requirements,
+            session=session, autobuilding=True
+        )
+
+    return build_failures
+
+
+class InstallCommand(RequirementCommand):
+    """
+    Install packages from:
+
+    - PyPI (and other indexes) using requirement specifiers.
+    - VCS project urls.
+    - Local project directories.
+    - Local or remote source archives.
+
+    pip also supports installing from "requirements files", which provide
+    an easy way to specify a whole environment to be installed.
+    """
+    name = 'install'
+
+    usage = """
+      %prog [options] <requirement specifier> [package-index-options] ...
+      %prog [options] -r <requirements file> [package-index-options] ...
+      %prog [options] [-e] <vcs project url> ...
+      %prog [options] [-e] <local project path> ...
+      %prog [options] <archive url/path> ..."""
+
+    summary = 'Install packages.'
+
+    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())
+
+        cmd_opts.add_option(cmdoptions.editable())
+        cmd_opts.add_option(
+            '-t', '--target',
+            dest='target_dir',
+            metavar='dir',
+            default=None,
+            help='Install packages into <dir>. '
+                 'By default this will not replace existing files/folders in '
+                 '<dir>. Use --upgrade to replace existing packages in <dir> '
+                 'with new versions.'
+        )
+        cmd_opts.add_option(cmdoptions.platform())
+        cmd_opts.add_option(cmdoptions.python_version())
+        cmd_opts.add_option(cmdoptions.implementation())
+        cmd_opts.add_option(cmdoptions.abi())
+
+        cmd_opts.add_option(
+            '--user',
+            dest='use_user_site',
+            action='store_true',
+            help="Install to the Python user install directory for your "
+                 "platform. Typically ~/.local/, or %APPDATA%\\Python on "
+                 "Windows. (See the Python documentation for site.USER_BASE "
+                 "for full details.)")
+        cmd_opts.add_option(
+            '--no-user',
+            dest='use_user_site',
+            action='store_false',
+            help=SUPPRESS_HELP)
+        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(
+            '--prefix',
+            dest='prefix_path',
+            metavar='dir',
+            default=None,
+            help="Installation prefix where lib, bin and other top-level "
+                 "folders are placed")
+
+        cmd_opts.add_option(cmdoptions.build_dir())
+
+        cmd_opts.add_option(cmdoptions.src())
+
+        cmd_opts.add_option(
+            '-U', '--upgrade',
+            dest='upgrade',
+            action='store_true',
+            help='Upgrade all specified packages to the newest available '
+                 'version. The handling of dependencies depends on the '
+                 'upgrade-strategy used.'
+        )
+
+        cmd_opts.add_option(
+            '--upgrade-strategy',
+            dest='upgrade_strategy',
+            default='only-if-needed',
+            choices=['only-if-needed', 'eager'],
+            help='Determines how dependency upgrading should be handled '
+                 '[default: %default]. '
+                 '"eager" - dependencies are upgraded regardless of '
+                 'whether the currently installed version satisfies the '
+                 'requirements of the upgraded package(s). '
+                 '"only-if-needed" -  are upgraded only when they do not '
+                 'satisfy the requirements of the upgraded package(s).'
+        )
+
+        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(
+            '-I', '--ignore-installed',
+            dest='ignore_installed',
+            action='store_true',
+            help='Ignore the installed packages (reinstalling instead).')
+
+        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())
+
+        cmd_opts.add_option(cmdoptions.install_options())
+        cmd_opts.add_option(cmdoptions.global_options())
+
+        cmd_opts.add_option(
+            "--compile",
+            action="store_true",
+            dest="compile",
+            default=True,
+            help="Compile Python source files to bytecode",
+        )
+
+        cmd_opts.add_option(
+            "--no-compile",
+            action="store_false",
+            dest="compile",
+            help="Do not compile Python source files to bytecode",
+        )
+
+        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(
+            "--no-warn-conflicts",
+            action="store_false",
+            dest="warn_about_conflicts",
+            default=True,
+            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.no_clean())
+        cmd_opts.add_option(cmdoptions.require_hashes())
+        cmd_opts.add_option(cmdoptions.progress_bar())
+
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.index_group,
+            self.parser,
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def run(self, options, args):
+        cmdoptions.check_install_build_global(options)
+        upgrade_strategy = "to-satisfy-only"
+        if options.upgrade:
+            upgrade_strategy = options.upgrade_strategy
+
+        if options.build_dir:
+            options.build_dir = os.path.abspath(options.build_dir)
+
+        cmdoptions.check_dist_restriction(options, check_target=True)
+
+        if options.python_version:
+            python_versions = [options.python_version]
+        else:
+            python_versions = None
+
+        options.src_dir = os.path.abspath(options.src_dir)
+        install_options = options.install_options or []
+        if options.use_user_site:
+            if options.prefix_path:
+                raise CommandError(
+                    "Can not combine '--user' and '--prefix' as they imply "
+                    "different installation locations"
+                )
+            if virtualenv_no_global():
+                raise InstallationError(
+                    "Can not perform a '--user' install. User site-packages "
+                    "are not visible in this virtualenv."
+                )
+            install_options.append('--user')
+            install_options.append('--prefix=')
+
+        target_temp_dir = TempDirectory(kind="target")
+        if options.target_dir:
+            options.ignore_installed = True
+            options.target_dir = os.path.abspath(options.target_dir)
+            if (os.path.exists(options.target_dir) and not
+                    os.path.isdir(options.target_dir)):
+                raise CommandError(
+                    "Target path exists but is not a directory, will not "
+                    "continue."
+                )
+
+            # Create a target directory for using with the target option
+            target_temp_dir.create()
+            install_options.append('--home=' + target_temp_dir.path)
+
+        global_options = options.global_options or []
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(
+                options=options,
+                session=session,
+                platform=options.platform,
+                python_versions=python_versions,
+                abi=options.abi,
+                implementation=options.implementation,
+            )
+            build_delete = (not (options.no_clean or options.build_dir))
+            wheel_cache = WheelCache(options.cache_dir, options.format_control)
+
+            if options.cache_dir and not check_path_owner(options.cache_dir):
+                logger.warning(
+                    "The directory '%s' or its parent directory is not owned "
+                    "by the current user and caching wheels has been "
+                    "disabled. check the permissions and owner of that "
+                    "directory. If executing pip with sudo, you may want "
+                    "sudo's -H flag.",
+                    options.cache_dir,
+                )
+                options.cache_dir = None
+
+            with RequirementTracker() as req_tracker, TempDirectory(
+                options.build_dir, delete=build_delete, kind="install"
+            ) as directory:
+                requirement_set = RequirementSet(
+                    require_hashes=options.require_hashes,
+                    check_supported_wheels=not options.target_dir,
+                )
+
+                try:
+                    self.populate_requirement_set(
+                        requirement_set, args, options, finder, session,
+                        self.name, wheel_cache
+                    )
+                    preparer = RequirementPreparer(
+                        build_dir=directory.path,
+                        src_dir=options.src_dir,
+                        download_dir=None,
+                        wheel_download_dir=None,
+                        progress_bar=options.progress_bar,
+                        build_isolation=options.build_isolation,
+                        req_tracker=req_tracker,
+                    )
+
+                    resolver = Resolver(
+                        preparer=preparer,
+                        finder=finder,
+                        session=session,
+                        wheel_cache=wheel_cache,
+                        use_user_site=options.use_user_site,
+                        upgrade_strategy=upgrade_strategy,
+                        force_reinstall=options.force_reinstall,
+                        ignore_dependencies=options.ignore_dependencies,
+                        ignore_requires_python=options.ignore_requires_python,
+                        ignore_installed=options.ignore_installed,
+                        isolated=options.isolated_mode,
+                        use_pep517=options.use_pep517
+                    )
+                    resolver.resolve(requirement_set)
+
+                    protect_pip_from_modification_on_windows(
+                        modifying_pip=requirement_set.has_requirement("pip")
+                    )
+
+                    # Consider legacy and PEP517-using requirements separately
+                    legacy_requirements = []
+                    pep517_requirements = []
+                    for req in requirement_set.requirements.values():
+                        if req.use_pep517:
+                            pep517_requirements.append(req)
+                        else:
+                            legacy_requirements.append(req)
+
+                    wheel_builder = WheelBuilder(
+                        finder, preparer, wheel_cache,
+                        build_options=[], global_options=[],
+                    )
+
+                    build_failures = build_wheels(
+                        builder=wheel_builder,
+                        pep517_requirements=pep517_requirements,
+                        legacy_requirements=legacy_requirements,
+                        session=session,
+                    )
+
+                    # If we're using PEP 517, we cannot do a direct install
+                    # so we fail here.
+                    if build_failures:
+                        raise InstallationError(
+                            "Could not build wheels for {} which use"
+                            " PEP 517 and cannot be installed directly".format(
+                                ", ".join(r.name for r in build_failures)))
+
+                    to_install = resolver.get_installation_order(
+                        requirement_set
+                    )
+
+                    # Consistency Checking of the package set we're installing.
+                    should_warn_about_conflicts = (
+                        not options.ignore_dependencies and
+                        options.warn_about_conflicts
+                    )
+                    if should_warn_about_conflicts:
+                        self._warn_about_conflicts(to_install)
+
+                    # Don't warn about script install locations if
+                    # --target has been specified
+                    warn_script_location = options.warn_script_location
+                    if options.target_dir:
+                        warn_script_location = False
+
+                    installed = install_given_reqs(
+                        to_install,
+                        install_options,
+                        global_options,
+                        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,
+                    )
+
+                    lib_locations = get_lib_location_guesses(
+                        user=options.use_user_site,
+                        home=target_temp_dir.path,
+                        root=options.root_path,
+                        prefix=options.prefix_path,
+                        isolated=options.isolated_mode,
+                    )
+                    working_set = pkg_resources.WorkingSet(lib_locations)
+
+                    reqs = sorted(installed, key=operator.attrgetter('name'))
+                    items = []
+                    for req in reqs:
+                        item = req.name
+                        try:
+                            installed_version = get_installed_version(
+                                req.name, working_set=working_set
+                            )
+                            if installed_version:
+                                item += '-' + installed_version
+                        except Exception:
+                            pass
+                        items.append(item)
+                    installed = ' '.join(items)
+                    if installed:
+                        logger.info('Successfully installed %s', installed)
+                except EnvironmentError as error:
+                    show_traceback = (self.verbosity >= 1)
+
+                    message = create_env_error_message(
+                        error, show_traceback, options.use_user_site,
+                    )
+                    logger.error(message, exc_info=show_traceback)
+
+                    return ERROR
+                except PreviousBuildDirError:
+                    options.no_clean = True
+                    raise
+                finally:
+                    # Clean up
+                    if not options.no_clean:
+                        requirement_set.cleanup_files()
+                        wheel_cache.cleanup()
+
+        if options.target_dir:
+            self._handle_target_dir(
+                options.target_dir, target_temp_dir, options.upgrade
+            )
+        return requirement_set
+
+    def _handle_target_dir(self, target_dir, target_temp_dir, upgrade):
+        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
+                    )
+
+    def _warn_about_conflicts(self, to_install):
+        try:
+            package_set, _dep_info = check_install_conflicts(to_install)
+        except Exception:
+            logger.error("Error checking for conflicts.", exc_info=True)
+            return
+        missing, conflicting = _dep_info
+
+        # NOTE: There is some duplication here from pip check
+        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],
+                )
+
+        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,
+                )
+
+
+def get_lib_location_guesses(*args, **kwargs):
+    scheme = distutils_scheme('', *args, **kwargs)
+    return [scheme['purelib'], scheme['platlib']]
+
+
+def create_env_error_message(error, show_traceback, using_user_site):
+    """Format an error message for an EnvironmentError
+
+    It may occur anytime during the execution of the install command.
+    """
+    parts = []
+
+    # Mention the error if we are not going to show a traceback
+    parts.append("Could not install packages due to an EnvironmentError")
+    if not show_traceback:
+        parts.append(": ")
+        parts.append(str(error))
+    else:
+        parts.append(".")
+
+    # Spilt the error indication from a helper message (if any)
+    parts[-1] += "\n"
+
+    # Suggest useful actions to the user:
+    #  (1) using user site-packages or (2) verifying the permissions
+    if error.errno == errno.EACCES:
+        user_option_part = "Consider using the `--user` option"
+        permissions_part = "Check the permissions"
+
+        if not using_user_site:
+            parts.extend([
+                user_option_part, " or ",
+                permissions_part.lower(),
+            ])
+        else:
+            parts.append(permissions_part)
+        parts.append(".\n")
+
+    return "".join(parts).strip() + "\n"
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c51bbe128cc5afb365a64cfe0a4eab84849c7dfe
GIT binary patch
literal 16064
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
SV`a>oJe-nZ{~7LbvH}1*0(PkY

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/list.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/list.py
new file mode 100644
index 00000000..d70782d4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/list.py
@@ -0,0 +1,302 @@
+from __future__ import absolute_import
+
+import json
+import logging
+
+from pip._vendor import six
+from pip._vendor.six.moves import zip_longest
+
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.base_command import Command
+from pip._internal.exceptions import CommandError
+from pip._internal.index import PackageFinder
+from pip._internal.utils.misc import (
+    dist_is_editable, get_installed_distributions,
+)
+from pip._internal.utils.packaging import get_installer
+
+logger = logging.getLogger(__name__)
+
+
+class ListCommand(Command):
+    """
+    List installed packages, including editables.
+
+    Packages are listed in a case-insensitive sorted order.
+    """
+    name = 'list'
+    usage = """
+      %prog [options]"""
+    summary = 'List installed packages.'
+
+    def __init__(self, *args, **kw):
+        super(ListCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(
+            '-o', '--outdated',
+            action='store_true',
+            default=False,
+            help='List outdated packages')
+        cmd_opts.add_option(
+            '-u', '--uptodate',
+            action='store_true',
+            default=False,
+            help='List uptodate packages')
+        cmd_opts.add_option(
+            '-e', '--editable',
+            action='store_true',
+            default=False,
+            help='List editable projects.')
+        cmd_opts.add_option(
+            '-l', '--local',
+            action='store_true',
+            default=False,
+            help=('If in a virtualenv that has global access, do not list '
+                  'globally-installed packages.'),
+        )
+        self.cmd_opts.add_option(
+            '--user',
+            dest='user',
+            action='store_true',
+            default=False,
+            help='Only output packages installed in user-site.')
+
+        cmd_opts.add_option(
+            '--pre',
+            action='store_true',
+            default=False,
+            help=("Include pre-release and development versions. By default, "
+                  "pip only finds stable versions."),
+        )
+
+        cmd_opts.add_option(
+            '--format',
+            action='store',
+            dest='list_format',
+            default="columns",
+            choices=('columns', 'freeze', 'json'),
+            help="Select the output format among: columns (default), freeze, "
+                 "or json",
+        )
+
+        cmd_opts.add_option(
+            '--not-required',
+            action='store_true',
+            dest='not_required',
+            help="List packages that are not dependencies of "
+                 "installed packages.",
+        )
+
+        cmd_opts.add_option(
+            '--exclude-editable',
+            action='store_false',
+            dest='include_editable',
+            help='Exclude editable package from output.',
+        )
+        cmd_opts.add_option(
+            '--include-editable',
+            action='store_true',
+            dest='include_editable',
+            help='Include editable package from output.',
+            default=True,
+        )
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.index_group, self.parser
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def _build_package_finder(self, options, index_urls, session):
+        """
+        Create a package finder appropriate to this list command.
+        """
+        return PackageFinder(
+            find_links=options.find_links,
+            index_urls=index_urls,
+            allow_all_prereleases=options.pre,
+            trusted_hosts=options.trusted_hosts,
+            session=session,
+        )
+
+    def run(self, options, args):
+        if options.outdated and options.uptodate:
+            raise CommandError(
+                "Options --outdated and --uptodate cannot be combined.")
+
+        packages = get_installed_distributions(
+            local_only=options.local,
+            user_only=options.user,
+            editables_only=options.editable,
+            include_editables=options.include_editable,
+        )
+
+        # get_not_required must be called firstly in order to find and
+        # filter out all dependencies correctly. Otherwise a package
+        # can't be identified as requirement because some parent packages
+        # could be filtered out before.
+        if options.not_required:
+            packages = self.get_not_required(packages, options)
+
+        if options.outdated:
+            packages = self.get_outdated(packages, options)
+        elif options.uptodate:
+            packages = self.get_uptodate(packages, options)
+
+        self.output_package_listing(packages, options)
+
+    def get_outdated(self, packages, options):
+        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):
+        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()
+        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}
+
+    def iter_packages_latest_infos(self, packages, options):
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index:
+            logger.debug('Ignoring indexes: %s', ','.join(index_urls))
+            index_urls = []
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(options, index_urls, session)
+
+            for dist in packages:
+                typ = 'unknown'
+                all_candidates = finder.find_all_candidates(dist.key)
+                if not options.pre:
+                    # Remove prereleases
+                    all_candidates = [candidate for candidate in all_candidates
+                                      if not candidate.version.is_prerelease]
+
+                evaluator = finder.candidate_evaluator
+                best_candidate = evaluator.get_best_candidate(all_candidates)
+                if best_candidate is None:
+                    continue
+
+                remote_version = best_candidate.version
+                if best_candidate.location.is_wheel:
+                    typ = 'wheel'
+                else:
+                    typ = 'sdist'
+                # This is dirty but makes the rest of the code much cleaner
+                dist.latest_version = remote_version
+                dist.latest_filetype = typ
+                yield dist
+
+    def output_package_listing(self, packages, options):
+        packages = sorted(
+            packages,
+            key=lambda dist: dist.project_name.lower(),
+        )
+        if options.list_format == 'columns' and packages:
+            data, header = format_for_columns(packages, options)
+            self.output_package_listing_columns(data, header)
+        elif options.list_format == 'freeze':
+            for dist in packages:
+                if options.verbose >= 1:
+                    logger.info("%s==%s (%s)", dist.project_name,
+                                dist.version, dist.location)
+                else:
+                    logger.info("%s==%s", dist.project_name, dist.version)
+        elif options.list_format == 'json':
+            logger.info(format_for_json(packages, options))
+
+    def output_package_listing_columns(self, data, header):
+        # insert the header first: we need to know the size of column names
+        if len(data) > 0:
+            data.insert(0, header)
+
+        pkg_strings, sizes = tabulate(data)
+
+        # Create and add a separator.
+        if len(data) > 0:
+            pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes)))
+
+        for val in pkg_strings:
+            logger.info(val)
+
+
+def tabulate(vals):
+    # From pfmoore on GitHub:
+    # https://github.com/pypa/pip/issues/3651#issuecomment-216932564
+    assert len(vals) > 0
+
+    sizes = [0] * max(len(x) for x in vals)
+    for row in vals:
+        sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)]
+
+    result = []
+    for row in vals:
+        display = " ".join([str(c).ljust(s) if c is not None else ''
+                            for s, c in zip_longest(sizes, row)])
+        result.append(display)
+
+    return result, sizes
+
+
+def format_for_columns(pkgs, options):
+    """
+    Convert the package data into something usable
+    by output_package_listing_columns.
+    """
+    running_outdated = options.outdated
+    # Adjust the header for the `pip list --outdated` case.
+    if running_outdated:
+        header = ["Package", "Version", "Latest", "Type"]
+    else:
+        header = ["Package", "Version"]
+
+    data = []
+    if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs):
+        header.append("Location")
+    if options.verbose >= 1:
+        header.append("Installer")
+
+    for proj in pkgs:
+        # if we're working on the 'outdated' list, separate out the
+        # latest_version and type
+        row = [proj.project_name, proj.version]
+
+        if running_outdated:
+            row.append(proj.latest_version)
+            row.append(proj.latest_filetype)
+
+        if options.verbose >= 1 or dist_is_editable(proj):
+            row.append(proj.location)
+        if options.verbose >= 1:
+            row.append(get_installer(proj))
+
+        data.append(row)
+
+    return data, header
+
+
+def format_for_json(packages, options):
+    data = []
+    for dist in packages:
+        info = {
+            'name': dist.project_name,
+            'version': six.text_type(dist.version),
+        }
+        if options.verbose >= 1:
+            info['location'] = dist.location
+            info['installer'] = get_installer(dist)
+        if options.outdated:
+            info['latest_version'] = six.text_type(dist.latest_version)
+            info['latest_filetype'] = dist.latest_filetype
+        data.append(info)
+    return json.dumps(data)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9dd7b7a460d89f8881e44aa1445809fd768f00c7
GIT binary patch
literal 11104
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/search.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/search.py
new file mode 100644
index 00000000..c157a312
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/search.py
@@ -0,0 +1,135 @@
+from __future__ import absolute_import
+
+import logging
+import sys
+import textwrap
+from collections import OrderedDict
+
+from pip._vendor import pkg_resources
+from pip._vendor.packaging.version import parse as parse_version
+# 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._internal.cli.base_command import Command
+from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS
+from pip._internal.download import PipXmlrpcTransport
+from pip._internal.exceptions import CommandError
+from pip._internal.models.index import PyPI
+from pip._internal.utils.compat import get_terminal_size
+from pip._internal.utils.logging import indent_log
+
+logger = logging.getLogger(__name__)
+
+
+class SearchCommand(Command):
+    """Search for PyPI packages whose name or summary contains <query>."""
+    name = 'search'
+    usage = """
+      %prog [options] <query>"""
+    summary = 'Search PyPI for packages.'
+    ignore_require_venv = True
+
+    def __init__(self, *args, **kw):
+        super(SearchCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-i', '--index',
+            dest='index',
+            metavar='URL',
+            default=PyPI.pypi_url,
+            help='Base URL of Python Package Index (default %default)')
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        if not args:
+            raise CommandError('Missing required argument (search query).')
+        query = args
+        pypi_hits = self.search(query, options)
+        hits = transform_hits(pypi_hits)
+
+        terminal_width = None
+        if sys.stdout.isatty():
+            terminal_width = get_terminal_size()[0]
+
+        print_results(hits, terminal_width=terminal_width)
+        if pypi_hits:
+            return SUCCESS
+        return NO_MATCHES_FOUND
+
+    def search(self, query, options):
+        index_url = options.index
+        with self._build_session(options) as session:
+            transport = PipXmlrpcTransport(index_url, session)
+            pypi = xmlrpc_client.ServerProxy(index_url, transport)
+            hits = pypi.search({'name': query, 'summary': query}, 'or')
+            return hits
+
+
+def transform_hits(hits):
+    """
+    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()
+    for hit in hits:
+        name = hit['name']
+        summary = hit['summary']
+        version = hit['version']
+
+        if name not in packages.keys():
+            packages[name] = {
+                'name': name,
+                'summary': summary,
+                'versions': [version],
+            }
+        else:
+            packages[name]['versions'].append(version)
+
+            # if this is the highest version, replace summary and score
+            if version == highest_version(packages[name]['versions']):
+                packages[name]['summary'] = summary
+
+    return list(packages.values())
+
+
+def print_results(hits, name_column_width=None, terminal_width=None):
+    if not hits:
+        return
+    if name_column_width is None:
+        name_column_width = max([
+            len(hit['name']) + len(highest_version(hit.get('versions', ['-'])))
+            for hit in hits
+        ]) + 4
+
+    installed_packages = [p.project_name for p in pkg_resources.working_set]
+    for hit in hits:
+        name = hit['name']
+        summary = hit['summary'] or ''
+        latest = highest_version(hit.get('versions', ['-']))
+        if terminal_width is not 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)
+
+        line = '%-*s - %s' % (name_column_width,
+                              '%s (%s)' % (name, latest), summary)
+        try:
+            logger.info(line)
+            if name in installed_packages:
+                dist = pkg_resources.get_distribution(name)
+                with indent_log():
+                    if dist.version == latest:
+                        logger.info('INSTALLED: %s (latest)', dist.version)
+                    else:
+                        logger.info('INSTALLED: %s', dist.version)
+                        logger.info('LATEST:    %s', latest)
+        except UnicodeEncodeError:
+            pass
+
+
+def highest_version(versions):
+    return max(versions, key=parse_version)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8ccb346246da2eb7cf3f7cc3e43897e305cf2aa3
GIT binary patch
literal 5521
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/show.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.py
new file mode 100644
index 00000000..a18a9020
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.py
@@ -0,0 +1,168 @@
+from __future__ import absolute_import
+
+import logging
+import os
+from email.parser import FeedParser
+
+from pip._vendor import pkg_resources
+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
+
+logger = logging.getLogger(__name__)
+
+
+class ShowCommand(Command):
+    """
+    Show information about one or more installed packages.
+
+    The output is in RFC-compliant mail header format.
+    """
+    name = 'show'
+    usage = """
+      %prog [options] <package> ..."""
+    summary = 'Show information about installed packages.'
+    ignore_require_venv = True
+
+    def __init__(self, *args, **kw):
+        super(ShowCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-f', '--files',
+            dest='files',
+            action='store_true',
+            default=False,
+            help='Show the full list of installed files for each package.')
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        if not args:
+            logger.warning('ERROR: Please provide a package name or names.')
+            return ERROR
+        query = args
+
+        results = search_packages_info(query)
+        if not print_results(
+                results, list_files=options.files, verbose=options.verbose):
+            return ERROR
+        return SUCCESS
+
+
+def search_packages_info(query):
+    """
+    Gather details from installed distributions. Print distribution name,
+    version, location, and installed files. Installed files requires a
+    pip generated 'installed-files.txt' in the distributions '.egg-info'
+    directory.
+    """
+    installed = {}
+    for p in pkg_resources.working_set:
+        installed[canonicalize_name(p.project_name)] = p
+
+    query_names = [canonicalize_name(name) for name in query]
+
+    for dist in [installed[pkg] for pkg in query_names if pkg in installed]:
+        package = {
+            'name': dist.project_name,
+            'version': dist.version,
+            'location': dist.location,
+            'requires': [dep.project_name for dep in dist.requires()],
+        }
+        file_list = None
+        metadata = None
+        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 = [os.path.join(dist.location, p) for p in paths]
+                file_list = [os.path.relpath(p, dist.location) for p in paths]
+
+            if dist.has_metadata('METADATA'):
+                metadata = dist.get_metadata('METADATA')
+        else:
+            # Otherwise use pip's log for .egg-info's
+            if dist.has_metadata('installed-files.txt'):
+                paths = dist.get_metadata_lines('installed-files.txt')
+                paths = [os.path.join(dist.egg_info, p) for p in paths]
+                file_list = [os.path.relpath(p, dist.location) for p in paths]
+
+            if dist.has_metadata('PKG-INFO'):
+                metadata = dist.get_metadata('PKG-INFO')
+
+        if dist.has_metadata('entry_points.txt'):
+            entry_points = dist.get_metadata_lines('entry_points.txt')
+            package['entry_points'] = entry_points
+
+        if dist.has_metadata('INSTALLER'):
+            for line in dist.get_metadata_lines('INSTALLER'):
+                if line.strip():
+                    package['installer'] = line.strip()
+                    break
+
+        # @todo: Should pkg_resources.Distribution have a
+        # `get_pkg_info` method?
+        feed_parser = FeedParser()
+        feed_parser.feed(metadata)
+        pkg_info_dict = feed_parser.close()
+        for key in ('metadata-version', 'summary',
+                    'home-page', 'author', 'author-email', 'license'):
+            package[key] = pkg_info_dict.get(key)
+
+        # It looks like FeedParser cannot deal with repeated headers
+        classifiers = []
+        for line in metadata.splitlines():
+            if line.startswith('Classifier: '):
+                classifiers.append(line[len('Classifier: '):])
+        package['classifiers'] = classifiers
+
+        if file_list:
+            package['files'] = sorted(file_list)
+        yield package
+
+
+def print_results(distributions, list_files=False, verbose=False):
+    """
+    Print the informations from installed distributions found.
+    """
+    results_printed = False
+    for i, dist in enumerate(distributions):
+        results_printed = True
+        if i > 0:
+            logger.info("---")
+
+        name = dist.get('name', '')
+        required_by = [
+            pkg.project_name for pkg in pkg_resources.working_set
+            if name in [required.name for required in pkg.requires()]
+        ]
+
+        logger.info("Name: %s", name)
+        logger.info("Version: %s", dist.get('version', ''))
+        logger.info("Summary: %s", dist.get('summary', ''))
+        logger.info("Home-page: %s", dist.get('home-page', ''))
+        logger.info("Author: %s", dist.get('author', ''))
+        logger.info("Author-email: %s", dist.get('author-email', ''))
+        logger.info("License: %s", dist.get('license', ''))
+        logger.info("Location: %s", dist.get('location', ''))
+        logger.info("Requires: %s", ', '.join(dist.get('requires', [])))
+        logger.info("Required-by: %s", ', '.join(required_by))
+
+        if verbose:
+            logger.info("Metadata-Version: %s",
+                        dist.get('metadata-version', ''))
+            logger.info("Installer: %s", dist.get('installer', ''))
+            logger.info("Classifiers:")
+            for classifier in dist.get('classifiers', []):
+                logger.info("  %s", classifier)
+            logger.info("Entry-points:")
+            for entry in dist.get('entry_points', []):
+                logger.info("  %s", entry.strip())
+        if list_files:
+            logger.info("Files:")
+            for line in dist.get('files', []):
+                logger.info("  %s", line.strip())
+            if "files" not in dist:
+                logger.info("Cannot locate installed-files.txt")
+    return results_printed
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b9df9d5fe551e55b18f40c6031dbe349624b8140
GIT binary patch
literal 6415
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py
new file mode 100644
index 00000000..0cd6f54b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py
@@ -0,0 +1,78 @@
+from __future__ import absolute_import
+
+from pip._vendor.packaging.utils import canonicalize_name
+
+from pip._internal.cli.base_command import Command
+from pip._internal.exceptions import InstallationError
+from pip._internal.req import parse_requirements
+from pip._internal.req.constructors import install_req_from_line
+from pip._internal.utils.misc import protect_pip_from_modification_on_windows
+
+
+class UninstallCommand(Command):
+    """
+    Uninstall packages.
+
+    pip is able to uninstall most installed packages. Known exceptions are:
+
+    - Pure distutils packages installed with ``python setup.py install``, which
+      leave behind no metadata to determine what files were installed.
+    - Script wrappers installed by ``python setup.py develop``.
+    """
+    name = 'uninstall'
+    usage = """
+      %prog [options] <package> ...
+      %prog [options] -r <requirements file> ..."""
+    summary = 'Uninstall packages.'
+
+    def __init__(self, *args, **kw):
+        super(UninstallCommand, self).__init__(*args, **kw)
+        self.cmd_opts.add_option(
+            '-r', '--requirement',
+            dest='requirements',
+            action='append',
+            default=[],
+            metavar='file',
+            help='Uninstall all the packages listed in the given requirements '
+                 'file.  This option can be used multiple times.',
+        )
+        self.cmd_opts.add_option(
+            '-y', '--yes',
+            dest='yes',
+            action='store_true',
+            help="Don't ask for confirmation of uninstall deletions.")
+
+        self.parser.insert_option_group(0, self.cmd_opts)
+
+    def run(self, options, args):
+        with self._build_session(options) as session:
+            reqs_to_uninstall = {}
+            for name in args:
+                req = install_req_from_line(
+                    name, isolated=options.isolated_mode,
+                )
+                if req.name:
+                    reqs_to_uninstall[canonicalize_name(req.name)] = req
+            for filename in options.requirements:
+                for req in parse_requirements(
+                        filename,
+                        options=options,
+                        session=session):
+                    if req.name:
+                        reqs_to_uninstall[canonicalize_name(req.name)] = req
+            if not reqs_to_uninstall:
+                raise InstallationError(
+                    'You must give at least one requirement to %(name)s (see '
+                    '"pip help %(name)s")' % dict(name=self.name)
+                )
+
+            protect_pip_from_modification_on_windows(
+                modifying_pip="pip" in reqs_to_uninstall
+            )
+
+            for req in reqs_to_uninstall.values():
+                uninstall_pathset = req.uninstall(
+                    auto_confirm=options.yes, verbose=self.verbosity > 0,
+                )
+                if uninstall_pathset:
+                    uninstall_pathset.commit()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c071974b8000d5c9fa0dca859bc0b85572e8114e
GIT binary patch
literal 3344
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
Mm;{&v7@?3E0Be*{i~s-t

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py
new file mode 100644
index 00000000..cd72a3df
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py
@@ -0,0 +1,186 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+import logging
+import os
+
+from pip._internal.cache import WheelCache
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.base_command import RequirementCommand
+from pip._internal.exceptions import CommandError, PreviousBuildDirError
+from pip._internal.operations.prepare import RequirementPreparer
+from pip._internal.req import RequirementSet
+from pip._internal.req.req_tracker import RequirementTracker
+from pip._internal.resolve import Resolver
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.wheel import WheelBuilder
+
+logger = logging.getLogger(__name__)
+
+
+class WheelCommand(RequirementCommand):
+    """
+    Build Wheel archives for your requirements and dependencies.
+
+    Wheel is a built-package format, and offers the advantage of not
+    recompiling your software during every install. For more details, see the
+    wheel docs: https://wheel.readthedocs.io/en/latest/
+
+    Requirements: setuptools>=0.8, and wheel.
+
+    'pip wheel' uses the bdist_wheel setuptools extension from the wheel
+    package to build individual wheels.
+
+    """
+
+    name = 'wheel'
+    usage = """
+      %prog [options] <requirement specifier> ...
+      %prog [options] -r <requirements file> ...
+      %prog [options] [-e] <vcs project url> ...
+      %prog [options] [-e] <local project path> ...
+      %prog [options] <archive url/path> ..."""
+
+    summary = 'Build wheels from your requirements.'
+
+    def __init__(self, *args, **kw):
+        super(WheelCommand, self).__init__(*args, **kw)
+
+        cmd_opts = self.cmd_opts
+
+        cmd_opts.add_option(
+            '-w', '--wheel-dir',
+            dest='wheel_dir',
+            metavar='dir',
+            default=os.curdir,
+            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(
+            '--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(
+            '--global-option',
+            dest='global_options',
+            action='append',
+            metavar='options',
+            help="Extra global options to be supplied to the setup.py "
+            "call before the 'bdist_wheel' command.")
+
+        cmd_opts.add_option(
+            '--pre',
+            action='store_true',
+            default=False,
+            help=("Include pre-release and development versions. By default, "
+                  "pip only finds stable versions."),
+        )
+
+        cmd_opts.add_option(cmdoptions.no_clean())
+        cmd_opts.add_option(cmdoptions.require_hashes())
+
+        index_opts = cmdoptions.make_option_group(
+            cmdoptions.index_group,
+            self.parser,
+        )
+
+        self.parser.insert_option_group(0, index_opts)
+        self.parser.insert_option_group(0, cmd_opts)
+
+    def run(self, options, args):
+        cmdoptions.check_install_build_global(options)
+
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index:
+            logger.debug('Ignoring indexes: %s', ','.join(index_urls))
+            index_urls = []
+
+        if options.build_dir:
+            options.build_dir = os.path.abspath(options.build_dir)
+
+        options.src_dir = os.path.abspath(options.src_dir)
+
+        with self._build_session(options) as session:
+            finder = self._build_package_finder(options, session)
+            build_delete = (not (options.no_clean or options.build_dir))
+            wheel_cache = WheelCache(options.cache_dir, options.format_control)
+
+            with RequirementTracker() as req_tracker, TempDirectory(
+                options.build_dir, delete=build_delete, kind="wheel"
+            ) as directory:
+
+                requirement_set = RequirementSet(
+                    require_hashes=options.require_hashes,
+                )
+
+                try:
+                    self.populate_requirement_set(
+                        requirement_set, args, options, finder, session,
+                        self.name, wheel_cache
+                    )
+
+                    preparer = RequirementPreparer(
+                        build_dir=directory.path,
+                        src_dir=options.src_dir,
+                        download_dir=None,
+                        wheel_download_dir=options.wheel_dir,
+                        progress_bar=options.progress_bar,
+                        build_isolation=options.build_isolation,
+                        req_tracker=req_tracker,
+                    )
+
+                    resolver = Resolver(
+                        preparer=preparer,
+                        finder=finder,
+                        session=session,
+                        wheel_cache=wheel_cache,
+                        use_user_site=False,
+                        upgrade_strategy="to-satisfy-only",
+                        force_reinstall=False,
+                        ignore_dependencies=options.ignore_dependencies,
+                        ignore_requires_python=options.ignore_requires_python,
+                        ignore_installed=True,
+                        isolated=options.isolated_mode,
+                        use_pep517=options.use_pep517
+                    )
+                    resolver.resolve(requirement_set)
+
+                    # build wheels
+                    wb = WheelBuilder(
+                        finder, preparer, wheel_cache,
+                        build_options=options.build_options or [],
+                        global_options=options.global_options or [],
+                        no_clean=options.no_clean,
+                    )
+                    build_failures = wb.build(
+                        requirement_set.requirements.values(), session=session,
+                    )
+                    if len(build_failures) != 0:
+                        raise CommandError(
+                            "Failed to build one or more wheels"
+                        )
+                except PreviousBuildDirError:
+                    options.no_clean = True
+                    raise
+                finally:
+                    if not options.no_clean:
+                        requirement_set.cleanup_files()
+                        wheel_cache.cleanup()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..36369114ec3b065381b3706689a18825367317f4
GIT binary patch
literal 6127
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
Qf}j|f1hE7d1(^7m0U(6kjQ{`u

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/configuration.py b/venv/lib/python2.7/site-packages/pip/_internal/configuration.py
new file mode 100644
index 00000000..b199fa70
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/configuration.py
@@ -0,0 +1,384 @@
+"""Configuration management setup
+
+Some terminology:
+- name
+  As written in config files.
+- value
+  Value associated with a name
+- key
+  Name combined with it's section (section.name)
+- variant
+  A single word describing where the configuration key-value pair came from
+"""
+
+import locale
+import logging
+import os
+
+from pip._vendor.six.moves import configparser
+
+from pip._internal.exceptions import (
+    ConfigurationError, ConfigurationFileCouldNotBeLoaded,
+)
+from pip._internal.locations import (
+    global_config_files, legacy_config_file, new_config_file, site_config_file,
+)
+from pip._internal.utils.misc import ensure_dir, enum
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any, Dict, Iterable, List, NewType, Optional, Tuple
+    )
+
+    RawConfigParser = configparser.RawConfigParser  # Shorthand
+    Kind = NewType("Kind", str)
+
+logger = logging.getLogger(__name__)
+
+
+# NOTE: Maybe use the optionx attribute to normalize keynames.
+def _normalize_name(name):
+    # type: (str) -> str
+    """Make a name consistent regardless of source (environment or file)
+    """
+    name = name.lower().replace('_', '-')
+    if name.startswith('--'):
+        name = name[2:]  # only prefer long opts
+    return name
+
+
+def _disassemble_key(name):
+    # type: (str) -> List[str]
+    return name.split(".", 1)
+
+
+# The kinds of configurations there are.
+kinds = enum(
+    USER="user",        # User Specific
+    GLOBAL="global",    # System Wide
+    SITE="site",        # [Virtual] Environment Specific
+    ENV="env",          # from PIP_CONFIG_FILE
+    ENV_VAR="env-var",  # from Environment Variables
+)
+
+
+class Configuration(object):
+    """Handles management of configuration.
+
+    Provides an interface to accessing and managing configuration files.
+
+    This class converts provides an API that takes "section.key-name" style
+    keys and stores the value associated with it as "key-name" under the
+    section "section".
+
+    This allows for a clean interface wherein the both the section and the
+    key-name are preserved in an easy to manage form in the configuration files
+    and the data stored is also nice.
+    """
+
+    def __init__(self, isolated, load_only=None):
+        # type: (bool, Kind) -> None
+        super(Configuration, self).__init__()
+
+        _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None]
+        if load_only not in _valid_load_only:
+            raise ConfigurationError(
+                "Got invalid value for load_only - should be one of {}".format(
+                    ", ".join(map(repr, _valid_load_only[:-1]))
+                )
+            )
+        self.isolated = isolated  # type: bool
+        self.load_only = load_only  # type: Optional[Kind]
+
+        # The order here determines the override order.
+        self._override_order = [
+            kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR
+        ]
+
+        self._ignore_env_names = ["version", "help"]
+
+        # Because we keep track of where we got the data from
+        self._parsers = {
+            variant: [] for variant in self._override_order
+        }  # type: Dict[Kind, List[Tuple[str, RawConfigParser]]]
+        self._config = {
+            variant: {} for variant in self._override_order
+        }  # type: Dict[Kind, Dict[str, Any]]
+        self._modified_parsers = []  # type: List[Tuple[str, RawConfigParser]]
+
+    def load(self):
+        # type: () -> None
+        """Loads configuration from configuration files and environment
+        """
+        self._load_config_files()
+        if not self.isolated:
+            self._load_environment_vars()
+
+    def get_file_to_edit(self):
+        # type: () -> Optional[str]
+        """Returns the file with highest priority in configuration
+        """
+        assert self.load_only is not None, \
+            "Need to be specified a file to be editing"
+
+        try:
+            return self._get_parser_to_modify()[0]
+        except IndexError:
+            return None
+
+    def items(self):
+        # type: () -> Iterable[Tuple[str, Any]]
+        """Returns key-value pairs like dict.items() representing the loaded
+        configuration
+        """
+        return self._dictionary.items()
+
+    def get_value(self, key):
+        # type: (str) -> Any
+        """Get a value from the configuration.
+        """
+        try:
+            return self._dictionary[key]
+        except KeyError:
+            raise ConfigurationError("No such key - {}".format(key))
+
+    def set_value(self, key, value):
+        # type: (str, Any) -> None
+        """Modify a value in the configuration.
+        """
+        self._ensure_have_load_only()
+
+        fname, parser = self._get_parser_to_modify()
+
+        if parser is not None:
+            section, name = _disassemble_key(key)
+
+            # Modify the parser and the configuration
+            if not parser.has_section(section):
+                parser.add_section(section)
+            parser.set(section, name, value)
+
+        self._config[self.load_only][key] = value
+        self._mark_as_modified(fname, parser)
+
+    def unset_value(self, key):
+        # type: (str) -> None
+        """Unset a value in the configuration.
+        """
+        self._ensure_have_load_only()
+
+        if key not in self._config[self.load_only]:
+            raise ConfigurationError("No such key - {}".format(key))
+
+        fname, parser = self._get_parser_to_modify()
+
+        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:
+                raise ConfigurationError(
+                    "Fatal Internal error [id=1]. Please report as a bug."
+                )
+
+        del self._config[self.load_only][key]
+
+    def save(self):
+        # type: () -> None
+        """Save the current in-memory state.
+        """
+        self._ensure_have_load_only()
+
+        for fname, parser in self._modified_parsers:
+            logger.info("Writing to %s", fname)
+
+            # Ensure directory exists.
+            ensure_dir(os.path.dirname(fname))
+
+            with open(fname, "w") as f:
+                parser.write(f)
+
+    #
+    # Private routines
+    #
+
+    def _ensure_have_load_only(self):
+        # type: () -> None
+        if self.load_only is None:
+            raise ConfigurationError("Needed a specific file to be modifying.")
+        logger.debug("Will be working with %s variant only", self.load_only)
+
+    @property
+    def _dictionary(self):
+        # type: () -> Dict[str, Any]
+        """A dictionary representing the loaded configuration.
+        """
+        # NOTE: Dictionaries are not populated if not loaded. So, conditionals
+        #       are not needed here.
+        retval = {}
+
+        for variant in self._override_order:
+            retval.update(self._config[variant])
+
+        return retval
+
+    def _load_config_files(self):
+        # type: () -> None
+        """Loads configuration from configuration 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 "
+                "environment's PIP_CONFIG_FILE being os.devnull"
+            )
+            return
+
+        for variant, files in config_files.items():
+            for fname in files:
+                # If there's specific variant set in `load_only`, load only
+                # that variant, not the others.
+                if self.load_only is not None and variant != self.load_only:
+                    logger.debug(
+                        "Skipping file '%s' (variant: %s)", fname, variant
+                    )
+                    continue
+
+                parser = self._load_file(variant, fname)
+
+                # Keeping track of the parsers used
+                self._parsers[variant].append((fname, parser))
+
+    def _load_file(self, variant, fname):
+        # type: (Kind, str) -> RawConfigParser
+        logger.debug("For variant '%s', will try loading '%s'", variant, fname)
+        parser = self._construct_parser(fname)
+
+        for section in parser.sections():
+            items = parser.items(section)
+            self._config[variant].update(self._normalized_keys(section, items))
+
+        return parser
+
+    def _construct_parser(self, fname):
+        # type: (str) -> RawConfigParser
+        parser = configparser.RawConfigParser()
+        # If there is no such file, don't bother reading it but create the
+        # parser anyway, to hold the data.
+        # Doing this is useful when modifying and saving files, where we don't
+        # need to construct a parser.
+        if os.path.exists(fname):
+            try:
+                parser.read(fname)
+            except UnicodeDecodeError:
+                # See https://github.com/pypa/pip/issues/4963
+                raise ConfigurationFileCouldNotBeLoaded(
+                    reason="contains invalid {} characters".format(
+                        locale.getpreferredencoding(False)
+                    ),
+                    fname=fname,
+                )
+            except configparser.Error as error:
+                # See https://github.com/pypa/pip/issues/4893
+                raise ConfigurationFileCouldNotBeLoaded(error=error)
+        return parser
+
+    def _load_environment_vars(self):
+        # type: () -> None
+        """Loads configuration from environment variables
+        """
+        self._config[kinds.ENV_VAR].update(
+            self._normalized_keys(":env:", self._get_environ_vars())
+        )
+
+    def _normalized_keys(self, section, items):
+        # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any]
+        """Normalizes items to construct a dictionary with normalized keys.
+
+        This routine is where the names become keys and are made the same
+        regardless of source - configuration files or environment.
+        """
+        normalized = {}
+        for name, val in items:
+            key = section + "." + _normalize_name(name)
+            normalized[key] = val
+        return normalized
+
+    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():
+            should_be_yielded = (
+                key.startswith("PIP_") and
+                key[4:].lower() not in self._ignore_env_names
+            )
+            if should_be_yielded:
+                yield key[4:].lower(), val
+
+    # XXX: This is patched in the tests.
+    def _iter_config_files(self):
+        # type: () -> Iterable[Tuple[Kind, List[str]]]
+        """Yields variant and configuration files associated with it.
+
+        This should be treated like items of a dictionary.
+        """
+        # SMELL: Move the conditions out of this function
+
+        # environment variables have the lowest priority
+        config_file = os.environ.get('PIP_CONFIG_FILE', None)
+        if config_file is not None:
+            yield kinds.ENV, [config_file]
+        else:
+            yield kinds.ENV, []
+
+        # at the base we have any global configuration
+        yield kinds.GLOBAL, list(global_config_files)
+
+        # per-user configuration next
+        should_load_user_config = not self.isolated and not (
+            config_file and os.path.exists(config_file)
+        )
+        if should_load_user_config:
+            # The legacy config file is overridden by the new config file
+            yield kinds.USER, [legacy_config_file, new_config_file]
+
+        # finally virtualenv configuration first trumping others
+        yield kinds.SITE, [site_config_file]
+
+    def _get_parser_to_modify(self):
+        # type: () -> Tuple[str, RawConfigParser]
+        # Determine which parser to modify
+        parsers = self._parsers[self.load_only]
+        if not parsers:
+            # This should not happen if everything works correctly.
+            raise ConfigurationError(
+                "Fatal Internal error [id=2]. Please report as a bug."
+            )
+
+        # Use the highest priority parser.
+        return parsers[-1]
+
+    # XXX: This is patched in the tests.
+    def _mark_as_modified(self, fname, parser):
+        # type: (str, RawConfigParser) -> None
+        file_parser_tuple = (fname, parser)
+        if file_parser_tuple not in self._modified_parsers:
+            self._modified_parsers.append(file_parser_tuple)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc b/venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4a2c53d3334a114651a4228fcd8871456d05fac2
GIT binary patch
literal 13105
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/download.py b/venv/lib/python2.7/site-packages/pip/_internal/download.py
new file mode 100644
index 00000000..2683cf08
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/download.py
@@ -0,0 +1,979 @@
+from __future__ import absolute_import
+
+import cgi
+import email.utils
+import getpass
+import json
+import logging
+import mimetypes
+import os
+import platform
+import re
+import shutil
+import sys
+
+from pip._vendor import requests, six, urllib3
+from pip._vendor.cachecontrol import CacheControlAdapter
+from pip._vendor.cachecontrol.caches import FileCache
+from pip._vendor.lockfile import LockError
+from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter
+from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
+from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
+from pip._vendor.requests.structures import CaseInsensitiveDict
+from pip._vendor.requests.utils import get_netrc_auth
+# 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._vendor.six.moves.urllib import request as urllib_request
+from pip._vendor.urllib3.util import IS_PYOPENSSL
+
+import pip
+from pip._internal.exceptions import HashMismatch, InstallationError
+from pip._internal.locations import write_delete_marker_file
+from pip._internal.models.index import PyPI
+from pip._internal.utils.encoding import auto_decode
+from pip._internal.utils.filesystem import check_path_owner
+from pip._internal.utils.glibc import libc_ver
+from pip._internal.utils.misc import (
+    ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, consume, display_path,
+    format_size, get_installed_version, rmtree, split_auth_from_netloc,
+    splitext, unpack_file,
+)
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.ui import DownloadProgressProvider
+from pip._internal.vcs import vcs
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Optional, Tuple, Dict, IO, Text, Union
+    )
+    from pip._internal.models.link import Link
+    from pip._internal.utils.hashes import Hashes
+    from pip._internal.vcs import AuthInfo
+
+try:
+    import ssl  # noqa
+except ImportError:
+    ssl = None
+
+HAS_TLS = (ssl is not None) or IS_PYOPENSSL
+
+__all__ = ['get_file_content',
+           'is_url', 'url_to_path', 'path_to_url',
+           'is_archive_file', 'unpack_vcs_link',
+           'unpack_file_url', 'is_vcs_url', 'is_file_url',
+           'unpack_http_url', 'unpack_url']
+
+
+logger = logging.getLogger(__name__)
+
+
+# These are environment variables present when running under various
+# CI systems.  For each variable, some CI systems that use the variable
+# are indicated.  The collection was chosen so that for each of a number
+# of popular systems, at least one of the environment variables is used.
+# This list is used to provide some indication of and lower bound for
+# CI traffic to PyPI.  Thus, it is okay if the list is not comprehensive.
+# For more background, see: https://github.com/pypa/pip/issues/5499
+CI_ENVIRONMENT_VARIABLES = (
+    # Azure Pipelines
+    'BUILD_BUILDID',
+    # Jenkins
+    'BUILD_ID',
+    # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI
+    'CI',
+)
+
+
+def looks_like_ci():
+    # type: () -> bool
+    """
+    Return whether it looks like pip is running under CI.
+    """
+    # We don't use the method of checking for a tty (e.g. using isatty())
+    # because some CI systems mimic a tty (e.g. Travis CI).  Thus that
+    # method doesn't provide definitive information in either direction.
+    return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES)
+
+
+def user_agent():
+    """
+    Return a string representing the user agent.
+    """
+    data = {
+        "installer": {"name": "pip", "version": pip.__version__},
+        "python": platform.python_version(),
+        "implementation": {
+            "name": platform.python_implementation(),
+        },
+    }
+
+    if data["implementation"]["name"] == 'CPython':
+        data["implementation"]["version"] = platform.python_version()
+    elif data["implementation"]["name"] == 'PyPy':
+        if sys.pypy_version_info.releaselevel == 'final':
+            pypy_version_info = sys.pypy_version_info[:3]
+        else:
+            pypy_version_info = sys.pypy_version_info
+        data["implementation"]["version"] = ".".join(
+            [str(x) for x in pypy_version_info]
+        )
+    elif data["implementation"]["name"] == 'Jython':
+        # Complete Guess
+        data["implementation"]["version"] = platform.python_version()
+    elif data["implementation"]["name"] == 'IronPython':
+        # Complete Guess
+        data["implementation"]["version"] = platform.python_version()
+
+    if sys.platform.startswith("linux"):
+        from pip._vendor import distro
+        distro_infos = dict(filter(
+            lambda x: x[1],
+            zip(["name", "version", "id"], distro.linux_distribution()),
+        ))
+        libc = dict(filter(
+            lambda x: x[1],
+            zip(["lib", "version"], libc_ver()),
+        ))
+        if libc:
+            distro_infos["libc"] = libc
+        if distro_infos:
+            data["distro"] = distro_infos
+
+    if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
+        data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]}
+
+    if platform.system():
+        data.setdefault("system", {})["name"] = platform.system()
+
+    if platform.release():
+        data.setdefault("system", {})["release"] = platform.release()
+
+    if platform.machine():
+        data["cpu"] = platform.machine()
+
+    if HAS_TLS:
+        data["openssl_version"] = ssl.OPENSSL_VERSION
+
+    setuptools_version = get_installed_version("setuptools")
+    if setuptools_version is not None:
+        data["setuptools_version"] = setuptools_version
+
+    # Use None rather than False so as not to give the impression that
+    # pip knows it is not being run under CI.  Rather, it is a null or
+    # inconclusive result.  Also, we include some value rather than no
+    # value to make it easier to know that the check has been run.
+    data["ci"] = True if looks_like_ci() else None
+
+    user_data = os.environ.get("PIP_USER_AGENT_USER_DATA")
+    if user_data is not None:
+        data["user_data"] = user_data
+
+    return "{data[installer][name]}/{data[installer][version]} {json}".format(
+        data=data,
+        json=json.dumps(data, separators=(",", ":"), sort_keys=True),
+    )
+
+
+class MultiDomainBasicAuth(AuthBase):
+
+    def __init__(self, prompting=True):
+        # type: (bool) -> None
+        self.prompting = prompting
+        self.passwords = {}  # type: Dict[str, AuthInfo]
+
+    def __call__(self, req):
+        parsed = urllib_parse.urlparse(req.url)
+
+        # Split the credentials from the netloc.
+        netloc, url_user_password = split_auth_from_netloc(parsed.netloc)
+
+        # Set the url of the request to the url without any credentials
+        req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:])
+
+        # Use any stored credentials that we have for this netloc
+        username, password = self.passwords.get(netloc, (None, None))
+
+        # Use the credentials embedded in the url if we have none stored
+        if username is None:
+            username, password = url_user_password
+
+        # Get creds from netrc if we still don't have them
+        if username is None and password is None:
+            netrc_auth = get_netrc_auth(req.url)
+            username, password = netrc_auth if netrc_auth else (None, None)
+
+        if username or password:
+            # Store the username and password
+            self.passwords[netloc] = (username, password)
+
+            # Send the basic auth with this request
+            req = HTTPBasicAuth(username or "", password or "")(req)
+
+        # Attach a hook to handle 401 responses
+        req.register_hook("response", self.handle_401)
+
+        return req
+
+    def handle_401(self, resp, **kwargs):
+        # We only care about 401 responses, anything else we want to just
+        #   pass through the actual response
+        if resp.status_code != 401:
+            return resp
+
+        # We are not able to prompt the user so simply return the response
+        if not self.prompting:
+            return resp
+
+        parsed = urllib_parse.urlparse(resp.url)
+
+        # Prompt the user for a new username and password
+        username = six.moves.input("User for %s: " % parsed.netloc)
+        password = getpass.getpass("Password: ")
+
+        # Store the new username and password to use for future requests
+        if username or password:
+            self.passwords[parsed.netloc] = (username, password)
+
+        # Consume content and release the original connection to allow our new
+        #   request to reuse the same one.
+        resp.content
+        resp.raw.release_conn()
+
+        # Add our new username and password to the request
+        req = HTTPBasicAuth(username or "", password or "")(resp.request)
+        req.register_hook("response", self.warn_on_401)
+
+        # Send our new request
+        new_resp = resp.connection.send(req, **kwargs)
+        new_resp.history.append(resp)
+
+        return new_resp
+
+    def warn_on_401(self, resp, **kwargs):
+        # warn user that they provided incorrect credentials
+        if resp.status_code == 401:
+            logger.warning('401 Error, Credentials not correct for %s',
+                           resp.request.url)
+
+
+class LocalFSAdapter(BaseAdapter):
+
+    def send(self, request, stream=None, timeout=None, verify=None, cert=None,
+             proxies=None):
+        pathname = url_to_path(request.url)
+
+        resp = Response()
+        resp.status_code = 200
+        resp.url = request.url
+
+        try:
+            stats = os.stat(pathname)
+        except OSError as exc:
+            resp.status_code = 404
+            resp.raw = exc
+        else:
+            modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
+            content_type = mimetypes.guess_type(pathname)[0] or "text/plain"
+            resp.headers = CaseInsensitiveDict({
+                "Content-Type": content_type,
+                "Content-Length": stats.st_size,
+                "Last-Modified": modified,
+            })
+
+            resp.raw = open(pathname, "rb")
+            resp.close = resp.raw.close
+
+        return resp
+
+    def close(self):
+        pass
+
+
+class SafeFileCache(FileCache):
+    """
+    A file based cache which is safe to use even when the target directory may
+    not be accessible or writable.
+    """
+
+    def __init__(self, *args, **kwargs):
+        super(SafeFileCache, self).__init__(*args, **kwargs)
+
+        # Check to ensure that the directory containing our cache directory
+        # is owned by the user current executing pip. If it does not exist
+        # we will check the parent directory until we find one that does exist.
+        # If it is not owned by the user executing pip then we will disable
+        # the cache and log a warning.
+        if not check_path_owner(self.directory):
+            logger.warning(
+                "The directory '%s' or its parent directory is not owned by "
+                "the current user and the cache has been disabled. Please "
+                "check the permissions and owner of that directory. If "
+                "executing pip with sudo, you may want sudo's -H flag.",
+                self.directory,
+            )
+
+            # Set our directory to None to disable the Cache
+            self.directory = None
+
+    def get(self, *args, **kwargs):
+        # If we don't have a directory, then the cache should be a no-op.
+        if self.directory is None:
+            return
+
+        try:
+            return super(SafeFileCache, self).get(*args, **kwargs)
+        except (LockError, OSError, IOError):
+            # We intentionally silence this error, if we can't access the cache
+            # then we can just skip caching and process the request as if
+            # caching wasn't enabled.
+            pass
+
+    def set(self, *args, **kwargs):
+        # If we don't have a directory, then the cache should be a no-op.
+        if self.directory is None:
+            return
+
+        try:
+            return super(SafeFileCache, self).set(*args, **kwargs)
+        except (LockError, OSError, IOError):
+            # We intentionally silence this error, if we can't access the cache
+            # then we can just skip caching and process the request as if
+            # caching wasn't enabled.
+            pass
+
+    def delete(self, *args, **kwargs):
+        # If we don't have a directory, then the cache should be a no-op.
+        if self.directory is None:
+            return
+
+        try:
+            return super(SafeFileCache, self).delete(*args, **kwargs)
+        except (LockError, OSError, IOError):
+            # We intentionally silence this error, if we can't access the cache
+            # then we can just skip caching and process the request as if
+            # caching wasn't enabled.
+            pass
+
+
+class InsecureHTTPAdapter(HTTPAdapter):
+
+    def cert_verify(self, conn, url, verify, cert):
+        conn.cert_reqs = 'CERT_NONE'
+        conn.ca_certs = None
+
+
+class PipSession(requests.Session):
+
+    timeout = None  # type: Optional[int]
+
+    def __init__(self, *args, **kwargs):
+        retries = kwargs.pop("retries", 0)
+        cache = kwargs.pop("cache", None)
+        insecure_hosts = kwargs.pop("insecure_hosts", [])
+
+        super(PipSession, self).__init__(*args, **kwargs)
+
+        # Attach our User Agent to the request
+        self.headers["User-Agent"] = user_agent()
+
+        # Attach our Authentication handler to the session
+        self.auth = MultiDomainBasicAuth()
+
+        # Create our urllib3.Retry instance which will allow us to customize
+        # how we handle retries.
+        retries = urllib3.Retry(
+            # Set the total number of retries that a particular request can
+            # have.
+            total=retries,
+
+            # A 503 error from PyPI typically means that the Fastly -> Origin
+            # connection got interrupted in some way. A 503 error in general
+            # is typically considered a transient error so we'll go ahead and
+            # retry it.
+            # A 500 may indicate transient error in Amazon S3
+            # A 520 or 527 - may indicate transient error in CloudFlare
+            status_forcelist=[500, 503, 520, 527],
+
+            # Add a small amount of back off between failed requests in
+            # order to prevent hammering the service.
+            backoff_factor=0.25,
+        )
+
+        # We want to _only_ cache responses on securely fetched origins. We do
+        # this because we can't validate the response of an insecurely fetched
+        # origin, and we don't want someone to be able to poison the cache and
+        # require manual eviction from the cache to fix it.
+        if cache:
+            secure_adapter = CacheControlAdapter(
+                cache=SafeFileCache(cache, use_dir_lock=True),
+                max_retries=retries,
+            )
+        else:
+            secure_adapter = HTTPAdapter(max_retries=retries)
+
+        # Our Insecure HTTPAdapter disables HTTPS validation. It does not
+        # support caching (see above) so we'll use it for all http:// URLs as
+        # well as any https:// host that we've marked as ignoring TLS errors
+        # for.
+        insecure_adapter = InsecureHTTPAdapter(max_retries=retries)
+
+        self.mount("https://", secure_adapter)
+        self.mount("http://", insecure_adapter)
+
+        # Enable file:// urls
+        self.mount("file://", LocalFSAdapter())
+
+        # We want to use a non-validating adapter for any requests which are
+        # deemed insecure.
+        for host in insecure_hosts:
+            self.mount("https://{}/".format(host), insecure_adapter)
+
+    def request(self, method, url, *args, **kwargs):
+        # Allow setting a default timeout on a session
+        kwargs.setdefault("timeout", self.timeout)
+
+        # Dispatch the actual request
+        return super(PipSession, self).request(method, url, *args, **kwargs)
+
+
+def get_file_content(url, comes_from=None, session=None):
+    # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text]
+    """Gets the content of a file; it may be a filename, file: URL, or
+    http: URL.  Returns (location, content).  Content is unicode.
+
+    :param url:         File path or url.
+    :param comes_from:  Origin description of requirements.
+    :param session:     Instance of pip.download.PipSession.
+    """
+    if session is None:
+        raise TypeError(
+            "get_file_content() missing 1 required keyword argument: 'session'"
+        )
+
+    match = _scheme_re.search(url)
+    if match:
+        scheme = match.group(1).lower()
+        if (scheme == 'file' and comes_from and
+                comes_from.startswith('http')):
+            raise InstallationError(
+                'Requirements file %s references URL %s, which is local'
+                % (comes_from, url))
+        if scheme == 'file':
+            path = url.split(':', 1)[1]
+            path = path.replace('\\', '/')
+            match = _url_slash_drive_re.match(path)
+            if match:
+                path = match.group(1) + ':' + path.split('|', 1)[1]
+            path = urllib_parse.unquote(path)
+            if path.startswith('/'):
+                path = '/' + path.lstrip('/')
+            url = path
+        else:
+            # FIXME: catch some errors
+            resp = session.get(url)
+            resp.raise_for_status()
+            return resp.url, resp.text
+    try:
+        with open(url, 'rb') as f:
+            content = auto_decode(f.read())
+    except IOError as exc:
+        raise InstallationError(
+            'Could not open requirements file: %s' % str(exc)
+        )
+    return url, content
+
+
+_scheme_re = re.compile(r'^(http|https|file):', re.I)
+_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I)
+
+
+def is_url(name):
+    # type: (Union[str, Text]) -> bool
+    """Returns true if the name looks like a URL"""
+    if ':' not in name:
+        return False
+    scheme = name.split(':', 1)[0].lower()
+    return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes
+
+
+def url_to_path(url):
+    # type: (str) -> str
+    """
+    Convert a file: URL to a path.
+    """
+    assert url.startswith('file:'), (
+        "You can only turn file: urls into filenames (not %r)" % url)
+
+    _, netloc, path, _, _ = urllib_parse.urlsplit(url)
+
+    if not netloc or netloc == 'localhost':
+        # According to RFC 8089, same as empty authority.
+        netloc = ''
+    elif sys.platform == 'win32':
+        # If we have a UNC path, prepend UNC share notation.
+        netloc = '\\\\' + netloc
+    else:
+        raise ValueError(
+            'non-local file URIs are not supported on this platform: %r'
+            % url
+        )
+
+    path = urllib_request.url2pathname(netloc + path)
+    return path
+
+
+def path_to_url(path):
+    # type: (Union[str, Text]) -> str
+    """
+    Convert a path to a file: URL.  The path will be made absolute and have
+    quoted path parts.
+    """
+    path = os.path.normpath(os.path.abspath(path))
+    url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path))
+    return url
+
+
+def is_archive_file(name):
+    # type: (str) -> bool
+    """Return True if `name` is a considered as an archive file."""
+    ext = splitext(name)[1].lower()
+    if ext in ARCHIVE_EXTENSIONS:
+        return True
+    return False
+
+
+def unpack_vcs_link(link, location):
+    vcs_backend = _get_used_vcs_backend(link)
+    vcs_backend.unpack(location)
+
+
+def _get_used_vcs_backend(link):
+    for backend in vcs.backends:
+        if link.scheme in backend.schemes:
+            vcs_backend = backend(link.url)
+            return vcs_backend
+
+
+def is_vcs_url(link):
+    # type: (Link) -> bool
+    return bool(_get_used_vcs_backend(link))
+
+
+def is_file_url(link):
+    # type: (Link) -> bool
+    return link.url.lower().startswith('file:')
+
+
+def is_dir_url(link):
+    # type: (Link) -> bool
+    """Return whether a file:// Link points to a directory.
+
+    ``link`` must not have any other scheme but file://. Call is_file_url()
+    first.
+
+    """
+    link_path = url_to_path(link.url_without_fragment)
+    return os.path.isdir(link_path)
+
+
+def _progress_indicator(iterable, *args, **kwargs):
+    return iterable
+
+
+def _download_url(
+    resp,  # type: Response
+    link,  # type: Link
+    content_file,  # type: IO
+    hashes,  # type: Hashes
+    progress_bar  # type: str
+):
+    # type: (...) -> None
+    try:
+        total_length = int(resp.headers['content-length'])
+    except (ValueError, KeyError, TypeError):
+        total_length = 0
+
+    cached_resp = getattr(resp, "from_cache", False)
+    if logger.getEffectiveLevel() > logging.INFO:
+        show_progress = False
+    elif cached_resp:
+        show_progress = False
+    elif total_length > (40 * 1000):
+        show_progress = True
+    elif not total_length:
+        show_progress = True
+    else:
+        show_progress = False
+
+    show_url = link.show_url
+
+    def resp_read(chunk_size):
+        try:
+            # Special case for urllib3.
+            for chunk in resp.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 = resp.raw.read(chunk_size)
+                if not chunk:
+                    break
+                yield chunk
+
+    def written_chunks(chunks):
+        for chunk in chunks:
+            content_file.write(chunk)
+            yield chunk
+
+    progress_indicator = _progress_indicator
+
+    if link.netloc == PyPI.netloc:
+        url = show_url
+    else:
+        url = link.url_without_fragment
+
+    if show_progress:  # We don't show progress on cached responses
+        progress_indicator = DownloadProgressProvider(progress_bar,
+                                                      max=total_length)
+        if total_length:
+            logger.info("Downloading %s (%s)", url, format_size(total_length))
+        else:
+            logger.info("Downloading %s", url)
+    elif cached_resp:
+        logger.info("Using cached %s", url)
+    else:
+        logger.info("Downloading %s", url)
+
+    logger.debug('Downloading from URL %s', link)
+
+    downloaded_chunks = written_chunks(
+        progress_indicator(
+            resp_read(CONTENT_CHUNK_SIZE),
+            CONTENT_CHUNK_SIZE
+        )
+    )
+    if hashes:
+        hashes.check_against_chunks(downloaded_chunks)
+    else:
+        consume(downloaded_chunks)
+
+
+def _copy_file(filename, location, link):
+    copy = True
+    download_location = os.path.join(location, link.filename)
+    if os.path.exists(download_location):
+        response = ask_path_exists(
+            'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' %
+            display_path(download_location), ('i', 'w', 'b', 'a'))
+        if response == 'i':
+            copy = False
+        elif response == 'w':
+            logger.warning('Deleting %s', display_path(download_location))
+            os.remove(download_location)
+        elif response == 'b':
+            dest_file = backup_dir(download_location)
+            logger.warning(
+                'Backing up %s to %s',
+                display_path(download_location),
+                display_path(dest_file),
+            )
+            shutil.move(download_location, dest_file)
+        elif response == 'a':
+            sys.exit(-1)
+    if copy:
+        shutil.copy(filename, download_location)
+        logger.info('Saved %s', display_path(download_location))
+
+
+def unpack_http_url(
+    link,  # type: Link
+    location,  # type: str
+    download_dir=None,  # type: Optional[str]
+    session=None,  # type: Optional[PipSession]
+    hashes=None,  # type: Optional[Hashes]
+    progress_bar="on"  # type: str
+):
+    # type: (...) -> None
+    if session is None:
+        raise TypeError(
+            "unpack_http_url() missing 1 required keyword argument: 'session'"
+        )
+
+    with TempDirectory(kind="unpack") as temp_dir:
+        # If a download dir is specified, is the file already downloaded there?
+        already_downloaded_path = None
+        if download_dir:
+            already_downloaded_path = _check_download_dir(link,
+                                                          download_dir,
+                                                          hashes)
+
+        if already_downloaded_path:
+            from_path = already_downloaded_path
+            content_type = mimetypes.guess_type(from_path)[0]
+        else:
+            # let's download to a tmp dir
+            from_path, content_type = _download_http_url(link,
+                                                         session,
+                                                         temp_dir.path,
+                                                         hashes,
+                                                         progress_bar)
+
+        # unpack the archive to the build dir location. even when only
+        # downloading archives, they have to be unpacked to parse dependencies
+        unpack_file(from_path, location, content_type, link)
+
+        # a download dir is specified; let's copy the archive there
+        if download_dir and not already_downloaded_path:
+            _copy_file(from_path, download_dir, link)
+
+        if not already_downloaded_path:
+            os.unlink(from_path)
+
+
+def unpack_file_url(
+    link,  # type: Link
+    location,  # type: str
+    download_dir=None,  # type: Optional[str]
+    hashes=None  # type: Optional[Hashes]
+):
+    # type: (...) -> None
+    """Unpack link into location.
+
+    If download_dir is provided and link points to a file, make a copy
+    of the link file inside download_dir.
+    """
+    link_path = url_to_path(link.url_without_fragment)
+
+    # If it's a url to a local directory
+    if is_dir_url(link):
+        if os.path.isdir(location):
+            rmtree(location)
+        shutil.copytree(link_path, location, symlinks=True)
+        if download_dir:
+            logger.info('Link is a directory, ignoring download_dir')
+        return
+
+    # If --require-hashes is off, `hashes` is either empty, the
+    # link's embedded hash, or MissingHashes; it is required to
+    # match. If --require-hashes is on, we are satisfied by any
+    # hash in `hashes` matching: a URL-based or an option-based
+    # one; no internet-sourced hash will be in `hashes`.
+    if hashes:
+        hashes.check_against_path(link_path)
+
+    # If a download dir is specified, is the file already there and valid?
+    already_downloaded_path = None
+    if download_dir:
+        already_downloaded_path = _check_download_dir(link,
+                                                      download_dir,
+                                                      hashes)
+
+    if already_downloaded_path:
+        from_path = already_downloaded_path
+    else:
+        from_path = link_path
+
+    content_type = mimetypes.guess_type(from_path)[0]
+
+    # unpack the archive to the build dir location. even when only downloading
+    # archives, they have to be unpacked to parse dependencies
+    unpack_file(from_path, location, content_type, link)
+
+    # a download dir is specified and not already downloaded
+    if download_dir and not already_downloaded_path:
+        _copy_file(from_path, download_dir, link)
+
+
+class PipXmlrpcTransport(xmlrpc_client.Transport):
+    """Provide a `xmlrpclib.Transport` implementation via a `PipSession`
+    object.
+    """
+
+    def __init__(self, index_url, session, use_datetime=False):
+        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):
+        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()
+            self.verbose = verbose
+            return self.parse_response(response.raw)
+        except requests.HTTPError as exc:
+            logger.critical(
+                "HTTP error %s while getting %s",
+                exc.response.status_code, url,
+            )
+            raise
+
+
+def unpack_url(
+    link,  # type: Optional[Link]
+    location,  # type: Optional[str]
+    download_dir=None,  # type: Optional[str]
+    only_download=False,  # type: bool
+    session=None,  # type: Optional[PipSession]
+    hashes=None,  # type: Optional[Hashes]
+    progress_bar="on"  # type: str
+):
+    # type: (...) -> None
+    """Unpack link.
+       If link is a VCS link:
+         if only_download, export into download_dir and ignore location
+          else unpack into location
+       for other types of link:
+         - unpack into location
+         - if download_dir, copy the file into download_dir
+         - if only_download, mark location for deletion
+
+    :param hashes: A Hashes object, one of whose embedded hashes must match,
+        or HashMismatch will be raised. If the Hashes is empty, no matches are
+        required, and unhashable types of requirements (like VCS ones, which
+        would ordinarily raise HashUnsupported) are allowed.
+    """
+    # non-editable vcs urls
+    if is_vcs_url(link):
+        unpack_vcs_link(link, location)
+
+    # file urls
+    elif is_file_url(link):
+        unpack_file_url(link, location, download_dir, hashes=hashes)
+
+    # http urls
+    else:
+        if session is None:
+            session = PipSession()
+
+        unpack_http_url(
+            link,
+            location,
+            download_dir,
+            session,
+            hashes=hashes,
+            progress_bar=progress_bar
+        )
+    if only_download:
+        write_delete_marker_file(location)
+
+
+def _download_http_url(
+    link,  # type: Link
+    session,  # type: PipSession
+    temp_dir,  # type: str
+    hashes,  # type: Hashes
+    progress_bar  # type: str
+):
+    # type: (...) -> Tuple[str, str]
+    """Download link url into temp_dir using provided session"""
+    target_url = link.url.split('#', 1)[0]
+    try:
+        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()
+    except requests.HTTPError as exc:
+        logger.critical(
+            "HTTP error %s while getting %s", exc.response.status_code, link,
+        )
+        raise
+
+    content_type = resp.headers.get('content-type', '')
+    filename = link.filename  # fallback
+    # Have a look at the Content-Disposition header for a better guess
+    content_disposition = resp.headers.get('content-disposition')
+    if content_disposition:
+        type, params = cgi.parse_header(content_disposition)
+        # We use ``or`` here because we don't want to use an "empty" value
+        # from the filename param.
+        filename = params.get('filename') or filename
+    ext = splitext(filename)[1]
+    if not ext:
+        ext = mimetypes.guess_extension(content_type)
+        if ext:
+            filename += ext
+    if not ext and link.url != resp.url:
+        ext = os.path.splitext(resp.url)[1]
+        if ext:
+            filename += ext
+    file_path = os.path.join(temp_dir, filename)
+    with open(file_path, 'wb') as content_file:
+        _download_url(resp, link, content_file, hashes, progress_bar)
+    return file_path, content_type
+
+
+def _check_download_dir(link, download_dir, hashes):
+    # type: (Link, str, Hashes) -> Optional[str]
+    """ Check download_dir for previously downloaded file with correct hash
+        If a correct file is found return its path else None
+    """
+    download_path = os.path.join(download_dir, link.filename)
+    if os.path.exists(download_path):
+        # If already downloaded, does its hash match?
+        logger.info('File was already downloaded %s', download_path)
+        if hashes:
+            try:
+                hashes.check_against_path(download_path)
+            except HashMismatch:
+                logger.warning(
+                    'Previously-downloaded file %s has bad hash. '
+                    'Re-downloading.',
+                    download_path
+                )
+                os.unlink(download_path)
+                return None
+        return download_path
+    return None
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/download.pyc b/venv/lib/python2.7/site-packages/pip/_internal/download.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..88bba2d7fc471a758cfcc417555ce757bef1eea0
GIT binary patch
literal 28623
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
Bw(S4_

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/exceptions.py b/venv/lib/python2.7/site-packages/pip/_internal/exceptions.py
new file mode 100644
index 00000000..7b291a1e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/exceptions.py
@@ -0,0 +1,274 @@
+"""Exceptions used throughout package"""
+from __future__ import absolute_import
+
+from itertools import chain, groupby, repeat
+
+from pip._vendor.six import iteritems
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional
+    from pip._internal.req.req_install import InstallRequirement
+
+
+class PipError(Exception):
+    """Base pip exception"""
+
+
+class ConfigurationError(PipError):
+    """General exception in configuration"""
+
+
+class InstallationError(PipError):
+    """General exception during installation"""
+
+
+class UninstallationError(PipError):
+    """General exception during uninstallation"""
+
+
+class DistributionNotFound(InstallationError):
+    """Raised when a distribution cannot be found to satisfy a requirement"""
+
+
+class RequirementsFileParseError(InstallationError):
+    """Raised when a general error occurs parsing a requirements file line."""
+
+
+class BestVersionAlreadyInstalled(PipError):
+    """Raised when the most up-to-date version of a package is already
+    installed."""
+
+
+class BadCommand(PipError):
+    """Raised when virtualenv or a command is not found"""
+
+
+class CommandError(PipError):
+    """Raised when there is an error in command-line arguments"""
+
+
+class PreviousBuildDirError(PipError):
+    """Raised when there's a previous conflicting build directory"""
+
+
+class InvalidWheelFilename(InstallationError):
+    """Invalid wheel filename."""
+
+
+class UnsupportedWheel(InstallationError):
+    """Unsupported wheel."""
+
+
+class HashErrors(InstallationError):
+    """Multiple HashError instances rolled into one for reporting"""
+
+    def __init__(self):
+        self.errors = []
+
+    def append(self, error):
+        self.errors.append(error)
+
+    def __str__(self):
+        lines = []
+        self.errors.sort(key=lambda e: e.order)
+        for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__):
+            lines.append(cls.head)
+            lines.extend(e.body() for e in errors_of_cls)
+        if lines:
+            return '\n'.join(lines)
+
+    def __nonzero__(self):
+        return bool(self.errors)
+
+    def __bool__(self):
+        return self.__nonzero__()
+
+
+class HashError(InstallationError):
+    """
+    A failure to verify a package against known-good hashes
+
+    :cvar order: An int sorting hash exception classes by difficulty of
+        recovery (lower being harder), so the user doesn't bother fretting
+        about unpinned packages when he has deeper issues, like VCS
+        dependencies, to deal with. Also keeps error reports in a
+        deterministic order.
+    :cvar head: A section heading for display above potentially many
+        exceptions of this kind
+    :ivar req: The InstallRequirement that triggered this error. This is
+        pasted on after the exception is instantiated, because it's not
+        typically available earlier.
+
+    """
+    req = None  # type: Optional[InstallRequirement]
+    head = ''
+
+    def body(self):
+        """Return a summary of me for display under the heading.
+
+        This default implementation simply prints a description of the
+        triggering requirement.
+
+        :param req: The InstallRequirement that provoked this error, with
+            populate_link() having already been called
+
+        """
+        return '    %s' % self._requirement_name()
+
+    def __str__(self):
+        return '%s\n%s' % (self.head, self.body())
+
+    def _requirement_name(self):
+        """Return a description of the requirement that triggered me.
+
+        This default implementation returns long description of the req, with
+        line numbers
+
+        """
+        return str(self.req) if self.req else 'unknown package'
+
+
+class VcsHashUnsupported(HashError):
+    """A hash was provided for a version-control-system-based requirement, but
+    we don't have a method for hashing those."""
+
+    order = 0
+    head = ("Can't verify hashes for these requirements because we don't "
+            "have a way to hash version control repositories:")
+
+
+class DirectoryUrlHashUnsupported(HashError):
+    """A hash was provided for a version-control-system-based requirement, but
+    we don't have a method for hashing those."""
+
+    order = 1
+    head = ("Can't verify hashes for these file:// requirements because they "
+            "point to directories:")
+
+
+class HashMissing(HashError):
+    """A hash was needed for a requirement but is absent."""
+
+    order = 2
+    head = ('Hashes are required in --require-hashes mode, but they are '
+            'missing from some requirements. Here is a list of those '
+            'requirements along with the hashes their downloaded archives '
+            'actually had. Add lines like these to your requirements files to '
+            'prevent tampering. (If you did not enable --require-hashes '
+            'manually, note that it turns on automatically when any package '
+            'has a hash.)')
+
+    def __init__(self, gotten_hash):
+        """
+        :param gotten_hash: The hash of the (possibly malicious) archive we
+            just downloaded
+        """
+        self.gotten_hash = gotten_hash
+
+    def body(self):
+        # Dodge circular import.
+        from pip._internal.utils.hashes import FAVORITE_HASH
+
+        package = None
+        if self.req:
+            # In the case of URL-based requirements, display the original URL
+            # seen in the requirements file rather than the package name,
+            # so the output can be directly copied into the requirements file.
+            package = (self.req.original_link if self.req.original_link
+                       # In case someone feeds something downright stupid
+                       # to InstallRequirement's constructor.
+                       else getattr(self.req, 'req', None))
+        return '    %s --hash=%s:%s' % (package or 'unknown package',
+                                        FAVORITE_HASH,
+                                        self.gotten_hash)
+
+
+class HashUnpinned(HashError):
+    """A requirement had a hash specified but was not pinned to a specific
+    version."""
+
+    order = 3
+    head = ('In --require-hashes mode, all requirements must have their '
+            'versions pinned with ==. These do not:')
+
+
+class HashMismatch(HashError):
+    """
+    Distribution file hash values don't match.
+
+    :ivar package_name: The name of the package that triggered the hash
+        mismatch. Feel free to write to this after the exception is raise to
+        improve its error message.
+
+    """
+    order = 4
+    head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS '
+            'FILE. If you have updated the package versions, please update '
+            'the hashes. Otherwise, examine the package contents carefully; '
+            'someone may have tampered with them.')
+
+    def __init__(self, allowed, gots):
+        """
+        :param allowed: A dict of algorithm names pointing to lists of allowed
+            hex digests
+        :param gots: A dict of algorithm names pointing to hashes we
+            actually got from the files under suspicion
+        """
+        self.allowed = allowed
+        self.gots = gots
+
+    def body(self):
+        return '    %s:\n%s' % (self._requirement_name(),
+                                self._hash_comparison())
+
+    def _hash_comparison(self):
+        """
+        Return a comparison of actual and expected hash values.
+
+        Example::
+
+               Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
+                            or 123451234512345123451234512345123451234512345
+                    Got        bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef
+
+        """
+        def hash_then_or(hash_name):
+            # 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 = []
+        for hash_name, expecteds in iteritems(self.allowed):
+            prefix = hash_then_or(hash_name)
+            lines.extend(('        Expected %s %s' % (next(prefix), e))
+                         for e in expecteds)
+            lines.append('             Got        %s\n' %
+                         self.gots[hash_name].hexdigest())
+            prefix = '    or'
+        return '\n'.join(lines)
+
+
+class UnsupportedPythonVersion(InstallationError):
+    """Unsupported python version according to Requires-Python package
+    metadata."""
+
+
+class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
+    """When there are errors while loading a configuration file
+    """
+
+    def __init__(self, reason="could not be loaded", fname=None, error=None):
+        super(ConfigurationFileCouldNotBeLoaded, self).__init__(error)
+        self.reason = reason
+        self.fname = fname
+        self.error = error
+
+    def __str__(self):
+        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)
+        return "Configuration file {}{}".format(self.reason, message_part)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..89064ae52ac0ee39605f1a56457272357765ae9d
GIT binary patch
literal 16273
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index.py b/venv/lib/python2.7/site-packages/pip/_internal/index.py
new file mode 100644
index 00000000..ff614b34
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/index.py
@@ -0,0 +1,1108 @@
+"""Routines related to PyPI, indexes"""
+from __future__ import absolute_import
+
+import cgi
+import itertools
+import logging
+import mimetypes
+import os
+import posixpath
+import re
+import sys
+from collections import namedtuple
+
+from pip._vendor import html5lib, requests, six
+from pip._vendor.distlib.compat import unescape
+from pip._vendor.packaging import specifiers
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.packaging.version import parse as parse_version
+from pip._vendor.requests.exceptions import HTTPError, 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.download import HAS_TLS, is_url, path_to_url, url_to_path
+from pip._internal.exceptions import (
+    BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename,
+    UnsupportedWheel,
+)
+from pip._internal.models.candidate import InstallationCandidate
+from pip._internal.models.format_control import FormatControl
+from pip._internal.models.index import PyPI
+from pip._internal.models.link import Link
+from pip._internal.pep425tags import get_supported
+from pip._internal.utils.compat import ipaddress
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import (
+    ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path,
+    redact_password_from_url,
+)
+from pip._internal.utils.packaging import check_requires_python
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.wheel import Wheel
+
+if MYPY_CHECK_RUNNING:
+    from logging import Logger
+    from typing import (
+        Tuple, Optional, Any, List, Union, Callable, Set, Sequence,
+        Iterable, MutableMapping
+    )
+    from pip._vendor.packaging.version import _BaseVersion
+    from pip._vendor.requests import Response
+    from pip._internal.pep425tags import Pep425Tag
+    from pip._internal.req import InstallRequirement
+    from pip._internal.download import PipSession
+
+    SecureOrigin = Tuple[str, str, Optional[str]]
+    BuildTag = Tuple[Any, ...]  # either empty tuple or Tuple[int, str]
+    CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]]
+
+
+__all__ = ['FormatControl', 'FoundCandidates', 'PackageFinder']
+
+
+SECURE_ORIGINS = [
+    # protocol, hostname, port
+    # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC)
+    ("https", "*", "*"),
+    ("*", "localhost", "*"),
+    ("*", "127.0.0.0/8", "*"),
+    ("*", "::1/128", "*"),
+    ("file", "*", None),
+    # ssh is always secure.
+    ("ssh", "*", "*"),
+]  # type: List[SecureOrigin]
+
+
+logger = logging.getLogger(__name__)
+
+
+def _match_vcs_scheme(url):
+    # type: (str) -> Optional[str]
+    """Look for VCS schemes in the URL.
+
+    Returns the matched VCS scheme, or None if there's no match.
+    """
+    from pip._internal.vcs import VcsSupport
+    for scheme in VcsSupport.schemes:
+        if url.lower().startswith(scheme) and url[len(scheme)] in '+:':
+            return scheme
+    return None
+
+
+def _is_url_like_archive(url):
+    # type: (str) -> bool
+    """Return whether the URL looks like an archive.
+    """
+    filename = Link(url).filename
+    for bad_ext in ARCHIVE_EXTENSIONS:
+        if filename.endswith(bad_ext):
+            return True
+    return False
+
+
+class _NotHTML(Exception):
+    def __init__(self, content_type, request_desc):
+        # type: (str, str) -> None
+        super(_NotHTML, self).__init__(content_type, request_desc)
+        self.content_type = content_type
+        self.request_desc = request_desc
+
+
+def _ensure_html_header(response):
+    # type: (Response) -> None
+    """Check the Content-Type header to ensure the response contains HTML.
+
+    Raises `_NotHTML` if the content type is not text/html.
+    """
+    content_type = response.headers.get("Content-Type", "")
+    if not content_type.lower().startswith("text/html"):
+        raise _NotHTML(content_type, response.request.method)
+
+
+class _NotHTTP(Exception):
+    pass
+
+
+def _ensure_html_response(url, session):
+    # type: (str, PipSession) -> None
+    """Send a HEAD request to the URL, and ensure the response contains HTML.
+
+    Raises `_NotHTTP` if the URL is not available for a HEAD request, or
+    `_NotHTML` if the content type is not text/html.
+    """
+    scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url)
+    if scheme not in {'http', 'https'}:
+        raise _NotHTTP()
+
+    resp = session.head(url, allow_redirects=True)
+    resp.raise_for_status()
+
+    _ensure_html_header(resp)
+
+
+def _get_html_response(url, session):
+    # type: (str, PipSession) -> Response
+    """Access an HTML page with GET, and return the response.
+
+    This consists of three parts:
+
+    1. If the URL looks suspiciously like an archive, send a HEAD first to
+       check the Content-Type is HTML, to avoid downloading a large file.
+       Raise `_NotHTTP` if the content type cannot be determined, or
+       `_NotHTML` if it is not HTML.
+    2. Actually perform the request. Raise HTTP exceptions on network failures.
+    3. Check the Content-Type header to make sure we got HTML, and raise
+       `_NotHTML` otherwise.
+    """
+    if _is_url_like_archive(url):
+        _ensure_html_response(url, session=session)
+
+    logger.debug('Getting page %s', redact_password_from_url(url))
+
+    resp = session.get(
+        url,
+        headers={
+            "Accept": "text/html",
+            # We don't want to blindly returned cached data for
+            # /simple/, because authors generally expecting that
+            # twine upload && pip install will function, but if
+            # they've done a pip install in the last ~10 minutes
+            # it won't. Thus by setting this to zero we will not
+            # blindly use any cached data, however the benefit of
+            # using max-age=0 instead of no-cache, is that we will
+            # still support conditional requests, so we will still
+            # minimize traffic sent in cases where the page hasn't
+            # changed at all, we will just always incur the round
+            # trip for the conditional GET now instead of only
+            # once per 10 minutes.
+            # For more information, please see pypa/pip#5670.
+            "Cache-Control": "max-age=0",
+        },
+    )
+    resp.raise_for_status()
+
+    # The check for archives above only works if the url ends with
+    # something that looks like an archive. However that is not a
+    # requirement of an url. Unless we issue a HEAD request on every
+    # url we cannot know ahead of time for sure if something is HTML
+    # or not. However we can check after we've downloaded it.
+    _ensure_html_header(resp)
+
+    return resp
+
+
+def _handle_get_page_fail(
+    link,  # type: Link
+    reason,  # type: Union[str, Exception]
+    meth=None  # type: Optional[Callable[..., None]]
+):
+    # type: (...) -> None
+    if meth is None:
+        meth = logger.debug
+    meth("Could not fetch URL %s: %s - skipping", link, reason)
+
+
+def _get_html_page(link, session=None):
+    # type: (Link, Optional[PipSession]) -> Optional[HTMLPage]
+    if session is None:
+        raise TypeError(
+            "_get_html_page() missing 1 required keyword argument: 'session'"
+        )
+
+    url = link.url.split('#', 1)[0]
+
+    # 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)
+        return None
+
+    # Tack index.html onto file:// URLs that point to directories
+    scheme, _, path, _, _, _ = urllib_parse.urlparse(url)
+    if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))):
+        # add trailing slash if not present so urljoin doesn't trim
+        # final segment
+        if not url.endswith('/'):
+            url += '/'
+        url = urllib_parse.urljoin(url, 'index.html')
+        logger.debug(' file: URL is directory, getting %s', url)
+
+    try:
+        resp = _get_html_response(url, session=session)
+    except _NotHTTP:
+        logger.debug(
+            'Skipping page %s because it looks like an archive, and cannot '
+            'be checked by HEAD.', link,
+        )
+    except _NotHTML as exc:
+        logger.debug(
+            'Skipping page %s because the %s request got Content-Type: %s',
+            link, exc.request_desc, exc.content_type,
+        )
+    except HTTPError as exc:
+        _handle_get_page_fail(link, exc)
+    except RetryError as exc:
+        _handle_get_page_fail(link, exc)
+    except SSLError as exc:
+        reason = "There was a problem confirming the ssl certificate: "
+        reason += str(exc)
+        _handle_get_page_fail(link, reason, meth=logger.info)
+    except requests.ConnectionError as exc:
+        _handle_get_page_fail(link, "connection error: %s" % exc)
+    except requests.Timeout:
+        _handle_get_page_fail(link, "timed out")
+    else:
+        return HTMLPage(resp.content, resp.url, resp.headers)
+    return None
+
+
+class CandidateEvaluator(object):
+
+    def __init__(
+        self,
+        valid_tags,          # type: List[Pep425Tag]
+        prefer_binary=False  # type: bool
+
+    ):
+        # type: (...) -> None
+        self._prefer_binary = prefer_binary
+        self._valid_tags = valid_tags
+
+    def is_wheel_supported(self, wheel):
+        # type: (Wheel) -> bool
+        return wheel.supported(self._valid_tags)
+
+    def _sort_key(self, candidate):
+        # type: (InstallationCandidate) -> CandidateSortingKey
+        """
+        Function used to generate link sort key for link tuples.
+        The greater the return value, the more preferred it is.
+        If not finding wheels, then sorted by version only.
+        If finding wheels, then the sort order is by version, then:
+          1. existing installs
+          2. wheels ordered via Wheel.support_index_min(self._valid_tags)
+          3. source archives
+        If prefer_binary was set, then all wheels are sorted above sources.
+        Note: it was considered to embed this logic into the Link
+              comparison operators, but then different sdist links
+              with the same version, would have to be considered equal
+        """
+        support_num = len(self._valid_tags)
+        build_tag = tuple()  # type: BuildTag
+        binary_preference = 0
+        if candidate.location.is_wheel:
+            # can raise InvalidWheelFilename
+            wheel = Wheel(candidate.location.filename)
+            if not wheel.supported(self._valid_tags):
+                raise UnsupportedWheel(
+                    "%s is not a supported wheel for this platform. It "
+                    "can't be sorted." % wheel.filename
+                )
+            if self._prefer_binary:
+                binary_preference = 1
+            pri = -(wheel.support_index_min(self._valid_tags))
+            if wheel.build_tag is not None:
+                match = re.match(r'^(\d+)(.*)$', wheel.build_tag)
+                build_tag_groups = match.groups()
+                build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
+        else:  # sdist
+            pri = -(support_num)
+        return (binary_preference, candidate.version, build_tag, pri)
+
+    def get_best_candidate(self, candidates):
+        # type: (List[InstallationCandidate]) -> InstallationCandidate
+        """
+        Return the best candidate per the instance's sort order, or None if
+        no candidates are given.
+        """
+        if not candidates:
+            return None
+
+        return max(candidates, key=self._sort_key)
+
+
+class FoundCandidates(object):
+    """A collection of candidates, returned by `PackageFinder.find_candidates`.
+
+    This class is only intended to be instantiated by PackageFinder through
+    the `from_specifier()` constructor.
+
+    Arguments:
+
+    * `candidates`: A sequence of all available candidates found.
+    * `specifier`: Specifier to filter applicable versions.
+    * `prereleases`: Whether prereleases should be accounted. Pass None to
+        infer from the specifier.
+    * `evaluator`: A CandidateEvaluator object to sort applicable candidates
+        by order of preference.
+    """
+
+    def __init__(
+        self,
+        candidates,     # type: List[InstallationCandidate]
+        versions,       # type: Set[str]
+        evaluator,      # type: CandidateEvaluator
+    ):
+        # type: (...) -> None
+        self._candidates = candidates
+        self._evaluator = evaluator
+        self._versions = versions
+
+    @classmethod
+    def from_specifier(
+        cls,
+        candidates,     # type: List[InstallationCandidate]
+        specifier,      # type: specifiers.BaseSpecifier
+        prereleases,    # type: Optional[bool]
+        evaluator,      # type: CandidateEvaluator
+    ):
+        # type: (...) -> FoundCandidates
+        versions = {
+            str(v) for v in specifier.filter(
+                # We turn the version object into a str here because otherwise
+                # when we're debundled but setuptools isn't, Python will see
+                # packaging.version.Version and
+                # pkg_resources._vendor.packaging.version.Version as different
+                # types. This way we'll use a str as a common data interchange
+                # format. If we stop using the pkg_resources provided specifier
+                # and start using our own, we can drop the cast to str().
+                (str(c.version) for c in candidates),
+                prereleases=prereleases,
+            )
+        }
+        return cls(candidates, versions, evaluator)
+
+    def iter_all(self):
+        # type: () -> Iterable[InstallationCandidate]
+        """Iterate through all candidates.
+        """
+        return iter(self._candidates)
+
+    def iter_applicable(self):
+        # type: () -> Iterable[InstallationCandidate]
+        """Iterate through candidates matching the versions associated with
+        this instance.
+        """
+        # Again, converting version to str to deal with debundling.
+        return (c for c in self.iter_all() if str(c.version) in self._versions)
+
+    def get_best(self):
+        # type: () -> Optional[InstallationCandidate]
+        """Return the best candidate available, or None if no applicable
+        candidates are found.
+        """
+        candidates = list(self.iter_applicable())
+        return self._evaluator.get_best_candidate(candidates)
+
+
+class PackageFinder(object):
+    """This finds packages.
+
+    This is meant to match easy_install's technique for looking for
+    packages, by reading pages and looking for appropriate links.
+    """
+
+    def __init__(
+        self,
+        find_links,  # type: List[str]
+        index_urls,  # type: List[str]
+        allow_all_prereleases=False,  # type: bool
+        trusted_hosts=None,  # type: Optional[Iterable[str]]
+        session=None,  # type: Optional[PipSession]
+        format_control=None,  # type: Optional[FormatControl]
+        platform=None,  # type: Optional[str]
+        versions=None,  # type: Optional[List[str]]
+        abi=None,  # type: Optional[str]
+        implementation=None,  # type: Optional[str]
+        prefer_binary=False  # type: bool
+    ):
+        # type: (...) -> None
+        """Create a PackageFinder.
+
+        :param format_control: A FormatControl object or None. Used to control
+            the selection of source packages / binary packages when consulting
+            the index and links.
+        :param platform: A string or None. If None, searches for packages
+            that are supported by the current system. Otherwise, will find
+            packages that can be built on the platform passed in. These
+            packages will only be downloaded for distribution: they will
+            not be built locally.
+        :param versions: A list of strings or None. This is passed directly
+            to pep425tags.py in the get_supported() method.
+        :param abi: A string or None. This is passed directly
+            to pep425tags.py in the get_supported() method.
+        :param implementation: A string or None. This is passed directly
+            to pep425tags.py in the get_supported() method.
+        :param prefer_binary: Whether to prefer an old, but valid, binary
+            dist over a new source dist.
+        """
+        if session is None:
+            raise TypeError(
+                "PackageFinder() missing 1 required keyword argument: "
+                "'session'"
+            )
+
+        # Build find_links. If an argument starts with ~, it may be
+        # a local file relative to a home directory. So try normalizing
+        # it and if it exists, use the normalized version.
+        # This is deliberately conservative - it might be fine just to
+        # blindly normalize anything starting with a ~...
+        self.find_links = []  # type: List[str]
+        for link in find_links:
+            if link.startswith('~'):
+                new_link = normalize_path(link)
+                if os.path.exists(new_link):
+                    link = new_link
+            self.find_links.append(link)
+
+        self.index_urls = index_urls
+
+        # These are boring links that have already been logged somehow:
+        self.logged_links = set()  # type: Set[Link]
+
+        self.format_control = format_control or FormatControl(set(), set())
+
+        # Domains that we won't emit warnings for when not using HTTPS
+        self.secure_origins = [
+            ("*", host, "*")
+            for host in (trusted_hosts if trusted_hosts else [])
+        ]  # type: List[SecureOrigin]
+
+        # Do we want to allow _all_ pre-releases?
+        self.allow_all_prereleases = allow_all_prereleases
+
+        # The Session we'll use to make requests
+        self.session = session
+
+        # The valid tags to check potential found wheel candidates against
+        valid_tags = get_supported(
+            versions=versions,
+            platform=platform,
+            abi=abi,
+            impl=implementation,
+        )
+        self.candidate_evaluator = CandidateEvaluator(
+            valid_tags=valid_tags, prefer_binary=prefer_binary,
+        )
+
+        # If we don't have TLS enabled, then WARN if anyplace we're looking
+        # relies on TLS.
+        if not HAS_TLS:
+            for link in itertools.chain(self.index_urls, self.find_links):
+                parsed = urllib_parse.urlparse(link)
+                if parsed.scheme == "https":
+                    logger.warning(
+                        "pip is configured with locations that require "
+                        "TLS/SSL, however the ssl module in Python is not "
+                        "available."
+                    )
+                    break
+
+    def get_formatted_locations(self):
+        # type: () -> str
+        lines = []
+        if self.index_urls and self.index_urls != [PyPI.simple_url]:
+            lines.append(
+                "Looking in indexes: {}".format(", ".join(
+                    redact_password_from_url(url) for url in self.index_urls))
+            )
+        if self.find_links:
+            lines.append(
+                "Looking in links: {}".format(", ".join(self.find_links))
+            )
+        return "\n".join(lines)
+
+    @staticmethod
+    def _sort_locations(locations, expand_dir=False):
+        # type: (Sequence[str], bool) -> Tuple[List[str], List[str]]
+        """
+        Sort locations into "files" (archives) and "urls", and return
+        a pair of lists (files,urls)
+        """
+        files = []
+        urls = []
+
+        # puts the url for the given file path into the appropriate list
+        def sort_path(path):
+            url = path_to_url(path)
+            if mimetypes.guess_type(url, strict=False)[0] == 'text/html':
+                urls.append(url)
+            else:
+                files.append(url)
+
+        for url in locations:
+
+            is_local_path = os.path.exists(url)
+            is_file_url = url.startswith('file:')
+
+            if is_local_path or is_file_url:
+                if is_local_path:
+                    path = url
+                else:
+                    path = url_to_path(url)
+                if os.path.isdir(path):
+                    if expand_dir:
+                        path = os.path.realpath(path)
+                        for item in os.listdir(path):
+                            sort_path(os.path.join(path, item))
+                    elif is_file_url:
+                        urls.append(url)
+                    else:
+                        logger.warning(
+                            "Path '{0}' is ignored: "
+                            "it is a directory.".format(path),
+                        )
+                elif os.path.isfile(path):
+                    sort_path(path)
+                else:
+                    logger.warning(
+                        "Url '%s' is ignored: it is neither a file "
+                        "nor a directory.", url,
+                    )
+            elif is_url(url):
+                # Only add url with clear scheme
+                urls.append(url)
+            else:
+                logger.warning(
+                    "Url '%s' is ignored. It is either a non-existing "
+                    "path or lacks a specific scheme.", url,
+                )
+
+        return files, urls
+
+    def _validate_secure_origin(self, logger, location):
+        # type: (Logger, Link) -> bool
+        # Determine if this url used a secure transport mechanism
+        parsed = urllib_parse.urlparse(str(location))
+        origin = (parsed.scheme, parsed.hostname, parsed.port)
+
+        # The protocol to use to see if the protocol matches.
+        # Don't count the repository type as part of the protocol: in
+        # cases such as "git+ssh", only use "ssh". (I.e., Only verify against
+        # the last scheme.)
+        protocol = origin[0].rsplit('+', 1)[-1]
+
+        # Determine if our origin is a secure origin by looking through our
+        # hardcoded list of secure origins, as well as any additional ones
+        # configured on this PackageFinder instance.
+        for secure_origin in (SECURE_ORIGINS + self.secure_origins):
+            if protocol != secure_origin[0] and secure_origin[0] != "*":
+                continue
+
+            try:
+                # We need to do this decode dance to ensure that we have a
+                # unicode object, even on Python 2.x.
+                addr = ipaddress.ip_address(
+                    origin[1]
+                    if (
+                        isinstance(origin[1], six.text_type) or
+                        origin[1] is None
+                    )
+                    else origin[1].decode("utf8")
+                )
+                network = ipaddress.ip_network(
+                    secure_origin[1]
+                    if isinstance(secure_origin[1], six.text_type)
+                    # setting secure_origin[1] to proper Union[bytes, str]
+                    # creates problems in other places
+                    else secure_origin[1].decode("utf8")  # type: ignore
+                )
+            except ValueError:
+                # We don't have both a valid address or a valid network, so
+                # we'll check this origin against hostnames.
+                if (origin[1] and
+                        origin[1].lower() != secure_origin[1].lower() and
+                        secure_origin[1] != "*"):
+                    continue
+            else:
+                # We have a valid address and network, so see if the address
+                # is contained within the network.
+                if addr not in network:
+                    continue
+
+            # Check to see if the port patches
+            if (origin[2] != secure_origin[2] and
+                    secure_origin[2] != "*" and
+                    secure_origin[2] is not None):
+                continue
+
+            # If we've gotten here, then this origin matches the current
+            # secure origin and we should return True
+            return True
+
+        # If we've gotten to this point, then the origin isn't secure and we
+        # will not accept it as a valid location to search. We will however
+        # log a warning that we are ignoring it.
+        logger.warning(
+            "The repository located at %s is not a trusted or secure host and "
+            "is being ignored. If this repository is available via HTTPS we "
+            "recommend you use HTTPS instead, otherwise you may silence "
+            "this warning and allow it anyway with '--trusted-host %s'.",
+            parsed.hostname,
+            parsed.hostname,
+        )
+
+        return False
+
+    def _get_index_urls_locations(self, project_name):
+        # type: (str) -> List[str]
+        """Returns the locations found via self.index_urls
+
+        Checks the url_name on the main (first in the list) index and
+        use this url_name to produce all locations
+        """
+
+        def mkurl_pypi_url(url):
+            loc = posixpath.join(
+                url,
+                urllib_parse.quote(canonicalize_name(project_name)))
+            # For maximum compatibility with easy_install, ensure the path
+            # ends in a trailing slash.  Although this isn't in the spec
+            # (and PyPI can handle it without the slash) some other index
+            # implementations might break if they relied on easy_install's
+            # behavior.
+            if not loc.endswith('/'):
+                loc = loc + '/'
+            return loc
+
+        return [mkurl_pypi_url(url) for url in self.index_urls]
+
+    def find_all_candidates(self, project_name):
+        # type: (str) -> List[Optional[InstallationCandidate]]
+        """Find all available InstallationCandidate for project_name
+
+        This checks index_urls and find_links.
+        All versions found are returned as an InstallationCandidate list.
+
+        See _link_package_versions for details on which files are accepted
+        """
+        index_locations = self._get_index_urls_locations(project_name)
+        index_file_loc, index_url_loc = self._sort_locations(index_locations)
+        fl_file_loc, fl_url_loc = self._sort_locations(
+            self.find_links, expand_dir=True,
+        )
+
+        file_locations = (Link(url) for url in itertools.chain(
+            index_file_loc, fl_file_loc,
+        ))
+
+        # We trust every url that the user has given us whether it was given
+        #   via --index-url or --find-links.
+        # We want to filter out any thing which does not have a secure origin.
+        url_locations = [
+            link for link in itertools.chain(
+                (Link(url) for url in index_url_loc),
+                (Link(url) for url in fl_url_loc),
+            )
+            if self._validate_secure_origin(logger, link)
+        ]
+
+        logger.debug('%d location(s) to search for versions of %s:',
+                     len(url_locations), project_name)
+
+        for location in url_locations:
+            logger.debug('* %s', location)
+
+        canonical_name = canonicalize_name(project_name)
+        formats = self.format_control.get_allowed_formats(canonical_name)
+        search = Search(project_name, canonical_name, formats)
+        find_links_versions = self._package_versions(
+            # We trust every directly linked archive in find_links
+            (Link(url, '-f') for url in self.find_links),
+            search
+        )
+
+        page_versions = []
+        for page in self._get_pages(url_locations, project_name):
+            logger.debug('Analyzing links from page %s', page.url)
+            with indent_log():
+                page_versions.extend(
+                    self._package_versions(page.iter_links(), search)
+                )
+
+        file_versions = self._package_versions(file_locations, search)
+        if file_versions:
+            file_versions.sort(reverse=True)
+            logger.debug(
+                'Local files found: %s',
+                ', '.join([
+                    url_to_path(candidate.location.url)
+                    for candidate in file_versions
+                ])
+            )
+
+        # This is an intentional priority ordering
+        return file_versions + find_links_versions + page_versions
+
+    def find_candidates(
+        self,
+        project_name,       # type: str
+        specifier=None,     # type: Optional[specifiers.BaseSpecifier]
+    ):
+        """Find matches for the given project and specifier.
+
+        If given, `specifier` should implement `filter` to allow version
+        filtering (e.g. ``packaging.specifiers.SpecifierSet``).
+
+        Returns a `FoundCandidates` instance.
+        """
+        if specifier is None:
+            specifier = specifiers.SpecifierSet()
+        return FoundCandidates.from_specifier(
+            self.find_all_candidates(project_name),
+            specifier=specifier,
+            prereleases=(self.allow_all_prereleases or None),
+            evaluator=self.candidate_evaluator,
+        )
+
+    def find_requirement(self, req, upgrade):
+        # type: (InstallRequirement, bool) -> Optional[Link]
+        """Try to find a Link matching req
+
+        Expects req, an InstallRequirement and upgrade, a boolean
+        Returns a Link if found,
+        Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
+        """
+        candidates = self.find_candidates(req.name, req.specifier)
+        best_candidate = candidates.get_best()
+
+        installed_version = None    # type: Optional[_BaseVersion]
+        if req.satisfied_by is not None:
+            installed_version = parse_version(req.satisfied_by.version)
+
+        def _format_versions(cand_iter):
+            # This repeated parse_version and str() conversion is needed to
+            # handle different vendoring sources from pip and pkg_resources.
+            # If we stop using the pkg_resources provided specifier and start
+            # using our own, we can drop the cast to str().
+            return ", ".join(sorted(
+                {str(c.version) for c in cand_iter},
+                key=parse_version,
+            )) or "none"
+
+        if installed_version is None and best_candidate is None:
+            logger.critical(
+                'Could not find a version that satisfies the requirement %s '
+                '(from versions: %s)',
+                req,
+                _format_versions(candidates.iter_all()),
+            )
+
+            raise DistributionNotFound(
+                'No matching distribution found for %s' % req
+            )
+
+        best_installed = False
+        if installed_version and (
+                best_candidate is None or
+                best_candidate.version <= installed_version):
+            best_installed = True
+
+        if not upgrade and installed_version is not None:
+            if best_installed:
+                logger.debug(
+                    'Existing installed version (%s) is most up-to-date and '
+                    'satisfies requirement',
+                    installed_version,
+                )
+            else:
+                logger.debug(
+                    'Existing installed version (%s) satisfies requirement '
+                    '(most up-to-date version is %s)',
+                    installed_version,
+                    best_candidate.version,
+                )
+            return None
+
+        if best_installed:
+            # We have an existing version, and its the best version
+            logger.debug(
+                'Installed version (%s) is most up-to-date (past versions: '
+                '%s)',
+                installed_version,
+                _format_versions(candidates.iter_applicable()),
+            )
+            raise BestVersionAlreadyInstalled
+
+        logger.debug(
+            'Using version %s (newest of versions: %s)',
+            best_candidate.version,
+            _format_versions(candidates.iter_applicable()),
+        )
+        return best_candidate.location
+
+    def _get_pages(self, locations, project_name):
+        # type: (Iterable[Link], str) -> Iterable[HTMLPage]
+        """
+        Yields (page, page_url) from the given locations, skipping
+        locations that have errors.
+        """
+        seen = set()  # type: Set[Link]
+        for location in locations:
+            if location in seen:
+                continue
+            seen.add(location)
+
+            page = _get_html_page(location, session=self.session)
+            if page is None:
+                continue
+
+            yield page
+
+    _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$')
+
+    def _sort_links(self, links):
+        # type: (Iterable[Link]) -> List[Link]
+        """
+        Returns elements of links in order, non-egg links first, egg links
+        second, while eliminating duplicates
+        """
+        eggs, no_eggs = [], []
+        seen = set()  # type: Set[Link]
+        for link in links:
+            if link not in seen:
+                seen.add(link)
+                if link.egg_fragment:
+                    eggs.append(link)
+                else:
+                    no_eggs.append(link)
+        return no_eggs + eggs
+
+    def _package_versions(
+        self,
+        links,  # type: Iterable[Link]
+        search  # type: Search
+    ):
+        # type: (...) -> List[Optional[InstallationCandidate]]
+        result = []
+        for link in self._sort_links(links):
+            v = self._link_package_versions(link, search)
+            if v is not None:
+                result.append(v)
+        return result
+
+    def _log_skipped_link(self, link, reason):
+        # type: (Link, str) -> None
+        if link not in self.logged_links:
+            logger.debug('Skipping link %s; %s', link, reason)
+            self.logged_links.add(link)
+
+    def _link_package_versions(self, link, search):
+        # type: (Link, Search) -> Optional[InstallationCandidate]
+        """Return an InstallationCandidate or None"""
+        version = None
+        if link.egg_fragment:
+            egg_info = link.egg_fragment
+            ext = link.ext
+        else:
+            egg_info, ext = link.splitext()
+            if not ext:
+                self._log_skipped_link(link, 'not a file')
+                return None
+            if ext not in SUPPORTED_EXTENSIONS:
+                self._log_skipped_link(
+                    link, 'unsupported archive format: %s' % ext,
+                )
+                return None
+            if "binary" not in search.formats and ext == WHEEL_EXTENSION:
+                self._log_skipped_link(
+                    link, 'No binaries permitted for %s' % search.supplied,
+                )
+                return None
+            if "macosx10" in link.path and ext == '.zip':
+                self._log_skipped_link(link, 'macosx10 one')
+                return None
+            if ext == WHEEL_EXTENSION:
+                try:
+                    wheel = Wheel(link.filename)
+                except InvalidWheelFilename:
+                    self._log_skipped_link(link, 'invalid wheel filename')
+                    return None
+                if canonicalize_name(wheel.name) != search.canonical:
+                    self._log_skipped_link(
+                        link, 'wrong project name (not %s)' % search.supplied)
+                    return None
+
+                if not self.candidate_evaluator.is_wheel_supported(wheel):
+                    self._log_skipped_link(
+                        link, 'it is not compatible with this Python')
+                    return None
+
+                version = wheel.version
+
+        # This should be up by the search.ok_binary check, but see issue 2700.
+        if "source" not in search.formats and ext != WHEEL_EXTENSION:
+            self._log_skipped_link(
+                link, 'No sources permitted for %s' % search.supplied,
+            )
+            return None
+
+        if not version:
+            version = _egg_info_matches(egg_info, search.canonical)
+        if not version:
+            self._log_skipped_link(
+                link, 'Missing project version for %s' % search.supplied)
+            return None
+
+        match = self._py_version_re.search(version)
+        if match:
+            version = version[:match.start()]
+            py_version = match.group(1)
+            if py_version != sys.version[:3]:
+                self._log_skipped_link(
+                    link, 'Python version is incorrect')
+                return None
+        try:
+            support_this_python = check_requires_python(link.requires_python)
+        except specifiers.InvalidSpecifier:
+            logger.debug("Package %s has an invalid Requires-Python entry: %s",
+                         link.filename, link.requires_python)
+            support_this_python = True
+
+        if not support_this_python:
+            logger.debug("The package %s is incompatible with the python "
+                         "version in use. Acceptable python versions are: %s",
+                         link, link.requires_python)
+            return None
+        logger.debug('Found link %s, version: %s', link, version)
+
+        return InstallationCandidate(search.supplied, version, link)
+
+
+def _find_name_version_sep(egg_info, canonical_name):
+    # type: (str, str) -> int
+    """Find the separator's index based on the package's canonical name.
+
+    `egg_info` must be an egg info string for the given package, and
+    `canonical_name` must be the package's canonical name.
+
+    This function is needed since the canonicalized name does not necessarily
+    have the same length as the egg info's name part. An example::
+
+    >>> egg_info = 'foo__bar-1.0'
+    >>> canonical_name = 'foo-bar'
+    >>> _find_name_version_sep(egg_info, canonical_name)
+    8
+    """
+    # Project name and version must be separated by one single dash. Find all
+    # occurrences of dashes; if the string in front of it matches the canonical
+    # name, this is the one separating the name and version parts.
+    for i, c in enumerate(egg_info):
+        if c != "-":
+            continue
+        if canonicalize_name(egg_info[:i]) == canonical_name:
+            return i
+    raise ValueError("{} does not match {}".format(egg_info, canonical_name))
+
+
+def _egg_info_matches(egg_info, canonical_name):
+    # type: (str, str) -> Optional[str]
+    """Pull the version part out of a string.
+
+    :param egg_info: The string to parse. E.g. foo-2.1
+    :param canonical_name: The canonicalized name of the package this
+        belongs to.
+    """
+    try:
+        version_start = _find_name_version_sep(egg_info, canonical_name) + 1
+    except ValueError:
+        return None
+    version = egg_info[version_start:]
+    if not version:
+        return None
+    return version
+
+
+def _determine_base_url(document, page_url):
+    """Determine the HTML document's base URL.
+
+    This looks for a ``<base>`` tag in the HTML document. If present, its href
+    attribute denotes the base URL of anchor tags in the document. If there is
+    no such tag (or if it does not have a valid href attribute), the HTML
+    file's URL is used as the base URL.
+
+    :param document: An HTML document representation. The current
+        implementation expects the result of ``html5lib.parse()``.
+    :param page_url: The URL of the HTML document.
+    """
+    for base in document.findall(".//base"):
+        href = base.get("href")
+        if href is not None:
+            return href
+    return page_url
+
+
+def _get_encoding_from_headers(headers):
+    """Determine if we have any encoding information in our headers.
+    """
+    if headers and "Content-Type" in headers:
+        content_type, params = cgi.parse_header(headers["Content-Type"])
+        if "charset" in params:
+            return params['charset']
+    return None
+
+
+def _clean_link(url):
+    # type: (str) -> str
+    """Makes sure a link is fully encoded.  That is, if a ' ' shows up in
+    the link, it will be rewritten to %20 (while not over-quoting
+    % or other characters)."""
+    # Split the URL into parts according to the general structure
+    # `scheme://netloc/path;parameters?query#fragment`. Note that the
+    # `netloc` can be empty and the URI will then refer to a local
+    # filesystem path.
+    result = urllib_parse.urlparse(url)
+    # In both cases below we unquote prior to quoting to make sure
+    # nothing is double quoted.
+    if result.netloc == "":
+        # On Windows the path part might contain a drive letter which
+        # should not be quoted. On Linux where drive letters do not
+        # exist, the colon should be quoted. We rely on urllib.request
+        # to do the right thing here.
+        path = urllib_request.pathname2url(
+            urllib_request.url2pathname(result.path))
+    else:
+        # In addition to the `/` character we protect `@` so that
+        # revision strings in VCS URLs are properly parsed.
+        path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@")
+    return urllib_parse.urlunparse(result._replace(path=path))
+
+
+class HTMLPage(object):
+    """Represents one page, along with its URL"""
+
+    def __init__(self, content, url, headers=None):
+        # type: (bytes, str, MutableMapping[str, str]) -> None
+        self.content = content
+        self.url = url
+        self.headers = headers
+
+    def __str__(self):
+        return redact_password_from_url(self.url)
+
+    def iter_links(self):
+        # type: () -> Iterable[Link]
+        """Yields all links in the page"""
+        document = html5lib.parse(
+            self.content,
+            transport_encoding=_get_encoding_from_headers(self.headers),
+            namespaceHTMLElements=False,
+        )
+        base_url = _determine_base_url(document, self.url)
+        for anchor in document.findall(".//a"):
+            if anchor.get("href"):
+                href = anchor.get("href")
+                url = _clean_link(urllib_parse.urljoin(base_url, href))
+                pyrequire = anchor.get('data-requires-python')
+                pyrequire = unescape(pyrequire) if pyrequire else None
+                yield Link(url, self.url, requires_python=pyrequire)
+
+
+Search = namedtuple('Search', 'supplied canonical formats')
+"""Capture key aspects of a search.
+
+:attribute supplied: The user supplied package.
+:attribute canonical: The canonical package name.
+:attribute formats: The formats allowed for this package. Should be a set
+    with 'binary' or 'source' or both in it.
+"""
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index.pyc b/venv/lib/python2.7/site-packages/pip/_internal/index.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5d8eed42181141893e79ce5137951eb0519bce46
GIT binary patch
literal 36283
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
Cikj5`

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/locations.py b/venv/lib/python2.7/site-packages/pip/_internal/locations.py
new file mode 100644
index 00000000..10860f7b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/locations.py
@@ -0,0 +1,211 @@
+"""Locations where we look for configs, install stuff, etc"""
+from __future__ import absolute_import
+
+import os
+import os.path
+import platform
+import site
+import sys
+import sysconfig
+from distutils import sysconfig as distutils_sysconfig
+from distutils.command.install import SCHEME_KEYS  # type: ignore
+
+from pip._internal.utils import appdirs
+from pip._internal.utils.compat import WINDOWS, expanduser
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Union, Dict, List, Optional
+
+
+# Application Directories
+USER_CACHE_DIR = appdirs.user_cache_dir("pip")
+
+
+DELETE_MARKER_MESSAGE = '''\
+This file is placed here by pip to indicate the source was put
+here by pip.
+
+Once this package is successfully installed this source code will be
+deleted (unless you remove this file).
+'''
+PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt'
+
+
+def write_delete_marker_file(directory):
+    # type: (str) -> None
+    """
+    Write the pip delete marker file into this directory.
+    """
+    filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME)
+    with open(filepath, 'w') as marker_fp:
+        marker_fp.write(DELETE_MARKER_MESSAGE)
+
+
+def running_under_virtualenv():
+    # type: () -> bool
+    """
+    Return True if we're running inside a virtualenv, False otherwise.
+
+    """
+    if hasattr(sys, 'real_prefix'):
+        return True
+    elif sys.prefix != getattr(sys, "base_prefix", sys.prefix):
+        return True
+
+    return False
+
+
+def virtualenv_no_global():
+    # type: () -> bool
+    """
+    Return True if in a venv and no system site packages.
+    """
+    # this mirrors the logic in virtualenv.py for locating the
+    # no-global-site-packages.txt file
+    site_mod_dir = os.path.dirname(os.path.abspath(site.__file__))
+    no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt')
+    if running_under_virtualenv() and os.path.isfile(no_global_file):
+        return True
+    else:
+        return False
+
+
+if running_under_virtualenv():
+    src_prefix = os.path.join(sys.prefix, 'src')
+else:
+    # FIXME: keep src in cwd for now (it is not a temporary folder)
+    try:
+        src_prefix = os.path.join(os.getcwd(), 'src')
+    except OSError:
+        # In case the current working directory has been renamed or deleted
+        sys.exit(
+            "The folder you are executing pip from can no longer be found."
+        )
+
+# under macOS + virtualenv sys.prefix is not properly resolved
+# it is something like /path/to/python/bin/..
+# Note: using realpath due to tmp dirs on OSX being symlinks
+src_prefix = os.path.abspath(src_prefix)
+
+# FIXME doesn't account for venv linked to global site-packages
+
+site_packages = sysconfig.get_path("purelib")  # type: Optional[str]
+
+# This is because of a bug in PyPy's sysconfig module, see
+# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths
+# for more information.
+if platform.python_implementation().lower() == "pypy":
+    site_packages = distutils_sysconfig.get_python_lib()
+try:
+    # Use getusersitepackages if this is present, as it ensures that the
+    # value is initialised properly.
+    user_site = site.getusersitepackages()
+except AttributeError:
+    user_site = site.USER_SITE
+user_dir = expanduser('~')
+if WINDOWS:
+    bin_py = os.path.join(sys.prefix, 'Scripts')
+    bin_user = os.path.join(user_site, 'Scripts')
+    # buildout uses 'bin' on Windows too?
+    if not os.path.exists(bin_py):
+        bin_py = os.path.join(sys.prefix, 'bin')
+        bin_user = os.path.join(user_site, 'bin')
+
+    config_basename = 'pip.ini'
+
+    legacy_storage_dir = os.path.join(user_dir, 'pip')
+    legacy_config_file = os.path.join(
+        legacy_storage_dir,
+        config_basename,
+    )
+else:
+    bin_py = os.path.join(sys.prefix, 'bin')
+    bin_user = os.path.join(user_site, 'bin')
+
+    config_basename = 'pip.conf'
+
+    legacy_storage_dir = os.path.join(user_dir, '.pip')
+    legacy_config_file = os.path.join(
+        legacy_storage_dir,
+        config_basename,
+    )
+    # Forcing to use /usr/local/bin for standard macOS framework installs
+    # Also log to ~/Library/Logs/ for use with the Console.app log viewer
+    if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
+        bin_py = '/usr/local/bin'
+
+global_config_files = [
+    os.path.join(path, config_basename)
+    for path in appdirs.site_config_dirs('pip')
+]
+
+site_config_file = os.path.join(sys.prefix, config_basename)
+new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename)
+
+
+def distutils_scheme(dist_name, user=False, home=None, root=None,
+                     isolated=False, prefix=None):
+    # type:(str, bool, str, str, bool, str) -> dict
+    """
+    Return a distutils install scheme
+    """
+    from distutils.dist import Distribution
+
+    scheme = {}
+
+    if isolated:
+        extra_dist_args = {"script_args": ["--no-user-cfg"]}
+    else:
+        extra_dist_args = {}
+    dist_args = {'name': dist_name}  # type: Dict[str, Union[str, List[str]]]
+    dist_args.update(extra_dist_args)
+
+    d = Distribution(dist_args)
+    # Ignoring, typeshed issue reported python/typeshed/issues/2567
+    d.parse_config_files()
+    # NOTE: Ignoring type since mypy can't find attributes on 'Command'
+    i = d.get_command_obj('install', create=True)  # type: Any
+    assert i is not None
+    # NOTE: setting user or home has the side-effect of creating the home dir
+    # or user base for installations during finalize_options()
+    # ideally, we'd prefer a scheme class that has no side-effects.
+    assert not (user and prefix), "user={} prefix={}".format(user, prefix)
+    i.user = user or i.user
+    if user:
+        i.prefix = ""
+    i.prefix = prefix or i.prefix
+    i.home = home or i.home
+    i.root = root or i.root
+    i.finalize_options()
+    for key in SCHEME_KEYS:
+        scheme[key] = getattr(i, 'install_' + key)
+
+    # install_lib specified in setup.cfg should install *everything*
+    # into there (i.e. it takes precedence over both purelib and
+    # platlib).  Note, i.install_lib is *always* set after
+    # finalize_options(); we only want to override here if the user
+    # has explicitly requested it hence going back to the config
+
+    # Ignoring, typeshed issue reported python/typeshed/issues/2567
+    if 'install_lib' in d.get_option_dict('install'):  # type: ignore
+        scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib))
+
+    if running_under_virtualenv():
+        scheme['headers'] = os.path.join(
+            sys.prefix,
+            'include',
+            'site',
+            'python' + sys.version[:3],
+            dist_name,
+        )
+
+        if root is not None:
+            path_no_drive = os.path.splitdrive(
+                os.path.abspath(scheme["headers"]))[1]
+            scheme["headers"] = os.path.join(
+                root,
+                path_no_drive[1:],
+            )
+
+    return scheme
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/locations.pyc b/venv/lib/python2.7/site-packages/pip/_internal/locations.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..20cbfdb393b678bdf59c0bbcd8b38da1148d9144
GIT binary patch
literal 5685
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py
new file mode 100644
index 00000000..7855226e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py
@@ -0,0 +1,2 @@
+"""A package that contains models that represent entities.
+"""
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..361de827aa635289d5f2a143baa5f6eb4556eb60
GIT binary patch
literal 278
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#4H#X7#tM}5|gtN
z(^C~nG7?J^lJoOQ5;OCP6>{@aQgezSf<>tXMXAN9c_j*|c_o=8nW@EkTz(oLqf6Ks
z7#QN?Q}UDJ<2685B8cJw1_lQGf}+f_#FA9~vcw|&wEUcu)S_bj>_YwQVk2{N!@?{h
z^D;vV^WvP!^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6@<hwhzzmQO7{_Pkm82Hs
nCFbZu+^8QPpP83g5+AQuP+7vkz`$UWo1apelWGU{BgjzzC(cXo

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py
new file mode 100644
index 00000000..b66c3657
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py
@@ -0,0 +1,31 @@
+from pip._vendor.packaging.version import parse as parse_version
+
+from pip._internal.utils.models import KeyBasedCompareMixin
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from pip._vendor.packaging.version import _BaseVersion
+    from pip._internal.models.link import Link
+    from typing import Any
+
+
+class InstallationCandidate(KeyBasedCompareMixin):
+    """Represents a potential "candidate" for installation.
+    """
+
+    def __init__(self, project, version, location):
+        # type: (Any, str, Link) -> None
+        self.project = project
+        self.version = parse_version(version)  # type: _BaseVersion
+        self.location = location
+
+        super(InstallationCandidate, self).__init__(
+            key=(self.project, self.version, self.location),
+            defining_class=InstallationCandidate
+        )
+
+    def __repr__(self):
+        # type: () -> str
+        return "<InstallationCandidate({!r}, {!r}, {!r})>".format(
+            self.project, self.version, self.location,
+        )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..05b973f6ad33d6eb7869630349a57eb94d867ca5
GIT binary patch
literal 1709
zcmZSn%*&NH<x)&C0~9bbFfceUFfbH1GcYiuFfgPrGUPBY<T5fuF)=WL_)H8r%nZ3K
z3{fl)J~KlOD?=_DLlheWV=5a%Q6^Xy3s@IBLliqi6)Qsy2SY9=Llh^3&&H6$#gNO*
z5XH^Fn8(17!p@M&!jQ(ukix;x!obkXzz`Y5!;r$s5Ujz)z`&6C|NsC08jK7K3?-}#
z3=9Q{Ma8KQt_TAIgLi7BQ(|#yigSK$L1Iy=Z)Qbi9z<4%fq}s{G9WVE*~8V@J3c7X
z&(G7(9U{lWz`zg>(ifImRGgU))xpBRz~Gaamkm(^3Jk}*$`Vlq1_sZ(;*!LioWzpM
z{5<Exyp+t8#FA8auz}p>1PV3<1_p*y28Jj`P%uO>fx@qafgy^SA%zL#vnUpZpkNJ<
zxy6<Y3=Bc31x2aFsd**E3W*8@`6a1&C7Fpi3QEZ^3zQVn@{1HQk?hvvQczG(NCr6+
zghAoq46-<kfq|ihk)eixA)bMugpr|!iJ=+7Wn!pd28%N@l(2w8u!e!5nTa8b4dl2Q
z28JvKkZcwcm}F*11G}|^m7$q|2^8ZH=lYd^9G#t7S;7ZO7^!KQd6{|X@yR)f#l;%z
zpqK#>1x5K;smUcJys%h`FN1_`2}l;k=3ro8$jMIz2PHT{i%Sbqi-Oodrhw$)<1_Oz
zOXA}-Kprds5yh!FX+fNz0OJM`pt#cjC0H;~T*$z{pkGjwS(aFms$Z5^q@R|blag9g
zte;(|pIvNZZf;nZWn^AvXklKQQ<+{KZ<1nSVqjokke;U>qF<0%pbHIO-SR}s(!dOm
z5E#d2=9Q!t<t66m=jNxR<`nD0qeZWvG6)n70-%rwxrTv>laZg1lSznCf-xDC7(f{0
za&X+pfP#z>7SN2~fQAKkGc!Z51``7VgI}>G0|SE%)^w&(tyom6qktea?I3{z3bVBQ
zqTIw1^xy$GAc&uVfdL#wU}9hbsss|HMX3cv@$u5200V^!0}~sg1}O1DrSlSVQ{&@H
zxInowJ~uz5GzY{5rJDHol>FrQcyM?J38Hvt0DT2ct)Q4M21NlI6B`pJx1R<m-IvIM
z5`SiaUVK?<UP^wEUO{4Vc4B&FUb-GM0|bGRZV<?;B~mc8u%xC}T9TPltOrSOL7+&)
zsivf|ATuvL2$Xh$K$){d62mZvF?u<fdD%grP%i;F7OD>v_+VdvLlHp?U@EbJM7$ly
W+r{Ag#U#Kez{JKVz$m~d%nSf@5S4lW

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py b/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py
new file mode 100644
index 00000000..53138e48
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py
@@ -0,0 +1,73 @@
+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, Set, FrozenSet
+
+
+class FormatControl(object):
+    """Helper for managing formats from which a package can be installed.
+    """
+
+    def __init__(self, no_binary=None, only_binary=None):
+        # type: (Optional[Set], Optional[Set]) -> None
+        if no_binary is None:
+            no_binary = set()
+        if only_binary is None:
+            only_binary = set()
+
+        self.no_binary = no_binary
+        self.only_binary = only_binary
+
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __repr__(self):
+        return "{}({}, {})".format(
+            self.__class__.__name__,
+            self.no_binary,
+            self.only_binary
+        )
+
+    @staticmethod
+    def handle_mutual_excludes(value, target, other):
+        # type: (str, Optional[Set], Optional[Set]) -> None
+        new = value.split(',')
+        while ':all:' in new:
+            other.clear()
+            target.clear()
+            target.add(':all:')
+            del new[:new.index(':all:') + 1]
+            # Without a none, we want to discard everything as :all: covers it
+            if ':none:' not in new:
+                return
+        for name in new:
+            if name == ':none:':
+                target.clear()
+                continue
+            name = canonicalize_name(name)
+            other.discard(name)
+            target.add(name)
+
+    def get_allowed_formats(self, canonical_name):
+        # type: (str) -> FrozenSet
+        result = {"binary", "source"}
+        if canonical_name in self.only_binary:
+            result.discard('source')
+        elif canonical_name in self.no_binary:
+            result.discard('binary')
+        elif ':all:' in self.only_binary:
+            result.discard('source')
+        elif ':all:' in self.no_binary:
+            result.discard('binary')
+        return frozenset(result)
+
+    def disallow_binaries(self):
+        # type: () -> None
+        self.handle_mutual_excludes(
+            ':all:', self.no_binary, self.only_binary,
+        )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a8002448a13a5cf6b46b87e49d49a503301d063
GIT binary patch
literal 3380
zcmZSn%*&NH<x)&C0~9bbFfceUFfbIyGcYiuFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJsjH%2FMXq2~%nUg!47scfQLGHPYz$Fs47uzKQS1zic?=9GEDWg}3~7uEDXa`F
z3=GW-43SZs3@L03!5Zug3=En7|NsB5!N|bCP$I~{z>u7nm!FrJoS2hYl^UOyn41cb
z5@KLr@Qn<JjCb~Mb@q-A3ib2z^mEq$xweFZfq}ulpd>RtFEOVCBodrjQo_l=z~EMt
zUzM5%;_-rb`9-;jCC>SIB}Mr;DE@T<`8Se*fgzOv<joWYhA1Y66b>+AWN2Yxh+<(#
zVFEcmij^US8O&e<`KyHi<jGVHnAaE?AU*?$b1|f_gH>`f1O;n=oKx)1z`)><np2Qk
zq>z?hq>!7KmzbWJmk#3OCYBT{q!s1oDwJnrCTA!lDikCpXD6noDkLZ7DI}#TWabr@
zB<AF#rs#1gC@3f-gZv4?ObiSR&LH=@F)%RHFoGf@n}eZ9f}w;F6x6kh40#L;HB2yZ
z1DH4ySe%iehJhiT38VnTU<N4*28Xzx1`8-kK!jg@UMe_Ti=p9~mmi;$nU`2pS;Ec0
zz>uGpQwilm;sd0oI5j6N2oy0voD2*M8lc1lCW^}#7#Q>miZaU*OH%dA5{vZH@^eyB
zi;DHL3-z;$jm*sr3$u*O%M2~di*qW|%i~Q_OiT<63=Goq^h5LuG7EH}0ij!-XjvMV
z0TKe^_{_YL)S|q^9R1w<l+>JJ{WNfN$0tMLTd$xJoKE87GxIV_;^RRHqL>HdEG8aC
zFl6FnOa=ue41)tz02HVU3|Ziy&0=84W@3N^4>-kwd>9{}l9^l*AFlz@8N>w&HC9lt
zlw_n9f&C072GZkf3=9nM@u`LJ@#3JA0&*t<7SHk_d$yU8fd|>EK_FR#7lS|n2=*A5
z7<k|1rN+lgA^8pzJs=E9jNqu02bE`x;HYF^$YNy3VgjZ8EM_pt!qCjj5DfO7UojU0
z14DJKMs=-@LUpaC1}HL1KtTveQQ(p#K0Y}ovA8%s9-62?1yy`JQi2Cr4NeQ--~kf@
z8AgzFT9jH)6dx}O3MG&L10x$FCnFmpxGVwr5>%dm!)hNqC8RJiG&3^PGBZ?!f{MTz
zW`=AwhN3i3fsq9+U>Iu{L7~~qzyM}3fmAg!GBDOKGt@9MWHCeeDa;JwCMhf+v21pR
zA|Y@=Qz*m`UJ(EibBXm}sAXZOVF8t@*-Q*Y6F_Ad)P}-5P+3(1mIgV71#CMjNHy3d
zNL;dj9LiXj#}J;vzz__MHNO&2H0TtA{AQJylVg<$;unMB(kd@MFV#u|#4G_x7Z>DY
zmVjBwIjM<7;NmVZB?T;!nU|7U5d<nLN<bA>N@j6#Vo?g%2C#ftVoqr)IE9oX7Nw__
zfb#~}guK-95>NsJB@b{K022e55X2Z57%~#`QgTw`b4yD~6LaEIE0S|cQ&NjnK*>T5
z<V$9LMt(*vMlMEPMiC|+Mh-?^Mjl2kMm9zsMqWs<0ZJ&KQUsh>CP6Y*3KK&H6GJT%
zDB^0sMJ6bvXoKU55t<4Z^I~DrOyGp%1(OCRGsZkSQ1yz?oe7g>0!MD1JWLv*y8|W-
z)y=?A!VD5>W@HEkS6_bMSb^46ptvs1FD*(=MI;EYDsUAQB+0<Q0M5YR44wvVIuxgt
zfU7icPA&nJfbixCxNQP9z9_Z0G^Yd{vtVK%qgR-LfgwG$Bt9`GC%-&3B_2{_6<dJf
zRs<BcOgxPIi~=Y)8I&nN7?e`MF$yXnAd!&52reEWBonBR1hoNS1tlosfb$h3kU)tC
z9D?8g1-Bx=0S68hFfoup18Q8RWEO)%2GU%~Of7Z=1q{gF3`}f{ej1<#K@g~^Spup9
z;^TAkQ%ZAE<Kw~kK0ZDrKRG@=2$YV3xIw7}lpuomK`c<Xmw<E^mn4>CCg-M>WaOs=
zfdd4TuYy!j8bJdc7D1qh;{<sf)V^V3Vq@ax;$-Gz=49s=;pFwx0C~Pdnt_3#AhSR(
zzAQB_CBH}y(jLvsOV=wc$;>H+l!u@i7pw@@`hrO6l~fjF=A{RLQWZFlK>46DBM4M@
t1cAaFER&y<m6}`vb`dyO5X3+x7EtwQ1Brb*kSB^k0s>3|Ol*wu%m6~q2G{@q

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/index.py b/venv/lib/python2.7/site-packages/pip/_internal/models/index.py
new file mode 100644
index 00000000..ead1efbd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/models/index.py
@@ -0,0 +1,31 @@
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+
+class PackageIndex(object):
+    """Represents a Package Index and provides easier access to endpoints
+    """
+
+    def __init__(self, url, file_storage_domain):
+        # type: (str, str) -> None
+        super(PackageIndex, self).__init__()
+        self.url = url
+        self.netloc = urllib_parse.urlsplit(url).netloc
+        self.simple_url = self._url_for_path('simple')
+        self.pypi_url = self._url_for_path('pypi')
+
+        # This is part of a temporary hack used to block installs of PyPI
+        # packages which depend on external urls only necessary until PyPI can
+        # block such packages themselves
+        self.file_storage_domain = file_storage_domain
+
+    def _url_for_path(self, path):
+        # type: (str) -> str
+        return urllib_parse.urljoin(self.url, path)
+
+
+PyPI = PackageIndex(
+    'https://pypi.org/', file_storage_domain='files.pythonhosted.org'
+)
+TestPyPI = PackageIndex(
+    'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org'
+)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fd9cf7fc06dabc0d336a52d95b52aee404388bdf
GIT binary patch
literal 1555
zcmZSn%*&NH<x)&C0~D|@FfceUFfbJRF)%QsFfgPrGUPBY<T5fuF)=WvFfpVuGo&#x
zq%bqIFfcSTFhoYNFr>0Dq_8lgurj2uF*GwWMzMlL*uf$kU=cQk6i$X<4K4--hRpx}
z|NqxuWME(@VP#-oC`c?SPA%bKU|<MHOwLYBPxZ`8Nv(jp2Bgjj<QfGA28L7yhA2jm
zo1&ON&T3&`h+<|)VFI}%iiII4Sc4g)(w%{UAt<$=D782>ucTNZQ2}bO0@!4Q#Jm)R
zf};Gg%#_q(h1A62%+w-<#N_1E;$nr8e1+7!l!E-sypm!r1qB6#WRQU{><ltI3FK}D
zh7v}G8U}`DCWb5~P#`eYfcf#v3?(cKS*#2-j10|;3|VX-Me$%Viyh?RW{5HlkT^($
z38busfgzrgp@s=07|#Xr9>gPlC2SxYGjj`aQcFOwQczitslg3$04U&!OAAtqf<WO@
z!ok465FekJmst`YUjlM&X;BV1NK1=yax#<RAz=(sRa%r&T#%Dl0ya7?wInA$xr7&_
zyR;}LJ}ti}z96wAql61?Z#>8(kVcT*V2&^Y14CM7PHKE{Nq$jcdTM-1er{rB9ysX1
zt}IT?NecqGJP2g41}Ig5iQ-%a1_u3tqRg_yl2rY&#3KE){G623qGJ8*LjCMwBXe`Z
z!Ym{6GD8dV;+)F#@_3UJ6B7di1B3KD{Sf_v%mUrayyB9?oE+WqM9b2^43H2Q$7kl1
zq!#5R=IH0<r=;c->t}*ekX}J$5Ga^HjxPo!F9s%IMovaiMj=Ka)?_9I1_lrY1r|77
zLEb81V8~(w#X=SnI0l&*g2Cz35A3-hc2LNJh|;2*to+P8uqQP@rUdbUq`*;>Sdszu
zEtnVpFN2~^6cl|RcQG(&fPw&;KJpTCQ{&^oksBYMo1ape1LA@_6d#|GpBx_#4zD1P
z31HVFhym~iC|!dBv>23<*qGRuIC+Z&85kHcN=gcft@QOl=}|AgC|w_%%8JFHsj^tF
zpt2+*KQAM{xFj_NqyQ`h(^ZmMT%rfpS}YBUw$$PhT~LC?)as`J3Y-!dP$`vJpch}3
znwOGaq*t6-p_iLqmRhU_$zDOABo0X(Ajjq>Wu+#UKr$xC2LY7<p5Pb=Ni8k`aS-7O
fX3;-z!LG4^qyRfmKo^7JT!2|jjG2+2iJ1`q_>+1`

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/link.py b/venv/lib/python2.7/site-packages/pip/_internal/models/link.py
new file mode 100644
index 00000000..2f420760
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/models/link.py
@@ -0,0 +1,163 @@
+import posixpath
+import re
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+from pip._internal.download import path_to_url
+from pip._internal.utils.misc import (
+    WHEEL_EXTENSION, redact_password_from_url, splitext,
+)
+from pip._internal.utils.models import KeyBasedCompareMixin
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional, Tuple, Union
+    from pip._internal.index import HTMLPage
+
+
+class Link(KeyBasedCompareMixin):
+    """Represents a parsed link from a Package Index's simple URL
+    """
+
+    def __init__(self, url, comes_from=None, requires_python=None):
+        # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None
+        """
+        url:
+            url of the resource pointed to (href of the link)
+        comes_from:
+            instance of HTMLPage where the link was found, or string.
+        requires_python:
+            String containing the `Requires-Python` metadata field, specified
+            in PEP 345. This may be specified by a data-requires-python
+            attribute in the HTML link tag, as described in PEP 503.
+        """
+
+        # url can be a UNC windows share
+        if url.startswith('\\\\'):
+            url = path_to_url(url)
+
+        self.url = url
+        self.comes_from = comes_from
+        self.requires_python = requires_python if requires_python else None
+
+        super(Link, self).__init__(
+            key=(self.url),
+            defining_class=Link
+        )
+
+    def __str__(self):
+        if self.requires_python:
+            rp = ' (requires-python:%s)' % self.requires_python
+        else:
+            rp = ''
+        if self.comes_from:
+            return '%s (from %s)%s' % (redact_password_from_url(self.url),
+                                       self.comes_from, rp)
+        else:
+            return redact_password_from_url(str(self.url))
+
+    def __repr__(self):
+        return '<Link %s>' % self
+
+    @property
+    def filename(self):
+        # type: () -> str
+        _, netloc, path, _, _ = urllib_parse.urlsplit(self.url)
+        name = posixpath.basename(path.rstrip('/')) or netloc
+        name = urllib_parse.unquote(name)
+        assert name, ('URL %r produced no filename' % self.url)
+        return name
+
+    @property
+    def scheme(self):
+        # type: () -> str
+        return urllib_parse.urlsplit(self.url)[0]
+
+    @property
+    def netloc(self):
+        # type: () -> str
+        return urllib_parse.urlsplit(self.url)[1]
+
+    @property
+    def path(self):
+        # type: () -> str
+        return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2])
+
+    def splitext(self):
+        # type: () -> Tuple[str, str]
+        return splitext(posixpath.basename(self.path.rstrip('/')))
+
+    @property
+    def ext(self):
+        # type: () -> str
+        return self.splitext()[1]
+
+    @property
+    def url_without_fragment(self):
+        # type: () -> str
+        scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url)
+        return urllib_parse.urlunsplit((scheme, netloc, path, query, None))
+
+    _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)')
+
+    @property
+    def egg_fragment(self):
+        # type: () -> Optional[str]
+        match = self._egg_fragment_re.search(self.url)
+        if not match:
+            return None
+        return match.group(1)
+
+    _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)')
+
+    @property
+    def subdirectory_fragment(self):
+        # type: () -> Optional[str]
+        match = self._subdirectory_fragment_re.search(self.url)
+        if not match:
+            return None
+        return match.group(1)
+
+    _hash_re = re.compile(
+        r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)'
+    )
+
+    @property
+    def hash(self):
+        # type: () -> Optional[str]
+        match = self._hash_re.search(self.url)
+        if match:
+            return match.group(2)
+        return None
+
+    @property
+    def hash_name(self):
+        # type: () -> Optional[str]
+        match = self._hash_re.search(self.url)
+        if match:
+            return match.group(1)
+        return None
+
+    @property
+    def show_url(self):
+        # type: () -> Optional[str]
+        return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0])
+
+    @property
+    def is_wheel(self):
+        # type: () -> bool
+        return self.ext == WHEEL_EXTENSION
+
+    @property
+    def is_artifact(self):
+        # type: () -> bool
+        """
+        Determines if this points to an actual artifact (e.g. a tarball) or if
+        it points to an "abstract" thing like a path or a VCS location.
+        """
+        from pip._internal.vcs import vcs
+
+        if self.scheme in vcs.all_schemes:
+            return False
+
+        return True
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8ed6bd5076bda20aa5db40458ec9ad5ad7d073b3
GIT binary patch
literal 7361
zcmZSn%*&NH<x)&C0~9bbFfceUFfbG!W?*1QVPHsMWXNG)h=Q{j8KM}$;!F%VObofq
z3{fl$j39N)3^}X}xoiwkY!E&RLk>GbE(b#t2SY9=Llh@NE*C=-7etPgA%~kGmxm#W
z2f}A#$l+zk<ztBAV_;0>V<=h)wt<}?ho2!=fFVkNAy<$gN{}H}h#^V{qJx7WN0=d3
zgds|VfiaJPA%&A6m4_jXks*bPp@o5=nSmiPN)+VwU=3~t28PW4|NsB@(_my^U?^c_
zU|=XnEGkZga6!@qi6t5FCHe8CML8NE|CjJHFffFBxVrkpyGDe#`UQLX`;|yAFfbIQ
zrX(hp#1|wM7nkQ3rNpNd<>!KQm2iMUtRN?|B(<UhVy*}S1A}*JrBh;YYKn7yZb4#E
zs&8gRW*$UVh=GB@H!>hH-r2*|**iWc)X&e;&mCep$SnVYlFa<P#2m0|LrM#BQo*dy
zyv%&42_RJ-A-+BViRq~&EDQ_`KACyhD6!}Saudk9R0e3AMKLj?h=LI#Lkklq=2DnI
z!4<{IkiraRurZ{vGo-M9*v*Wfr~`3XVO&nIEE|l=1?IBDxZDgW93XZS4_KTN#0D9{
z3+6)Ng%K3Rsr(FC0t_kK3?NxSuq+Quu@D1PmKQ8543_1C$%?>a`N6WHU|9i}tQeRp
z2;+)_xk50m1ehxf<4S_LA~3ELLr}1W7%0T-85kIXQVWVwi&OJTiWL$Sz=<VAAty60
zTLBc|3W*8<iOJcC>8T2yc`2zC>ctAhnYjfysS2S%K3ob43JS@f_yA#0T5|>&n$5t#
zP{YWO1<p^+j0{C`3?+;pk!D7QT1JLEuxt$jLp&2h4HE;1!OT#@%ur+lBJ-F*Q34WV
zWhh}|C}9UFXl7!_;$TPtE6!p9#a{_KLo)*tV+spHum;HD;zf)M3}E+w+*DeWV+H3x
z1r+kr6iPBu6^c@e^Gl18QxyvGGxJJPQxr<_6*Mx6Qqy1xKz`SR>rT$kO)UneeN+=O
z^NLFn^O93Rx?o9Dp*$nCC>3lA$Pk6{#A1cC{L;J>9fkZNh2oN;%)E3xxXDGSg{7HA
zsm1XHl_eSZd8oz*gB2?z=jW9qX69w)rGrgP2!iU-4FKy&P{>U!NlZyBNmNM7OwCEr
zQ7A4*P0mcqOih7X1M+@mo<e|YfP%4!sh&beMrN@>ZepcEQYu2VLQ<tdq5{YuU6`|U
zA<jZEC$XfYC^M<FBvm0Z59}b2&moDWBr#n_A+cB?CAB!YC^IQF1*8OIsi}c6!q3G_
z3=9l0F(sgaCp)#Wgb!5irlx^?7@wSzSX}I<!3iq3xIhW1B(bQZxID8YBM4lWfi#sC
z<&=Qr5YYlI5B&1;Qo#io%=OSf1s5d6r3I-)L7=h^Ty(|9XXa&=#K&uZ5-nJFacWLl
z5I-m@2!IGsd8GlWA;3g&4g&*&enC-YSz<}5epzCXep-G`N@`KDes-aLcCnGUxnW_J
zk$IV+g?VvKWqNtMNs5Vyfq{WRdY*oWenDn|E;y;=<mi?sT9yW8fP}y}9+dow@)C3O
zbMsSDbBgsrX-2Q0G6+<ff^#RxH4J?GjQmWTjGT<3OhSyDjLD#&0EHsR_2BFl1Ilg;
zpzKy8391EZz-%#4PGbY*nOa6r7Rq8|C~^ho940WA8C0l%l!9|+8Z(1fa0wGb2@689
znUNtlg@GX$98P}4q6`cS3L3ERg{BTG)nd&OP*4?vVp6qOK?7W9s1|Fg7K8I;5GXK%
zKpqJKMIShn!LeUlQltU$Mi9u{5)iAX036<6g6@G{!p^|J5FcM$QWPI=07`ox|1dCe
zG72!UF>*5UGx9NkLmn3T;E)GZODW*c6$=J?#;=%@fq}sWR68lC7TbZn0;-f4z`lfV
z!J$R(GzCrgMX3cv@$uFm|A9iB0g{?P<tGS({RAq!OBfik7{LjF36x4=SV6^hEfYg6
zGnm21P{PcR#R4j=vsghXu9*>}tiT3ToY%52fV8tQ)UbdAYgs^y;&f0!4llpOni(0I
z7(o)j;8uWN2`E_gi=`PD7(#=56jX~83X1YmN|RGl6!P*F(lT>W^AdAYH9+BA!o$G8
zP+F9elbI9`uB^abD=o??2DL~a>5CK8>d7z8tN^uj!176n#b6^!*gy>%P)S?>j`7mG
z!qWVbRB$=uSX`W11Zs)678T_eK~gU`ae^Ed57wENT9T8W3@$UkMuYMo*kzzd1xGLa
z6D}xFU?F4&idim@W0(~g<rw)HB_S~k@&PEq!7&UfUO-XAh=}17Mg~b}3eE)S2FFT}
z45%=a1reaKad4z#Q2Z4qXQbw)x`X@*@)QFzX3iwwM^JbST0aJ<fEu`1d<QB(!7&Jm
z6G#k#NG5PRg3EJIJc5dCNMV!-3LS9i4T(xcP*j5Sf^*5Bh|eHZ1_p*eEPe&$EU;hY
zL9GD>Py;dx=Fuz`M4^N5Z4jvRfaF?`<{&wcZ$Y}jb_6LfFfa@bFN0hc2KO?SY6VpF
zfNExN*A5h=u&fDAwjd%1WX7QI4Y)2(ttg3tdkB&nLHQJf!EtB{i9?)q3JXImE4bER
z2K5qZm_Rj44GXASoW=^OM1sLy^@Bt%YN-Tn43-w<l;%Ooe?d?*gDeKuxIv&Y8JwTM
zi2&RhEG$hessvXGX+??Yxv6<2AVmydg8rp9sGuq>%83WHa`Q_|;$d!z2ZbjnmKm58
z8H+*XZ?v*nY-)PCtwwa5TCA2PxXc4(a1aKEvJSi*h#b(M)*mB7u{<a=gF(GASmr@V
zRG{j=1k_54PfbrpIHD*OT<sO7CKe@UfJ==aPymC&F}*0iv;bVtfP)$=mYZ0ToB<9=
zFhT#|1T_wjeUJ_cMo<mOz%0th#>m203>w)01!Zw*Qc7k~YH~?_Q6&w-R1(yzM79e#
zaD((gWfUlK!ND2?YIq_-G{_K?mci9Ah@gL9f*L<qonD9$szxBE7H1?H))Z$X8X1{@
zC}RsSWn^jw;+Yy6)#Rp_YT9Z<C+emd=vu~VlbD8!G(e?87BjT)hxAQAsoxJ$(Sg%2
zD6Zo(5{on9i&Bw-7ZkGKFdjs~3(DOfm)4?&CNHGP2J#pP6U^Fpf(2AnKnhJ$P(nkb
zw!s)2oD2*Mpx}rHHK<#$h6%_&pil#c3CIti<_{yd`NPBjNf;?i49(yHB1sUR1=RnA
z^1&?yP#S^sHk30#rh!|#;NFKlq@jdpHGr}uxKIOEEZ`alT+o3_HZVc|90^L@#TohK
zpkdfvP!NGq2)6bwFT5@&VPwc=Vu014AoW3-pu_-T4IWQr7RQ%oq^9OfLh}^Jl^_g`
zaV^kb5hEx{a~K$M!DESxpmq`yv|Pw$V<=Js4PgYAurfe;mc<JgkcI_aQcF^cax?Q%
zixo0KgMpdFkU_v=g_3-Q#5{$><dV|F9EHT9lFYQk<PrsqRK0XPg+zst#G<6coE%Ni
zC|+h7d_*j>1Xa6IVp4HQQDSn5l0r!aXvi)nGdmSLrdpB#(we9c<{Ye$lb@Uj>SZDZ
z#lQph;J5&{rpl6wH9#$x5>QoJkXfJyA1Kl*OD+xqHKxGrni9~6R$@+0JfuHV3{I?W
zi8;lPA@Y!-(p03<4x|m7YQY5klP<`ynZ@z2u$>NyXi#!yU>9H#Vq{_R(*U*K!R@km
za1jt64{qDV$LHp!l;)(y$AdfU@$o77$?@^vvK%~676htcgQP$$OptK}MfnA(MJ1I%
z>Yzjp@++eG2W~Y(Qok-pJt$!nrGkx3&d)8#%t;N>1L*=)W<kavmI;Uemz`!HmN|$3
zjh+PAfLNe82apYrwj-ED_izOdYl6nuib2gkHYPSEeko3FPG){iepV3VWZ`G!XX9t$
z=Kx_gMowma4t@@h40r+n(n|t$rAt8VYH(^ROU+BkFVZW{tkBENFH0@fgN(KWff^y;
zj${dFa1yK(HiD^_l3$*elb@IZ8K?!du~6kpOEPnc^>Q<dlY>B^4jBss73C$Mn8T_T
zJSG|hDzI^?DXA>T%u5dfXBIF4;e&?qf<TEOh!Yge!l2P0lx&m<n#l;_0>vRHS%PB@
oLC`%8!HM1mlFaQuwNf#tSHQ!_!z92Yz$n8k03L*tVH9Qt0KSrk#Q*>R

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ae904bfb65b08638517f38133a7b89d1e986960f
GIT binary patch
literal 203
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaR~zhgML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GMGxJJPi}Dh4^z#c+ixNvR^Ye=J<Kr{)GE3s)^$IFW
WI2afhY;yBcN^?@}K+Y=$xefsOq%>^+

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/check.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/check.py
new file mode 100644
index 00000000..920df5d4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/check.py
@@ -0,0 +1,155 @@
+"""Validation of dependencies of packages
+"""
+
+import logging
+from collections import namedtuple
+
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.pkg_resources import RequirementParseError
+
+from pip._internal.operations.prepare import make_abstract_dist
+from pip._internal.utils.misc import get_installed_distributions
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+logger = logging.getLogger(__name__)
+
+if MYPY_CHECK_RUNNING:
+    from pip._internal.req.req_install import InstallRequirement
+    from typing import (
+        Any, Callable, Dict, Optional, Set, Tuple, List
+    )
+
+    # Shorthands
+    PackageSet = Dict[str, 'PackageDetails']
+    Missing = Tuple[str, Any]
+    Conflicting = Tuple[str, str, Any]
+
+    MissingDict = Dict[str, List[Missing]]
+    ConflictingDict = Dict[str, List[Conflicting]]
+    CheckResult = Tuple[MissingDict, ConflictingDict]
+
+PackageDetails = namedtuple('PackageDetails', ['version', 'requires'])
+
+
+def create_package_set_from_installed(**kwargs):
+    # type: (**Any) -> Tuple[PackageSet, bool]
+    """Converts a list of distributions into a PackageSet.
+    """
+    # Default to using all packages installed on the system
+    if kwargs == {}:
+        kwargs = {"local_only": False, "skip": ()}
+
+    package_set = {}
+    problems = False
+    for dist in get_installed_distributions(**kwargs):
+        name = canonicalize_name(dist.project_name)
+        try:
+            package_set[name] = PackageDetails(dist.version, dist.requires())
+        except RequirementParseError as e:
+            # Don't crash on broken metadata
+            logging.warning("Error parsing requirements for %s: %s", name, e)
+            problems = True
+    return package_set, problems
+
+
+def check_package_set(package_set, should_ignore=None):
+    # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult
+    """Check if a package set is consistent
+
+    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 = dict()
+    conflicting = dict()
+
+    for package_name in package_set:
+        # Info about dependencies of package_name
+        missing_deps = set()  # type: Set[Missing]
+        conflicting_deps = set()  # type: Set[Conflicting]
+
+        if should_ignore(package_name):
+            continue
+
+        for req in package_set[package_name].requires:
+            name = canonicalize_name(req.project_name)  # type: str
+
+            # Check if it's missing
+            if name not in package_set:
+                missed = True
+                if req.marker is not None:
+                    missed = req.marker.evaluate()
+                if missed:
+                    missing_deps.add((name, req))
+                continue
+
+            # Check if there's a conflict
+            version = package_set[name].version  # type: str
+            if not req.specifier.contains(version, prereleases=True):
+                conflicting_deps.add((name, version, req))
+
+        if missing_deps:
+            missing[package_name] = sorted(missing_deps, key=str)
+        if conflicting_deps:
+            conflicting[package_name] = sorted(conflicting_deps, key=str)
+
+    return missing, conflicting
+
+
+def check_install_conflicts(to_install):
+    # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult]
+    """For checking if the dependency graph would be consistent after \
+    installing given requirements
+    """
+    # Start from the current state
+    package_set, _ = create_package_set_from_installed()
+    # Install packages
+    would_be_installed = _simulate_installation_of(to_install, package_set)
+
+    # Only warn about directly-dependent packages; create a whitelist of them
+    whitelist = _create_whitelist(would_be_installed, package_set)
+
+    return (
+        package_set,
+        check_package_set(
+            package_set, should_ignore=lambda name: name not in whitelist
+        )
+    )
+
+
+def _simulate_installation_of(to_install, package_set):
+    # type: (List[InstallRequirement], PackageSet) -> Set[str]
+    """Computes the version of packages after installing to_install.
+    """
+
+    # Keep track of packages that were installed
+    installed = set()
+
+    # Modify it as installing requirement_set would (assuming no errors)
+    for inst_req in to_install:
+        dist = make_abstract_dist(inst_req).dist()
+        name = canonicalize_name(dist.key)
+        package_set[name] = PackageDetails(dist.version, dist.requires())
+
+        installed.add(name)
+
+    return installed
+
+
+def _create_whitelist(would_be_installed, package_set):
+    # type: (Set[str], PackageSet) -> Set[str]
+    packages_affected = set(would_be_installed)
+
+    for package_name in package_set:
+        if package_name in packages_affected:
+            continue
+
+        for req in package_set[package_name].requires:
+            if canonicalize_name(req.name) in packages_affected:
+                packages_affected.add(package_name)
+                break
+
+    return packages_affected
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f674d9cb20fa55d676be0f47a5a0ed3e090a5c0a
GIT binary patch
literal 4985
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
WW)fi(VH9Q(W#$y+(dQK96b1nO$&%{;

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py
new file mode 100644
index 00000000..0c4c7610
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py
@@ -0,0 +1,247 @@
+from __future__ import absolute_import
+
+import collections
+import logging
+import os
+import re
+
+from pip._vendor import six
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.pkg_resources import RequirementParseError
+
+from pip._internal.exceptions import BadCommand, InstallationError
+from pip._internal.req.constructors import (
+    install_req_from_editable, install_req_from_line,
+)
+from pip._internal.req.req_file import COMMENT_RE
+from pip._internal.utils.misc import (
+    dist_is_editable, get_installed_distributions,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union
+    )
+    from pip._internal.cache import WheelCache
+    from pip._vendor.pkg_resources import (
+        Distribution, Requirement
+    )
+
+    RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]]
+
+
+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]
+    skip_regex=None,  # type: Optional[str]
+    isolated=False,  # type: bool
+    wheel_cache=None,  # type: Optional[WheelCache]
+    exclude_editable=False,  # type: bool
+    skip=()  # type: Container[str]
+):
+    # type: (...) -> Iterator[str]
+    find_links = find_links or []
+    skip_match = None
+
+    if skip_regex:
+        skip_match = re.compile(skip_regex).search
+
+    for link in find_links:
+        yield '-f %s' % link
+    installations = {}  # type: Dict[str, FrozenRequirement]
+    for dist in get_installed_distributions(local_only=local_only,
+                                            skip=(),
+                                            user_only=user_only):
+        try:
+            req = FrozenRequirement.from_dist(dist)
+        except RequirementParseError:
+            logger.warning(
+                "Could not parse requirement: %s",
+                dist.project_name
+            )
+            continue
+        if exclude_editable and req.editable:
+            continue
+        installations[req.name] = req
+
+    if requirement:
+        # the options that don't get turned into an InstallRequirement
+        # should only be emitted once, even if the same option is in multiple
+        # requirements files, so we need to keep track of what has been emitted
+        # so that we don't emit it again if it's seen again
+        emitted_options = set()  # type: Set[str]
+        # keep track of which files a requirement is in so that we can
+        # give an accurate warning if a requirement appears multiple times.
+        req_files = collections.defaultdict(list)  # type: Dict[str, List[str]]
+        for req_file_path in requirement:
+            with open(req_file_path) as req_file:
+                for line in req_file:
+                    if (not line.strip() or
+                            line.strip().startswith('#') or
+                            (skip_match and skip_match(line)) or
+                            line.startswith((
+                                '-r', '--requirement',
+                                '-Z', '--always-unzip',
+                                '-f', '--find-links',
+                                '-i', '--index-url',
+                                '--pre',
+                                '--trusted-host',
+                                '--process-dependency-links',
+                                '--extra-index-url'))):
+                        line = line.rstrip()
+                        if line not in emitted_options:
+                            emitted_options.add(line)
+                            yield line
+                        continue
+
+                    if line.startswith('-e') or line.startswith('--editable'):
+                        if line.startswith('-e'):
+                            line = line[2:].strip()
+                        else:
+                            line = line[len('--editable'):].strip().lstrip('=')
+                        line_req = install_req_from_editable(
+                            line,
+                            isolated=isolated,
+                            wheel_cache=wheel_cache,
+                        )
+                    else:
+                        line_req = install_req_from_line(
+                            COMMENT_RE.sub('', line).strip(),
+                            isolated=isolated,
+                            wheel_cache=wheel_cache,
+                        )
+
+                    if not line_req.name:
+                        logger.info(
+                            "Skipping line in requirement file [%s] because "
+                            "it's not clear what it would install: %s",
+                            req_file_path, line.strip(),
+                        )
+                        logger.info(
+                            "  (add #egg=PackageName to the URL to avoid"
+                            " this warning)"
+                        )
+                    elif line_req.name not in installations:
+                        # either it's not installed, or it is installed
+                        # but has been processed already
+                        if not req_files[line_req.name]:
+                            logger.warning(
+                                "Requirement file [%s] contains %s, but "
+                                "package %r is not installed",
+                                req_file_path,
+                                COMMENT_RE.sub('', line).strip(), line_req.name
+                            )
+                        else:
+                            req_files[line_req.name].append(req_file_path)
+                    else:
+                        yield str(installations[line_req.name]).rstrip()
+                        del installations[line_req.name]
+                        req_files[line_req.name].append(req_file_path)
+
+        # Warn about requirements that were included multiple times (in a
+        # single requirements file or in different requirements files).
+        for name, files in six.iteritems(req_files):
+            if len(files) > 1:
+                logger.warning("Requirement %s included multiple times [%s]",
+                               name, ', '.join(sorted(set(files))))
+
+        yield(
+            '## The following requirements were added by '
+            'pip freeze:'
+        )
+    for installation in sorted(
+            installations.values(), key=lambda x: x.name.lower()):
+        if canonicalize_name(installation.name) not in skip:
+            yield str(installation).rstrip()
+
+
+def get_requirement_info(dist):
+    # type: (Distribution) -> RequirementInfo
+    """
+    Compute and return values (req, editable, comments) for use in
+    FrozenRequirement.from_dist().
+    """
+    if not dist_is_editable(dist):
+        return (None, False, [])
+
+    location = os.path.normcase(os.path.abspath(dist.location))
+
+    from pip._internal.vcs import vcs, RemoteNotFoundError
+    vc_type = vcs.get_backend_type(location)
+
+    if not vc_type:
+        req = dist.as_requirement()
+        logger.debug(
+            'No VCS found for editable requirement {!r} in: {!r}', req,
+            location,
+        )
+        comments = [
+            '# Editable install with no version control ({})'.format(req)
+        ]
+        return (location, True, comments)
+
+    try:
+        req = vc_type.get_src_requirement(location, dist.project_name)
+    except RemoteNotFoundError:
+        req = dist.as_requirement()
+        comments = [
+            '# Editable {} install with no remote ({})'.format(
+                vc_type.__name__, req,
+            )
+        ]
+        return (location, True, comments)
+
+    except BadCommand:
+        logger.warning(
+            'cannot determine version of editable source in %s '
+            '(%s command not found in path)',
+            location,
+            vc_type.name,
+        )
+        return (None, True, [])
+
+    except InstallationError as exc:
+        logger.warning(
+            "Error when trying to get requirement for VCS system %s, "
+            "falling back to uneditable format", exc
+        )
+    else:
+        if req is not None:
+            return (req, True, [])
+
+    logger.warning(
+        'Could not determine repository location of %s', location
+    )
+    comments = ['## !! Could not determine repository location']
+
+    return (None, False, comments)
+
+
+class FrozenRequirement(object):
+    def __init__(self, name, req, editable, comments=()):
+        # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None
+        self.name = name
+        self.req = req
+        self.editable = editable
+        self.comments = comments
+
+    @classmethod
+    def from_dist(cls, dist):
+        # type: (Distribution) -> FrozenRequirement
+        req, editable, comments = get_requirement_info(dist)
+        if req is None:
+            req = dist.as_requirement()
+
+        return cls(dist.project_name, req, editable, comments=comments)
+
+    def __str__(self):
+        req = self.req
+        if self.editable:
+            req = '-e %s' % req
+        return '\n'.join(list(self.comments) + [str(req)]) + '\n'
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e49bcdc12e981a9e08676fbd9fa91fad052e114b
GIT binary patch
literal 7528
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py
new file mode 100644
index 00000000..077a985a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py
@@ -0,0 +1,426 @@
+"""Prepares a distribution for installation
+"""
+
+import logging
+import os
+
+from pip._vendor import pkg_resources, requests
+
+from pip._internal.build_env import BuildEnvironment
+from pip._internal.download import (
+    is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path,
+)
+from pip._internal.exceptions import (
+    DirectoryUrlHashUnsupported, HashUnpinned, InstallationError,
+    PreviousBuildDirError, VcsHashUnsupported,
+)
+from pip._internal.utils.compat import expanduser
+from pip._internal.utils.hashes import MissingHashes
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import display_path, normalize_path
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Optional
+    from pip._internal.req.req_install import InstallRequirement
+    from pip._internal.index import PackageFinder
+    from pip._internal.download import PipSession
+    from pip._internal.req.req_tracker import RequirementTracker
+
+logger = logging.getLogger(__name__)
+
+
+def make_abstract_dist(req):
+    # type: (InstallRequirement) -> DistAbstraction
+    """Factory to make an abstract dist object.
+
+    Preconditions: Either an editable req with a source_dir, or satisfied_by or
+    a wheel link, or a non-editable req with a source_dir.
+
+    :return: A concrete DistAbstraction.
+    """
+    if req.editable:
+        return IsSDist(req)
+    elif req.link and req.link.is_wheel:
+        return IsWheel(req)
+    else:
+        return IsSDist(req)
+
+
+class DistAbstraction(object):
+    """Abstracts out the wheel vs non-wheel Resolver.resolve() logic.
+
+    The requirements for anything installable are as follows:
+     - we must be able to determine the requirement name
+       (or we can't correctly handle the non-upgrade case).
+     - we must be able to generate a list of run-time dependencies
+       without installing any additional packages (or we would
+       have to either burn time by doing temporary isolated installs
+       or alternatively violate pips 'don't start installing unless
+       all requirements are available' rule - neither of which are
+       desirable).
+     - for packages with setup requirements, we must also be able
+       to determine their requirements without installing additional
+       packages (for the same reason as run-time dependencies)
+     - we must be able to create a Distribution object exposing the
+       above metadata.
+    """
+
+    def __init__(self, req):
+        # type: (InstallRequirement) -> None
+        self.req = req  # type: InstallRequirement
+
+    def dist(self):
+        # type: () -> Any
+        """Return a setuptools Dist object."""
+        raise NotImplementedError
+
+    def prep_for_dist(self, finder, build_isolation):
+        # type: (PackageFinder, bool) -> Any
+        """Ensure that we can get a Dist for this requirement."""
+        raise NotImplementedError
+
+
+class IsWheel(DistAbstraction):
+
+    def dist(self):
+        # type: () -> pkg_resources.Distribution
+        return list(pkg_resources.find_distributions(
+            self.req.source_dir))[0]
+
+    def prep_for_dist(self, finder, build_isolation):
+        # type: (PackageFinder, bool) -> Any
+        # FIXME:https://github.com/pypa/pip/issues/1112
+        pass
+
+
+class IsSDist(DistAbstraction):
+
+    def dist(self):
+        return self.req.get_dist()
+
+    def _raise_conflicts(self, conflicting_with, conflicting_reqs):
+        conflict_messages = [
+            '%s is incompatible with %s' % (installed, wanted)
+            for installed, wanted in sorted(conflicting_reqs)
+        ]
+        raise InstallationError(
+            "Some build dependencies for %s conflict with %s: %s." % (
+                self.req, conflicting_with, ', '.join(conflict_messages))
+        )
+
+    def install_backend_dependencies(self, finder):
+        # type: (PackageFinder) -> None
+        """
+        Install any extra build dependencies that the backend requests.
+
+        :param finder: a PackageFinder object.
+        """
+        req = self.req
+        with req.build_env:
+            # We need to have the env active when calling the hook.
+            req.spin_message = "Getting requirements to build wheel"
+            reqs = req.pep517_backend.get_requires_for_build_wheel()
+        conflicting, missing = req.build_env.check_requirements(reqs)
+        if conflicting:
+            self._raise_conflicts("the backend dependencies", conflicting)
+        req.build_env.install_requirements(
+            finder, missing, 'normal',
+            "Installing backend dependencies"
+        )
+
+    def prep_for_dist(self, finder, build_isolation):
+        # type: (PackageFinder, bool) -> None
+        # Prepare for building. We need to:
+        #   1. Load pyproject.toml (if it exists)
+        #   2. Set up the build environment
+
+        self.req.load_pyproject_toml()
+        should_isolate = self.req.use_pep517 and build_isolation
+
+        if should_isolate:
+            # Isolate in a BuildEnvironment and install the build-time
+            # requirements.
+            self.req.build_env = BuildEnvironment()
+            self.req.build_env.install_requirements(
+                finder, self.req.pyproject_requires, 'overlay',
+                "Installing build dependencies"
+            )
+            conflicting, missing = self.req.build_env.check_requirements(
+                self.req.requirements_to_check
+            )
+            if conflicting:
+                self._raise_conflicts("PEP 517/518 supported requirements",
+                                      conflicting)
+            if missing:
+                logger.warning(
+                    "Missing build requirements in pyproject.toml for %s.",
+                    self.req,
+                )
+                logger.warning(
+                    "The project does not specify a build backend, and "
+                    "pip cannot fall back to setuptools without %s.",
+                    " and ".join(map(repr, sorted(missing)))
+                )
+
+            # Install any extra build dependencies that the backend requests.
+            # This must be done in a second pass, as the pyproject.toml
+            # dependencies must be installed before we can call the backend.
+            self.install_backend_dependencies(finder=finder)
+
+        self.req.prepare_metadata()
+        self.req.assert_source_matches_version()
+
+
+class Installed(DistAbstraction):
+
+    def dist(self):
+        # type: () -> pkg_resources.Distribution
+        return self.req.satisfied_by
+
+    def prep_for_dist(self, finder, build_isolation):
+        # type: (PackageFinder, bool) -> Any
+        pass
+
+
+class RequirementPreparer(object):
+    """Prepares a Requirement
+    """
+
+    def __init__(
+        self,
+        build_dir,  # type: str
+        download_dir,  # type: Optional[str]
+        src_dir,  # type: str
+        wheel_download_dir,  # type: Optional[str]
+        progress_bar,  # type: str
+        build_isolation,  # type: bool
+        req_tracker  # type: RequirementTracker
+    ):
+        # type: (...) -> None
+        super(RequirementPreparer, self).__init__()
+
+        self.src_dir = src_dir
+        self.build_dir = build_dir
+        self.req_tracker = req_tracker
+
+        # Where still packed archives should be written to. If None, they are
+        # not saved, and are deleted immediately after unpacking.
+        self.download_dir = download_dir
+
+        # Where still-packed .whl files should be written to. If None, they are
+        # written to the download_dir parameter. Separate to download_dir to
+        # permit only keeping wheel archives for pip wheel.
+        if wheel_download_dir:
+            wheel_download_dir = normalize_path(wheel_download_dir)
+        self.wheel_download_dir = wheel_download_dir
+
+        # NOTE
+        # download_dir and wheel_download_dir overlap semantically and may
+        # be combined if we're willing to have non-wheel archives present in
+        # the wheelhouse output by 'pip wheel'.
+
+        self.progress_bar = progress_bar
+
+        # Is build isolation allowed?
+        self.build_isolation = build_isolation
+
+    @property
+    def _download_should_save(self):
+        # type: () -> bool
+        # TODO: Modify to reduce indentation needed
+        if self.download_dir:
+            self.download_dir = expanduser(self.download_dir)
+            if os.path.exists(self.download_dir):
+                return True
+            else:
+                logger.critical('Could not find download directory')
+                raise InstallationError(
+                    "Could not find or access download directory '%s'"
+                    % display_path(self.download_dir))
+        return False
+
+    def prepare_linked_requirement(
+        self,
+        req,  # type: InstallRequirement
+        session,  # type: PipSession
+        finder,  # type: PackageFinder
+        upgrade_allowed,  # type: bool
+        require_hashes  # type: bool
+    ):
+        # type: (...) -> DistAbstraction
+        """Prepare a requirement that would be obtained from req.link
+        """
+        # TODO: Breakup into smaller functions
+        if req.link and req.link.scheme == 'file':
+            path = url_to_path(req.link.url)
+            logger.info('Processing %s', display_path(path))
+        else:
+            logger.info('Collecting %s', req)
+
+        with indent_log():
+            # @@ if filesystem packages are not marked
+            # editable in a req, a non deterministic error
+            # occurs when the script attempts to unpack the
+            # build directory
+            req.ensure_has_source_dir(self.build_dir)
+            # 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`
+            # 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 '%s' due to a"
+                    " pre-existing build directory (%s). 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."
+                    % (req, req.source_dir)
+                )
+            req.populate_link(finder, upgrade_allowed, require_hashes)
+
+            # We can't hit this spot and have populate_link return None.
+            # req.satisfied_by is None here (because we're
+            # guarded) and upgrade has no impact except when satisfied_by
+            # is not None.
+            # Then inside find_requirement existing_applicable -> False
+            # If no new versions are found, DistributionNotFound is raised,
+            # otherwise a result is guaranteed.
+            assert req.link
+            link = req.link
+
+            # 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 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 is_vcs_url(link):
+                    raise VcsHashUnsupported()
+                elif is_file_url(link) and is_dir_url(link):
+                    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 require_hashes)
+            if 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()
+
+            try:
+                download_dir = self.download_dir
+                # We always delete unpacked sdists after pip ran.
+                autodelete_unpacked = True
+                if req.link.is_wheel and self.wheel_download_dir:
+                    # when doing 'pip wheel` we download wheels to a
+                    # dedicated dir.
+                    download_dir = self.wheel_download_dir
+                if req.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
+                unpack_url(
+                    req.link, req.source_dir,
+                    download_dir, autodelete_unpacked,
+                    session=session, hashes=hashes,
+                    progress_bar=self.progress_bar
+                )
+            except requests.HTTPError as exc:
+                logger.critical(
+                    'Could not install requirement %s because of error %s',
+                    req,
+                    exc,
+                )
+                raise InstallationError(
+                    'Could not install requirement %s because of HTTP '
+                    'error %s for URL %s' %
+                    (req, exc, req.link)
+                )
+            abstract_dist = make_abstract_dist(req)
+            with self.req_tracker.track(req):
+                abstract_dist.prep_for_dist(finder, self.build_isolation)
+            if self._download_should_save:
+                # Make a .zip of the source_dir we already created.
+                if not req.link.is_artifact:
+                    req.archive(self.download_dir)
+        return abstract_dist
+
+    def prepare_editable_requirement(
+        self,
+        req,  # type: InstallRequirement
+        require_hashes,  # type: bool
+        use_user_site,  # type: bool
+        finder  # type: PackageFinder
+    ):
+        # type: (...) -> DistAbstraction
+        """Prepare an editable requirement
+        """
+        assert req.editable, "cannot prepare a non-editable req as editable"
+
+        logger.info('Obtaining %s', req)
+
+        with indent_log():
+            if require_hashes:
+                raise InstallationError(
+                    'The editable requirement %s cannot be installed when '
+                    'requiring hashes, because there is no single file to '
+                    'hash.' % req
+                )
+            req.ensure_has_source_dir(self.src_dir)
+            req.update_editable(not self._download_should_save)
+
+            abstract_dist = make_abstract_dist(req)
+            with self.req_tracker.track(req):
+                abstract_dist.prep_for_dist(finder, self.build_isolation)
+
+            if self._download_should_save:
+                req.archive(self.download_dir)
+            req.check_if_exists(use_user_site)
+
+        return abstract_dist
+
+    def prepare_installed_requirement(self, req, require_hashes, skip_reason):
+        # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction
+        """Prepare an already-installed requirement
+        """
+        assert req.satisfied_by, "req should have been satisfied but isn't"
+        assert skip_reason is not None, (
+            "did not get skip reason skipped but req.satisfied_by "
+            "is set to %r" % (req.satisfied_by,)
+        )
+        logger.info(
+            'Requirement %s: %s (%s)',
+            skip_reason, req, req.satisfied_by.version
+        )
+        with indent_log():
+            if require_hashes:
+                logger.debug(
+                    'Since it is already installed, we are trusting this '
+                    'package without checking its hash. To ensure a '
+                    'completely repeatable environment, install into an '
+                    'empty virtualenv.'
+                )
+            abstract_dist = Installed(req)
+
+        return abstract_dist
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0f70ce20f56d7ad910f360f018d70028d4e07b8f
GIT binary patch
literal 13680
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.py b/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.py
new file mode 100644
index 00000000..3b68f28d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.py
@@ -0,0 +1,381 @@
+"""Generate and work with PEP 425 Compatibility Tags."""
+from __future__ import absolute_import
+
+import distutils.util
+import logging
+import platform
+import re
+import sys
+import sysconfig
+import warnings
+from collections import OrderedDict
+
+import pip._internal.utils.glibc
+from pip._internal.utils.compat import get_extension_suffixes
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Tuple, Callable, List, Optional, Union, Dict
+    )
+
+    Pep425Tag = Tuple[str, str, str]
+
+logger = logging.getLogger(__name__)
+
+_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)')
+
+
+def get_config_var(var):
+    # type: (str) -> Optional[str]
+    try:
+        return sysconfig.get_config_var(var)
+    except IOError as e:  # Issue #1074
+        warnings.warn("{}".format(e), RuntimeWarning)
+        return None
+
+
+def get_abbr_impl():
+    # type: () -> str
+    """Return abbreviated implementation name."""
+    if hasattr(sys, 'pypy_version_info'):
+        pyimpl = 'pp'
+    elif sys.platform.startswith('java'):
+        pyimpl = 'jy'
+    elif sys.platform == 'cli':
+        pyimpl = 'ip'
+    else:
+        pyimpl = 'cp'
+    return pyimpl
+
+
+def get_impl_ver():
+    # type: () -> str
+    """Return implementation version."""
+    impl_ver = get_config_var("py_version_nodot")
+    if not impl_ver or get_abbr_impl() == 'pp':
+        impl_ver = ''.join(map(str, get_impl_version_info()))
+    return impl_ver
+
+
+def get_impl_version_info():
+    # type: () -> Tuple[int, ...]
+    """Return sys.version_info-like tuple for use in decrementing the minor
+    version."""
+    if get_abbr_impl() == 'pp':
+        # as per https://github.com/pypa/pip/issues/2882
+        # attrs exist only on pypy
+        return (sys.version_info[0],
+                sys.pypy_version_info.major,  # type: ignore
+                sys.pypy_version_info.minor)  # type: ignore
+    else:
+        return sys.version_info[0], sys.version_info[1]
+
+
+def get_impl_tag():
+    # type: () -> str
+    """
+    Returns the Tag for this specific implementation.
+    """
+    return "{}{}".format(get_abbr_impl(), get_impl_ver())
+
+
+def get_flag(var, fallback, expected=True, warn=True):
+    # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool
+    """Use a fallback method for determining SOABI flags if the needed config
+    var is unset or unavailable."""
+    val = get_config_var(var)
+    if val is None:
+        if warn:
+            logger.debug("Config variable '%s' is unset, Python ABI tag may "
+                         "be incorrect", var)
+        return fallback()
+    return val == expected
+
+
+def get_abi_tag():
+    # type: () -> Optional[str]
+    """Return the ABI tag based on SOABI (if available) or emulate SOABI
+    (CPython 2, PyPy)."""
+    soabi = get_config_var('SOABI')
+    impl = get_abbr_impl()
+    if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'):
+        d = ''
+        m = ''
+        u = ''
+        if get_flag('Py_DEBUG',
+                    lambda: hasattr(sys, 'gettotalrefcount'),
+                    warn=(impl == 'cp')):
+            d = 'd'
+        if get_flag('WITH_PYMALLOC',
+                    lambda: impl == 'cp',
+                    warn=(impl == 'cp')):
+            m = 'm'
+        if get_flag('Py_UNICODE_SIZE',
+                    lambda: sys.maxunicode == 0x10ffff,
+                    expected=4,
+                    warn=(impl == 'cp' and
+                          sys.version_info < (3, 3))) \
+                and sys.version_info < (3, 3):
+            u = 'u'
+        abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u)
+    elif soabi and soabi.startswith('cpython-'):
+        abi = 'cp' + soabi.split('-')[1]
+    elif soabi:
+        abi = soabi.replace('.', '_').replace('-', '_')
+    else:
+        abi = None
+    return abi
+
+
+def _is_running_32bit():
+    # type: () -> bool
+    return sys.maxsize == 2147483647
+
+
+def get_platform():
+    # type: () -> str
+    """Return our platform name 'win32', 'linux_x86_64'"""
+    if sys.platform == 'darwin':
+        # distutils.util.get_platform() returns the release based on the value
+        # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may
+        # be significantly older than the user's current machine.
+        release, _, machine = platform.mac_ver()
+        split_ver = release.split('.')
+
+        if machine == "x86_64" and _is_running_32bit():
+            machine = "i386"
+        elif machine == "ppc64" and _is_running_32bit():
+            machine = "ppc"
+
+        return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine)
+
+    # XXX remove distutils dependency
+    result = distutils.util.get_platform().replace('.', '_').replace('-', '_')
+    if result == "linux_x86_64" and _is_running_32bit():
+        # 32 bit Python program (running on a 64 bit Linux): pip should only
+        # install and run 32 bit compiled extensions in that case.
+        result = "linux_i686"
+
+    return result
+
+
+def is_manylinux1_compatible():
+    # type: () -> bool
+    # Only Linux, and only x86-64 / i686
+    if get_platform() not in {"linux_x86_64", "linux_i686"}:
+        return False
+
+    # Check for presence of _manylinux module
+    try:
+        import _manylinux
+        return bool(_manylinux.manylinux1_compatible)
+    except (ImportError, AttributeError):
+        # Fall through to heuristic check below
+        pass
+
+    # Check glibc version. CentOS 5 uses glibc 2.5.
+    return pip._internal.utils.glibc.have_compatible_glibc(2, 5)
+
+
+def is_manylinux2010_compatible():
+    # type: () -> bool
+    # Only Linux, and only x86-64 / i686
+    if get_platform() not in {"linux_x86_64", "linux_i686"}:
+        return False
+
+    # Check for presence of _manylinux module
+    try:
+        import _manylinux
+        return bool(_manylinux.manylinux2010_compatible)
+    except (ImportError, AttributeError):
+        # Fall through to heuristic check below
+        pass
+
+    # Check glibc version. CentOS 6 uses glibc 2.12.
+    return pip._internal.utils.glibc.have_compatible_glibc(2, 12)
+
+
+def get_darwin_arches(major, minor, machine):
+    # type: (int, int, str) -> List[str]
+    """Return a list of supported arches (including group arches) for
+    the given major, minor and machine architecture of an macOS machine.
+    """
+    arches = []
+
+    def _supports_arch(major, minor, arch):
+        # type: (int, int, str) -> bool
+        # Looking at the application support for macOS versions in the chart
+        # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears
+        # our timeline looks roughly like:
+        #
+        # 10.0 - Introduces ppc support.
+        # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64
+        #        and x86_64 support is CLI only, and cannot be used for GUI
+        #        applications.
+        # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications.
+        # 10.6 - Drops support for ppc64
+        # 10.7 - Drops support for ppc
+        #
+        # Given that we do not know if we're installing a CLI or a GUI
+        # application, we must be conservative and assume it might be a GUI
+        # application and behave as if ppc64 and x86_64 support did not occur
+        # until 10.5.
+        #
+        # Note: The above information is taken from the "Application support"
+        #       column in the chart not the "Processor support" since I believe
+        #       that we care about what instruction sets an application can use
+        #       not which processors the OS supports.
+        if arch == 'ppc':
+            return (major, minor) <= (10, 5)
+        if arch == 'ppc64':
+            return (major, minor) == (10, 5)
+        if arch == 'i386':
+            return (major, minor) >= (10, 4)
+        if arch == 'x86_64':
+            return (major, minor) >= (10, 5)
+        if arch in groups:
+            for garch in groups[arch]:
+                if _supports_arch(major, minor, garch):
+                    return True
+        return False
+
+    groups = OrderedDict([
+        ("fat", ("i386", "ppc")),
+        ("intel", ("x86_64", "i386")),
+        ("fat64", ("x86_64", "ppc64")),
+        ("fat32", ("x86_64", "i386", "ppc")),
+    ])  # type: Dict[str, Tuple[str, ...]]
+
+    if _supports_arch(major, minor, machine):
+        arches.append(machine)
+
+    for garch in groups:
+        if machine in groups[garch] and _supports_arch(major, minor, garch):
+            arches.append(garch)
+
+    arches.append('universal')
+
+    return arches
+
+
+def get_all_minor_versions_as_strings(version_info):
+    # type: (Tuple[int, ...]) -> List[str]
+    versions = []
+    major = version_info[:-1]
+    # Support all previous minor Python versions.
+    for minor in range(version_info[-1], -1, -1):
+        versions.append(''.join(map(str, major + (minor,))))
+    return versions
+
+
+def get_supported(
+    versions=None,  # type: Optional[List[str]]
+    noarch=False,  # type: bool
+    platform=None,  # type: Optional[str]
+    impl=None,  # type: Optional[str]
+    abi=None  # type: Optional[str]
+):
+    # type: (...) -> List[Pep425Tag]
+    """Return a list of supported tags for each version specified in
+    `versions`.
+
+    :param versions: a list of string versions, of the form ["33", "32"],
+        or None. The first version will be assumed to support our ABI.
+    :param platform: specify the exact platform you want valid
+        tags for, or None. If None, use the local system platform.
+    :param impl: specify the exact implementation you want valid
+        tags for, or None. If None, use the local interpreter impl.
+    :param abi: specify the exact abi you want valid
+        tags for, or None. If None, use the local interpreter abi.
+    """
+    supported = []
+
+    # Versions must be given with respect to the preference
+    if versions is None:
+        version_info = get_impl_version_info()
+        versions = get_all_minor_versions_as_strings(version_info)
+
+    impl = impl or get_abbr_impl()
+
+    abis = []  # type: List[str]
+
+    abi = abi or get_abi_tag()
+    if abi:
+        abis[0:0] = [abi]
+
+    abi3s = set()
+    for suffix in get_extension_suffixes():
+        if suffix.startswith('.abi'):
+            abi3s.add(suffix.split('.', 2)[1])
+
+    abis.extend(sorted(list(abi3s)))
+
+    abis.append('none')
+
+    if not noarch:
+        arch = platform or get_platform()
+        arch_prefix, arch_sep, arch_suffix = arch.partition('_')
+        if arch.startswith('macosx'):
+            # support macosx-10.6-intel on macosx-10.9-x86_64
+            match = _osx_arch_pat.match(arch)
+            if match:
+                name, major, minor, actual_arch = match.groups()
+                tpl = '{}_{}_%i_%s'.format(name, major)
+                arches = []
+                for m in reversed(range(int(minor) + 1)):
+                    for a in get_darwin_arches(int(major), m, actual_arch):
+                        arches.append(tpl % (m, a))
+            else:
+                # arch pattern didn't match (?!)
+                arches = [arch]
+        elif arch_prefix == 'manylinux2010':
+            # manylinux1 wheels run on most manylinux2010 systems with the
+            # exception of wheels depending on ncurses. PEP 571 states
+            # manylinux1 wheels should be considered manylinux2010 wheels:
+            # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels
+            arches = [arch, 'manylinux1' + arch_sep + arch_suffix]
+        elif platform is None:
+            arches = []
+            if is_manylinux2010_compatible():
+                arches.append('manylinux2010' + arch_sep + arch_suffix)
+            if is_manylinux1_compatible():
+                arches.append('manylinux1' + arch_sep + arch_suffix)
+            arches.append(arch)
+        else:
+            arches = [arch]
+
+        # Current version, current API (built specifically for our Python):
+        for abi in abis:
+            for arch in arches:
+                supported.append(('%s%s' % (impl, versions[0]), abi, arch))
+
+        # abi3 modules compatible with older version of Python
+        for version in versions[1:]:
+            # abi3 was introduced in Python 3.2
+            if version in {'31', '30'}:
+                break
+            for abi in abi3s:   # empty set if not Python 3
+                for arch in arches:
+                    supported.append(("%s%s" % (impl, version), abi, arch))
+
+        # Has binaries, does not use the Python API:
+        for arch in arches:
+            supported.append(('py%s' % (versions[0][0]), 'none', arch))
+
+    # No abi / arch, but requires our implementation:
+    supported.append(('%s%s' % (impl, versions[0]), 'none', 'any'))
+    # Tagged specifically as being cross-version compatible
+    # (with just the major version specified)
+    supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
+
+    # No abi / arch, generic Python
+    for i, version in enumerate(versions):
+        supported.append(('py%s' % (version,), 'none', 'any'))
+        if i == 0:
+            supported.append(('py%s' % (version[0]), 'none', 'any'))
+
+    return supported
+
+
+implementation_tag = get_impl_tag()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc b/venv/lib/python2.7/site-packages/pip/_internal/pep425tags.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2e3a8b2e7d5904cdbeb19957158197dd57eace73
GIT binary patch
literal 11553
zcmZSn%*&NH<x)&C0~D|^FfcecFfbIaV`N}RVPJ@2U`SzPNMT~gVPwc<Vu)g5U<C1*
z8FH8zqFBIk%nUiK3{k8wHXB0}8;s4)5XBB-b1+14z}TD&QJgR~7ef>mn9ahF!_AP(
z!w|&-w}Y1<iVrNu%8<j)kSo9tB><6QW5^L?$Q5FU5@KLX6=Ep*09M7$kR!~HE5Z;Z
z!jLP<5GBfxE5;Bd#*iz{5GBr#E5Q&Y!H_G-5GBdLm@2}MDg{Mp%nXuI(hPYF45_RP
zSuzZ%vJB0P3{i3nsq73{@(d{)V6Fl~3MWGg14EP|Lkbs|p~R5F4Q41ar0{?lDhw&S
zV1_C~su~ET@G-P7F+`~|r0|2qH5gI^zzj`>6hSaUiy=h_%+O{?5e74K7*a&Q3|)p4
zQ7}V~A%&SC)c{1MFoQ`kh89+aC_{!+Rfc8;hA1PDV6cWb0|P^`5d#B*dum>4QDRA|
zLSkNuLV12swnBMkNrpmzYk-1@k*R`ner`cxNoG=JPG(7^LP%nIv0f%9`ZX9C7#K?U
z85kH6lZx|mN=s7XGjj{_i%R?;GTaOd4E{wasYR(NE}6+C5J52p28Q(1lK9k$lGME7
z%>2Cg;?lIV%!<@vh`bO31A}j5KxDkLhpV%9d{C&LpQoR@1}L4Cure?(gp?NKq?T|n
zFfceL=Hw(M<)oIdFfcIqWEPizMg0p(GV}8ibHIv2^D^`E!15pm6pJ!2Flgv$YsPED
zq##H=ZOvqmPnZ}O7(g~SgOal=0|P^)AVUcQLlz@L4Ff1jgTwQ58CXh~7_zw-iX0di
zYZ)0BOPCq5z^OWmm7#_aq^g9Cp&69u85n{iQWzM5H9*Gt6@$p?S`Co9OE^K{URj)+
zpO==IUcv_r5C}KEEU~DBoq>VD)8DnID8C5or}D(2yv)4xVz5s@oDxuQq~#aoCYFHp
z2bJcPWag%ZL)3wl`Q_)Og6%G0W?*0dnF{h_ss=dXKtypi0|SG8K~ZK|Vo9ogSz?iX
zT7FJSYEiL%cA<WDv5~pCVPTe$d6}Vwd2vo<dU?D_iiwGVfq_AKo_>gaL1uw&W?peg
zVor{3d7@=$U<ODCjN>!&N>YpR5_9wmQVUFsOiMrsrl2wilpJJ1UgrW?&&13q$jHwq
z$p|h=KyCxM6CC!Tpk&3sP{Ihxq|HnWMG~L_rIvvq&k`h<#l(;WPS(wg3`NEaDJ%>i
zDLJTA3M)f46GM?VLkb&MoQ)xc9mJ>s#RVw%i`5wz7=ltuN{jLo5|fgOQp++EOHxx5
zGII-ZQgc)DN)kZ{NFgsVH&w4hkb!}rpt7JczAUu}oLDpS((+3{ky%gx4(6=HvP3XH
zs}da0$vK%|Ze{_PN-od<rA}~+W+WCTmXs8Ml@(VOgJZTJC$R(+k0qcmDK1GYDk%nK
zJxEpnMRGwU$Xx>$YbCtU<OvEYQ1;GI14W?#C<>YR895n+7&#gF89ABQ5D^LTF*qV!
zAQ71Y&KR`}pnSwrtOSavW(H7{f+ETRR2F41F_bVfl&~<Au!0JxW+qTh0>vs=PcS$P
zi{%jU1_~3TxPnHGUJ1xqNRgG7pORk^1j_X#Aoqd`5pXgLQUJLO<j$=8%sg<6<R%t?
z>Ee>25|9p183nQiCFUXV0!l?NsR4``9%#(KoMHls7?9f-n0Xk*808=l0`fRKXL*CX
z%>WAG6h?41(Fa9F7858kBuf}U`6`PAEX2%^#mbPz%n%F`MaVOOVoNfOi6J<Jg&|l2
zR9qGZBI2dEvRDrq8S$W;qMMVMovKg*DzX*Q@{1Hoi&GUc^Au82lZ(L7mzkHYP?C|V
zkeiv8U&N)Lpr8QNtp|=Za4nMwDjWPDaR-XFAQ_M+K%R%H1=|!P0ulweCpR%GzX)9V
zgH1(55ST^xQV*0}Y(X&t%Ha$w{LEa8oQ%9o;8G7IZa@`d3L`@nxZrDMU?^b%#ZxmA
zv<fM<W?*0d2N9&~Dh3B!NMbrTU`sMGixr9sQj;^&GLzAYGCi=aVo++YuC1=s0HuZ?
zP^}Hl1wo)-0bvFNLGM5+0mUXf!<8hagVHIu%4A?o2Duv)uOMfGOBE+jOoI!CW=4iu
z7KR!YQ1Z>@U?{R+s9|O(G6V%3sD@w!6*!>EIFA8bIWsT>*RU|uFo9BjFgO^B(-{~T
zLW@%s5*5-Cb8?arld~0aQ%f@PQ^28`l3J2ll$!~vdliEH9i2QC(sB~hixo1{z=5Ba
znwpZDq5!G5!GT<sSfr3ytWcU)oLZs)O7D4zWr>;KR*GJ+9jMI$uJaYj5{oiHO&0}q
z)nawH4jqMn%94!yJOz+VC5h<@xrvnuNuV5)oL^Lwnq1-sE(jqd7^r3fHv@9=)6-KS
z2|gt?sWcs&DT6@GC~yq}^B0(tT2YXiT#}j+1Zs4Ei@UPKoB@n?P-z8<cTlhfgE9%o
zT?{Ndj695NjGT;IjO>s?3>5#I3=9m+pr%<aBLk>i2Cr307(p4O6PzM=ig+12z;#Os
zGeZUwLpB>j5ies2xOz!p0kzDEco|bz8EP3BKqM2G1lK$%;D$mA1E~EDF(I3Yp_z%X
zs0`GQuVn<a_e)qnZTWTvhBQV{TfPlb@nTTZzLp85n3n<6qGtd#=TihwOwPXms`0W|
z8B!z}vKbhfnV5>+!9=7$B1P{&E&W<%kWneZ3>^#%pq3>#A=fa0(s>#ygIFyKLtYFh
zl^5AC)-W(+v4i>opk|Q`V+s>UJc|R=DQIS7ND*U@6bC8S1ql}=gOzhKq=+-5NPvPR
zixZ>}!Uid0V@Q#PX0BijP>EX{fhgudMK&yrCM6c9rYPj+K{JR(W|{&#&1-`4Kx%Gj
z4ybPd&OqQ?qTvip=SH9uA5f{O2QIF`3WB6S)_^KtaFZxEv7$6DGdVvcHAo4R?Li49
zpfcXY)hW~+r3eiMr3_G8r374lf)WR;<n#kK3(`|dO7cq*bBa>alJiURO2BR7AZd_o
zAnzeE0hmSi5)kAuo1Dblq?ANEP{X_!R5w7fDX9KS0k^}#JwrU=10sDLeSG|#;ob+e
zMukD%=VD+0r4vZi4()h=!xQW!2mvw-+;9c88o)yI_G*wh0|P@oD6@mSSORiTF1QmJ
zP#GWU=jrV4;u;_98Rd%NKji4m0{08D;nAD<|GxkOBsxJc83bwvfqjM`2E>n`C<I}K
zAOi*lhD=aBmI<oFz+Nsb2E~?YF$@-i5<qeRxct`ztI!2Ee85aSFc}Z_BiINqfyVXI
z0Clh+l>@k)1W(&Rpgw+(CMc<cf+PskkOt?t;)0ya5^&$7D77FbF*!8|RI7k15Quz!
zVp3+11xO>P^$`SW$AD{%#H37+NetljaF7)!GC_%!j=jkekY_<vM`BWDd`V(@0>}*@
zmx5{!PDTwzHYf!5P8iu3`9ZxDaIM0|$ipZE=E*aPGD<PBF)G4(FQ60&%1+>R2DCK6
zlHC5+gTo%u5(RbEa}z6yGpmp~*Wl2hcd7&TR^u~^<BLl3Ky8+IW22<Zl4elIfIP(j
zX>@|>Qczk1`|&cUPz8^1KuV3GE^zA~-1LlL2KAe385wGsKy?PFMFr`XF@xGrDa@c|
zR8b(P*VfFyP!tI6h%+(d$$@1dz3_aPY(BU<4z3qd*g;*38fH*+C<&rC86<0%7@9$S
z4K`2}mc;?8&p{Ou6R5gvW?}%bxuI-mgO3Mn`+1o8=RqTBpn8h|)Eo@f0JS5ELD>${
zSXRg{EmDB>wZUC`1@-dGJYyqu9R>BA%)HWy_zDZNcrz1qaFZ$}v8X&VFUTGgIG|2A
zL=IAH8e5ow^F~2IvY81uGZYjg7lWG9xrxd7#TD_@wGf2pyaYLbauBHb2X5#h+Xt@X
zAOe|Y7G@e;AeG=!3^Y;#&YHQ2$)G-HkRwRS9YlaE0}mplWEPi{mSpBY28KW^umzxO
z0rPASsI?5q(V&D{l$w*8Sey!W5zO?A%)C^vap2+rWEVIPic*V9b4tJo8BEYSH3tPj
zsxyXS2~f6V=4TOQ<Yy9P<YW|O<Yba&R%aAt=7c0^P#pq_CvcJmg?kCCkDI~-ZUwS4
z6iI>-c5tOEr~{kAz>vcPO57#P;FQe*8g2*<&l6{0DPaY*v(g}geEtlKjEs4V3=t*l
z3|SnYWSGUpki`v3=_#zBR#PyzTk03&3yKy$P$>^`Y9=VRWrFgV2B>2L_6Ru5xFzNk
zr-GwAJ~uJ15*+W~RF#yUp93CsfD0SOCqqYFb5g-&ohNu?6*49WO5KhnB}JJ@r6s8l
zAyCCqkXZnZNB967*iulkC<e3Ab25{X!PaCXmZc(D5D%7t6y~629yq?i1id4@1Qgeq
z#facR4u{2{k_<G&!@w-c$imFb$ipbeD9psd3~nk6%0vK)e?%e(3J0YVPzVP_g31<<
zXW=n!WMF836emH^Ahj_dA{Io%frxkz0jlbP5<x@RATI}jj049Nn4o)vfm#{J5r*cC
ztvKThlwv`71k~_h1~p&zfyT2K7;2dr+8G$y85z=;K;yq{3=Ex+{vH#k&jk`>1$DAO
z40ced4`OhF`dMjA4C&yU+{p-P2G_v)O3lm+MOmO86KEtKT!S&@F)&m(Fmy07xWrn3
zdpS%XP7Mo#B&fq!h@_nbR52A5!nA|UXDlpaC@f?MuVDsF4y15_N)N^wW`<x5P{~}}
z1BxW*__9JyW^su^ewspYX#r?vBsE1Lu_!qswOBzTGcP%(GzByQmR^)!S^yQ-1PwfZ
zdr6>9R(fVxYMugkL`w%UNCuvw$xTcK7204enI);oC8b5FAWITKYLoqg6`%?rBR|QY
zkOtNGpwI?)6xJ~?fGcUp7@!QO46K2KHwQyDBSUZv6R3y-jm}yi$#H_JT(BIZat}e0
z<6_8Wh3I1ksVXW!lH-QSbufba<Et1dw86p6#31PsD+7w~4shqah7lCZpy+A`b?}1=
z+Zn?1z}>lEa31mt@&OgGpgIy<x(0!UiGsX9Vj%AYd4lo;xa@^10k_jKv2j5<u*rhU
z<B+1#RB&d647g~4VpJQHV?nw=5eO+yK`gKt;7OQxXdD;EgT%pgC^%+|2P9(#WiT)>
zoCD=PP>-5HoQF|>5fuwE3NdnnX0R9-(h^I+;Rp_3u-`y)I62@D1#{C9OUz8b;SJ*&
z8-eSZ(!5O2Fl=HDI2;g$K)9e70gEAVL6HU?d;^;fmIYf2Q35K`z(JQ-P>`CJ0&ckk
z!NWf&1QZFNsvZ=?sl`E{@jGzvLUe=t90Y0r(7hN0b(}!$E=bc6oB~pdkAs3A)S6>p
zWn&UjWoG0ALm_4%Mgb;XMkPiOCSE4++#@Jmf!b%_77VE5PiFv)QPqHF(-mr&7%E&q
zSpveB1kI>3f(j;=SRGLIsbK^cL`)3uc@*dn5hH^*WG<zdk%6&Loguu2kpVLD>6iKc
z|NsBsK^1TqgQK-5F)uwe2-G(ZQU)b?6%e5c%2goufqRhPVMI`jXXfV>BO(S82cX6e
z-9ugxRBfb|#3$zD#DhotK`mI&TwQT|VsU(NNfBt~l#P*r0o>zeU}9tBVv=RlVoU}V
zhms5o4DfLO#mv9}3U^je;gurD02)%(0yP_(85nBWK%>evY@o6pIx)q}P+$fcvIEI7
zgEg{)Iv)kz&`t@Yr&5#-5=>`gsDZ3(U}Vq+m1*F4u38RIH3S*gbBQ%&sO4m+;RJPo
zQoz+zQ58cC2dLo*666FoT){(_DXa{V;0Uc^D6C=#uVH7%;$kS_W+>qSsc#0)wt?h9
z61<>}7nsAyQ0&ZH!^BYVnxTXb)WfRfVyNL_$l?c0kTx?ifVz9!47EHAwY*?)c2EZm
zG?sXZu|$9&OAsUo8gS=hsNrKM+Q(SK$B-oiGAD+Gp_ZSaR)C>akfBxxG+LS^%uvJ6
zP$K|pBG(FogGPj*B8#C!grP)~p+t<KMi3N^DXa|Q5ZAiIIxy6VGE|r|l!$}n1wisO
zq6{@ckYp~)P%FkzBf^ly%TOcC0Fn>`wGYHVJ}aEY7+zS;7+x5~RKvxP&d5+J!jLzC
zp$6Pz1XW^h8Ed#eZHF2j2JsqR2Jv(zu##MG9SDi$KqgSci!hW(fP7S>zyz@?g^K~E
z31kx};v~Te9AOH$(G@^6)<7Bsd7Pk7gE*<e8I%NEVy!_9jtV1&8W9GUSS<!nEU<$7
zmBIt6{h&EKjfp`FG*`g|nu7ybU6{udUYN)fUXcY(oU9D;F0pY8wc-pl;-E%Q3Lm(i
z!^Ti_oGAd*y0Hf(1(#TJuw{A>%hWI|69)$(sztY%!VAwag%_@73a>DRXw*Q`$Pc!k
zkpWZ)Ns6VgfjpST42mwsLJ?+AeO-gyJD>q}0ho8Ns7YaD08K1{j7)*6t4LuekpkJ+
z3~H-|F~l%2)JlN84Y7nD<o`5A22@=&5}=kNDC*}hLu~>p1X+QqvTzP_;T-1h8dip2
z4bYTHaWWHPaR8Ra8)z*9sD-AGnwXpco2-OQynz-G<bm6639u3}L5~Y8U{#P<l$Z<C
zP;8};h%g*nLcyhUKn*!i+YhuXKp|Sm*jPzNLCM%iDOLw;5@?b%zeoYJyhBeRBqLQJ
zEwiY&1g2e~JToT;G-s4pTwI!)nxasW4{LgY$3PsNJRyxjsDog`1XfT#RDvhAQY#XZ
zOAzBFmHDL#<%xME3T25onJI8rz`{ZYG|CTgk7pX#VLIT6UXUkp@{<#D6hNyTQgh)3
zqPPGw4vo!rkT`gb7_uCLVmE*qG(`nPpcy^z{3wbe5|c8qxgjwrQ-P`$CnjY=>;<(^
z7{F7qdY~az&`1+x)BxQ60oAs7`FYS`8c=fwGPYFA&A`9_8DCP(j8`oNPYR%PAi;wR
za1leW4WJ=r@M08WLkML67A~k%Ee4NYCFWK7X@I(M;L+b8(1djmXuSkvdKk123aqR+
zwIm4CxP}ZLgZdPSDJkGlDR6rYyq+rs%q-3?DoITNH>5$`A4r1&G@1i$F%~2im1KgJ
z*nnLh4;nH9HRj?A5=+31kle(Q<P2~l4m?Q>Zg3Q(f-+QUN>CA~{Rgr;Gp{755Y#+L
z0TD?cVbBC&YF=qBcqy9(sAdlW4Znk(l$Q^(BM3C81|F^s0xwMg>3}xcQ&S+#8&J?E
zCS^hfOcIkajf=thA#2ov(m?irA^~Jtd_hraT4n{<fna`dY5{nt2Er)?t!fJbjlP0I
z0<@k8(O!b6OD-u*%mKF*!695ykP}n@@(yUQ9X#Zp2p*#Y`5m;54U{&Z<L(2}(&B}-
zwBSJ|0BTi%T+ATC#>@j+2*kwC#Ky$W$i^tl#K|bY$j_+4B+10f1R8#qVB`nONH7X9
zvN0+%$}=i4^Dy$TibE%RB^WswB^U*mIGK4Fc^P$>1(}2xSr{Q~UPeu36=n@)Nk&;l
z9!6Cr4P#J5fEsS`@hSPq@$ukvA0MAq3hD~S$Ac0ZsFlOO03RaN1C4_P1;F%yX3aD6
z(!nVLoGXe_!Nd7MpuS=d$fw{aO3u&8NlgZ&*5V*g@Rxv+RY7Kf9(;@qY;Lh0cmyp7
zG*VLn>Th9F0vXT)=OLVGN-7ILt^%cSaJqx?L8&qb)Lsn&6$U{dj|YLqO@crvI0)22
z2WPDS@OrzD#B?w(J+;IKvNiyuG(H}b0^{R@bYVdNa!+PXYETm>$$=6zB*TN6@{mG6
z2PBaSBES<!ppqa6JOB*}-XKt(3j*gpa6SZ=7@%GdxZfN!6=VyjMnx^hK~ps#3kGtr
z2`Dsda`RJ4b5iX<aa!!bz`(%9D8K|-c7VVjz5t^D6C0x*ix?9>6F)O2Cnp~mbMW(W
XDs!@ON^=Tv3US(Vax*hRAWsGW0dWm(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pyproject.py b/venv/lib/python2.7/site-packages/pip/_internal/pyproject.py
new file mode 100644
index 00000000..43efbed4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/pyproject.py
@@ -0,0 +1,171 @@
+from __future__ import absolute_import
+
+import io
+import os
+import sys
+
+from pip._vendor import pytoml, six
+
+from pip._internal.exceptions import InstallationError
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Tuple, Optional, List
+
+
+def _is_list_of_str(obj):
+    # type: (Any) -> bool
+    return (
+        isinstance(obj, list) and
+        all(isinstance(item, six.string_types) for item in obj)
+    )
+
+
+def make_pyproject_path(setup_py_dir):
+    # type: (str) -> str
+    path = os.path.join(setup_py_dir, 'pyproject.toml')
+
+    # Python2 __file__ should not be unicode
+    if six.PY2 and isinstance(path, six.text_type):
+        path = path.encode(sys.getfilesystemencoding())
+
+    return path
+
+
+def load_pyproject_toml(
+    use_pep517,  # type: Optional[bool]
+    pyproject_toml,  # type: str
+    setup_py,  # type: str
+    req_name  # type: str
+):
+    # type: (...) -> Optional[Tuple[List[str], str, List[str]]]
+    """Load the pyproject.toml file.
+
+    Parameters:
+        use_pep517 - Has the user requested PEP 517 processing? None
+                     means the user hasn't explicitly specified.
+        pyproject_toml - Location of the project's pyproject.toml file
+        setup_py - Location of the project's setup.py file
+        req_name - The name of the requirement we're processing (for
+                   error reporting)
+
+    Returns:
+        None if we should use the legacy code path, otherwise a tuple
+        (
+            requirements from pyproject.toml,
+            name of PEP 517 backend,
+            requirements we should check are installed after setting
+                up the build environment
+        )
+    """
+    has_pyproject = os.path.isfile(pyproject_toml)
+    has_setup = os.path.isfile(setup_py)
+
+    if has_pyproject:
+        with io.open(pyproject_toml, encoding="utf-8") as f:
+            pp_toml = pytoml.load(f)
+        build_system = pp_toml.get("build-system")
+    else:
+        build_system = None
+
+    # The following cases must use PEP 517
+    # We check for use_pep517 being non-None and falsey because that means
+    # the user explicitly requested --no-use-pep517.  The value 0 as
+    # opposed to False can occur when the value is provided via an
+    # environment variable or config file option (due to the quirk of
+    # strtobool() returning an integer in pip's configuration code).
+    if has_pyproject and not has_setup:
+        if use_pep517 is not None and not use_pep517:
+            raise InstallationError(
+                "Disabling PEP 517 processing is invalid: "
+                "project does not have a setup.py"
+            )
+        use_pep517 = True
+    elif build_system and "build-backend" in build_system:
+        if use_pep517 is not None and not use_pep517:
+            raise InstallationError(
+                "Disabling PEP 517 processing is invalid: "
+                "project specifies a build backend of {} "
+                "in pyproject.toml".format(
+                    build_system["build-backend"]
+                )
+            )
+        use_pep517 = True
+
+    # If we haven't worked out whether to use PEP 517 yet,
+    # and the user hasn't explicitly stated a preference,
+    # we do so if the project has a pyproject.toml file.
+    elif use_pep517 is None:
+        use_pep517 = has_pyproject
+
+    # At this point, we know whether we're going to use PEP 517.
+    assert use_pep517 is not None
+
+    # If we're using the legacy code path, there is nothing further
+    # for us to do here.
+    if not use_pep517:
+        return None
+
+    if build_system is None:
+        # Either the user has a pyproject.toml with no build-system
+        # section, or the user has no pyproject.toml, but has opted in
+        # explicitly via --use-pep517.
+        # In the absence of any explicit backend specification, we
+        # assume the setuptools backend that most closely emulates the
+        # traditional direct setup.py execution, and require wheel and
+        # a version of setuptools that supports that backend.
+
+        build_system = {
+            "requires": ["setuptools>=40.8.0", "wheel"],
+            "build-backend": "setuptools.build_meta:__legacy__",
+        }
+
+    # If we're using PEP 517, we have build system information (either
+    # from pyproject.toml, or defaulted by the code above).
+    # Note that at this point, we do not know if the user has actually
+    # specified a backend, though.
+    assert build_system is not None
+
+    # Ensure that the build-system section in pyproject.toml conforms
+    # to PEP 518.
+    error_template = (
+        "{package} has a pyproject.toml file that does not comply "
+        "with PEP 518: {reason}"
+    )
+
+    # Specifying the build-system table but not the requires key is invalid
+    if "requires" not in build_system:
+        raise InstallationError(
+            error_template.format(package=req_name, reason=(
+                "it has a 'build-system' table but not "
+                "'build-system.requires' which is mandatory in the table"
+            ))
+        )
+
+    # Error out if requires is not a list of strings
+    requires = build_system["requires"]
+    if not _is_list_of_str(requires):
+        raise InstallationError(error_template.format(
+            package=req_name,
+            reason="'build-system.requires' is not a list of strings.",
+        ))
+
+    backend = build_system.get("build-backend")
+    check = []  # type: List[str]
+    if backend is None:
+        # If the user didn't specify a backend, we assume they want to use
+        # the setuptools backend. But we can't be sure they have included
+        # a version of setuptools which supplies the backend, or wheel
+        # (which is needed by the backend) in their requirements. So we
+        # make a note to check that those requirements are present once
+        # we have set up the environment.
+        # This is quite a lot of work to check for a very specific case. But
+        # the problem is, that case is potentially quite common - projects that
+        # adopted PEP 518 early for the ability to specify requirements to
+        # execute setup.py, but never considered needing to mention the build
+        # tools themselves. The original PEP 518 code had a similar check (but
+        # implemented in a different way).
+        backend = "setuptools.build_meta:__legacy__"
+        check = ["setuptools>=40.8.0", "wheel"]
+
+    return (requires, backend, check)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc b/venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0182caca6d4a2ab2920233d76d8aaec1968c522b
GIT binary patch
literal 4063
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
a1A_n)D0F$4#Fzva1(?_vRhc<CIJp5a751C}

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.py
new file mode 100644
index 00000000..c39f63fa
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.py
@@ -0,0 +1,78 @@
+from __future__ import absolute_import
+
+import logging
+
+from .req_install import InstallRequirement
+from .req_set import RequirementSet
+from .req_file import parse_requirements
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, List, Sequence
+
+__all__ = [
+    "RequirementSet", "InstallRequirement",
+    "parse_requirements", "install_given_reqs",
+]
+
+logger = logging.getLogger(__name__)
+
+
+def install_given_reqs(
+    to_install,  # type: List[InstallRequirement]
+    install_options,  # type: List[str]
+    global_options=(),  # type: Sequence[str]
+    *args,  # type: Any
+    **kwargs  # type: Any
+):
+    # type: (...) -> List[InstallRequirement]
+    """
+    Install everything in the given list.
+
+    (to be called after having downloaded and unpacked the packages)
+    """
+
+    if to_install:
+        logger.info(
+            'Installing collected packages: %s',
+            ', '.join([req.name for req in to_install]),
+        )
+
+    with indent_log():
+        for requirement in to_install:
+            if requirement.conflicts_with:
+                logger.info(
+                    'Found existing installation: %s',
+                    requirement.conflicts_with,
+                )
+                with indent_log():
+                    uninstalled_pathset = requirement.uninstall(
+                        auto_confirm=True
+                    )
+            try:
+                requirement.install(
+                    install_options,
+                    global_options,
+                    *args,
+                    **kwargs
+                )
+            except Exception:
+                should_rollback = (
+                    requirement.conflicts_with and
+                    not requirement.install_succeeded
+                )
+                # if install did not succeed, rollback previous uninstall
+                if should_rollback:
+                    uninstalled_pathset.rollback()
+                raise
+            else:
+                should_commit = (
+                    requirement.conflicts_with and
+                    requirement.install_succeeded
+                )
+                if should_commit:
+                    uninstalled_pathset.commit()
+            requirement.remove_temporary_source()
+
+    return to_install
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3bcac221a4db1da8f541d1121a311b24537a2f0d
GIT binary patch
literal 1982
zcmZSn%*&NH<x)&C0~D|@FfcecFfbG!VqjoMVPHsMWXNG)$Yo@RVq{<h@tGKMm>8m%
z7*d!SQdk&rm>F_e7@}Ah7(skih8$LgTsDR%HVB`MA%~qImxCdS1EQCmA%~M8my02a
z3&Q7M$l+$l<za~8VPH(<VJMmiwvm$|hnFFjk0FYWA(x*aik~4@fFVkNfiaJPA%%+}
zg_|LTharWRA)SRGN{}Iyi6KjfAyt^6nUNt%gdv5WA%%~jg^?jjlp%$QAy`9zfq@|t
z<TnjQ1_p)_eg+1H#H8Z<oYIoi_{`jb{Gt-SOppvjT8M#x!85P8Brzu^D7COOvnVw;
zHLnCB$H&0HfFu~43Ka+GDM&0TPK_@@Xeoy1;R4y7my()S5}%Ww4iN*X_l*pQjCb~M
zb@q-A3ib2z^mEr>200HzIObKBfMUTXv$&*$gMon|IJK}eH7_|ehzaBZkYj^D>PkQc
zWkMVqpPpHkng?<~aWY5_WG@c`1A{*(CRG?27-|?8iYypP7#Ok`K~b8*#E`|rkPa4i
ziREXgWo4*gWyoS?h+|?XlmUfhGZQ$#OIR4185sKSGB8$L1sUQJdzPV=jiH8(A&Zrv
zXadYcW~c~A7gUQl10zTk8z_~Ouro9>FxIj&gr~4F1V-dBFjPu`b#O4$Ff!CIG1M?K
z)UYu0F)=WP=UFkZlyEX+b1@V>V_;+i8^X$ve+sOgi-D(>gQ13lq38ia4Ld^?H^_CM
zgwe#nkf+8F0kV;mA^#gxaV;l94JShp4<kq|4@@mc5igii=*bWcaZ(KfL$C%L0|P^G
zDFXuomx6+V0yG^cq?V-?RhDFA=A|oS<|&k9q$+>|TOlX2xI~W&tW={UUm+<~AvrN8
zCpASOF|8!ENFgJ!45TF`zdSD|KQRR)o|mFfnpcpRoSm8iHV4E^OiwM=1RGMUh)8@O
zoyqw*IjPAdsVNFDbyf<h#l@gRprcSM&%nUomS38eqL5mVSzH3r08I;tC7JnoAf+Xs
z6p&b2k{_R(pO=<dl<TJfO2Z`}Z|3Bur>7Qy(^+O-T0WSOm7kdhX5=O2rUrqMU<pV)
zNOMkRa!GM~d1gsQ2`2*sLunq=F0k^DqSDk7c5q4u=NzyS*NWuS0+35e1Q9av#ihx~
zsi`TcDd2=%l%JE6l$e|ic2RPEZf<5ti8uoTLs4pOepzaKNh&CRCKgr37w4B2C8uhD
zQgsQK$d89P0F<Gj?D%}Jg~ec3r|0A+CFa0|K)y*VN-qXmm0b>If-*``YGDaC*h+YA
zFA+xeVQNZzL1IZpacT*;>?qF2FU?7bhr65?lw=@c5D#d8%Nh_-oXfz#pkGjwS(aFm
zs$Z5^q@R|blag9gte;(|pIvNZZf;nZWn^AvXklKQQ<+{KZ<1nSVqjokke;U>qF<0%
zpbPbvZh4|*X<!CO2#n)1^GZ^S@)C3Oi&6{q<Kr{)GE3s)^$IG3I2jli#6T{x137??
zjggI!nNgFOi;<U+6U^pf;$q}v6k=iq^OzZ#8M&EwnK&7_nAsS48QGaR89A9iED<J%
zKR||oLp(k{t+b@HC^bGl2xK%kx<P3uGcO$$ey}JB0+mo;1x2Za@x`en;BpHR;i-l3
zX_+~xkn&5Kfq|hQvp^5-AHC9&%$#C9sJW07D1}2&No7H1UV0EKsMG`{Xeb}V3<9Oa
zAW+E(c13)AVopwcJUCURr<V9YQa(sJJ|2|P<Ku%sDF7UJ5MP6Q2xieg3c<l-lbfGX
inv-e=3dmv!1_lNJCLSgMMkr)rW0YrRW8`7xX9EB<qu1#G

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py
new file mode 100644
index 00000000..0f18b6a7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py
@@ -0,0 +1,340 @@
+"""Backing implementation for InstallRequirement's various constructors
+
+The idea here is that these formed a major chunk of InstallRequirement's size
+so, moving them and support code dedicated to them outside of that class
+helps creates for better understandability for the rest of the code.
+
+These are meant to be used elsewhere within pip to create instances of
+InstallRequirement.
+"""
+
+import logging
+import os
+import re
+
+from pip._vendor.packaging.markers import Marker
+from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
+from pip._vendor.packaging.specifiers import Specifier
+from pip._vendor.pkg_resources import RequirementParseError, parse_requirements
+
+from pip._internal.download import (
+    is_archive_file, is_url, path_to_url, url_to_path,
+)
+from pip._internal.exceptions import InstallationError
+from pip._internal.models.index import PyPI, TestPyPI
+from pip._internal.models.link import Link
+from pip._internal.pyproject import make_pyproject_path
+from pip._internal.req.req_install import InstallRequirement
+from pip._internal.utils.misc import is_installable_dir
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.vcs import vcs
+from pip._internal.wheel import Wheel
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any, Dict, Optional, Set, Tuple, Union,
+    )
+    from pip._internal.cache import WheelCache
+
+
+__all__ = [
+    "install_req_from_editable", "install_req_from_line",
+    "parse_editable"
+]
+
+logger = logging.getLogger(__name__)
+operators = Specifier._operators.keys()
+
+
+def _strip_extras(path):
+    # type: (str) -> Tuple[str, Optional[str]]
+    m = re.match(r'^(.+)(\[[^\]]+\])$', path)
+    extras = None
+    if m:
+        path_no_extras = m.group(1)
+        extras = m.group(2)
+    else:
+        path_no_extras = path
+
+    return path_no_extras, extras
+
+
+def parse_editable(editable_req):
+    # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]]
+    """Parses an editable requirement into:
+        - a requirement name
+        - an URL
+        - extras
+        - editable options
+    Accepted requirements:
+        svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir
+        .[some_extra]
+    """
+
+    url = editable_req
+
+    # If a file path is specified with extras, strip off the extras.
+    url_no_extras, extras = _strip_extras(url)
+
+    if os.path.isdir(url_no_extras):
+        if not os.path.exists(os.path.join(url_no_extras, 'setup.py')):
+            msg = (
+                'File "setup.py" not found. Directory cannot be installed '
+                'in editable mode: {}'.format(os.path.abspath(url_no_extras))
+            )
+            pyproject_path = make_pyproject_path(url_no_extras)
+            if os.path.isfile(pyproject_path):
+                msg += (
+                    '\n(A "pyproject.toml" file was found, but editable '
+                    'mode currently requires a setup.py based build.)'
+                )
+            raise InstallationError(msg)
+
+        # Treating it as code that has already been checked out
+        url_no_extras = path_to_url(url_no_extras)
+
+    if url_no_extras.lower().startswith('file:'):
+        package_name = Link(url_no_extras).egg_fragment
+        if extras:
+            return (
+                package_name,
+                url_no_extras,
+                Requirement("placeholder" + extras.lower()).extras,
+            )
+        else:
+            return package_name, url_no_extras, None
+
+    for version_control in vcs:
+        if url.lower().startswith('%s:' % version_control):
+            url = '%s+%s' % (version_control, url)
+            break
+
+    if '+' not in url:
+        raise InstallationError(
+            '%s should either be a path to a local project or a VCS url '
+            'beginning with svn+, git+, hg+, or bzr+' %
+            editable_req
+        )
+
+    vc_type = url.split('+', 1)[0].lower()
+
+    if not vcs.get_backend(vc_type):
+        error_message = 'For --editable=%s only ' % editable_req + \
+            ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \
+            ' is currently supported'
+        raise InstallationError(error_message)
+
+    package_name = Link(url).egg_fragment
+    if not package_name:
+        raise InstallationError(
+            "Could not detect requirement name for '%s', please specify one "
+            "with #egg=your_package_name" % editable_req
+        )
+    return package_name, url, None
+
+
+def deduce_helpful_msg(req):
+    # type: (str) -> str
+    """Returns helpful msg in case requirements file does not exist,
+    or cannot be parsed.
+
+    :params req: Requirements file path
+    """
+    msg = ""
+    if os.path.exists(req):
+        msg = " It does exist."
+        # Try to parse and check if it is a requirements file.
+        try:
+            with open(req, 'r') as fp:
+                # parse first line only
+                next(parse_requirements(fp.read()))
+                msg += " The argument you provided " + \
+                    "(%s) appears to be a" % (req) + \
+                    " requirements file. If that is the" + \
+                    " case, use the '-r' flag to install" + \
+                    " the packages specified within it."
+        except RequirementParseError:
+            logger.debug("Cannot parse '%s' as requirements \
+            file" % (req), exc_info=True)
+    else:
+        msg += " File '%s' does not exist." % (req)
+    return msg
+
+
+# ---- The actual constructors follow ----
+
+
+def install_req_from_editable(
+    editable_req,  # type: str
+    comes_from=None,  # type: Optional[str]
+    use_pep517=None,  # type: Optional[bool]
+    isolated=False,  # type: bool
+    options=None,  # type: Optional[Dict[str, Any]]
+    wheel_cache=None,  # type: Optional[WheelCache]
+    constraint=False  # type: bool
+):
+    # type: (...) -> InstallRequirement
+    name, url, extras_override = parse_editable(editable_req)
+    if url.startswith('file:'):
+        source_dir = url_to_path(url)
+    else:
+        source_dir = None
+
+    if name is not None:
+        try:
+            req = Requirement(name)
+        except InvalidRequirement:
+            raise InstallationError("Invalid requirement: '%s'" % name)
+    else:
+        req = None
+    return InstallRequirement(
+        req, comes_from, source_dir=source_dir,
+        editable=True,
+        link=Link(url),
+        constraint=constraint,
+        use_pep517=use_pep517,
+        isolated=isolated,
+        options=options if options else {},
+        wheel_cache=wheel_cache,
+        extras=extras_override or (),
+    )
+
+
+def install_req_from_line(
+    name,  # type: str
+    comes_from=None,  # type: Optional[Union[str, InstallRequirement]]
+    use_pep517=None,  # type: Optional[bool]
+    isolated=False,  # type: bool
+    options=None,  # type: Optional[Dict[str, Any]]
+    wheel_cache=None,  # type: Optional[WheelCache]
+    constraint=False  # type: bool
+):
+    # type: (...) -> InstallRequirement
+    """Creates an InstallRequirement from a name, which might be a
+    requirement, directory containing 'setup.py', filename, or URL.
+    """
+    if is_url(name):
+        marker_sep = '; '
+    else:
+        marker_sep = ';'
+    if marker_sep in name:
+        name, markers_as_string = name.split(marker_sep, 1)
+        markers_as_string = markers_as_string.strip()
+        if not markers_as_string:
+            markers = None
+        else:
+            markers = Marker(markers_as_string)
+    else:
+        markers = None
+    name = name.strip()
+    req_as_string = None
+    path = os.path.normpath(os.path.abspath(name))
+    link = None
+    extras_as_string = None
+
+    if is_url(name):
+        link = Link(name)
+    else:
+        p, extras_as_string = _strip_extras(path)
+        looks_like_dir = os.path.isdir(p) and (
+            os.path.sep in name or
+            (os.path.altsep is not None and os.path.altsep in name) or
+            name.startswith('.')
+        )
+        if looks_like_dir:
+            if not is_installable_dir(p):
+                raise InstallationError(
+                    "Directory %r is not installable. Neither 'setup.py' "
+                    "nor 'pyproject.toml' found." % name
+                )
+            link = Link(path_to_url(p))
+        elif is_archive_file(p):
+            if not os.path.isfile(p):
+                logger.warning(
+                    'Requirement %r looks like a filename, but the '
+                    'file does not exist',
+                    name
+                )
+            link = Link(path_to_url(p))
+
+    # it's a local file, dir, or url
+    if link:
+        # Handle relative file URLs
+        if link.scheme == 'file' and re.search(r'\.\./', link.url):
+            link = Link(
+                path_to_url(os.path.normpath(os.path.abspath(link.path))))
+        # wheel file
+        if link.is_wheel:
+            wheel = Wheel(link.filename)  # can raise InvalidWheelFilename
+            req_as_string = "%s==%s" % (wheel.name, wheel.version)
+        else:
+            # set the req to the egg fragment.  when it's not there, this
+            # will become an 'unnamed' requirement
+            req_as_string = link.egg_fragment
+
+    # a requirement specifier
+    else:
+        req_as_string = name
+
+    if extras_as_string:
+        extras = Requirement("placeholder" + extras_as_string.lower()).extras
+    else:
+        extras = ()
+    if req_as_string is not None:
+        try:
+            req = Requirement(req_as_string)
+        except InvalidRequirement:
+            if os.path.sep in req_as_string:
+                add_msg = "It looks like a path."
+                add_msg += deduce_helpful_msg(req_as_string)
+            elif ('=' in req_as_string and
+                  not any(op in req_as_string for op in operators)):
+                add_msg = "= is not a valid operator. Did you mean == ?"
+            else:
+                add_msg = ""
+            raise InstallationError(
+                "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg)
+            )
+    else:
+        req = None
+
+    return InstallRequirement(
+        req, comes_from, link=link, markers=markers,
+        use_pep517=use_pep517, isolated=isolated,
+        options=options if options else {},
+        wheel_cache=wheel_cache,
+        constraint=constraint,
+        extras=extras,
+    )
+
+
+def install_req_from_req_string(
+    req_string,  # type: str
+    comes_from=None,  # type: Optional[InstallRequirement]
+    isolated=False,  # type: bool
+    wheel_cache=None,  # type: Optional[WheelCache]
+    use_pep517=None  # type: Optional[bool]
+):
+    # type: (...) -> InstallRequirement
+    try:
+        req = Requirement(req_string)
+    except InvalidRequirement:
+        raise InstallationError("Invalid requirement: '%s'" % req_string)
+
+    domains_not_allowed = [
+        PyPI.file_storage_domain,
+        TestPyPI.file_storage_domain,
+    ]
+    if (req.url and comes_from and comes_from.link and
+            comes_from.link.netloc in domains_not_allowed):
+        # Explicitly disallow pypi packages that depend on external urls
+        raise InstallationError(
+            "Packages installed from PyPI cannot depend on packages "
+            "which are not also hosted on PyPI.\n"
+            "%s depends on %s " % (comes_from.name, req)
+        )
+
+    return InstallRequirement(
+        req, comes_from, isolated=isolated, wheel_cache=wheel_cache,
+        use_pep517=use_pep517
+    )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..047312e550c043cde536d8d38433a57405f3042f
GIT binary patch
literal 9643
zcmZSn%*&NH<x)&C0~D|`FfceUFfbJJFflNsFfc?hFr+Xtq%bk$Ffv3j!q`j<QA{v4
zGeZ<Jn9a<P!@`iu$`HlMzzEXA!jQwpkju^x#m<n+!4Sm(5oKk_;bh3=Vu<2`@Yxu0
zxEXSJ7@~L>a(Nk|cp;+f3^{xZx%>=K{0zAQ3{e6Mxq=K)f(*Gr3{gT56&wsX!VI}0
z3{fHwJ|{ztC_}CoLzEapt~f)KI7F0-AxDBCSCS!062j+Z$dO{mm1c;NhVXe9a%32C
zWf`JmA$(qj965$ud4?!?2%nE3M}Z+%ks(SE!slnmQDVqdW{6UT@C6uhR2Xtq8KP7f
z7*iD)ib}yg7i7p$W5`u!h*D?B)nJIyV93>Eh|*-p)nbU!V#w8Ih|*@r)nSOzftVr0
zkfY0xtH%(f$H17!z>p%$kRrm6BFd1?%n+r|kjluAWx$YX$k5El5M{)W%Egdn%#dZm
z(9FOPWy+8u#?ZpR5M{=YA`WJlGo(m>85W>8OJQP2wL)S@GPJNUL|G$=FoD=0HBw+H
z8yFWXo+8cA!om<`3la?0kO8HNIz|Qtr^Mv!%)E4k%-n*U)ZEm(lEjkC{5*xU{2~R<
zyyB9?oSdN4!qUtlu$+3aLRn%_W`1e0LUMjyaY<2Wa!GzsF&9@zMyf()N@}7)Mru*2
zLT0f-Nk(FcLP<tyaVp5D+|(3>M1|bMto$N{<c!k1Y=!(Z?8X;oR;6+k=j$ls=9ht-
zRg#gKtB{zNqEK8~P>^3#qL7@QlB$rBnv$8ESdyBeP?8U_C08N8w4^vQB^6{Y*y`k*
z#NuMEjMSWhVuj?Q)Wnk1Vvs`=l2S`bQi~Ky^HNfaic1pnQWBFgb23XR!IC8zsR~7@
z#U&6^Qo(lVfjw88s*qTes*szSm{$U_GbvS}v^X_IAvLEswH)l{^30Nq%shpH%mR=+
z#7c!sPzdHFrxq*Zr*UBhryf`4|NsC0`)M#TFff#`F)%RrCKhF<7HKen_(BW}44!#q
zi8+}mNKsJ2&A`Bb#E0nRWME(jE=WzzOv{967e!SUkXTfl>RMEkUsM7zxB$eBFG56Z
zu?7psQho*ohRovl#G>Sk%(B$@w9K4Tu){Ko<4cQjz?K&zmSn`2<iq);ML8fYNEqT6
zL9oNYX$PE`z_vpC1hONbGQhKhgMon|B(=B%#DVAnN%>^vWkYzv3=9mpiP@>~1(gLw
z`B|ySCGiLgKpwyhO^8O2TxM}RIOKD35|eUL<5Mz=5OThe0g>^}9<I*b@j;<}ex82r
z5IJTB28OcaVhD$ofq@}BBQ-Tg0~9GGAUVgp$`X(hT{4qPz^?Z%0A-ZK9I$L~YDo!5
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
R8wB&nLue4mlMW)8836%(;R65w

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.py
new file mode 100644
index 00000000..270b75cd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.py
@@ -0,0 +1,383 @@
+"""
+Requirements file parsing
+"""
+
+from __future__ import absolute_import
+
+import optparse
+import os
+import re
+import shlex
+import sys
+
+from pip._vendor.six.moves import filterfalse
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+from pip._internal.cli import cmdoptions
+from pip._internal.download import get_file_content
+from pip._internal.exceptions import RequirementsFileParseError
+from pip._internal.req.constructors import (
+    install_req_from_editable, install_req_from_line,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple,
+    )
+    from pip._internal.req import InstallRequirement
+    from pip._internal.cache import WheelCache
+    from pip._internal.index import PackageFinder
+    from pip._internal.download import PipSession
+
+    ReqFileLines = Iterator[Tuple[int, Text]]
+
+__all__ = ['parse_requirements']
+
+SCHEME_RE = re.compile(r'^(http|https|file):', re.I)
+COMMENT_RE = re.compile(r'(^|\s)+#.*$')
+
+# Matches environment variable-style values in '${MY_VARIABLE_1}' with the
+# variable name consisting of only uppercase letters, digits or the '_'
+# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1,
+# 2013 Edition.
+ENV_VAR_RE = re.compile(r'(?P<var>\$\{(?P<name>[A-Z0-9_]+)\})')
+
+SUPPORTED_OPTIONS = [
+    cmdoptions.constraints,
+    cmdoptions.editable,
+    cmdoptions.requirements,
+    cmdoptions.no_index,
+    cmdoptions.index_url,
+    cmdoptions.find_links,
+    cmdoptions.extra_index_url,
+    cmdoptions.always_unzip,
+    cmdoptions.no_binary,
+    cmdoptions.only_binary,
+    cmdoptions.pre,
+    cmdoptions.trusted_host,
+    cmdoptions.require_hashes,
+]  # type: List[Callable[..., optparse.Option]]
+
+# options to be passed to requirements
+SUPPORTED_OPTIONS_REQ = [
+    cmdoptions.install_options,
+    cmdoptions.global_options,
+    cmdoptions.hash,
+]  # type: List[Callable[..., optparse.Option]]
+
+# the 'dest' string values
+SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ]
+
+
+def parse_requirements(
+    filename,  # type: str
+    finder=None,  # type: Optional[PackageFinder]
+    comes_from=None,  # type: Optional[str]
+    options=None,  # type: Optional[optparse.Values]
+    session=None,  # type: Optional[PipSession]
+    constraint=False,  # type: bool
+    wheel_cache=None,  # type: Optional[WheelCache]
+    use_pep517=None  # type: Optional[bool]
+):
+    # type: (...) -> Iterator[InstallRequirement]
+    """Parse a requirements file and yield InstallRequirement instances.
+
+    :param filename:    Path or url of requirements file.
+    :param finder:      Instance of pip.index.PackageFinder.
+    :param comes_from:  Origin description of requirements.
+    :param options:     cli options.
+    :param session:     Instance of pip.download.PipSession.
+    :param constraint:  If true, parsing a constraint file rather than
+        requirements file.
+    :param wheel_cache: Instance of pip.wheel.WheelCache
+    :param use_pep517:  Value of the --use-pep517 option.
+    """
+    if session is None:
+        raise TypeError(
+            "parse_requirements() missing 1 required keyword argument: "
+            "'session'"
+        )
+
+    _, content = get_file_content(
+        filename, comes_from=comes_from, session=session
+    )
+
+    lines_enum = preprocess(content, options)
+
+    for line_number, line in lines_enum:
+        req_iter = process_line(line, filename, line_number, finder,
+                                comes_from, options, session, wheel_cache,
+                                use_pep517=use_pep517, constraint=constraint)
+        for req in req_iter:
+            yield req
+
+
+def preprocess(content, options):
+    # type: (Text, Optional[optparse.Values]) -> ReqFileLines
+    """Split, filter, and join lines, and return a line iterator
+
+    :param content: the content of the requirements file
+    :param options: cli options
+    """
+    lines_enum = enumerate(content.splitlines(), start=1)  # type: ReqFileLines
+    lines_enum = join_lines(lines_enum)
+    lines_enum = ignore_comments(lines_enum)
+    lines_enum = skip_regex(lines_enum, options)
+    lines_enum = expand_env_variables(lines_enum)
+    return lines_enum
+
+
+def process_line(
+    line,  # type: Text
+    filename,  # type: str
+    line_number,  # type: int
+    finder=None,  # type: Optional[PackageFinder]
+    comes_from=None,  # type: Optional[str]
+    options=None,  # type: Optional[optparse.Values]
+    session=None,  # type: Optional[PipSession]
+    wheel_cache=None,  # type: Optional[WheelCache]
+    use_pep517=None,  # type: Optional[bool]
+    constraint=False  # type: bool
+):
+    # type: (...) -> Iterator[InstallRequirement]
+    """Process a single requirements line; This can result in creating/yielding
+    requirements, or updating the finder.
+
+    For lines that contain requirements, the only options that have an effect
+    are from SUPPORTED_OPTIONS_REQ, and they are scoped to the
+    requirement. Other options from SUPPORTED_OPTIONS may be present, but are
+    ignored.
+
+    For lines that do not contain requirements, the only options that have an
+    effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may
+    be present, but are ignored. These lines may contain multiple options
+    (although our docs imply only one is supported), and all our parsed and
+    affect the finder.
+
+    :param constraint: If True, parsing a constraints file.
+    :param options: OptionParser options that we may update
+    """
+    parser = build_parser(line)
+    defaults = parser.get_default_values()
+    defaults.index_url = None
+    if finder:
+        defaults.format_control = finder.format_control
+    args_str, options_str = break_args_options(line)
+    # Prior to 2.7.3, shlex cannot deal with unicode entries
+    if sys.version_info < (2, 7, 3):
+        # https://github.com/python/mypy/issues/1174
+        options_str = options_str.encode('utf8')  # type: ignore
+    # https://github.com/python/mypy/issues/1174
+    opts, _ = parser.parse_args(
+        shlex.split(options_str), defaults)  # type: ignore
+
+    # preserve for the nested code path
+    line_comes_from = '%s %s (line %s)' % (
+        '-c' if constraint else '-r', filename, line_number,
+    )
+
+    # yield a line requirement
+    if args_str:
+        isolated = options.isolated_mode if options else False
+        if options:
+            cmdoptions.check_install_build_global(options, opts)
+        # get the options that apply to requirements
+        req_options = {}
+        for dest in SUPPORTED_OPTIONS_REQ_DEST:
+            if dest in opts.__dict__ and opts.__dict__[dest]:
+                req_options[dest] = opts.__dict__[dest]
+        yield install_req_from_line(
+            args_str, line_comes_from, constraint=constraint,
+            use_pep517=use_pep517,
+            isolated=isolated, options=req_options, wheel_cache=wheel_cache
+        )
+
+    # yield an editable requirement
+    elif opts.editables:
+        isolated = options.isolated_mode if options else False
+        yield install_req_from_editable(
+            opts.editables[0], comes_from=line_comes_from,
+            use_pep517=use_pep517,
+            constraint=constraint, isolated=isolated, wheel_cache=wheel_cache
+        )
+
+    # parse a nested requirements file
+    elif opts.requirements or opts.constraints:
+        if opts.requirements:
+            req_path = opts.requirements[0]
+            nested_constraint = False
+        else:
+            req_path = opts.constraints[0]
+            nested_constraint = True
+        # original file is over http
+        if SCHEME_RE.search(filename):
+            # do a url join so relative paths work
+            req_path = urllib_parse.urljoin(filename, req_path)
+        # original file and nested file are paths
+        elif not SCHEME_RE.search(req_path):
+            # do a join so relative paths work
+            req_path = os.path.join(os.path.dirname(filename), req_path)
+        # TODO: Why not use `comes_from='-r {} (line {})'` here as well?
+        parsed_reqs = parse_requirements(
+            req_path, finder, comes_from, options, session,
+            constraint=nested_constraint, wheel_cache=wheel_cache
+        )
+        for req in parsed_reqs:
+            yield req
+
+    # percolate hash-checking option upward
+    elif opts.require_hashes:
+        options.require_hashes = opts.require_hashes
+
+    # set finder options
+    elif finder:
+        if opts.index_url:
+            finder.index_urls = [opts.index_url]
+        if opts.no_index is True:
+            finder.index_urls = []
+        if opts.extra_index_urls:
+            finder.index_urls.extend(opts.extra_index_urls)
+        if opts.find_links:
+            # FIXME: it would be nice to keep track of the source
+            # of the find_links: support a find-links local path
+            # relative to a requirements file.
+            value = opts.find_links[0]
+            req_dir = os.path.dirname(os.path.abspath(filename))
+            relative_to_reqs_file = os.path.join(req_dir, value)
+            if os.path.exists(relative_to_reqs_file):
+                value = relative_to_reqs_file
+            finder.find_links.append(value)
+        if opts.pre:
+            finder.allow_all_prereleases = True
+        if opts.trusted_hosts:
+            finder.secure_origins.extend(
+                ("*", host, "*") for host in opts.trusted_hosts)
+
+
+def break_args_options(line):
+    # type: (Text) -> Tuple[str, Text]
+    """Break up the line into an args and options string.  We only want to shlex
+    (and then optparse) the options, not the args.  args can contain markers
+    which are corrupted by shlex.
+    """
+    tokens = line.split(' ')
+    args = []
+    options = tokens[:]
+    for token in tokens:
+        if token.startswith('-') or token.startswith('--'):
+            break
+        else:
+            args.append(token)
+            options.pop(0)
+    return ' '.join(args), ' '.join(options)  # type: ignore
+
+
+def build_parser(line):
+    # type: (Text) -> optparse.OptionParser
+    """
+    Return a parser for parsing requirement lines
+    """
+    parser = optparse.OptionParser(add_help_option=False)
+
+    option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ
+    for option_factory in option_factories:
+        option = option_factory()
+        parser.add_option(option)
+
+    # By default optparse sys.exits on parsing errors. We want to wrap
+    # that in our own exception.
+    def parser_exit(self, msg):
+        # type: (Any, str) -> NoReturn
+        # add offending line
+        msg = 'Invalid requirement: %s\n%s' % (line, msg)
+        raise RequirementsFileParseError(msg)
+    # NOTE: mypy disallows assigning to a method
+    #       https://github.com/python/mypy/issues/2427
+    parser.exit = parser_exit  # type: ignore
+
+    return parser
+
+
+def join_lines(lines_enum):
+    # type: (ReqFileLines) -> ReqFileLines
+    """Joins a line ending in '\' with the previous line (except when following
+    comments).  The joined line takes on the index of the first line.
+    """
+    primary_line_number = None
+    new_line = []  # type: List[Text]
+    for line_number, line in lines_enum:
+        if not line.endswith('\\') or COMMENT_RE.match(line):
+            if COMMENT_RE.match(line):
+                # this ensures comments are always matched later
+                line = ' ' + line
+            if new_line:
+                new_line.append(line)
+                yield primary_line_number, ''.join(new_line)
+                new_line = []
+            else:
+                yield line_number, line
+        else:
+            if not new_line:
+                primary_line_number = line_number
+            new_line.append(line.strip('\\'))
+
+    # last line contains \
+    if new_line:
+        yield primary_line_number, ''.join(new_line)
+
+    # TODO: handle space after '\'.
+
+
+def ignore_comments(lines_enum):
+    # type: (ReqFileLines) -> ReqFileLines
+    """
+    Strips comments and filter empty lines.
+    """
+    for line_number, line in lines_enum:
+        line = COMMENT_RE.sub('', line)
+        line = line.strip()
+        if line:
+            yield line_number, line
+
+
+def skip_regex(lines_enum, options):
+    # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines
+    """
+    Skip lines that match '--skip-requirements-regex' pattern
+
+    Note: the regex pattern is only built once
+    """
+    skip_regex = options.skip_requirements_regex if options else None
+    if skip_regex:
+        pattern = re.compile(skip_regex)
+        lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum)
+    return lines_enum
+
+
+def expand_env_variables(lines_enum):
+    # type: (ReqFileLines) -> ReqFileLines
+    """Replace all environment variables that can be retrieved via `os.getenv`.
+
+    The only allowed format for environment variables defined in the
+    requirement file is `${MY_VARIABLE_1}` to ensure two things:
+
+    1. Strings that contain a `$` aren't accidentally (partially) expanded.
+    2. Ensure consistency across platforms for requirement files.
+
+    These points are the result of a discussion on the `github pull
+    request #3514 <https://github.com/pypa/pip/pull/3514>`_.
+
+    Valid characters in variable names follow the `POSIX standard
+    <http://pubs.opengroup.org/onlinepubs/9699919799/>`_ and are limited
+    to uppercase letter, digits and the `_` (underscore).
+    """
+    for line_number, line in lines_enum:
+        for env_var, var_name in ENV_VAR_RE.findall(line):
+            value = os.getenv(var_name)
+            if not value:
+                continue
+
+            line = line.replace(env_var, value)
+
+        yield line_number, line
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0f8a936e3e90a28f547b029820c8899850ba3747
GIT binary patch
literal 11785
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
BbUgq7

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py
new file mode 100644
index 00000000..25a692e1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py
@@ -0,0 +1,1028 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import shutil
+import sys
+import sysconfig
+import zipfile
+from distutils.util import change_root
+
+from pip._vendor import pkg_resources, six
+from pip._vendor.packaging.requirements import Requirement
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.packaging.version import Version
+from pip._vendor.packaging.version import parse as parse_version
+from pip._vendor.pep517.wrappers import Pep517HookCaller
+
+from pip._internal import wheel
+from pip._internal.build_env import NoOpBuildEnvironment
+from pip._internal.exceptions import InstallationError
+from pip._internal.locations import (
+    PIP_DELETE_MARKER_FILENAME, running_under_virtualenv,
+)
+from pip._internal.models.link import Link
+from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path
+from pip._internal.req.req_uninstall import UninstallPathSet
+from pip._internal.utils.compat import native_str
+from pip._internal.utils.hashes import Hashes
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import (
+    _make_build_dir, ask_path_exists, backup_dir, call_subprocess,
+    display_path, dist_in_site_packages, dist_in_usersite, ensure_dir,
+    get_installed_version, redact_password_from_url, rmtree,
+)
+from pip._internal.utils.packaging import get_metadata
+from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.ui import open_spinner
+from pip._internal.vcs import vcs
+from pip._internal.wheel import move_wheel_files
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union,
+    )
+    from pip._internal.build_env import BuildEnvironment
+    from pip._internal.cache import WheelCache
+    from pip._internal.index import PackageFinder
+    from pip._vendor.pkg_resources import Distribution
+    from pip._vendor.packaging.specifiers import SpecifierSet
+    from pip._vendor.packaging.markers import Marker
+
+
+logger = logging.getLogger(__name__)
+
+
+class InstallRequirement(object):
+    """
+    Represents something that may be installed later on, may have information
+    about where to fetch the relevant requirement and also contains logic for
+    installing the said requirement.
+    """
+
+    def __init__(
+        self,
+        req,  # type: Optional[Requirement]
+        comes_from,  # type: Optional[Union[str, InstallRequirement]]
+        source_dir=None,  # type: Optional[str]
+        editable=False,  # type: bool
+        link=None,  # type: Optional[Link]
+        update=True,  # type: bool
+        markers=None,  # type: Optional[Marker]
+        use_pep517=None,  # type: Optional[bool]
+        isolated=False,  # type: bool
+        options=None,  # type: Optional[Dict[str, Any]]
+        wheel_cache=None,  # type: Optional[WheelCache]
+        constraint=False,  # type: bool
+        extras=()  # type: Iterable[str]
+    ):
+        # type: (...) -> None
+        assert req is None or isinstance(req, Requirement), req
+        self.req = req
+        self.comes_from = comes_from
+        self.constraint = constraint
+        if source_dir is not None:
+            self.source_dir = os.path.normpath(os.path.abspath(source_dir))
+        else:
+            self.source_dir = None
+        self.editable = editable
+
+        self._wheel_cache = wheel_cache
+        if link is None and req and req.url:
+            # PEP 508 URL requirement
+            link = Link(req.url)
+        self.link = self.original_link = link
+
+        if extras:
+            self.extras = extras
+        elif req:
+            self.extras = {
+                pkg_resources.safe_extra(extra) for extra in req.extras
+            }
+        else:
+            self.extras = set()
+        if markers is None and req:
+            markers = req.marker
+        self.markers = markers
+
+        self._egg_info_path = None  # type: Optional[str]
+        # This holds the pkg_resources.Distribution object if this requirement
+        # is already available:
+        self.satisfied_by = None
+        # This hold the pkg_resources.Distribution object if this requirement
+        # conflicts with another installed distribution:
+        self.conflicts_with = None
+        # Temporary build location
+        self._temp_build_dir = TempDirectory(kind="req-build")
+        # Used to store the global directory where the _temp_build_dir should
+        # have been created. Cf _correct_build_location method.
+        self._ideal_build_dir = None  # type: Optional[str]
+        # True if the editable should be updated:
+        self.update = update
+        # Set to True after successful installation
+        self.install_succeeded = None  # type: Optional[bool]
+        # UninstallPathSet of uninstalled distribution (for possible rollback)
+        self.uninstalled_pathset = None
+        self.options = options if options else {}
+        # Set to True after successful preparation of this requirement
+        self.prepared = False
+        self.is_direct = False
+
+        self.isolated = isolated
+        self.build_env = NoOpBuildEnvironment()  # type: BuildEnvironment
+
+        # For PEP 517, the directory where we request the project metadata
+        # gets stored. We need this to pass to build_wheel, so the backend
+        # can ensure that the wheel matches the metadata (see the PEP for
+        # details).
+        self.metadata_directory = None  # type: Optional[str]
+
+        # The static build requirements (from pyproject.toml)
+        self.pyproject_requires = None  # type: Optional[List[str]]
+
+        # Build requirements that we will check are available
+        self.requirements_to_check = []  # type: List[str]
+
+        # The PEP 517 backend we should use to build the project
+        self.pep517_backend = None  # type: Optional[Pep517HookCaller]
+
+        # Are we using PEP 517 for this requirement?
+        # After pyproject.toml has been loaded, the only valid values are True
+        # and False. Before loading, None is valid (meaning "use the default").
+        # Setting an explicit value before loading pyproject.toml is supported,
+        # but after loading this flag should be treated as read only.
+        self.use_pep517 = use_pep517
+
+    def __str__(self):
+        # type: () -> str
+        if self.req:
+            s = str(self.req)
+            if self.link:
+                s += ' from %s' % redact_password_from_url(self.link.url)
+        elif self.link:
+            s = redact_password_from_url(self.link.url)
+        else:
+            s = '<InstallRequirement>'
+        if self.satisfied_by is not None:
+            s += ' in %s' % display_path(self.satisfied_by.location)
+        if self.comes_from:
+            if isinstance(self.comes_from, six.string_types):
+                comes_from = self.comes_from
+            else:
+                comes_from = self.comes_from.from_path()
+            if comes_from:
+                s += ' (from %s)' % comes_from
+        return s
+
+    def __repr__(self):
+        # type: () -> str
+        return '<%s object: %s editable=%r>' % (
+            self.__class__.__name__, str(self), self.editable)
+
+    def populate_link(self, finder, upgrade, require_hashes):
+        # type: (PackageFinder, bool, bool) -> None
+        """Ensure that if a link can be found for this, that it is found.
+
+        Note that self.link may still be None - if Upgrade is False and the
+        requirement is already installed.
+
+        If 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 undeterministic contents due
+        to file modification times.
+        """
+        if self.link is None:
+            self.link = finder.find_requirement(self, upgrade)
+        if self._wheel_cache is not None and not require_hashes:
+            old_link = self.link
+            self.link = self._wheel_cache.get(self.link, self.name)
+            if old_link != self.link:
+                logger.debug('Using cached wheel link: %s', self.link)
+
+    # Things that are valid for all kinds of requirements?
+    @property
+    def name(self):
+        # type: () -> Optional[str]
+        if self.req is None:
+            return None
+        return native_str(pkg_resources.safe_name(self.req.name))
+
+    @property
+    def specifier(self):
+        # type: () -> SpecifierSet
+        return self.req.specifier
+
+    @property
+    def is_pinned(self):
+        # type: () -> bool
+        """Return whether I am pinned to an exact version.
+
+        For example, some-package==1.2 is pinned; some-package>1.2 is not.
+        """
+        specifiers = self.specifier
+        return (len(specifiers) == 1 and
+                next(iter(specifiers)).operator in {'==', '==='})
+
+    @property
+    def installed_version(self):
+        # type: () -> Optional[str]
+        return get_installed_version(self.name)
+
+    def match_markers(self, extras_requested=None):
+        # type: (Optional[Iterable[str]]) -> bool
+        if not extras_requested:
+            # Provide an extra to safely evaluate the markers
+            # without matching any extra
+            extras_requested = ('',)
+        if self.markers is not None:
+            return any(
+                self.markers.evaluate({'extra': extra})
+                for extra in extras_requested)
+        else:
+            return True
+
+    @property
+    def has_hash_options(self):
+        # type: () -> bool
+        """Return whether any known-good hashes are specified as options.
+
+        These activate --require-hashes mode; hashes specified as part of a
+        URL do not.
+
+        """
+        return bool(self.options.get('hashes', {}))
+
+    def hashes(self, trust_internet=True):
+        # type: (bool) -> Hashes
+        """Return a hash-comparer that considers my option- and URL-based
+        hashes to be known-good.
+
+        Hashes in URLs--ones embedded in the requirements file, not ones
+        downloaded from an index server--are almost peers with ones from
+        flags. They satisfy --require-hashes (whether it was implicitly or
+        explicitly activated) but do not activate it. md5 and sha224 are not
+        allowed in flags, which should nudge people toward good algos. We
+        always OR all hashes together, even ones from URLs.
+
+        :param trust_internet: Whether to trust URL-based (#md5=...) hashes
+            downloaded from the internet, as by populate_link()
+
+        """
+        good_hashes = self.options.get('hashes', {}).copy()
+        link = self.link if trust_internet else self.original_link
+        if link and link.hash:
+            good_hashes.setdefault(link.hash_name, []).append(link.hash)
+        return Hashes(good_hashes)
+
+    def from_path(self):
+        # type: () -> Optional[str]
+        """Format a nice indicator to show where this "comes from"
+        """
+        if self.req is None:
+            return None
+        s = str(self.req)
+        if self.comes_from:
+            if isinstance(self.comes_from, six.string_types):
+                comes_from = self.comes_from
+            else:
+                comes_from = self.comes_from.from_path()
+            if comes_from:
+                s += '->' + comes_from
+        return s
+
+    def build_location(self, build_dir):
+        # type: (str) -> Optional[str]
+        assert build_dir is not None
+        if self._temp_build_dir.path is not None:
+            return self._temp_build_dir.path
+        if self.req is None:
+            # for requirement via a path to a directory: the name of the
+            # package is not available yet so we create a temp directory
+            # Once run_egg_info will have run, we'll be able
+            # to fix it via _correct_build_location
+            # Some systems have /tmp as a symlink which confuses custom
+            # builds (such as numpy). Thus, we ensure that the real path
+            # is returned.
+            self._temp_build_dir.create()
+            self._ideal_build_dir = build_dir
+
+            return self._temp_build_dir.path
+        if self.editable:
+            name = self.name.lower()
+        else:
+            name = self.name
+        # 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)
+            _make_build_dir(build_dir)
+        return os.path.join(build_dir, name)
+
+    def _correct_build_location(self):
+        # type: () -> None
+        """Move self._temp_build_dir to self._ideal_build_dir/self.req.name
+
+        For some requirements (e.g. a path to a directory), the name of the
+        package is not available until we run egg_info, so the build_location
+        will return a temporary directory and store the _ideal_build_dir.
+
+        This is only called by self.run_egg_info to fix the temporary build
+        directory.
+        """
+        if self.source_dir is not None:
+            return
+        assert self.req is not None
+        assert self._temp_build_dir.path
+        assert (self._ideal_build_dir is not None and
+                self._ideal_build_dir.path)  # type: ignore
+        old_location = self._temp_build_dir.path
+        self._temp_build_dir.path = None
+
+        new_location = self.build_location(self._ideal_build_dir)
+        if os.path.exists(new_location):
+            raise InstallationError(
+                'A package already exists in %s; please remove it to continue'
+                % display_path(new_location))
+        logger.debug(
+            'Moving package %s from %s to new location %s',
+            self, display_path(old_location), display_path(new_location),
+        )
+        shutil.move(old_location, new_location)
+        self._temp_build_dir.path = new_location
+        self._ideal_build_dir = None
+        self.source_dir = os.path.normpath(os.path.abspath(new_location))
+        self._egg_info_path = None
+
+        # Correct the metadata directory, if it exists
+        if self.metadata_directory:
+            old_meta = self.metadata_directory
+            rel = os.path.relpath(old_meta, start=old_location)
+            new_meta = os.path.join(new_location, rel)
+            new_meta = os.path.normpath(os.path.abspath(new_meta))
+            self.metadata_directory = new_meta
+
+    def remove_temporary_source(self):
+        # type: () -> None
+        """Remove the source files from this requirement, if they are marked
+        for deletion"""
+        if self.source_dir and os.path.exists(
+                os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)):
+            logger.debug('Removing source in %s', self.source_dir)
+            rmtree(self.source_dir)
+        self.source_dir = None
+        self._temp_build_dir.cleanup()
+        self.build_env.cleanup()
+
+    def check_if_exists(self, use_user_site):
+        # type: (bool) -> bool
+        """Find an installed distribution that satisfies or conflicts
+        with this requirement, and set self.satisfied_by or
+        self.conflicts_with appropriately.
+        """
+        if self.req is None:
+            return False
+        try:
+            # 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
+            self.satisfied_by = pkg_resources.get_distribution(str(no_marker))
+            if self.editable and self.satisfied_by:
+                self.conflicts_with = self.satisfied_by
+                # when installing editables, nothing pre-existing should ever
+                # satisfy
+                self.satisfied_by = None
+                return True
+        except pkg_resources.DistributionNotFound:
+            return False
+        except pkg_resources.VersionConflict:
+            existing_dist = pkg_resources.get_distribution(
+                self.req.name
+            )
+            if use_user_site:
+                if dist_in_usersite(existing_dist):
+                    self.conflicts_with = existing_dist
+                elif (running_under_virtualenv() and
+                        dist_in_site_packages(existing_dist)):
+                    raise InstallationError(
+                        "Will not install to the user site because it will "
+                        "lack sys.path precedence to %s in %s" %
+                        (existing_dist.project_name, existing_dist.location)
+                    )
+            else:
+                self.conflicts_with = existing_dist
+        return True
+
+    # Things valid for wheels
+    @property
+    def is_wheel(self):
+        # type: () -> bool
+        if not self.link:
+            return False
+        return self.link.is_wheel
+
+    def move_wheel_files(
+        self,
+        wheeldir,  # type: str
+        root=None,  # type: Optional[str]
+        home=None,  # type: Optional[str]
+        prefix=None,  # type: Optional[str]
+        warn_script_location=True,  # type: bool
+        use_user_site=False,  # type: bool
+        pycompile=True  # type: bool
+    ):
+        # type: (...) -> None
+        move_wheel_files(
+            self.name, self.req, wheeldir,
+            user=use_user_site,
+            home=home,
+            root=root,
+            prefix=prefix,
+            pycompile=pycompile,
+            isolated=self.isolated,
+            warn_script_location=warn_script_location,
+        )
+
+    # Things valid for sdists
+    @property
+    def setup_py_dir(self):
+        # type: () -> str
+        return os.path.join(
+            self.source_dir,
+            self.link and self.link.subdirectory_fragment or '')
+
+    @property
+    def setup_py(self):
+        # type: () -> str
+        assert self.source_dir, "No source dir for %s" % self
+
+        setup_py = os.path.join(self.setup_py_dir, 'setup.py')
+
+        # Python2 __file__ should not be unicode
+        if six.PY2 and isinstance(setup_py, six.text_type):
+            setup_py = setup_py.encode(sys.getfilesystemencoding())
+
+        return setup_py
+
+    @property
+    def pyproject_toml(self):
+        # type: () -> str
+        assert self.source_dir, "No source dir for %s" % self
+
+        return make_pyproject_path(self.setup_py_dir)
+
+    def load_pyproject_toml(self):
+        # type: () -> None
+        """Load the pyproject.toml file.
+
+        After calling this routine, all of the attributes related to PEP 517
+        processing for this requirement have been set. In particular, the
+        use_pep517 attribute can be used to determine whether we should
+        follow the PEP 517 or legacy (setup.py) code path.
+        """
+        pep517_data = load_pyproject_toml(
+            self.use_pep517,
+            self.pyproject_toml,
+            self.setup_py,
+            str(self)
+        )
+
+        if pep517_data is None:
+            self.use_pep517 = False
+        else:
+            self.use_pep517 = True
+            requires, backend, check = pep517_data
+            self.requirements_to_check = check
+            self.pyproject_requires = requires
+            self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend)
+
+            # Use a custom function to call subprocesses
+            self.spin_message = ""
+
+            def runner(
+                cmd,  # type: List[str]
+                cwd=None,  # type: Optional[str]
+                extra_environ=None  # type: Optional[Mapping[str, Any]]
+            ):
+                # type: (...) -> None
+                with open_spinner(self.spin_message) as spinner:
+                    call_subprocess(
+                        cmd,
+                        cwd=cwd,
+                        extra_environ=extra_environ,
+                        spinner=spinner
+                    )
+                self.spin_message = ""
+
+            self.pep517_backend._subprocess_runner = runner
+
+    def prepare_metadata(self):
+        # type: () -> None
+        """Ensure that project metadata is available.
+
+        Under PEP 517, call the backend hook to prepare the metadata.
+        Under legacy processing, call setup.py egg-info.
+        """
+        assert self.source_dir
+
+        with indent_log():
+            if self.use_pep517:
+                self.prepare_pep517_metadata()
+            else:
+                self.run_egg_info()
+
+        if not self.req:
+            if isinstance(parse_version(self.metadata["Version"]), Version):
+                op = "=="
+            else:
+                op = "==="
+            self.req = Requirement(
+                "".join([
+                    self.metadata["Name"],
+                    op,
+                    self.metadata["Version"],
+                ])
+            )
+            self._correct_build_location()
+        else:
+            metadata_name = canonicalize_name(self.metadata["Name"])
+            if canonicalize_name(self.req.name) != metadata_name:
+                logger.warning(
+                    'Generating metadata for package %s '
+                    'produced metadata for project name %s. Fix your '
+                    '#egg=%s fragments.',
+                    self.name, metadata_name, self.name
+                )
+                self.req = Requirement(metadata_name)
+
+    def prepare_pep517_metadata(self):
+        # type: () -> None
+        assert self.pep517_backend is not None
+
+        metadata_dir = os.path.join(
+            self.setup_py_dir,
+            'pip-wheel-metadata'
+        )
+        ensure_dir(metadata_dir)
+
+        with self.build_env:
+            # Note that Pep517HookCaller implements a fallback for
+            # prepare_metadata_for_build_wheel, so we don't have to
+            # consider the possibility that this hook doesn't exist.
+            backend = self.pep517_backend
+            self.spin_message = "Preparing wheel metadata"
+            distinfo_dir = backend.prepare_metadata_for_build_wheel(
+                metadata_dir
+            )
+
+        self.metadata_directory = os.path.join(metadata_dir, distinfo_dir)
+
+    def run_egg_info(self):
+        # type: () -> None
+        if self.name:
+            logger.debug(
+                'Running setup.py (path:%s) egg_info for package %s',
+                self.setup_py, self.name,
+            )
+        else:
+            logger.debug(
+                'Running setup.py (path:%s) egg_info for package from %s',
+                self.setup_py, self.link,
+            )
+        script = SETUPTOOLS_SHIM % self.setup_py
+        base_cmd = [sys.executable, '-c', script]
+        if self.isolated:
+            base_cmd += ["--no-user-cfg"]
+        egg_info_cmd = base_cmd + ['egg_info']
+        # We can't put the .egg-info files at the root, because then the
+        # source code will be mistaken for an installed egg, causing
+        # problems
+        if self.editable:
+            egg_base_option = []  # type: List[str]
+        else:
+            egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info')
+            ensure_dir(egg_info_dir)
+            egg_base_option = ['--egg-base', 'pip-egg-info']
+        with self.build_env:
+            call_subprocess(
+                egg_info_cmd + egg_base_option,
+                cwd=self.setup_py_dir,
+                command_desc='python setup.py egg_info')
+
+    @property
+    def egg_info_path(self):
+        # type: () -> str
+        if self._egg_info_path is None:
+            if self.editable:
+                base = self.source_dir
+            else:
+                base = os.path.join(self.setup_py_dir, 'pip-egg-info')
+            filenames = os.listdir(base)
+            if self.editable:
+                filenames = []
+                for root, dirs, files in os.walk(base):
+                    for dir in vcs.dirnames:
+                        if dir in dirs:
+                            dirs.remove(dir)
+                    # Iterate over a copy of ``dirs``, since mutating
+                    # a list while iterating over it can cause trouble.
+                    # (See https://github.com/pypa/pip/pull/462.)
+                    for dir in list(dirs):
+                        # Don't search in anything that looks like a virtualenv
+                        # environment
+                        if (
+                                os.path.lexists(
+                                    os.path.join(root, dir, 'bin', 'python')
+                                ) or
+                                os.path.exists(
+                                    os.path.join(
+                                        root, dir, 'Scripts', 'Python.exe'
+                                    )
+                                )):
+                            dirs.remove(dir)
+                        # Also don't search through tests
+                        elif dir == 'test' or dir == 'tests':
+                            dirs.remove(dir)
+                    filenames.extend([os.path.join(root, dir)
+                                      for dir in dirs])
+                filenames = [f for f in filenames if f.endswith('.egg-info')]
+
+            if not filenames:
+                raise InstallationError(
+                    "Files/directories not found in %s" % base
+                )
+            # if we have more than one match, we pick the toplevel one.  This
+            # can easily be the case if there is a dist folder which contains
+            # an extracted tarball for testing purposes.
+            if len(filenames) > 1:
+                filenames.sort(
+                    key=lambda x: x.count(os.path.sep) +
+                    (os.path.altsep and x.count(os.path.altsep) or 0)
+                )
+            self._egg_info_path = os.path.join(base, filenames[0])
+        return self._egg_info_path
+
+    @property
+    def metadata(self):
+        # type: () -> Any
+        if not hasattr(self, '_metadata'):
+            self._metadata = get_metadata(self.get_dist())
+
+        return self._metadata
+
+    def get_dist(self):
+        # type: () -> Distribution
+        """Return a pkg_resources.Distribution for this requirement"""
+        if self.metadata_directory:
+            base_dir, distinfo = os.path.split(self.metadata_directory)
+            metadata = pkg_resources.PathMetadata(
+                base_dir, self.metadata_directory
+            )
+            dist_name = os.path.splitext(distinfo)[0]
+            typ = pkg_resources.DistInfoDistribution
+        else:
+            egg_info = self.egg_info_path.rstrip(os.path.sep)
+            base_dir = os.path.dirname(egg_info)
+            metadata = pkg_resources.PathMetadata(base_dir, egg_info)
+            dist_name = os.path.splitext(os.path.basename(egg_info))[0]
+            # https://github.com/python/mypy/issues/1174
+            typ = pkg_resources.Distribution  # type: ignore
+
+        return typ(
+            base_dir,
+            project_name=dist_name,
+            metadata=metadata,
+        )
+
+    def assert_source_matches_version(self):
+        # type: () -> None
+        assert self.source_dir
+        version = self.metadata['version']
+        if self.req.specifier and version not in self.req.specifier:
+            logger.warning(
+                'Requested %s, but installing version %s',
+                self,
+                version,
+            )
+        else:
+            logger.debug(
+                'Source in %s has version %s, which satisfies requirement %s',
+                display_path(self.source_dir),
+                version,
+                self,
+            )
+
+    # For both source distributions and editables
+    def ensure_has_source_dir(self, parent_dir):
+        # type: (str) -> str
+        """Ensure that a source_dir is set.
+
+        This will create a temporary build dir if the name of the requirement
+        isn't known yet.
+
+        :param parent_dir: The ideal pip parent_dir for the source_dir.
+            Generally src_dir for editables and build_dir for sdists.
+        :return: self.source_dir
+        """
+        if self.source_dir is None:
+            self.source_dir = self.build_location(parent_dir)
+        return self.source_dir
+
+    # For editable installations
+    def install_editable(
+        self,
+        install_options,  # type: List[str]
+        global_options=(),  # type: Sequence[str]
+        prefix=None  # type: Optional[str]
+    ):
+        # type: (...) -> None
+        logger.info('Running setup.py develop for %s', self.name)
+
+        if self.isolated:
+            global_options = list(global_options) + ["--no-user-cfg"]
+
+        if prefix:
+            prefix_param = ['--prefix={}'.format(prefix)]
+            install_options = list(install_options) + prefix_param
+
+        with indent_log():
+            # FIXME: should we do --install-headers here too?
+            with self.build_env:
+                call_subprocess(
+                    [
+                        sys.executable,
+                        '-c',
+                        SETUPTOOLS_SHIM % self.setup_py
+                    ] +
+                    list(global_options) +
+                    ['develop', '--no-deps'] +
+                    list(install_options),
+
+                    cwd=self.setup_py_dir,
+                )
+
+        self.install_succeeded = True
+
+    def update_editable(self, obtain=True):
+        # type: (bool) -> None
+        if not self.link:
+            logger.debug(
+                "Cannot update repository at %s; repository location is "
+                "unknown",
+                self.source_dir,
+            )
+            return
+        assert self.editable
+        assert self.source_dir
+        if self.link.scheme == 'file':
+            # Static paths don't get updated
+            return
+        assert '+' in self.link.url, "bad url: %r" % self.link.url
+        if not self.update:
+            return
+        vc_type, url = self.link.url.split('+', 1)
+        backend = vcs.get_backend(vc_type)
+        if backend:
+            vcs_backend = backend(self.link.url)
+            if obtain:
+                vcs_backend.obtain(self.source_dir)
+            else:
+                vcs_backend.export(self.source_dir)
+        else:
+            assert 0, (
+                'Unexpected version control type (in %s): %s'
+                % (self.link, vc_type))
+
+    # Top-level Actions
+    def uninstall(self, auto_confirm=False, verbose=False,
+                  use_user_site=False):
+        # type: (bool, bool, bool) -> Optional[UninstallPathSet]
+        """
+        Uninstall the distribution currently satisfying this requirement.
+
+        Prompts before removing or modifying files unless
+        ``auto_confirm`` is True.
+
+        Refuses to delete or modify files outside of ``sys.prefix`` -
+        thus uninstallation within a virtual environment can only
+        modify that virtual environment, even if the virtualenv is
+        linked to global site-packages.
+
+        """
+        if not self.check_if_exists(use_user_site):
+            logger.warning("Skipping %s as it is not installed.", self.name)
+            return None
+        dist = self.satisfied_by or self.conflicts_with
+
+        uninstalled_pathset = UninstallPathSet.from_dist(dist)
+        uninstalled_pathset.remove(auto_confirm, verbose)
+        return uninstalled_pathset
+
+    def _clean_zip_name(self, name, prefix):  # only used by archive.
+        # type: (str, str) -> str
+        assert name.startswith(prefix + os.path.sep), (
+            "name %r doesn't start with prefix %r" % (name, prefix)
+        )
+        name = name[len(prefix) + 1:]
+        name = name.replace(os.path.sep, '/')
+        return name
+
+    def _get_archive_name(self, path, parentdir, rootdir):
+        # type: (str, str, str) -> str
+        path = os.path.join(parentdir, path)
+        name = self._clean_zip_name(path, rootdir)
+        return self.name + '/' + name
+
+    # TODO: Investigate if this should be kept in InstallRequirement
+    #       Seems to be used only when VCS + downloads
+    def archive(self, build_dir):
+        # type: (str) -> None
+        assert self.source_dir
+        create_archive = True
+        archive_name = '%s-%s.zip' % (self.name, self.metadata["version"])
+        archive_path = os.path.join(build_dir, archive_name)
+        if os.path.exists(archive_path):
+            response = ask_path_exists(
+                'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' %
+                display_path(archive_path), ('i', 'w', 'b', 'a'))
+            if response == 'i':
+                create_archive = False
+            elif response == 'w':
+                logger.warning('Deleting %s', display_path(archive_path))
+                os.remove(archive_path)
+            elif response == 'b':
+                dest_file = backup_dir(archive_path)
+                logger.warning(
+                    'Backing up %s to %s',
+                    display_path(archive_path),
+                    display_path(dest_file),
+                )
+                shutil.move(archive_path, dest_file)
+            elif response == 'a':
+                sys.exit(-1)
+        if create_archive:
+            zip = zipfile.ZipFile(
+                archive_path, 'w', zipfile.ZIP_DEFLATED,
+                allowZip64=True
+            )
+            dir = os.path.normcase(os.path.abspath(self.setup_py_dir))
+            for dirpath, dirnames, filenames in os.walk(dir):
+                if 'pip-egg-info' in dirnames:
+                    dirnames.remove('pip-egg-info')
+                for dirname in dirnames:
+                    dir_arcname = self._get_archive_name(dirname,
+                                                         parentdir=dirpath,
+                                                         rootdir=dir)
+                    zipdir = zipfile.ZipInfo(dir_arcname + '/')
+                    zipdir.external_attr = 0x1ED << 16  # 0o755
+                    zip.writestr(zipdir, '')
+                for filename in filenames:
+                    if filename == PIP_DELETE_MARKER_FILENAME:
+                        continue
+                    file_arcname = self._get_archive_name(filename,
+                                                          parentdir=dirpath,
+                                                          rootdir=dir)
+                    filename = os.path.join(dirpath, filename)
+                    zip.write(filename, file_arcname)
+            zip.close()
+            logger.info('Saved %s', display_path(archive_path))
+
+    def install(
+        self,
+        install_options,  # type: List[str]
+        global_options=None,  # type: Optional[Sequence[str]]
+        root=None,  # type: Optional[str]
+        home=None,  # type: Optional[str]
+        prefix=None,  # type: Optional[str]
+        warn_script_location=True,  # type: bool
+        use_user_site=False,  # type: bool
+        pycompile=True  # type: bool
+    ):
+        # type: (...) -> None
+        global_options = global_options if global_options is not None else []
+        if self.editable:
+            self.install_editable(
+                install_options, global_options, prefix=prefix,
+            )
+            return
+        if self.is_wheel:
+            version = wheel.wheel_version(self.source_dir)
+            wheel.check_compatibility(version, self.name)
+
+            self.move_wheel_files(
+                self.source_dir, root=root, prefix=prefix, home=home,
+                warn_script_location=warn_script_location,
+                use_user_site=use_user_site, pycompile=pycompile,
+            )
+            self.install_succeeded = True
+            return
+
+        # Extend the list of global and install options passed on to
+        # the setup.py call with the ones from the requirements file.
+        # Options specified in requirements file override those
+        # specified on the command line, since the last option given
+        # to setup.py is the one that is used.
+        global_options = list(global_options) + \
+            self.options.get('global_options', [])
+        install_options = list(install_options) + \
+            self.options.get('install_options', [])
+
+        if self.isolated:
+            # https://github.com/python/mypy/issues/1174
+            global_options = global_options + ["--no-user-cfg"]  # type: ignore
+
+        with TempDirectory(kind="record") as temp_dir:
+            record_filename = os.path.join(temp_dir.path, 'install-record.txt')
+            install_args = self.get_install_args(
+                global_options, record_filename, root, prefix, pycompile,
+            )
+            msg = 'Running setup.py install for %s' % (self.name,)
+            with open_spinner(msg) as spinner:
+                with indent_log():
+                    with self.build_env:
+                        call_subprocess(
+                            install_args + install_options,
+                            cwd=self.setup_py_dir,
+                            spinner=spinner,
+                        )
+
+            if not os.path.exists(record_filename):
+                logger.debug('Record file %s not found', record_filename)
+                return
+            self.install_succeeded = True
+
+            def prepend_root(path):
+                # type: (str) -> str
+                if root is None or not os.path.isabs(path):
+                    return path
+                else:
+                    return change_root(root, path)
+
+            with open(record_filename) as f:
+                for line in f:
+                    directory = os.path.dirname(line)
+                    if directory.endswith('.egg-info'):
+                        egg_info_dir = prepend_root(directory)
+                        break
+                else:
+                    logger.warning(
+                        'Could not find .egg-info directory in install record'
+                        ' for %s',
+                        self,
+                    )
+                    # FIXME: put the record somewhere
+                    # FIXME: should this be an error?
+                    return
+            new_lines = []
+            with open(record_filename) as f:
+                for line in f:
+                    filename = line.strip()
+                    if os.path.isdir(filename):
+                        filename += os.path.sep
+                    new_lines.append(
+                        os.path.relpath(prepend_root(filename), egg_info_dir)
+                    )
+            new_lines.sort()
+            ensure_dir(egg_info_dir)
+            inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt')
+            with open(inst_files_path, 'w') as f:
+                f.write('\n'.join(new_lines) + '\n')
+
+    def get_install_args(
+        self,
+        global_options,  # type: Sequence[str]
+        record_filename,  # type: str
+        root,  # type: Optional[str]
+        prefix,  # type: Optional[str]
+        pycompile  # type: bool
+    ):
+        # type: (...) -> List[str]
+        install_args = [sys.executable, "-u"]
+        install_args.append('-c')
+        install_args.append(SETUPTOOLS_SHIM % self.setup_py)
+        install_args += list(global_options) + \
+            ['install', '--record', record_filename]
+        install_args += ['--single-version-externally-managed']
+
+        if root is not None:
+            install_args += ['--root', root]
+        if prefix is not None:
+            install_args += ['--prefix', prefix]
+
+        if pycompile:
+            install_args += ["--compile"]
+        else:
+            install_args += ["--no-compile"]
+
+        if running_under_virtualenv():
+            py_ver_str = 'python' + sysconfig.get_python_version()
+            install_args += ['--install-headers',
+                             os.path.join(sys.prefix, 'include', 'site',
+                                          py_ver_str, self.name)]
+
+        return install_args
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e4392c54ff8b1eb570f3e52b92f907d20c4380a3
GIT binary patch
literal 32280
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
aB1C;yA)-){iH*^U8Oml9U=(KNX9fUyzGe6T

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py
new file mode 100644
index 00000000..d1966a4a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py
@@ -0,0 +1,193 @@
+from __future__ import absolute_import
+
+import logging
+from collections import OrderedDict
+
+from pip._internal.exceptions import InstallationError
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.wheel import Wheel
+
+if MYPY_CHECK_RUNNING:
+    from typing import Dict, Iterable, List, Optional, Tuple
+    from pip._internal.req.req_install import InstallRequirement
+
+
+logger = logging.getLogger(__name__)
+
+
+class RequirementSet(object):
+
+    def __init__(self, require_hashes=False, check_supported_wheels=True):
+        # type: (bool, bool) -> None
+        """Create a RequirementSet.
+        """
+
+        self.requirements = OrderedDict()  # type: Dict[str, InstallRequirement]  # noqa: E501
+        self.require_hashes = require_hashes
+        self.check_supported_wheels = check_supported_wheels
+
+        # Mapping of alias: real_name
+        self.requirement_aliases = {}  # type: Dict[str, str]
+        self.unnamed_requirements = []  # type: List[InstallRequirement]
+        self.successfully_downloaded = []  # type: List[InstallRequirement]
+        self.reqs_to_cleanup = []  # type: List[InstallRequirement]
+
+    def __str__(self):
+        # type: () -> str
+        reqs = [req for req in self.requirements.values()
+                if not req.comes_from]
+        reqs.sort(key=lambda req: req.name.lower())
+        return ' '.join([str(req.req) for req in reqs])
+
+    def __repr__(self):
+        # type: () -> str
+        reqs = [req for req in self.requirements.values()]
+        reqs.sort(key=lambda req: req.name.lower())
+        reqs_str = ', '.join([str(req.req) for req in reqs])
+        return ('<%s object; %d requirement(s): %s>'
+                % (self.__class__.__name__, len(reqs), reqs_str))
+
+    def add_requirement(
+        self,
+        install_req,  # type: InstallRequirement
+        parent_req_name=None,  # type: Optional[str]
+        extras_requested=None  # type: Optional[Iterable[str]]
+    ):
+        # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]  # noqa: E501
+        """Add install_req as a requirement to install.
+
+        :param parent_req_name: The name of the requirement that needed this
+            added. The name is used because when multiple unnamed requirements
+            resolve to the same name, we could otherwise end up with dependency
+            links that point outside the Requirements set. parent_req must
+            already be added. Note that None implies that this is a user
+            supplied requirement, vs an inferred one.
+        :param extras_requested: an iterable of extras used to evaluate the
+            environment markers.
+        :return: Additional requirements to scan. That is either [] if
+            the requirement is not applicable, or [install_req] if the
+            requirement is applicable and has just been added.
+        """
+        name = install_req.name
+
+        # If the markers do not match, ignore this requirement.
+        if not install_req.match_markers(extras_requested):
+            logger.info(
+                "Ignoring %s: markers '%s' don't match your environment",
+                name, install_req.markers,
+            )
+            return [], None
+
+        # If the wheel is not supported, raise an error.
+        # Should check this after filtering out based on environment markers to
+        # allow specifying different wheels based on the environment/OS, in a
+        # single requirements file.
+        if install_req.link and install_req.link.is_wheel:
+            wheel = Wheel(install_req.link.filename)
+            if self.check_supported_wheels and not wheel.supported():
+                raise InstallationError(
+                    "%s is not a supported wheel on this platform." %
+                    wheel.filename
+                )
+
+        # 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"
+        )
+
+        # Unnamed requirements are scanned again and the requirement won't be
+        # added as a dependency until after scanning.
+        if not name:
+            # url or path requirement w/o an egg fragment
+            self.unnamed_requirements.append(install_req)
+            return [install_req], None
+
+        try:
+            existing_req = self.get_requirement(name)
+        except KeyError:
+            existing_req = None
+
+        has_conflicting_requirement = (
+            parent_req_name is None and
+            existing_req and
+            not existing_req.constraint and
+            existing_req.extras == install_req.extras and
+            existing_req.req.specifier != install_req.req.specifier
+        )
+        if has_conflicting_requirement:
+            raise InstallationError(
+                "Double requirement given: %s (already in %s, name=%r)"
+                % (install_req, existing_req, name)
+            )
+
+        # When no existing requirement exists, add the requirement as a
+        # dependency and it will be scanned again after.
+        if not existing_req:
+            self.requirements[name] = install_req
+            # FIXME: what about other normalizations?  E.g., _ vs. -?
+            if name.lower() != name:
+                self.requirement_aliases[name.lower()] = name
+            # We'd want to rescan this requirements later
+            return [install_req], install_req
+
+        # Assume there's no need to scan, and that we've already
+        # encountered this for scanning.
+        if install_req.constraint or not existing_req.constraint:
+            return [], existing_req
+
+        does_not_satisfy_constraint = (
+            install_req.link and
+            not (
+                existing_req.link and
+                install_req.link.path == existing_req.link.path
+            )
+        )
+        if does_not_satisfy_constraint:
+            self.reqs_to_cleanup.append(install_req)
+            raise InstallationError(
+                "Could not satisfy constraints for '%s': "
+                "installation from path or url cannot be "
+                "constrained to a version" % name,
+            )
+        # If we're now installing a constraint, mark the existing
+        # object for real installation.
+        existing_req.constraint = False
+        existing_req.extras = tuple(sorted(
+            set(existing_req.extras) | set(install_req.extras)
+        ))
+        logger.debug(
+            "Setting %s extras to: %s",
+            existing_req, existing_req.extras,
+        )
+        # Return the existing requirement for addition to the parent and
+        # scanning again.
+        return [existing_req], existing_req
+
+    def has_requirement(self, project_name):
+        # type: (str) -> bool
+        name = project_name.lower()
+        if (name in self.requirements and
+           not self.requirements[name].constraint or
+           name in self.requirement_aliases and
+           not self.requirements[self.requirement_aliases[name]].constraint):
+            return True
+        return False
+
+    def get_requirement(self, project_name):
+        # type: (str) -> InstallRequirement
+        for name in project_name, project_name.lower():
+            if name in self.requirements:
+                return self.requirements[name]
+            if name in self.requirement_aliases:
+                return self.requirements[self.requirement_aliases[name]]
+        raise KeyError("No project with the name %r" % project_name)
+
+    def cleanup_files(self):
+        # type: () -> None
+        """Clean up files, remove builds."""
+        logger.debug('Cleaning up...')
+        with indent_log():
+            for req in self.reqs_to_cleanup:
+                req.remove_temporary_source()
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4580cc21e25364fe7db2e1b5922c7fc061989d6d
GIT binary patch
literal 6797
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
WOgxMNOahEx$i&8|!6?kk&kO+2dStKw

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py
new file mode 100644
index 00000000..e36a3f6b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py
@@ -0,0 +1,96 @@
+from __future__ import absolute_import
+
+import contextlib
+import errno
+import hashlib
+import logging
+import os
+
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from types import TracebackType
+    from typing import Iterator, Optional, Set, Type
+    from pip._internal.req.req_install import InstallRequirement
+    from pip._internal.models.link import Link
+
+logger = logging.getLogger(__name__)
+
+
+class RequirementTracker(object):
+
+    def __init__(self):
+        # type: () -> None
+        self._root = os.environ.get('PIP_REQ_TRACKER')
+        if self._root is None:
+            self._temp_dir = TempDirectory(delete=False, kind='req-tracker')
+            self._temp_dir.create()
+            self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path
+            logger.debug('Created requirements tracker %r', self._root)
+        else:
+            self._temp_dir = None
+            logger.debug('Re-using requirements tracker %r', self._root)
+        self._entries = set()  # type: Set[InstallRequirement]
+
+    def __enter__(self):
+        # type: () -> RequirementTracker
+        return self
+
+    def __exit__(
+        self,
+        exc_type,  # type: Optional[Type[BaseException]]
+        exc_val,  # type: Optional[BaseException]
+        exc_tb  # type: Optional[TracebackType]
+    ):
+        # type: (...) -> None
+        self.cleanup()
+
+    def _entry_path(self, link):
+        # type: (Link) -> str
+        hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest()
+        return os.path.join(self._root, hashed)
+
+    def add(self, req):
+        # type: (InstallRequirement) -> None
+        link = req.link
+        info = str(req)
+        entry_path = self._entry_path(link)
+        try:
+            with open(entry_path) as fp:
+                # Error, these's already a build in progress.
+                raise LookupError('%s is already being built: %s'
+                                  % (link, fp.read()))
+        except IOError as e:
+            if e.errno != errno.ENOENT:
+                raise
+            assert req not in self._entries
+            with open(entry_path, 'w') as fp:
+                fp.write(info)
+            self._entries.add(req)
+            logger.debug('Added %s to build tracker %r', req, self._root)
+
+    def remove(self, req):
+        # type: (InstallRequirement) -> None
+        link = req.link
+        self._entries.remove(req)
+        os.unlink(self._entry_path(link))
+        logger.debug('Removed %s from build tracker %r', req, self._root)
+
+    def cleanup(self):
+        # type: () -> None
+        for req in set(self._entries):
+            self.remove(req)
+        remove = self._temp_dir is not None
+        if remove:
+            self._temp_dir.cleanup()
+        logger.debug('%s build tracker %r',
+                     'Removed' if remove else 'Cleaned',
+                     self._root)
+
+    @contextlib.contextmanager
+    def track(self, req):
+        # type: (InstallRequirement) -> Iterator[None]
+        self.add(req)
+        yield
+        self.remove(req)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d96380e16dfb7f4385029ec0c0e4ee8fa8219d94
GIT binary patch
literal 4564
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
W2!%`ni~>xcY^}s7z$nbb&kO*smiEQ~

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py
new file mode 100644
index 00000000..733301ce
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py
@@ -0,0 +1,633 @@
+from __future__ import absolute_import
+
+import csv
+import functools
+import logging
+import os
+import sys
+import sysconfig
+
+from pip._vendor import pkg_resources
+
+from pip._internal.exceptions import UninstallationError
+from pip._internal.locations import bin_py, bin_user
+from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import (
+    FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local,
+    normalize_path, renames, rmtree,
+)
+from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple,
+    )
+    from pip._vendor.pkg_resources import Distribution
+
+logger = logging.getLogger(__name__)
+
+
+def _script_names(dist, script_name, is_gui):
+    # type: (Distribution, str, bool) -> List[str]
+    """Create the fully qualified name of the files created by
+    {console,gui}_scripts for the given ``dist``.
+    Returns the list of file names
+    """
+    if dist_in_usersite(dist):
+        bin_dir = bin_user
+    else:
+        bin_dir = bin_py
+    exe_name = os.path.join(bin_dir, script_name)
+    paths_to_remove = [exe_name]
+    if WINDOWS:
+        paths_to_remove.append(exe_name + '.exe')
+        paths_to_remove.append(exe_name + '.exe.manifest')
+        if is_gui:
+            paths_to_remove.append(exe_name + '-script.pyw')
+        else:
+            paths_to_remove.append(exe_name + '-script.py')
+    return paths_to_remove
+
+
+def _unique(fn):
+    # type: (Callable) -> Callable[..., Iterator[Any]]
+    @functools.wraps(fn)
+    def unique(*args, **kw):
+        # type: (Any, Any) -> Iterator[Any]
+        seen = set()  # type: Set[Any]
+        for item in fn(*args, **kw):
+            if item not in seen:
+                seen.add(item)
+                yield item
+    return unique
+
+
+@_unique
+def uninstallation_paths(dist):
+    # type: (Distribution) -> Iterator[str]
+    """
+    Yield all the uninstallation paths for dist based on RECORD-without-.py[co]
+
+    Yield paths to all the files in RECORD. For each .py file in RECORD, add
+    the .pyc and .pyo in the same directory.
+
+    UninstallPathSet.add() takes care of the __pycache__ .py[co].
+    """
+    r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD')))
+    for row in r:
+        path = os.path.join(dist.location, row[0])
+        yield path
+        if path.endswith('.py'):
+            dn, fn = os.path.split(path)
+            base = fn[:-3]
+            path = os.path.join(dn, base + '.pyc')
+            yield path
+            path = os.path.join(dn, base + '.pyo')
+            yield path
+
+
+def compact(paths):
+    # type: (Iterable[str]) -> Set[str]
+    """Compact a path set to contain the minimal number of paths
+    necessary to contain all paths in the set. If /a/path/ and
+    /a/path/to/a/file.txt are both in the set, leave only the
+    shorter path."""
+
+    sep = os.path.sep
+    short_paths = set()  # type: Set[str]
+    for path in sorted(paths, key=len):
+        should_skip = any(
+            path.startswith(shortpath.rstrip("*")) and
+            path[len(shortpath.rstrip("*").rstrip(sep))] == sep
+            for shortpath in short_paths
+        )
+        if not should_skip:
+            short_paths.add(path)
+    return short_paths
+
+
+def compress_for_rename(paths):
+    # type: (Iterable[str]) -> Set[str]
+    """Returns a set containing the paths that need to be renamed.
+
+    This set may include directories when the original sequence of paths
+    included every file on disk.
+    """
+    case_map = dict((os.path.normcase(p), p) for p in paths)
+    remaining = set(case_map)
+    unchecked = sorted(set(os.path.split(p)[0]
+                           for p in case_map.values()), key=len)
+    wildcards = set()  # type: Set[str]
+
+    def norm_join(*a):
+        # type: (str) -> str
+        return os.path.normcase(os.path.join(*a))
+
+    for root in unchecked:
+        if any(os.path.normcase(root).startswith(w)
+               for w in wildcards):
+            # This directory has already been handled.
+            continue
+
+        all_files = set()  # type: Set[str]
+        all_subdirs = set()  # type: Set[str]
+        for dirname, subdirs, files in os.walk(root):
+            all_subdirs.update(norm_join(root, dirname, d)
+                               for d in subdirs)
+            all_files.update(norm_join(root, dirname, f)
+                             for f in files)
+        # If all the files we found are in our remaining set of files to
+        # remove, then remove them from the latter set and add a wildcard
+        # for the directory.
+        if not (all_files - remaining):
+            remaining.difference_update(all_files)
+            wildcards.add(root + os.sep)
+
+    return set(map(case_map.__getitem__, remaining)) | wildcards
+
+
+def compress_for_output_listing(paths):
+    # type: (Iterable[str]) -> Tuple[Set[str], Set[str]]
+    """Returns a tuple of 2 sets of which paths to display to user
+
+    The first set contains paths that would be deleted. Files of a package
+    are not added and the top-level directory of the package has a '*' added
+    at the end - to signify that all it's contents are removed.
+
+    The second set contains files that would have been skipped in the above
+    folders.
+    """
+
+    will_remove = set(paths)
+    will_skip = set()
+
+    # Determine folders and files
+    folders = set()
+    files = set()
+    for path in will_remove:
+        if path.endswith(".pyc"):
+            continue
+        if path.endswith("__init__.py") or ".dist-info" in path:
+            folders.add(os.path.dirname(path))
+        files.add(path)
+
+    # probably this one https://github.com/python/mypy/issues/390
+    _normcased_files = set(map(os.path.normcase, files))  # type: ignore
+
+    folders = compact(folders)
+
+    # This walks the tree using os.walk to not miss extra folders
+    # that might get added.
+    for folder in folders:
+        for dirpath, _, dirfiles in os.walk(folder):
+            for fname in dirfiles:
+                if fname.endswith(".pyc"):
+                    continue
+
+                file_ = os.path.join(dirpath, fname)
+                if (os.path.isfile(file_) and
+                        os.path.normcase(file_) not in _normcased_files):
+                    # We are skipping this file. Add it to the set.
+                    will_skip.add(file_)
+
+    will_remove = files | {
+        os.path.join(folder, "*") for folder in folders
+    }
+
+    return will_remove, will_skip
+
+
+class StashedUninstallPathSet(object):
+    """A set of file rename operations to stash files while
+    tentatively uninstalling them."""
+    def __init__(self):
+        # type: () -> None
+        # Mapping from source file root to [Adjacent]TempDirectory
+        # for files under that directory.
+        self._save_dirs = {}  # type: Dict[str, TempDirectory]
+        # (old path, new path) tuples for each move that may need
+        # to be undone.
+        self._moves = []  # type: List[Tuple[str, str]]
+
+    def _get_directory_stash(self, path):
+        # type: (str) -> str
+        """Stashes a directory.
+
+        Directories are stashed adjacent to their original location if
+        possible, or else moved/copied into the user's temp dir."""
+
+        try:
+            save_dir = AdjacentTempDirectory(path)  # type: TempDirectory
+            save_dir.create()
+        except OSError:
+            save_dir = TempDirectory(kind="uninstall")
+            save_dir.create()
+        self._save_dirs[os.path.normcase(path)] = save_dir
+
+        return save_dir.path
+
+    def _get_file_stash(self, path):
+        # type: (str) -> str
+        """Stashes a file.
+
+        If no root has been provided, one will be created for the directory
+        in the user's temp directory."""
+        path = os.path.normcase(path)
+        head, old_head = os.path.dirname(path), None
+        save_dir = None
+
+        while head != old_head:
+            try:
+                save_dir = self._save_dirs[head]
+                break
+            except KeyError:
+                pass
+            head, old_head = os.path.dirname(head), head
+        else:
+            # Did not find any suitable root
+            head = os.path.dirname(path)
+            save_dir = TempDirectory(kind='uninstall')
+            save_dir.create()
+            self._save_dirs[head] = save_dir
+
+        relpath = os.path.relpath(path, head)
+        if relpath and relpath != os.path.curdir:
+            return os.path.join(save_dir.path, relpath)
+        return save_dir.path
+
+    def stash(self, path):
+        # type: (str) -> str
+        """Stashes the directory or file and returns its new location.
+        """
+        if os.path.isdir(path):
+            new_path = self._get_directory_stash(path)
+        else:
+            new_path = self._get_file_stash(path)
+
+        self._moves.append((path, new_path))
+        if os.path.isdir(path) and os.path.isdir(new_path):
+            # If we're moving a directory, we need to
+            # remove the destination first or else it will be
+            # moved to inside the existing directory.
+            # We just created new_path ourselves, so it will
+            # be removable.
+            os.rmdir(new_path)
+        renames(path, new_path)
+        return new_path
+
+    def commit(self):
+        # type: () -> None
+        """Commits the uninstall by removing stashed files."""
+        for _, save_dir in self._save_dirs.items():
+            save_dir.cleanup()
+        self._moves = []
+        self._save_dirs = {}
+
+    def rollback(self):
+        # type: () -> None
+        """Undoes the uninstall by moving stashed files back."""
+        for p in self._moves:
+            logging.info("Moving to %s\n from %s", *p)
+
+        for new_path, path in self._moves:
+            try:
+                logger.debug('Replacing %s from %s', new_path, path)
+                if os.path.isfile(new_path):
+                    os.unlink(new_path)
+                elif os.path.isdir(new_path):
+                    rmtree(new_path)
+                renames(path, new_path)
+            except OSError as ex:
+                logger.error("Failed to restore %s", new_path)
+                logger.debug("Exception: %s", ex)
+
+        self.commit()
+
+    @property
+    def can_rollback(self):
+        # type: () -> bool
+        return bool(self._moves)
+
+
+class UninstallPathSet(object):
+    """A set of file paths to be removed in the uninstallation of a
+    requirement."""
+    def __init__(self, dist):
+        # type: (Distribution) -> None
+        self.paths = set()  # type: Set[str]
+        self._refuse = set()  # type: Set[str]
+        self.pth = {}  # type: Dict[str, UninstallPthEntries]
+        self.dist = dist
+        self._moved_paths = StashedUninstallPathSet()
+
+    def _permitted(self, path):
+        # type: (str) -> bool
+        """
+        Return True if the given path is one we are permitted to
+        remove/modify, False otherwise.
+
+        """
+        return is_local(path)
+
+    def add(self, path):
+        # type: (str) -> None
+        head, tail = os.path.split(path)
+
+        # we normalize the head to resolve parent directory symlinks, but not
+        # the tail, since we only want to uninstall symlinks, not their targets
+        path = os.path.join(normalize_path(head), os.path.normcase(tail))
+
+        if not os.path.exists(path):
+            return
+        if self._permitted(path):
+            self.paths.add(path)
+        else:
+            self._refuse.add(path)
+
+        # __pycache__ files can show up after 'installed-files.txt' is created,
+        # due to imports
+        if os.path.splitext(path)[1] == '.py' and uses_pycache:
+            self.add(cache_from_source(path))
+
+    def add_pth(self, pth_file, entry):
+        # type: (str, str) -> None
+        pth_file = normalize_path(pth_file)
+        if self._permitted(pth_file):
+            if pth_file not in self.pth:
+                self.pth[pth_file] = UninstallPthEntries(pth_file)
+            self.pth[pth_file].add(entry)
+        else:
+            self._refuse.add(pth_file)
+
+    def remove(self, auto_confirm=False, verbose=False):
+        # type: (bool, bool) -> None
+        """Remove paths in ``self.paths`` with confirmation (unless
+        ``auto_confirm`` is True)."""
+
+        if not self.paths:
+            logger.info(
+                "Can't uninstall '%s'. No files were found to uninstall.",
+                self.dist.project_name,
+            )
+            return
+
+        dist_name_version = (
+            self.dist.project_name + "-" + self.dist.version
+        )
+        logger.info('Uninstalling %s:', dist_name_version)
+
+        with indent_log():
+            if auto_confirm or self._allowed_to_proceed(verbose):
+                moved = self._moved_paths
+
+                for_rename = compress_for_rename(self.paths)
+
+                for path in sorted(compact(for_rename)):
+                    moved.stash(path)
+                    logger.debug('Removing file or directory %s', path)
+
+                for pth in self.pth.values():
+                    pth.remove()
+
+                logger.info('Successfully uninstalled %s', dist_name_version)
+
+    def _allowed_to_proceed(self, verbose):
+        # type: (bool) -> bool
+        """Display which files would be deleted and prompt for confirmation
+        """
+
+        def _display(msg, paths):
+            # type: (str, Iterable[str]) -> None
+            if not paths:
+                return
+
+            logger.info(msg)
+            with indent_log():
+                for path in sorted(compact(paths)):
+                    logger.info(path)
+
+        if not verbose:
+            will_remove, will_skip = compress_for_output_listing(self.paths)
+        else:
+            # In verbose mode, display all the files that are going to be
+            # deleted.
+            will_remove = set(self.paths)
+            will_skip = set()
+
+        _display('Would remove:', will_remove)
+        _display('Would not remove (might be manually added):', will_skip)
+        _display('Would not remove (outside of prefix):', self._refuse)
+        if verbose:
+            _display('Will actually move:', compress_for_rename(self.paths))
+
+        return ask('Proceed (y/n)? ', ('y', 'n')) == 'y'
+
+    def rollback(self):
+        # type: () -> None
+        """Rollback the changes previously made by remove()."""
+        if not self._moved_paths.can_rollback:
+            logger.error(
+                "Can't roll back %s; was not uninstalled",
+                self.dist.project_name,
+            )
+            return
+        logger.info('Rolling back uninstall of %s', self.dist.project_name)
+        self._moved_paths.rollback()
+        for pth in self.pth.values():
+            pth.rollback()
+
+    def commit(self):
+        # type: () -> None
+        """Remove temporary save dir: rollback will no longer be possible."""
+        self._moved_paths.commit()
+
+    @classmethod
+    def from_dist(cls, dist):
+        # type: (Distribution) -> UninstallPathSet
+        dist_path = normalize_path(dist.location)
+        if not dist_is_local(dist):
+            logger.info(
+                "Not uninstalling %s at %s, outside environment %s",
+                dist.key,
+                dist_path,
+                sys.prefix,
+            )
+            return cls(dist)
+
+        if dist_path in {p for p in {sysconfig.get_path("stdlib"),
+                                     sysconfig.get_path("platstdlib")}
+                         if p}:
+            logger.info(
+                "Not uninstalling %s at %s, as it is in the standard library.",
+                dist.key,
+                dist_path,
+            )
+            return cls(dist)
+
+        paths_to_remove = cls(dist)
+        develop_egg_link = egg_link_path(dist)
+        develop_egg_link_egg_info = '{}.egg-info'.format(
+            pkg_resources.to_filename(dist.project_name))
+        egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info)
+        # Special case for distutils installed package
+        distutils_egg_info = getattr(dist._provider, 'path', None)
+
+        # Uninstall cases order do matter as in the case of 2 installs of the
+        # same package, pip needs to uninstall the currently detected version
+        if (egg_info_exists and dist.egg_info.endswith('.egg-info') and
+                not dist.egg_info.endswith(develop_egg_link_egg_info)):
+            # if dist.egg_info.endswith(develop_egg_link_egg_info), we
+            # are in fact in the develop_egg_link case
+            paths_to_remove.add(dist.egg_info)
+            if dist.has_metadata('installed-files.txt'):
+                for installed_file in dist.get_metadata(
+                        'installed-files.txt').splitlines():
+                    path = os.path.normpath(
+                        os.path.join(dist.egg_info, installed_file)
+                    )
+                    paths_to_remove.add(path)
+            # FIXME: need a test for this elif block
+            # occurs with --single-version-externally-managed/--record outside
+            # of pip
+            elif dist.has_metadata('top_level.txt'):
+                if dist.has_metadata('namespace_packages.txt'):
+                    namespaces = dist.get_metadata('namespace_packages.txt')
+                else:
+                    namespaces = []
+                for top_level_pkg in [
+                        p for p
+                        in dist.get_metadata('top_level.txt').splitlines()
+                        if p and p not in namespaces]:
+                    path = os.path.join(dist.location, top_level_pkg)
+                    paths_to_remove.add(path)
+                    paths_to_remove.add(path + '.py')
+                    paths_to_remove.add(path + '.pyc')
+                    paths_to_remove.add(path + '.pyo')
+
+        elif distutils_egg_info:
+            raise UninstallationError(
+                "Cannot uninstall {!r}. It is a distutils installed project "
+                "and thus we cannot accurately determine which files belong "
+                "to it which would lead to only a partial uninstall.".format(
+                    dist.project_name,
+                )
+            )
+
+        elif dist.location.endswith('.egg'):
+            # package installed by easy_install
+            # We cannot match on dist.egg_name because it can slightly vary
+            # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg
+            paths_to_remove.add(dist.location)
+            easy_install_egg = os.path.split(dist.location)[1]
+            easy_install_pth = os.path.join(os.path.dirname(dist.location),
+                                            'easy-install.pth')
+            paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)
+
+        elif egg_info_exists and dist.egg_info.endswith('.dist-info'):
+            for path in uninstallation_paths(dist):
+                paths_to_remove.add(path)
+
+        elif develop_egg_link:
+            # develop egg
+            with open(develop_egg_link, 'r') as fh:
+                link_pointer = os.path.normcase(fh.readline().strip())
+            assert (link_pointer == dist.location), (
+                'Egg-link %s does not match installed location of %s '
+                '(at %s)' % (link_pointer, dist.project_name, dist.location)
+            )
+            paths_to_remove.add(develop_egg_link)
+            easy_install_pth = os.path.join(os.path.dirname(develop_egg_link),
+                                            'easy-install.pth')
+            paths_to_remove.add_pth(easy_install_pth, dist.location)
+
+        else:
+            logger.debug(
+                'Not sure how to uninstall: %s - Check: %s',
+                dist, dist.location,
+            )
+
+        # find distutils scripts= scripts
+        if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'):
+            for script in dist.metadata_listdir('scripts'):
+                if dist_in_usersite(dist):
+                    bin_dir = bin_user
+                else:
+                    bin_dir = bin_py
+                paths_to_remove.add(os.path.join(bin_dir, script))
+                if WINDOWS:
+                    paths_to_remove.add(os.path.join(bin_dir, script) + '.bat')
+
+        # find console_scripts
+        _scripts_to_remove = []
+        console_scripts = dist.get_entry_map(group='console_scripts')
+        for name in console_scripts.keys():
+            _scripts_to_remove.extend(_script_names(dist, name, False))
+        # find gui_scripts
+        gui_scripts = dist.get_entry_map(group='gui_scripts')
+        for name in gui_scripts.keys():
+            _scripts_to_remove.extend(_script_names(dist, name, True))
+
+        for s in _scripts_to_remove:
+            paths_to_remove.add(s)
+
+        return paths_to_remove
+
+
+class UninstallPthEntries(object):
+    def __init__(self, pth_file):
+        # type: (str) -> None
+        if not os.path.isfile(pth_file):
+            raise UninstallationError(
+                "Cannot remove entries from nonexistent file %s" % pth_file
+            )
+        self.file = pth_file
+        self.entries = set()  # type: Set[str]
+        self._saved_lines = None  # type: Optional[List[bytes]]
+
+    def add(self, entry):
+        # type: (str) -> None
+        entry = os.path.normcase(entry)
+        # On Windows, os.path.normcase converts the entry to use
+        # backslashes.  This is correct for entries that describe absolute
+        # paths outside of site-packages, but all the others use forward
+        # slashes.
+        if WINDOWS and not os.path.splitdrive(entry)[0]:
+            entry = entry.replace('\\', '/')
+        self.entries.add(entry)
+
+    def remove(self):
+        # type: () -> None
+        logger.debug('Removing pth entries from %s:', self.file)
+        with open(self.file, 'rb') as fh:
+            # windows uses '\r\n' with py3k, but uses '\n' with py2.x
+            lines = fh.readlines()
+            self._saved_lines = lines
+        if any(b'\r\n' in line for line in lines):
+            endline = '\r\n'
+        else:
+            endline = '\n'
+        # handle missing trailing newline
+        if lines and not lines[-1].endswith(endline.encode("utf-8")):
+            lines[-1] = lines[-1] + endline.encode("utf-8")
+        for entry in self.entries:
+            try:
+                logger.debug('Removing entry: %s', entry)
+                lines.remove((entry + endline).encode("utf-8"))
+            except ValueError:
+                pass
+        with open(self.file, 'wb') as fh:
+            fh.writelines(lines)
+
+    def rollback(self):
+        # type: () -> bool
+        if self._saved_lines is None:
+            logger.error(
+                'Cannot roll back changes to %s, none were made', self.file
+            )
+            return False
+        logger.debug('Rolling %s back to previous state', self.file)
+        with open(self.file, 'wb') as fh:
+            fh.writelines(self._saved_lines)
+        return True
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b07fc4017f64c845961128913c01ceedeb6287dd
GIT binary patch
literal 23635
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
MoW^1WV*eR90T4omqyPW_

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolve.py b/venv/lib/python2.7/site-packages/pip/_internal/resolve.py
new file mode 100644
index 00000000..f49667bb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/resolve.py
@@ -0,0 +1,393 @@
+"""Dependency Resolution
+
+The dependency resolution in pip is performed as follows:
+
+for top-level requirements:
+    a. only one spec allowed per project, regardless of conflicts or not.
+       otherwise a "double requirement" exception is raised
+    b. they override sub-dependency requirements.
+for sub-dependencies
+    a. "first found, wins" (where the order is breadth first)
+"""
+
+import logging
+from collections import defaultdict
+from itertools import chain
+
+from pip._internal.exceptions import (
+    BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors,
+    UnsupportedPythonVersion,
+)
+from pip._internal.req.constructors import install_req_from_req_string
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import dist_in_usersite, ensure_dir
+from pip._internal.utils.packaging import check_dist_requires_python
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional, DefaultDict, List, Set
+    from pip._internal.download import PipSession
+    from pip._internal.req.req_install import InstallRequirement
+    from pip._internal.index import PackageFinder
+    from pip._internal.req.req_set import RequirementSet
+    from pip._internal.operations.prepare import (
+        DistAbstraction, RequirementPreparer
+    )
+    from pip._internal.cache import WheelCache
+
+logger = logging.getLogger(__name__)
+
+
+class Resolver(object):
+    """Resolves which packages need to be installed/uninstalled to perform \
+    the requested operation without breaking the requirements of any package.
+    """
+
+    _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"}
+
+    def __init__(
+        self,
+        preparer,  # type: RequirementPreparer
+        session,  # type: PipSession
+        finder,  # type: PackageFinder
+        wheel_cache,  # type: Optional[WheelCache]
+        use_user_site,  # type: bool
+        ignore_dependencies,  # type: bool
+        ignore_installed,  # type: bool
+        ignore_requires_python,  # type: bool
+        force_reinstall,  # type: bool
+        isolated,  # type: bool
+        upgrade_strategy,  # type: str
+        use_pep517=None  # type: Optional[bool]
+    ):
+        # type: (...) -> None
+        super(Resolver, self).__init__()
+        assert upgrade_strategy in self._allowed_strategies
+
+        self.preparer = preparer
+        self.finder = finder
+        self.session = session
+
+        # NOTE: This would eventually be replaced with a cache that can give
+        #       information about both sdist and wheels transparently.
+        self.wheel_cache = wheel_cache
+
+        # This is set in resolve
+        self.require_hashes = None  # type: Optional[bool]
+
+        self.upgrade_strategy = upgrade_strategy
+        self.force_reinstall = force_reinstall
+        self.isolated = isolated
+        self.ignore_dependencies = ignore_dependencies
+        self.ignore_installed = ignore_installed
+        self.ignore_requires_python = ignore_requires_python
+        self.use_user_site = use_user_site
+        self.use_pep517 = use_pep517
+
+        self._discovered_dependencies = \
+            defaultdict(list)  # type: DefaultDict[str, List]
+
+    def resolve(self, requirement_set):
+        # type: (RequirementSet) -> None
+        """Resolve what operations need to be done
+
+        As a side-effect of this method, the packages (and their dependencies)
+        are downloaded, unpacked and prepared for installation. This
+        preparation is done by ``pip.operations.prepare``.
+
+        Once PyPI has static dependency metadata available, it would be
+        possible to move the preparation to become a step separated from
+        dependency resolution.
+        """
+        # make the wheelhouse
+        if self.preparer.wheel_download_dir:
+            ensure_dir(self.preparer.wheel_download_dir)
+
+        # If any top-level requirement has a hash specified, enter
+        # hash-checking mode, which requires hashes from all.
+        root_reqs = (
+            requirement_set.unnamed_requirements +
+            list(requirement_set.requirements.values())
+        )
+        self.require_hashes = (
+            requirement_set.require_hashes or
+            any(req.has_hash_options for req in root_reqs)
+        )
+
+        # Display where finder is looking for packages
+        locations = self.finder.get_formatted_locations()
+        if locations:
+            logger.info(locations)
+
+        # Actually prepare the files, and collect any exceptions. Most hash
+        # exceptions cannot be checked ahead of time, because
+        # req.populate_link() needs to be called before we can make decisions
+        # based on link type.
+        discovered_reqs = []  # type: List[InstallRequirement]
+        hash_errors = HashErrors()
+        for req in chain(root_reqs, discovered_reqs):
+            try:
+                discovered_reqs.extend(
+                    self._resolve_one(requirement_set, req)
+                )
+            except HashError as exc:
+                exc.req = req
+                hash_errors.append(exc)
+
+        if hash_errors:
+            raise hash_errors
+
+    def _is_upgrade_allowed(self, req):
+        # type: (InstallRequirement) -> bool
+        if self.upgrade_strategy == "to-satisfy-only":
+            return False
+        elif self.upgrade_strategy == "eager":
+            return True
+        else:
+            assert self.upgrade_strategy == "only-if-needed"
+            return req.is_direct
+
+    def _set_req_to_reinstall(self, req):
+        # type: (InstallRequirement) -> None
+        """
+        Set a requirement to be installed.
+        """
+        # Don't uninstall the conflict if doing a user install and the
+        # conflict is not a user install.
+        if not self.use_user_site or dist_in_usersite(req.satisfied_by):
+            req.conflicts_with = req.satisfied_by
+        req.satisfied_by = None
+
+    # XXX: Stop passing requirement_set for options
+    def _check_skip_installed(self, req_to_install):
+        # type: (InstallRequirement) -> Optional[str]
+        """Check if req_to_install should be skipped.
+
+        This will check if the req is installed, and whether we should upgrade
+        or reinstall it, taking into account all the relevant user options.
+
+        After calling this req_to_install will only have satisfied_by set to
+        None if the req_to_install is to be upgraded/reinstalled etc. Any
+        other value will be a dist recording the current thing installed that
+        satisfies the requirement.
+
+        Note that for vcs urls and the like we can't assess skipping in this
+        routine - we simply identify that we need to pull the thing down,
+        then later on it is pulled down and introspected to assess upgrade/
+        reinstalls etc.
+
+        :return: A text reason for why it was skipped, or None.
+        """
+        if self.ignore_installed:
+            return None
+
+        req_to_install.check_if_exists(self.use_user_site)
+        if not req_to_install.satisfied_by:
+            return None
+
+        if self.force_reinstall:
+            self._set_req_to_reinstall(req_to_install)
+            return None
+
+        if not self._is_upgrade_allowed(req_to_install):
+            if self.upgrade_strategy == "only-if-needed":
+                return 'already satisfied, skipping upgrade'
+            return 'already satisfied'
+
+        # Check for the possibility of an upgrade.  For link-based
+        # requirements we have to pull the tree down and inspect to assess
+        # the version #, so it's handled way down.
+        if not req_to_install.link:
+            try:
+                self.finder.find_requirement(req_to_install, upgrade=True)
+            except BestVersionAlreadyInstalled:
+                # Then the best version is installed.
+                return 'already up-to-date'
+            except DistributionNotFound:
+                # No distribution found, so we squash the error.  It will
+                # be raised later when we re-try later to do the install.
+                # Why don't we just raise here?
+                pass
+
+        self._set_req_to_reinstall(req_to_install)
+        return None
+
+    def _get_abstract_dist_for(self, req):
+        # type: (InstallRequirement) -> DistAbstraction
+        """Takes a InstallRequirement and returns a single AbstractDist \
+        representing a prepared variant of the same.
+        """
+        assert self.require_hashes is not None, (
+            "require_hashes should have been set in Resolver.resolve()"
+        )
+
+        if req.editable:
+            return self.preparer.prepare_editable_requirement(
+                req, self.require_hashes, self.use_user_site, self.finder,
+            )
+
+        # satisfied_by is only evaluated by calling _check_skip_installed,
+        # so it must be None here.
+        assert req.satisfied_by is None
+        skip_reason = self._check_skip_installed(req)
+
+        if req.satisfied_by:
+            return self.preparer.prepare_installed_requirement(
+                req, self.require_hashes, skip_reason
+            )
+
+        upgrade_allowed = self._is_upgrade_allowed(req)
+        abstract_dist = self.preparer.prepare_linked_requirement(
+            req, self.session, self.finder, upgrade_allowed,
+            self.require_hashes
+        )
+
+        # NOTE
+        # The following portion is for determining if a certain package is
+        # going to be re-installed/upgraded or not and reporting to the user.
+        # This should probably get cleaned up in a future refactor.
+
+        # req.req is only avail after unpack for URL
+        # pkgs repeat check_if_exists to uninstall-on-upgrade
+        # (#14)
+        if not self.ignore_installed:
+            req.check_if_exists(self.use_user_site)
+
+        if req.satisfied_by:
+            should_modify = (
+                self.upgrade_strategy != "to-satisfy-only" or
+                self.force_reinstall or
+                self.ignore_installed or
+                req.link.scheme == 'file'
+            )
+            if should_modify:
+                self._set_req_to_reinstall(req)
+            else:
+                logger.info(
+                    'Requirement already satisfied (use --upgrade to upgrade):'
+                    ' %s', req,
+                )
+
+        return abstract_dist
+
+    def _resolve_one(
+        self,
+        requirement_set,  # type: RequirementSet
+        req_to_install  # type: InstallRequirement
+    ):
+        # type: (...) -> List[InstallRequirement]
+        """Prepare a single requirements file.
+
+        :return: A list of additional InstallRequirements to also install.
+        """
+        # Tell user what we are doing for this requirement:
+        # obtain (editable), skipping, processing (local url), collecting
+        # (remote url or package name)
+        if req_to_install.constraint or req_to_install.prepared:
+            return []
+
+        req_to_install.prepared = True
+
+        # register tmp src for cleanup in case something goes wrong
+        requirement_set.reqs_to_cleanup.append(req_to_install)
+
+        abstract_dist = self._get_abstract_dist_for(req_to_install)
+
+        # Parse and return dependencies
+        dist = abstract_dist.dist()
+        try:
+            check_dist_requires_python(dist)
+        except UnsupportedPythonVersion as err:
+            if self.ignore_requires_python:
+                logger.warning(err.args[0])
+            else:
+                raise
+
+        more_reqs = []  # type: List[InstallRequirement]
+
+        def add_req(subreq, extras_requested):
+            sub_install_req = install_req_from_req_string(
+                str(subreq),
+                req_to_install,
+                isolated=self.isolated,
+                wheel_cache=self.wheel_cache,
+                use_pep517=self.use_pep517
+            )
+            parent_req_name = req_to_install.name
+            to_scan_again, add_to_parent = requirement_set.add_requirement(
+                sub_install_req,
+                parent_req_name=parent_req_name,
+                extras_requested=extras_requested,
+            )
+            if parent_req_name and add_to_parent:
+                self._discovered_dependencies[parent_req_name].append(
+                    add_to_parent
+                )
+            more_reqs.extend(to_scan_again)
+
+        with indent_log():
+            # We add req_to_install before its dependencies, so that we
+            # can refer to it when adding dependencies.
+            if not requirement_set.has_requirement(req_to_install.name):
+                # 'unnamed' requirements will get added here
+                req_to_install.is_direct = True
+                requirement_set.add_requirement(
+                    req_to_install, parent_req_name=None,
+                )
+
+            if not self.ignore_dependencies:
+                if req_to_install.extras:
+                    logger.debug(
+                        "Installing extra requirements: %r",
+                        ','.join(req_to_install.extras),
+                    )
+                missing_requested = sorted(
+                    set(req_to_install.extras) - set(dist.extras)
+                )
+                for missing in missing_requested:
+                    logger.warning(
+                        '%s does not provide the extra \'%s\'',
+                        dist, missing
+                    )
+
+                available_requested = sorted(
+                    set(dist.extras) & set(req_to_install.extras)
+                )
+                for subreq in dist.requires(available_requested):
+                    add_req(subreq, extras_requested=available_requested)
+
+            if not req_to_install.editable and not req_to_install.satisfied_by:
+                # XXX: --no-install leads this to report 'Successfully
+                # downloaded' for only non-editable reqs, even though we took
+                # action on them.
+                requirement_set.successfully_downloaded.append(req_to_install)
+
+        return more_reqs
+
+    def get_installation_order(self, req_set):
+        # type: (RequirementSet) -> List[InstallRequirement]
+        """Create the installation order.
+
+        The installation order is topological - requirements are installed
+        before the requiring thing. We break cycles at an arbitrary point,
+        and make no other guarantees.
+        """
+        # The current implementation, which we may change at any point
+        # installs the user specified things in the order given, except when
+        # dependencies must come earlier to achieve topological order.
+        order = []
+        ordered_reqs = set()  # type: Set[InstallRequirement]
+
+        def schedule(req):
+            if req.satisfied_by or req in ordered_reqs:
+                return
+            if req.constraint:
+                return
+            ordered_reqs.add(req)
+            for dep in self._discovered_dependencies[req.name]:
+                schedule(dep)
+            order.append(req)
+
+        for install_req in req_set.requirements.values():
+            schedule(install_req)
+        return order
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolve.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolve.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3235c8b72e4f76e762d8f370171ce39c218a7672
GIT binary patch
literal 11222
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
LSd3YiiJut&;xy_@

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0f7f0c0d6d8d34bbf74474bb71cdfa5defadefa1
GIT binary patch
literal 198
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaXteBgML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GMGxJJPi}Dh4^h--JbBguj<1_OzOXB183MxxD7#J9A
Ra`RJ4b5iX<E-MB(3;@~OGF1Qo

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py
new file mode 100644
index 00000000..fb261110
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py
@@ -0,0 +1,268 @@
+"""
+This code was taken from https://github.com/ActiveState/appdirs and modified
+to suit our purposes.
+"""
+from __future__ import absolute_import
+
+import os
+import sys
+
+from pip._vendor.six import PY2, text_type
+
+from pip._internal.utils.compat import WINDOWS, expanduser
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import List
+
+
+def user_cache_dir(appname):
+    # type: (str) -> str
+    r"""
+    Return full path to the user-specific cache dir for this application.
+
+        "appname" is the name of application.
+
+    Typical user cache directories are:
+        macOS:      ~/Library/Caches/<AppName>
+        Unix:       ~/.cache/<AppName> (XDG default)
+        Windows:    C:\Users\<username>\AppData\Local\<AppName>\Cache
+
+    On Windows the only suggestion in the MSDN docs is that local settings go
+    in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the
+    non-roaming app data dir (the default returned by `user_data_dir`). Apps
+    typically put cache data somewhere *under* the given dir here. Some
+    examples:
+        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
+        ...\Acme\SuperApp\Cache\1.0
+
+    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
+    """
+    if WINDOWS:
+        # Get the base path
+        path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
+
+        # When using Python 2, return paths as bytes on Windows like we do on
+        # other operating systems. See helper function docs for more details.
+        if PY2 and isinstance(path, text_type):
+            path = _win_path_to_bytes(path)
+
+        # Add our app name and Cache directory to it
+        path = os.path.join(path, appname, "Cache")
+    elif sys.platform == "darwin":
+        # Get the base path
+        path = expanduser("~/Library/Caches")
+
+        # Add our app name to it
+        path = os.path.join(path, appname)
+    else:
+        # Get the base path
+        path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache"))
+
+        # Add our app name to it
+        path = os.path.join(path, appname)
+
+    return path
+
+
+def user_data_dir(appname, roaming=False):
+    # type: (str, bool) -> str
+    r"""
+    Return full path to the user-specific data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        macOS:                  ~/Library/Application Support/<AppName>
+                                if it exists, else ~/.config/<AppName>
+        Unix:                   ~/.local/share/<AppName>    # or in
+                                $XDG_DATA_HOME, if defined
+        Win XP (not roaming):   C:\Documents and Settings\<username>\ ...
+                                ...Application Data\<AppName>
+        Win XP (roaming):       C:\Documents and Settings\<username>\Local ...
+                                ...Settings\Application Data\<AppName>
+        Win 7  (not roaming):   C:\\Users\<username>\AppData\Local\<AppName>
+        Win 7  (roaming):       C:\\Users\<username>\AppData\Roaming\<AppName>
+
+    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
+    That means, by default "~/.local/share/<AppName>".
+    """
+    if WINDOWS:
+        const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
+        path = os.path.join(os.path.normpath(_get_win_folder(const)), appname)
+    elif sys.platform == "darwin":
+        path = os.path.join(
+            expanduser('~/Library/Application Support/'),
+            appname,
+        ) if os.path.isdir(os.path.join(
+            expanduser('~/Library/Application Support/'),
+            appname,
+        )
+        ) else os.path.join(
+            expanduser('~/.config/'),
+            appname,
+        )
+    else:
+        path = os.path.join(
+            os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")),
+            appname,
+        )
+
+    return path
+
+
+def user_config_dir(appname, roaming=True):
+    # type: (str, bool) -> str
+    """Return full path to the user-specific config dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "roaming" (boolean, default True) can be set False to not use the
+            Windows roaming appdata directory. That means that for users on a
+            Windows network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        macOS:                  same as user_data_dir
+        Unix:                   ~/.config/<AppName>
+        Win *:                  same as user_data_dir
+
+    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
+    That means, by default "~/.config/<AppName>".
+    """
+    if WINDOWS:
+        path = user_data_dir(appname, roaming=roaming)
+    elif sys.platform == "darwin":
+        path = user_data_dir(appname)
+    else:
+        path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config"))
+        path = os.path.join(path, appname)
+
+    return path
+
+
+# for the discussion regarding site_config_dirs locations
+# see <https://github.com/pypa/pip/issues/1733>
+def site_config_dirs(appname):
+    # type: (str) -> List[str]
+    r"""Return a list of potential user-shared config dirs for this application.
+
+        "appname" is the name of application.
+
+    Typical user config directories are:
+        macOS:      /Library/Application Support/<AppName>/
+        Unix:       /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in
+                    $XDG_CONFIG_DIRS
+        Win XP:     C:\Documents and Settings\All Users\Application ...
+                    ...Data\<AppName>\
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory
+                    on Vista.)
+        Win 7:      Hidden, but writeable on Win 7:
+                    C:\ProgramData\<AppName>\
+    """
+    if WINDOWS:
+        path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
+        pathlist = [os.path.join(path, appname)]
+    elif sys.platform == 'darwin':
+        pathlist = [os.path.join('/Library/Application Support', appname)]
+    else:
+        # try looking in $XDG_CONFIG_DIRS
+        xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg')
+        if xdg_config_dirs:
+            pathlist = [
+                os.path.join(expanduser(x), appname)
+                for x in xdg_config_dirs.split(os.pathsep)
+            ]
+        else:
+            pathlist = []
+
+        # always look in /etc directly as well
+        pathlist.append('/etc')
+
+    return pathlist
+
+
+# -- Windows support functions --
+
+def _get_win_folder_from_registry(csidl_name):
+    # type: (str) -> str
+    """
+    This is a fallback technique at best. I'm not sure if using the
+    registry for this guarantees us the correct answer for all CSIDL_*
+    names.
+    """
+    import _winreg
+
+    shell_folder_name = {
+        "CSIDL_APPDATA": "AppData",
+        "CSIDL_COMMON_APPDATA": "Common AppData",
+        "CSIDL_LOCAL_APPDATA": "Local AppData",
+    }[csidl_name]
+
+    key = _winreg.OpenKey(
+        _winreg.HKEY_CURRENT_USER,
+        r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
+    )
+    directory, _type = _winreg.QueryValueEx(key, shell_folder_name)
+    return directory
+
+
+def _get_win_folder_with_ctypes(csidl_name):
+    # type: (str) -> str
+    csidl_const = {
+        "CSIDL_APPDATA": 26,
+        "CSIDL_COMMON_APPDATA": 35,
+        "CSIDL_LOCAL_APPDATA": 28,
+    }[csidl_name]
+
+    buf = ctypes.create_unicode_buffer(1024)
+    ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in buf:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf2 = ctypes.create_unicode_buffer(1024)
+        if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
+            buf = buf2
+
+    return buf.value
+
+
+if WINDOWS:
+    try:
+        import ctypes
+        _get_win_folder = _get_win_folder_with_ctypes
+    except ImportError:
+        _get_win_folder = _get_win_folder_from_registry
+
+
+def _win_path_to_bytes(path):
+    """Encode Windows paths to bytes. Only used on Python 2.
+
+    Motivation is to be consistent with other operating systems where paths
+    are also returned as bytes. This avoids problems mixing bytes and Unicode
+    elsewhere in the codebase. For more details and discussion see
+    <https://github.com/pypa/pip/issues/3463>.
+
+    If encoding using ASCII and MBCS fails, return the original Unicode path.
+    """
+    for encoding in ('ASCII', 'MBCS'):
+        try:
+            return path.encode(encoding)
+        except (UnicodeEncodeError, LookupError):
+            pass
+    return path
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a2500150f05efd7a8e569a1933f9ced34163c15b
GIT binary patch
literal 9394
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
Yd6YOcImJ1p*ch1^c^J7Ec^P?`0ZU|x^8f$<

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py
new file mode 100644
index 00000000..845436e4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py
@@ -0,0 +1,264 @@
+"""Stuff that differs in different Python versions and platform
+distributions."""
+from __future__ import absolute_import, division
+
+import codecs
+import locale
+import logging
+import os
+import shutil
+import sys
+
+from pip._vendor.six import text_type
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Tuple, Text
+
+try:
+    import ipaddress
+except ImportError:
+    try:
+        from pip._vendor import ipaddress  # type: ignore
+    except ImportError:
+        import ipaddr as ipaddress  # type: ignore
+        ipaddress.ip_address = ipaddress.IPAddress  # type: ignore
+        ipaddress.ip_network = ipaddress.IPNetwork  # type: ignore
+
+
+__all__ = [
+    "ipaddress", "uses_pycache", "console_to_str", "native_str",
+    "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size",
+    "get_extension_suffixes",
+]
+
+
+logger = logging.getLogger(__name__)
+
+if sys.version_info >= (3, 4):
+    uses_pycache = True
+    from importlib.util import cache_from_source
+else:
+    import imp
+
+    try:
+        cache_from_source = imp.cache_from_source  # type: ignore
+    except AttributeError:
+        # does not use __pycache__
+        cache_from_source = None
+
+    uses_pycache = cache_from_source is not None
+
+
+if sys.version_info >= (3, 5):
+    backslashreplace_decode = "backslashreplace"
+else:
+    # In version 3.4 and older, backslashreplace exists
+    # but does not support use for decoding.
+    # We implement our own replace handler for this
+    # situation, so that we can consistently use
+    # backslash replacement for all versions.
+    def backslashreplace_decode_fn(err):
+        raw_bytes = (err.object[i] for i in range(err.start, err.end))
+        if sys.version_info[0] == 2:
+            # Python 2 gave us characters - convert to numeric bytes
+            raw_bytes = (ord(b) for b in raw_bytes)
+        return u"".join(u"\\x%x" % c for c in raw_bytes), err.end
+    codecs.register_error(
+        "backslashreplace_decode",
+        backslashreplace_decode_fn,
+    )
+    backslashreplace_decode = "backslashreplace_decode"
+
+
+def console_to_str(data):
+    # type: (bytes) -> Text
+    """Return a string, safe for output, of subprocess output.
+
+    We assume the data is in the locale preferred encoding.
+    If it won't decode properly, we warn the user but decode as
+    best we can.
+
+    We also ensure that the output can be safely written to
+    standard output without encoding errors.
+    """
+
+    # First, get the encoding we assume. This is the preferred
+    # encoding for the locale, unless that is not found, or
+    # it is ASCII, in which case assume UTF-8
+    encoding = locale.getpreferredencoding()
+    if (not encoding) or codecs.lookup(encoding).name == "ascii":
+        encoding = "utf-8"
+
+    # Now try to decode the data - if we fail, warn the user and
+    # decode with replacement.
+    try:
+        decoded_data = data.decode(encoding)
+    except UnicodeDecodeError:
+        logger.warning(
+            "Subprocess output does not appear to be encoded as %s",
+            encoding,
+        )
+        decoded_data = data.decode(encoding, errors=backslashreplace_decode)
+
+    # Make sure we can print the output, by encoding it to the output
+    # encoding with replacement of unencodable characters, and then
+    # decoding again.
+    # We use stderr's encoding because it's less likely to be
+    # redirected and if we don't find an encoding we skip this
+    # step (on the assumption that output is wrapped by something
+    # that won't fail).
+    # The double getattr is to deal with the possibility that we're
+    # being called in a situation where sys.__stderr__ doesn't exist,
+    # or doesn't have an encoding attribute. Neither of these cases
+    # should occur in normal pip use, but there's no harm in checking
+    # in case people use pip in (unsupported) unusual situations.
+    output_encoding = getattr(getattr(sys, "__stderr__", None),
+                              "encoding", None)
+
+    if output_encoding:
+        output_encoded = decoded_data.encode(
+            output_encoding,
+            errors="backslashreplace"
+        )
+        decoded_data = output_encoded.decode(output_encoding)
+
+    return decoded_data
+
+
+if sys.version_info >= (3,):
+    def native_str(s, replace=False):
+        # type: (str, bool) -> str
+        if isinstance(s, bytes):
+            return s.decode('utf-8', 'replace' if replace else 'strict')
+        return s
+
+else:
+    def native_str(s, replace=False):
+        # type: (str, bool) -> str
+        # Replace is ignored -- unicode to UTF-8 can't fail
+        if isinstance(s, text_type):
+            return s.encode('utf-8')
+        return s
+
+
+def get_path_uid(path):
+    # type: (str) -> int
+    """
+    Return path's uid.
+
+    Does not follow symlinks:
+        https://github.com/pypa/pip/pull/935#discussion_r5307003
+
+    Placed this function in compat due to differences on AIX and
+    Jython, that should eventually go away.
+
+    :raises OSError: When path is a symlink or can't be read.
+    """
+    if hasattr(os, 'O_NOFOLLOW'):
+        fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
+        file_uid = os.fstat(fd).st_uid
+        os.close(fd)
+    else:  # AIX and Jython
+        # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW
+        if not os.path.islink(path):
+            # older versions of Jython don't have `os.fstat`
+            file_uid = os.stat(path).st_uid
+        else:
+            # raise OSError for parity with os.O_NOFOLLOW above
+            raise OSError(
+                "%s is a symlink; Will not return uid for symlinks" % path
+            )
+    return file_uid
+
+
+if sys.version_info >= (3, 4):
+    from importlib.machinery import EXTENSION_SUFFIXES
+
+    def get_extension_suffixes():
+        return EXTENSION_SUFFIXES
+else:
+    from imp import get_suffixes
+
+    def get_extension_suffixes():
+        return [suffix[0] for suffix in get_suffixes()]
+
+
+def expanduser(path):
+    # type: (str) -> str
+    """
+    Expand ~ and ~user constructions.
+
+    Includes a workaround for https://bugs.python.org/issue14768
+    """
+    expanded = os.path.expanduser(path)
+    if path.startswith('~/') and expanded.startswith('//'):
+        expanded = expanded[1:]
+    return expanded
+
+
+# packages in the stdlib that may have installation metadata, but should not be
+# considered 'installed'.  this theoretically could be determined based on
+# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
+# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may
+# make this ineffective, so hard-coding
+stdlib_pkgs = {"python", "wsgiref", "argparse"}
+
+
+# windows detection, covers cpython and ironpython
+WINDOWS = (sys.platform.startswith("win") or
+           (sys.platform == 'cli' and os.name == 'nt'))
+
+
+def samefile(file1, file2):
+    # type: (str, str) -> bool
+    """Provide an alternative for os.path.samefile on Windows/Python2"""
+    if hasattr(os.path, 'samefile'):
+        return os.path.samefile(file1, file2)
+    else:
+        path1 = os.path.normcase(os.path.abspath(file1))
+        path2 = os.path.normcase(os.path.abspath(file2))
+        return path1 == path2
+
+
+if hasattr(shutil, 'get_terminal_size'):
+    def get_terminal_size():
+        # type: () -> Tuple[int, int]
+        """
+        Returns a tuple (x, y) representing the width(x) and the height(y)
+        in characters of the terminal window.
+        """
+        return tuple(shutil.get_terminal_size())  # type: ignore
+else:
+    def get_terminal_size():
+        # type: () -> Tuple[int, int]
+        """
+        Returns a tuple (x, y) representing the width(x) and the height(y)
+        in characters of the terminal window.
+        """
+        def ioctl_GWINSZ(fd):
+            try:
+                import fcntl
+                import termios
+                import struct
+                cr = struct.unpack_from(
+                    'hh',
+                    fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678')
+                )
+            except Exception:
+                return None
+            if cr == (0, 0):
+                return None
+            return cr
+        cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
+        if not cr:
+            try:
+                fd = os.open(os.ctermid(), os.O_RDONLY)
+                cr = ioctl_GWINSZ(fd)
+                os.close(fd)
+            except Exception:
+                pass
+        if not cr:
+            cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80))
+        return int(cr[1]), int(cr[0])
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9e6b6da78e4710d29d4843fdc657cdedf83ce5af
GIT binary patch
literal 8638
zcmZSn%*&NH<x)&C0~ByEFfceIFfbI~Wny4RVPJ@2U`SzPNMT~gVPwc<Vu)g5$Yo}T
zVrF0ji83?furNfifK@Ov<ghYCvBKDF3{h+_HakNUJB-c25XAvwb23D6g4rw#Ib006
z+ze6N5OY}>a(EbWc^RU385mP}8HyHzRk1PT@G<1_Geq$-<O(oE2{16`F)&mLfaRDO
zas(No1R28fVi{Ocg&4BA7>a}#85tQXMZogx3^~FKxnL!X;f2DCFg1K2HBhgJfDA|#
zWXKX_NEKv=7Xy)5;vh0!f}v2DF(QwVAtHr?A%&A6g^MADn<0gVA%&MAg^wYHpCLtn
zAw`fOor@t#k|C9iAxnxORhprhks(TkA(fLMOO_!;n<1N(p(u|rRgNJ_9_%O)h8zWk
zTt$W`MFz$^d$15QLyi(dloCTFFGH#lLl#&rJWrf~B~=;hrv+g5GJ~{$T$8HEkiyK6
z%?UCQYK;!qnxl*<VhmBL40-YlDdG$*3=C0f45=&(S?UZa5)7$o49!doj42Wz6)BQn
zX$_b&b;0_%nNl?wQluDK7#X6p81i@+KwN1kH$?`lMH{9?53I$T2^5a93^_Usxw;Hd
zx(tjda$t3O40)1Z&&h*4m#fbZrO&{aq5zdkQ3Nv#7*doNQj{4|R2VXt8KMlqW*aeN
z88f7)g2J(2B@@VlMhq!x4B1Q!`74=H*%`7-7*f<h+$d9q6b-OBW(=w345=KT_-JNg
zD7wIuq6rqaV94WSNYR3_Q<xcoHS`%67>d0a7#M;}O4HI5N-`2l6jCzN(o&0x6*BXn
z%+$ORg@DSEjQl)>vecsD%>2A!g~YrRg@T;KlC=DyT&|SN;*z4wq|y?QlwKw%8)+~x
zFff$xGcYhDCKc!Bl$NB%XXX~<7nPK7FfcHrWR_)u%<<D;1S#VL5vdg=@g<c7sSqI{
z1_lP-$biUrXAf6r@A#llKR-`DcZjL13=9k*r3E>uB`hFTYDEb|56GCzg2a@RqSWHz
zAU2SpJPZsBrNybm@dcI1iOCtMC43AF49WR<#rZj@@g@23#U({0pzNNPSdv+m3g&{e
zq^Fj|7bKQs#Fu8KlyHN>s3avPGbz3xJH5Dsoq>TN+|$p+KRg)hnc~FU)U?c;)Dl4k
z1_qGMlGLKy%)G>$_~Oi})DkhMXlg}CY97eb@x`TSX_*zN#hJ_u3=EkdKS10M(hqiJ
zd|FX{ZhUcmX;E@&CdjuX0t^fcNr}nX#W{(^8AYiDIf==s$)K<U1vAJ5W>9&R&A`CW
z&cKky2uf;g3=Aa<3>^#%S&U$k36$Vnni&~t85v5L8M0VFC7L8C>o74Cc{8N2fYL<`
zBLh@P9s@%PD?=75Lkb&`L^I5+G$w{%4Nyq<!JPr}jWNg>G7Jn1H4F@~LLjR^4q#xY
zVPudDV=QC_6{o>q-$J7v6ifL@S*gh-khlf;N6(-H<h4w&x)PAFsYOK^pj1_y%fP^(
zUr>};mRORiUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQWL{=yVP2e5nO+`ml44?FU|?X7
zo~Iw8Uyxa#o0(T!l9-dDTb^iH8khkR0^|71ypq(Syu=*+(vr-aV*TX&+=9dsy@JYO
zP@=L)Pt8lMC@8YC2PFlN6WJKRsXP<JMhSpoPyk3n13(ZI03~4GH#0I|^*_jW`9&#U
z&j$&Ek}SyUNnqcCiGlXA6T-`-peVrftt8a9{2<?^fPE_l@hc-kFxX?IpcEQYp<3Yw
z_7YeO;n`$}Ajt56_N+6)vl^h3Spv#@MTvRosbE%dNn%k6Bthn-fa&7O;u27S0WBBf
zGxO5&!KG4Ger6uTpQ4~h1*M{*#Pay0%97M#h<`!x90Zc2zo$#2uoNfpDXGc%DXH;k
zd3K;s02R{=jH-;nOu~#M;<(j=(*r1&K-d|S`p<(r3@&z>89+&*hLM4%Sev1Qi6M&_
zR1h>Xf(su;P^DF50xE@S85uy$7-3MUk;MvCQ_I8<o@d6uQo;tV_3IfJ85v918L~J)
z)qM>ks5E1&VE~m-HH@IrtAvxGnUS%Ui2>9oDB)rNA#P9^mcqf%%nT~VAdFgOh8kvu
zqSFjDObl7PAa)81Lkc@sGYdlv3)n<vP<;zBivgr8SOXM)#U_jl3_+<SrA2uPi3*?^
zFE3q3p*S%uRUs|ENFl$pq@c7!M<G8=p|~`upeR2%wYV56s>j8pprD`-o~n>oTwI!)
zs!)=Vs*sXclBkdgu4h5qoc!d(oK%H^qSUn1qN3Ckh19&{{FKbRbUm<M&oqV15{2^o
zJoOR<NK7dd6y+DB7UfjxD3qrvlqVMDfsHLKPAyVMDut^`EC%aON-Zt{sY_1GLvl?{
zalS%oUU6v=$VrJMU;`i?QAkeAQ%Fh$`!A<bp}Z)wq$D*@p(Gz{T5(BYUP@w73e<lJ
z<(VZJ`K2XrH!GwT73CKdL!1uIJBh`~nVH3)L{eIkrfX4b3Tkwqhm%4|ermBoUVe!}
zVnIP_Vv#~gKFAH=kVs8YNGw)REiM6NOo;K|syjZuxFjXDs3<-jTpNScX6B^_fofAf
z4N!d#)&U9L5)nvk3=d_Pa<Cdu`cH;fkdvREU0MLn%6W;osbFbHu$O?ECZTzmAjK}=
zEaM9DD_BKNetLRp5x9i_iVu)86hXNGR8gj<mL!&x6a|55N3gkm`FRj?!EQ*^0EG=$
z0+cX<R6+VcMGM5%lz5ORxIqPppLnpY%)E4PlLlEVH3d?@3`~I<1S&W{Ey`jQkOTO6
z808r`S(q7x8F?Am7?~N_nI!py7<ri37(tMeNr)*KREdHxs4fJTAfQ$$sM=&;C;{j5
zB5iQVzyxa6)G#s>selTNJZ4Zq(9FaTT*JT+tO2TG{1E9290$;b5;$r=`8Byj17rs{
z*<==jn*w>skfI%2Fb8QfFff2iZEypmILHjd2YCY=qVzAQgFxj@GpINQC3*%XenuHa
z%-~W0B^7X!3mRN9h~R2wgoY0&fRVxn91uYk3=9lGAekUTkWaxZE0EZr@OT&8<IMbw
zyo}(Q1{8mws0OE#4v5D~!0la7SH~BWV6vD%-Y;PURW~4#g~6$r2~-h*II!9!i;ba{
z39OnOTHi3{nS=Qp3|X8Y1DY8bic7#ETu?4VPo4ln2{$MK)-W)LH8V0aF+!>ckjsiS
z85tPB1thed0CghNixo;UQ=o;e3#@=k%g@QlFIOn8%+1Nn%PzJ8>jG6086_nJ#a8<I
z>6s-NrAd0p`MLT9l?935W@<rcPL95%v8i%OW^r<9F}OETWNK_+ZeU;xsbT^^J%bd5
zl8nq^g|yPVWKfq3)RTiWXcbaQQ$b}aq>GoDmz-Lxke{dE=ota((1D%c1@7qSK)Qm(
z8Tq9-DGI4&sd*)(i8(oy3hDU@iRFovP~TV;C1w_<7AyD%gUdiGh475jJOz-aK^0pf
z%y$a;MWE_Ly#!R47o{eqK<foA1_lQIct3wPe;*(J@M2IJR4qo)X{`{RnUe#q5sDx+
zZ)s)<xVnV}oCc_j1n2gQ#9~kZTLMbO`NiOpG`}D<4_qtw#|OFi`}sr$S%Z=csH9CR
z1{KGkY*kzW?&g66lXLQmA-zhFAHd~CW-%y!z@~w9fQoXccOiKQ)Mf<RnU(^!3e*(@
z83-;iz{CKQ8=#P#1j;@_pwf#MRBi|{3NQ;Xi83=Y@-jhsRv<aoh!9u5U{8O)_~1}C
zH_r&yVE8Z?sDTR3W}y650xDxcB9MMtkSD0T0GSQ;A($8dZ-T}bHiNtgigN}=h_^rq
z0@MwMb+f@90y!Pz53q;iK#c%!_qdsX!6jCJp%z?vrZ6%{#xXGzazVQ-e&9YH*w7#^
zkbgmjfD;A8Xt1xr!~l7H2g2*%!Vwe-APn}TBPgYVo8gcG5z_MqwV0Vf^=LCALy;}0
z=*waT6=ra53NwQ|q&;2(>b`-(4D35_;ow?P02=tI1C<sEb>NmJXfUOus1#h#6hn&z
z&%ETE(v;L<g+zt&{G#l{qWsc4NUntyZb_x-#d-zcqDC*jC|y6ZxVSXc(8S!#0&Gt)
z$QO0`U`k&<6BO>?3O>jdR5^ij94LjSf}I0$2DnNGch8DJO;K<i9t2hgYK}nE4RE{2
zhk=1%4=BPwE@EI8Vw7X#Wdx@tNH~DYu=3*c%%apZa6yt-lwOcnRGbR#XqIQ@f$8L&
zOmJb7R|0MafT9Of@qlAI9}?rBY7X2~0@aAB;2I3l^#XUzK@BE|iYykG94oYf10@ki
zrN{*8qCu6xs!Wh9GpMesVFq>Gf>S_4Kp@MDK^?|`qWrSVlvIVpJcYy@@K_3HL=9Y2
z=NIdNic>w<KpCjY3D3++$uBR~hm0#41@SU4F!+J{+(9;=IEF_wSOy#(dHF@T$%)0O
z;DAa@Dh8PeP8Hz(1*q6HgtLsmERYI_7>H#A&Z=MnoTBMEjs*6`HBj_}5-tO?5Th`Y
z9HSf~xNriMqo5QIjz!Q=UkSM7o5jS?%mC_$LPpGrn;4*t3s5rw(!c;^u@cZwsDeg?
zjzXoTLQ!f#QEG8&UP)$NI=DAio|#gTp;4g;&a$9>W=3jedPa#xr6xG1fsD$`Q%KH8
zEJ{o+0S)`+gNA`q6<~vy3gzIKg4Ea`)!<qW9K2wQ!6~>n12k+F1nO*o!xupeKuCjJ
z@dy;spde*n1BWmunSv^Ka0p)pjX*PkMm3@3J`*UA3$#GFAO+m>hq75f;<b#RQnI*-
zq0$00pqj-9Cc#lt!T@Sxf*O}hAiXtUb3ntZ44~`-;WCC7HZic2u!09M>Og}Sg-r|*
zdEmTQycKK~8$%X5c%Xs}G^hbG6e7aT02;AiVn_qGUh^0jN;p7HNnvJ?Y-WUUn7|zH
za4e{^Fh~*!xH<v_IH-XY3>p;z4IWndfNGu;28JB)zz}GzgaI_ERtqk!K;ldckl`6f
zrBnkRDXIaF!GK1hnLz_Npx|a<2+tFO4-F-NLN$efAvmIj1vC<r&BRbt2p(y!VPOac
z_p2dQIk@D^$N-lnhDOFFre@|A;Hm;#(Sr#MQ0WX#-D$~rB{|@-2Amc0A>#tY;JOYx
zCs3MKkeHke9;*jy$jnbJ$pKeHA)fxu?%|$(!BHikIB~5=PAvd6#Dfe#tq4%C1i6C>
zxp)wf03s4WMK>tDCPN0g!5N7Dc?Ud}3HC=k#Qh&Y`A7m(J~1*g@_-?z6EDxi%gD;e
z!^px24m5BD4IT>z2ZWEOpKEX?Xjm8=e9rzpp}u~>nE@crgTez+i-Rf+uso>P$<0g&
z0u8PQfrgudQbC~sYG|kCm1P#?Lu$VCRLIb4W*(#$ACwLXxHJ#}3QTZ_feHEt8@S+m
z1rI7VPCgazScfzt52GL>FC#l68>22GB&C5$BFLN%D7qn2K%f)>Zf1hH=;|zCp%EXS
zlAjzO4^Cq7@oA+crA4Xn@j;;22?8~df<WF6QiCZ64Mu@RpukmW3@DsrKvJMKb3tZ-
zUVK?<UP^wEUU6mxcnAPIC=8Z>&4uWJ3iV>WlF9;*F(8M73wtOZ)bt1fxg0Xn2AU=F
z1kdn+yMo{x0yYg|4OnL;cybP$Cp-fjA@g)#-((iVL#OSal76Wrpq3*{G7riHrHT0X
z#GIV?c(B6s)Dj=akQ*r5#>az(>f+;rbU~h#1$h?a$dIDa)F6;f@JJbC7BVL@3GBNd
zaBU0nT4rtmSl+P&GL@MM_69h|27$)#g21CJpt_|fH9fPqB(*3WJO~LM?*b=#x5S*{
zRPcyR5Esa9&}<IEw%o+zjLf{$qDpYrDF_q`L7+}W5U5=k1PVQHu>_k_4e|x~K?_8H
z`ZM6>1EggHa)JgZ&JhItQ#{zMHo5sJr8%i~poCmp!oa}5#wf-FDI~xolK_(d6C0x>
z6EmX#BQGN}qX;7}xCjwp;bG)w<YeJz;%8)I6lUUKVrJxJ<YnSw;$h}z<Yeb$0~Ipt
pOl-`Y=KPHO>^vNta{P<}Ogzj2Oq?v7Li{X3jB?DJ-299@902zg+p+)v

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py
new file mode 100644
index 00000000..8c896f8c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py
@@ -0,0 +1,93 @@
+"""
+A module that implements tooling to enable easy warnings about deprecations.
+"""
+from __future__ import absolute_import
+
+import logging
+import warnings
+
+from pip._vendor.packaging.version import parse
+
+from pip import __version__ as current_version
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Optional
+
+
+DEPRECATION_MSG_PREFIX = "DEPRECATION: "
+
+
+class PipDeprecationWarning(Warning):
+    pass
+
+
+_original_showwarning = None  # type: Any
+
+
+# Warnings <-> Logging Integration
+def _showwarning(message, category, filename, lineno, file=None, line=None):
+    if file is not None:
+        if _original_showwarning is not None:
+            _original_showwarning(
+                message, category, filename, lineno, file, line,
+            )
+    elif issubclass(category, PipDeprecationWarning):
+        # We use a specially named logger which will handle all of the
+        # deprecation messages for pip.
+        logger = logging.getLogger("pip._internal.deprecations")
+        logger.warning(message)
+    else:
+        _original_showwarning(
+            message, category, filename, lineno, file, line,
+        )
+
+
+def install_warning_logger():
+    # type: () -> None
+    # Enable our Deprecation Warnings
+    warnings.simplefilter("default", PipDeprecationWarning, append=True)
+
+    global _original_showwarning
+
+    if _original_showwarning is None:
+        _original_showwarning = warnings.showwarning
+        warnings.showwarning = _showwarning
+
+
+def deprecated(reason, replacement, gone_in, issue=None):
+    # type: (str, Optional[str], Optional[str], Optional[int]) -> None
+    """Helper to deprecate existing functionality.
+
+    reason:
+        Textual reason shown to the user about why this functionality has
+        been deprecated.
+    replacement:
+        Textual suggestion shown to the user about what alternative
+        functionality they can use.
+    gone_in:
+        The version of pip does this functionality should get removed in.
+        Raises errors if pip's current version is greater than or equal to
+        this.
+    issue:
+        Issue number on the tracker that would serve as a useful place for
+        users to find related discussion and provide feedback.
+
+    Always pass replacement, gone_in and issue as keyword arguments for clarity
+    at the call site.
+    """
+
+    # Construct a nice message.
+    # This is purposely eagerly formatted as we want it to appear as if someone
+    # typed this entire message out.
+    message = DEPRECATION_MSG_PREFIX + reason
+    if replacement is not None:
+        message += " A possible replacement is {}.".format(replacement)
+    if issue is not None:
+        url = "https://github.com/pypa/pip/issues/" + str(issue)
+        message += " You can find discussion regarding this at {}.".format(url)
+
+    # Raise as an error if it has to be removed.
+    if gone_in is not None and parse(current_version) >= parse(gone_in):
+        raise PipDeprecationWarning(message)
+    warnings.warn(message, category=PipDeprecationWarning, stacklevel=2)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8020b556e0e4ae4bb06255f4313036383d7e7d6c
GIT binary patch
literal 3408
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
E0FnY~{Qv*}

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py
new file mode 100644
index 00000000..30139f2e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py
@@ -0,0 +1,39 @@
+import codecs
+import locale
+import re
+import sys
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import List, Tuple, Text
+
+BOMS = [
+    (codecs.BOM_UTF8, 'utf-8'),
+    (codecs.BOM_UTF16, 'utf-16'),
+    (codecs.BOM_UTF16_BE, 'utf-16-be'),
+    (codecs.BOM_UTF16_LE, 'utf-16-le'),
+    (codecs.BOM_UTF32, 'utf-32'),
+    (codecs.BOM_UTF32_BE, 'utf-32-be'),
+    (codecs.BOM_UTF32_LE, 'utf-32-le'),
+]  # type: List[Tuple[bytes, Text]]
+
+ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)')
+
+
+def auto_decode(data):
+    # type: (bytes) -> Text
+    """Check a bytes string for a BOM to correctly detect the encoding
+
+    Fallback to locale.getpreferredencoding(False) like open() on Python3"""
+    for bom, encoding in BOMS:
+        if data.startswith(bom):
+            return data[len(bom):].decode(encoding)
+    # 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')
+            return data.decode(encoding)
+    return data.decode(
+        locale.getpreferredencoding(False) or sys.getdefaultencoding(),
+    )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e72bbed5f78c17809d4233f033c100e5b0771880
GIT binary patch
literal 1649
zcmZSn%*&NH<x)&C0~ByDFfceUFfbI~W?*1QVPHsMWXNG)h=Q{j8KM|r;!F%tOfWVx
zLliTZ&BTzy!jQ|#5XH*Cn99mflnNGQX2@Y<$Yp1UVrR(ZV2I*i$mL{+;$&dVV_-;S
zV94TPNMT_}V*<0e8B$nbY#xRbHW-_iA%z{r=3_|VfU)@*QaE930frPV5IdcnAxe-T
zm5Cush#`fWp_!2(N|+&qhoOamAxZ?~r(g|U1_p-A|NsC0_tRixU|=W_VqjqKjSPs4
zclK~~_Kpt<_4D)ebJt)7$+0jnF!*E^mz1zFFffFa7UZOsfP_L)D@uw%LZu~Xx)#N3
z3=9k)mZ4cOC!DF9l#0yDNrfvjHiAnS8zCz*Hqy;WEf!;7U`WnS$;?ZSwz7?lDb~`6
z){QCGi`CXl2DukxKL|U6;_4g&14D%sLkR<eORNz?3==~wBSS3{Lk$B%79&FqBgp?n
z>>zFl6O=2T#mrE{1d<3YWM>Gk$N|Y_v4Dc6nUNudi9x|7Hk_fBnW2W6A%z(fJBlf+
z4B1Q!MS%<@tPELfAc<y1bZ!<qLo)+NgJc#nDC(Nw?m$=<$Pf;47&Ai&2SXMoLkSni
z6$PglO1K%actF~l85x2#*g^j4Vqjo!&PYwpR!CGxsw_z@Rwynh%FIhwNXsu$NK|n0
z_f;s#S4hq;DoRZ*$*ELGNi9iDE>S4SNL5J9g9IKImx6+Vf?HxvPEulWHb{9+esW??
zs$P0(NkLI+T53^IY6?uThFfAzajK?5PG)whLViJNo`$AEex5==Wl2VUo^dfK+_^HD
zKnVwwTQWiX5)h#bP8f;B$(fnpbOlZwPX4~ZC0rnHlq43F6qjd~WR!qXQ%-7L2`H(g
zq$cO5q=I!87vyA?lyEaJFu3|T`@4AhxyJ{&f)y2~CKe@UfSKt<`K1NLU?#*1B_a$A
z4A{H@HWTa>u!Y5y#o*MPo?4QUnwD6aQv&xdC<TEXo03?P2v(ewpIZVd17J$PvN@S~
zsTv?JgNfpN1_lQGf}+f_#FA9~vcw|&wEUcu)S_bj>_YwQVk2{N!@?{h^D;vV^WvP!
z^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6@<hwhzzmQO7{_Pkm82HsCFbatmSpA>
z>%-ijS5OHKoW#<S{CG&PNr1u?lw}!Mg&Fx7rJ1A{l^B&61sT~GHAF#K78Jsu@J%ib
z;sfzPu~w8CBnV<lF)%O`WESYb?b8F>r&m&0keQbr1o9|2n4x@73<rVq2Z5pw96C<^
zzVV?UZWbk=j1J`(nw9V{FfhP*@lLL20zR(D>Wz(%rHzfy)EgVc`?v;yyio$m3(5Jp
z1(`XiL7+quB+kIV0FDX-F(8owN+>qD`6;D2sdk`HDwbnlVBlc{LnZ+xHb!}7FdHJm
JD8$Uq3;=(ab?*QG

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py
new file mode 100644
index 00000000..1e6b0338
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py
@@ -0,0 +1,30 @@
+import os
+import os.path
+
+from pip._internal.utils.compat import get_path_uid
+
+
+def check_path_owner(path):
+    # type: (str) -> bool
+    # If we don't have a way to check the effective uid of this process, then
+    # we'll just assume that we own the directory.
+    if not hasattr(os, "geteuid"):
+        return True
+
+    previous = None
+    while path != previous:
+        if os.path.lexists(path):
+            # Check if path is writable by current user.
+            if os.geteuid() == 0:
+                # Special handling for root user in order to handle properly
+                # cases where users use sudo without -H flag.
+                try:
+                    path_uid = get_path_uid(path)
+                except OSError:
+                    return False
+                return path_uid == 0
+            else:
+                return os.access(path, os.W_OK)
+        else:
+            previous, path = path, os.path.dirname(path)
+    return False  # assume we don't own the path
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..19a54688daa8501bca3be585a7dbd3e2bd48abef
GIT binary patch
literal 912
zcmZSn%*&NH<x)&C0~9bZFfceUFfbIGGB7ZtFfgPrGUPBYM8VmNFg6oI4iiHzGeZ<J
z17iv^Lkj~#6bndoum%eQ14HKj|NsB{X)rP{FqH5xFfgR2mc$n%mSn`2W~L;AM41^F
z7+4t?7@R?NZ2~D{U?^b(8PLqcP%O+)!o(1q!oX0=$WSqfp@xB>hLItgnW1PcNKqCG
zLl!GYu$hseXd+mIjiH%=A%%${n~9;QnxRsFp@bc(pq7atJWq&$rG$ean~R~SfPs;b
zv4oQ$IHHCLsv)?9ks*r<q#VTHW@u(&2riU?@mUzMctGrCMh2!@Muu7jhC&&JaF7Wa
zAV2t(utU6;TAG=X2?|6FUXX7<q8W+Bi6tdPC7>|PFD?OvOGr^^DwyGyp9f)pLIrF_
zPHIJFaY=CyD0G5A27yKWgI$Y?@{3A9Vda*XQ=D4D#=yXkn4Fwi3^6f0-rpOnG9|Mp
zFEKY2?5ZG;q7n`U28M#7)UwR{(qae)8Uq?2<H1C6Ap--0enC-YSz<}5epzCXep-G`
zN@`KDes-aLcCnGUxnW_Jk$IV+g?VvKWqNtMNs5Vyfq{WRdY*oWenDn|Zf0I_Nn%cp
zZh4|*X<!CO2#n)1^GZ^S@)C3OOG`3yiuKbnb5e^di%U{-^$IFW1Q-|?k~311vmuEh
zzdSFs2oz$)G9Z_+@H4V7u`%*93NZ;WGcyV>@-nhAaxsZ9$ueqy!XXG0@L)gZ7wdt;
zPYUGI%mO{Qt$JWv^^)^*3ldAfp&7)_z`y|ZGlCc(--F`CCO1E&G$+*#6x+q1*y3U2
IVG>{l06taFE&u=k

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py
new file mode 100644
index 00000000..5bea655e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py
@@ -0,0 +1,93 @@
+from __future__ import absolute_import
+
+import ctypes
+import re
+import warnings
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional, Tuple
+
+
+def glibc_version_string():
+    # type: () -> Optional[str]
+    "Returns glibc version string, or None if not using glibc."
+
+    # 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):
+    # 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()  # type: Optional[str]
+    if version_str is None:
+        return False
+    return check_glibc_version(version_str, required_major, minimum_minor)
+
+
+# platform.libc_ver regularly returns completely nonsensical glibc
+# versions. E.g. on my computer, platform says:
+#
+#   ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
+#   ('glibc', '2.7')
+#   ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
+#   ('glibc', '2.9')
+#
+# But the truth is:
+#
+#   ~$ ldd --version
+#   ldd (Debian GLIBC 2.22-11) 2.22
+#
+# This is unfortunate, because it means that the linehaul data on libc
+# versions that was generated by pip 8.1.2 and earlier is useless and
+# misleading. Solution: instead of using platform, use our code that actually
+# works.
+def libc_ver():
+    # type: () -> Tuple[str, str]
+    """Try to determine the glibc version
+
+    Returns a tuple of strings (lib, version) which default to empty strings
+    in case the lookup fails.
+    """
+    glibc_version = glibc_version_string()
+    if glibc_version is None:
+        return ("", "")
+    else:
+        return ("glibc", glibc_version)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dce3af22b04dc6f4fdc963eee209f4e17977910b
GIT binary patch
literal 2406
zcmZSn%*&NH<x)&C0~9bZFfcecFfbH%GcYiuFfgPrGUPBY<T5fuF)}cM_)H8rObk&>
zU^ym+9A<_nW*D1=A&LdeW@gA?Wyob?h+<=4Ol4yzN(PIvFyyc^<Z>`XaWLd^GDLAQ
zFy=8Zq_8ryFfc@MF{H488Qcsh>|h2DLkb6&!OM`s#1O2($-uyn338+cBLf3N2|oh^
zLt;{KeokpgYJ6sHL4Hw*A4Eoofq}s{G9WVE*~8V@J3c7X&(G7(T?6E?5)K9i2LFPR
z%>2B>oDx<B28NK*f}B*a=b0H87(gP<AkSxmtYBcsVg%XU%*as7z);D{P{Y8G#mrF4
z$Pk_<#K2O*!jR3yP-MWs$jAtCVMGZ7Ll!GT4I@K58;ERXV5ntcC}C%)VPYuZU}$Dy
zC{72lvp7M43Nn<5A&&th608BTyx5X~fgvchq_ilnSRp+pGbvf2EVZaOGe1wExTGjE
zFI`6=zevF^KQC1wGfg2czeJ(5I5RIDqErv;o5bSe%uGKGE|BZl7#J9mODYRei%VD-
z7#N&ge0;zRkO3tk3=9nEd8P5`sU`6so8qB1mGChzFgTW!6lErrmZZ8C73CL!!z?*I
zIU}(szMzDifq|hYwHRb>3CNnv;>^6_lEl2^)Do~CN{UKA7N?{p=clBCy;UN}z`#&Y
zl%JehTpXX5n44N$keHkr1d53gZUzPhsLk=kB}E$G=minQISdR8`UORqWr-!J`elhl
z`f2$&DXB%p`q_p0*~LcY=7xn?M&@OP7Usn{mFea2CMhN+1_lNO>3RAg`URN<x?pGJ
z<mi?sT9yW8fP}y}J~OW*wJ0w!N58ZrGpAS|9L{<Lm5>lY4hoQiGV{`T85kIfLBYkq
z!OzId$jivf%*xEe$jQXdD8!Tu@-rxOK{Pnwq=14Rl5iM7>7|*8p_ZAUhMA$*fT4s5
zlzdW{K;mL0ET9y@Si;H>T*3xYkj2iB!pzXj2tqZC4B1Q!`N<3jDHf1;Gb1RuWV12^
zYk-ofU$F`U1A~TrfK6^<R(_FPw1KW=thQ#19#|+d4<S@+%fP_kT2YXiT#}jsNip!m
zRi0Urp<twtoS$2epO>0fQmg<rO)nQ@fQ~|Xeu<TWYB4x{fh8a;kfa7U5<wZOC>0`_
zSdyFpPB7((MR}Qd>5#Ms;($|DP-$LCW^QUYL=vpUEitDUl6ErlO28uNMfs%#8lX@O
z5&(rJC`lHj7M5lfrKZF~TmXuc+|0bp+|t~5uro_QWkT*irXOKYcFRaj&W;BsDOiRA
zIjI=r0|pKuMm9!HMs7wHMrp=mP@sVl4al3|grf=aDgy(g(5L|yuh|?7MUtRY6I{X!
ziuW1@aIwP75DYHp{2*Zj%3eXBY#Ag8DnH~wDFS42kPL_`3nD<l2yzGmn4o{&5@ldu
z$Ve<pjR&Q%#FEUUoK#3Cfl9n$P$FVr;$-AuWMKrC#GtqYg%3Df)Dhvr0LnNi%nXol
zNnv3KhUBF*CWhb?P^f_NMDb)$sa{m6P?E2Zl3J2ll$)8Cs!)=Vikj-VxD*r=6kw%o
zqCyF%9#F_ngBG>L3K}_?Njk7RqNz}xk(r#Kkdm5~SejD;GCMW5prjI}8f;i*o<eeB
zF~qK%{QT_F0)@21%$#C9uxtsaSc9Z*P$}aFu8)EgLD2&uAY6D{f+M&Dl*}<w(?CTc
zD4IYn2c_&FP@xDCU|<Kw8<PeoiGwSI`1rKalG38o_;`>ah9FR!1cA!WATdx(N`Wea
z%mO`lIjjdRhxJM-3o`T4gFsOau0WuCP%;Ptr)F@_fD(6*0w~PD1s^C#!ATlS&_7*+
nLck_BKczG$)ehuxa6KWw#KXwL$ipPS#KtJe%qh(&$SDZ`f+av`

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py
new file mode 100644
index 00000000..a7142069
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py
@@ -0,0 +1,115 @@
+from __future__ import absolute_import
+
+import hashlib
+
+from pip._vendor.six import iteritems, iterkeys, itervalues
+
+from pip._internal.exceptions import (
+    HashMismatch, HashMissing, InstallationError,
+)
+from pip._internal.utils.misc import read_chunks
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Dict, List, BinaryIO, NoReturn, Iterator
+    )
+    from pip._vendor.six import PY3
+    if PY3:
+        from hashlib import _Hash
+    else:
+        from hashlib import _hash as _Hash
+
+
+# The recommended hash algo of the moment. Change this whenever the state of
+# the art changes; it won't hurt backward compatibility.
+FAVORITE_HASH = 'sha256'
+
+
+# Names of hashlib algorithms allowed by the --hash option and ``pip hash``
+# Currently, those are the ones at least as collision-resistant as sha256.
+STRONG_HASHES = ['sha256', 'sha384', 'sha512']
+
+
+class Hashes(object):
+    """A wrapper that builds multiple hashes at once and checks them against
+    known-good values
+
+    """
+    def __init__(self, hashes=None):
+        # type: (Dict[str, List[str]]) -> None
+        """
+        :param hashes: A dict of algorithm names pointing to lists of allowed
+            hex digests
+        """
+        self._allowed = {} if hashes is None else hashes
+
+    def check_against_chunks(self, chunks):
+        # type: (Iterator[bytes]) -> None
+        """Check good hashes against ones built from iterable of chunks of
+        data.
+
+        Raise HashMismatch if none match.
+
+        """
+        gots = {}
+        for hash_name in iterkeys(self._allowed):
+            try:
+                gots[hash_name] = hashlib.new(hash_name)
+            except (ValueError, TypeError):
+                raise InstallationError('Unknown hash name: %s' % hash_name)
+
+        for chunk in chunks:
+            for hash in itervalues(gots):
+                hash.update(chunk)
+
+        for hash_name, got in iteritems(gots):
+            if got.hexdigest() in self._allowed[hash_name]:
+                return
+        self._raise(gots)
+
+    def _raise(self, gots):
+        # type: (Dict[str, _Hash]) -> NoReturn
+        raise HashMismatch(self._allowed, gots)
+
+    def check_against_file(self, file):
+        # type: (BinaryIO) -> None
+        """Check good hashes against a file-like object
+
+        Raise HashMismatch if none match.
+
+        """
+        return self.check_against_chunks(read_chunks(file))
+
+    def check_against_path(self, path):
+        # type: (str) -> None
+        with open(path, 'rb') as file:
+            return self.check_against_file(file)
+
+    def __nonzero__(self):
+        # type: () -> bool
+        """Return whether I know any known-good hashes."""
+        return bool(self._allowed)
+
+    def __bool__(self):
+        # type: () -> bool
+        return self.__nonzero__()
+
+
+class MissingHashes(Hashes):
+    """A workalike for Hashes used when we're missing a hash for a requirement
+
+    It computes the actual hash of the requirement and raises a HashMissing
+    exception showing it to the user.
+
+    """
+    def __init__(self):
+        # type: () -> None
+        """Don't offer the ``hashes`` kwarg."""
+        # Pass our favorite hash in to generate a "gotten hash". With the
+        # empty list, it will never match, so an error will always raise.
+        super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []})
+
+    def _raise(self, gots):
+        # type: (Dict[str, _Hash]) -> NoReturn
+        raise HashMissing(gots[FAVORITE_HASH].hexdigest())
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..62ac3cf5873419df4cde3c316e4230aca56bdecc
GIT binary patch
literal 5026
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
ARR910

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py
new file mode 100644
index 00000000..a28e88ca
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py
@@ -0,0 +1,371 @@
+from __future__ import absolute_import
+
+import contextlib
+import errno
+import logging
+import logging.handlers
+import os
+import sys
+from logging import Filter
+
+from pip._vendor.six import PY2
+
+from pip._internal.utils.compat import WINDOWS
+from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX
+from pip._internal.utils.misc import ensure_dir, subprocess_logger
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading  # type: ignore
+
+
+try:
+    from pip._vendor import colorama
+# Lots of different errors can come from this, including SystemError and
+# ImportError.
+except Exception:
+    colorama = None
+
+
+_log_state = threading.local()
+_log_state.indentation = 0
+
+
+class BrokenStdoutLoggingError(Exception):
+    """
+    Raised if BrokenPipeError occurs for the stdout stream while logging.
+    """
+    pass
+
+
+# BrokenPipeError does not exist in Python 2 and, in addition, manifests
+# differently in Windows and non-Windows.
+if WINDOWS:
+    # In Windows, a broken pipe can show up as EINVAL rather than EPIPE:
+    # https://bugs.python.org/issue19612
+    # https://bugs.python.org/issue30418
+    if PY2:
+        def _is_broken_pipe_error(exc_class, exc):
+            """See the docstring for non-Windows Python 3 below."""
+            return (exc_class is IOError and
+                    exc.errno in (errno.EINVAL, errno.EPIPE))
+    else:
+        # In Windows, a broken pipe IOError became OSError in Python 3.
+        def _is_broken_pipe_error(exc_class, exc):
+            """See the docstring for non-Windows Python 3 below."""
+            return ((exc_class is BrokenPipeError) or  # noqa: F821
+                    (exc_class is OSError and
+                     exc.errno in (errno.EINVAL, errno.EPIPE)))
+elif PY2:
+    def _is_broken_pipe_error(exc_class, exc):
+        """See the docstring for non-Windows Python 3 below."""
+        return (exc_class is IOError and exc.errno == errno.EPIPE)
+else:
+    # Then we are in the non-Windows Python 3 case.
+    def _is_broken_pipe_error(exc_class, exc):
+        """
+        Return whether an exception is a broken pipe error.
+
+        Args:
+          exc_class: an exception class.
+          exc: an exception instance.
+        """
+        return (exc_class is BrokenPipeError)  # noqa: F821
+
+
+@contextlib.contextmanager
+def indent_log(num=2):
+    """
+    A context manager which will cause the log output to be indented for any
+    log messages emitted inside it.
+    """
+    _log_state.indentation += num
+    try:
+        yield
+    finally:
+        _log_state.indentation -= num
+
+
+def get_indentation():
+    return getattr(_log_state, 'indentation', 0)
+
+
+class IndentingFormatter(logging.Formatter):
+    def __init__(self, *args, **kwargs):
+        """
+        A logging.Formatter that obeys the indent_log() context manager.
+
+        :param add_timestamp: A bool indicating output lines should be prefixed
+            with their record's timestamp.
+        """
+        self.add_timestamp = kwargs.pop("add_timestamp", False)
+        super(IndentingFormatter, self).__init__(*args, **kwargs)
+
+    def get_message_start(self, formatted, levelno):
+        """
+        Return the start of the formatted log message (not counting the
+        prefix to add to each line).
+        """
+        if levelno < logging.WARNING:
+            return ''
+        if formatted.startswith(DEPRECATION_MSG_PREFIX):
+            # Then the message already has a prefix.  We don't want it to
+            # look like "WARNING: DEPRECATION: ...."
+            return ''
+        if levelno < logging.ERROR:
+            return 'WARNING: '
+
+        return 'ERROR: '
+
+    def format(self, record):
+        """
+        Calls the standard formatter, but will indent all of the log messages
+        by our current indentation level.
+        """
+        formatted = super(IndentingFormatter, self).format(record)
+        message_start = self.get_message_start(formatted, record.levelno)
+        formatted = message_start + formatted
+
+        prefix = ''
+        if self.add_timestamp:
+            prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ")
+        prefix += " " * get_indentation()
+        formatted = "".join([
+            prefix + line
+            for line in formatted.splitlines(True)
+        ])
+        return formatted
+
+
+def _color_wrap(*colors):
+    def wrapped(inp):
+        return "".join(list(colors) + [inp, colorama.Style.RESET_ALL])
+    return wrapped
+
+
+class ColorizedStreamHandler(logging.StreamHandler):
+
+    # Don't build up a list of colors if we don't have colorama
+    if colorama:
+        COLORS = [
+            # This needs to be in order from highest logging level to lowest.
+            (logging.ERROR, _color_wrap(colorama.Fore.RED)),
+            (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)),
+        ]
+    else:
+        COLORS = []
+
+    def __init__(self, stream=None, no_color=None):
+        logging.StreamHandler.__init__(self, stream)
+        self._no_color = no_color
+
+        if WINDOWS and colorama:
+            self.stream = colorama.AnsiToWin32(self.stream)
+
+    def _using_stdout(self):
+        """
+        Return whether the handler is using sys.stdout.
+        """
+        if WINDOWS and colorama:
+            # Then self.stream is an AnsiToWin32 object.
+            return self.stream.wrapped is sys.stdout
+
+        return self.stream is sys.stdout
+
+    def should_color(self):
+        # Don't colorize things if we do not have colorama or if told not to
+        if not colorama or self._no_color:
+            return False
+
+        real_stream = (
+            self.stream if not isinstance(self.stream, colorama.AnsiToWin32)
+            else self.stream.wrapped
+        )
+
+        # If the stream is a tty we should color it
+        if hasattr(real_stream, "isatty") and real_stream.isatty():
+            return True
+
+        # If we have an ANSI term we should color it
+        if os.environ.get("TERM") == "ANSI":
+            return True
+
+        # If anything else we should not color it
+        return False
+
+    def format(self, record):
+        msg = logging.StreamHandler.format(self, record)
+
+        if self.should_color():
+            for level, color in self.COLORS:
+                if record.levelno >= level:
+                    msg = color(msg)
+                    break
+
+        return msg
+
+    # The logging module says handleError() can be customized.
+    def handleError(self, record):
+        exc_class, exc = sys.exc_info()[:2]
+        # If a broken pipe occurred while calling write() or flush() on the
+        # stdout stream in logging's Handler.emit(), then raise our special
+        # exception so we can handle it in main() instead of logging the
+        # broken pipe error and continuing.
+        if (exc_class and self._using_stdout() and
+                _is_broken_pipe_error(exc_class, exc)):
+            raise BrokenStdoutLoggingError()
+
+        return super(ColorizedStreamHandler, self).handleError(record)
+
+
+class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler):
+
+    def _open(self):
+        ensure_dir(os.path.dirname(self.baseFilename))
+        return logging.handlers.RotatingFileHandler._open(self)
+
+
+class MaxLevelFilter(Filter):
+
+    def __init__(self, level):
+        self.level = level
+
+    def filter(self, record):
+        return record.levelno < self.level
+
+
+class ExcludeLoggerFilter(Filter):
+
+    """
+    A logging Filter that excludes records from a logger (or its children).
+    """
+
+    def filter(self, record):
+        # The base Filter class allows only records from a logger (or its
+        # children).
+        return not super(ExcludeLoggerFilter, self).filter(record)
+
+
+def setup_logging(verbosity, no_color, user_log_file):
+    """Configures and sets up all of the logging
+
+    Returns the requested logging level, as its integer value.
+    """
+
+    # Determine the level to be logging at.
+    if verbosity >= 1:
+        level = "DEBUG"
+    elif verbosity == -1:
+        level = "WARNING"
+    elif verbosity == -2:
+        level = "ERROR"
+    elif verbosity <= -3:
+        level = "CRITICAL"
+    else:
+        level = "INFO"
+
+    level_number = getattr(logging, level)
+
+    # The "root" logger should match the "console" level *unless* we also need
+    # to log to a user log file.
+    include_user_log = user_log_file is not None
+    if include_user_log:
+        additional_log_file = user_log_file
+        root_level = "DEBUG"
+    else:
+        additional_log_file = "/dev/null"
+        root_level = level
+
+    # Disable any logging besides WARNING unless we have DEBUG level logging
+    # enabled for vendored libraries.
+    vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG"
+
+    # Shorthands for clarity
+    log_streams = {
+        "stdout": "ext://sys.stdout",
+        "stderr": "ext://sys.stderr",
+    }
+    handler_classes = {
+        "stream": "pip._internal.utils.logging.ColorizedStreamHandler",
+        "file": "pip._internal.utils.logging.BetterRotatingFileHandler",
+    }
+    handlers = ["console", "console_errors", "console_subprocess"] + (
+        ["user_log"] if include_user_log else []
+    )
+
+    logging.config.dictConfig({
+        "version": 1,
+        "disable_existing_loggers": False,
+        "filters": {
+            "exclude_warnings": {
+                "()": "pip._internal.utils.logging.MaxLevelFilter",
+                "level": logging.WARNING,
+            },
+            "restrict_to_subprocess": {
+                "()": "logging.Filter",
+                "name": subprocess_logger.name,
+            },
+            "exclude_subprocess": {
+                "()": "pip._internal.utils.logging.ExcludeLoggerFilter",
+                "name": subprocess_logger.name,
+            },
+        },
+        "formatters": {
+            "indent": {
+                "()": IndentingFormatter,
+                "format": "%(message)s",
+            },
+            "indent_with_timestamp": {
+                "()": IndentingFormatter,
+                "format": "%(message)s",
+                "add_timestamp": True,
+            },
+        },
+        "handlers": {
+            "console": {
+                "level": level,
+                "class": handler_classes["stream"],
+                "no_color": no_color,
+                "stream": log_streams["stdout"],
+                "filters": ["exclude_subprocess", "exclude_warnings"],
+                "formatter": "indent",
+            },
+            "console_errors": {
+                "level": "WARNING",
+                "class": handler_classes["stream"],
+                "no_color": no_color,
+                "stream": log_streams["stderr"],
+                "filters": ["exclude_subprocess"],
+                "formatter": "indent",
+            },
+            # A handler responsible for logging to the console messages
+            # from the "subprocessor" logger.
+            "console_subprocess": {
+                "level": level,
+                "class": handler_classes["stream"],
+                "no_color": no_color,
+                "stream": log_streams["stderr"],
+                "filters": ["restrict_to_subprocess"],
+                "formatter": "indent",
+            },
+            "user_log": {
+                "level": "DEBUG",
+                "class": handler_classes["file"],
+                "filename": additional_log_file,
+                "delay": True,
+                "formatter": "indent_with_timestamp",
+            },
+        },
+        "root": {
+            "level": root_level,
+            "handlers": handlers,
+        },
+        "loggers": {
+            "pip._vendor": {
+                "level": vendored_log_level
+            }
+        },
+    })
+
+    return level_number
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cc3a2296d6157a2008d28b13871c44093b3a456d
GIT binary patch
literal 12627
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.py
new file mode 100644
index 00000000..ca7a5293
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.py
@@ -0,0 +1,1011 @@
+from __future__ import absolute_import
+
+import contextlib
+import errno
+import io
+# we have a submodule named 'logging' which would shadow this if we used the
+# regular name:
+import logging as std_logging
+import os
+import posixpath
+import re
+import shutil
+import stat
+import subprocess
+import sys
+import tarfile
+import zipfile
+from collections import deque
+
+from pip._vendor import pkg_resources
+# 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
+from pip._vendor.six.moves import input, shlex_quote
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote
+
+from pip._internal.exceptions import CommandError, InstallationError
+from pip._internal.locations import (
+    running_under_virtualenv, site_packages, user_site, virtualenv_no_global,
+    write_delete_marker_file,
+)
+from pip._internal.utils.compat import (
+    WINDOWS, console_to_str, expanduser, stdlib_pkgs,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if PY2:
+    from io import BytesIO as StringIO
+else:
+    from io import StringIO
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text,
+        AnyStr, Container
+    )
+    from pip._vendor.pkg_resources import Distribution
+    from pip._internal.models.link import Link
+    from pip._internal.utils.ui import SpinnerInterface
+
+
+__all__ = ['rmtree', 'display_path', 'backup_dir',
+           'ask', 'splitext',
+           'format_size', 'is_installable_dir',
+           'is_svn_page', 'file_contents',
+           'split_leading_dir', 'has_leading_dir',
+           'normalize_path',
+           'renames', 'get_prog',
+           'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess',
+           'captured_stdout', 'ensure_dir',
+           'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION',
+           'get_installed_version', 'remove_auth_from_url']
+
+
+logger = std_logging.getLogger(__name__)
+subprocess_logger = std_logging.getLogger('pip.subprocessor')
+
+LOG_DIVIDER = '----------------------------------------'
+
+WHEEL_EXTENSION = '.whl'
+BZ2_EXTENSIONS = ('.tar.bz2', '.tbz')
+XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma')
+ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION)
+TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar')
+ARCHIVE_EXTENSIONS = (
+    ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS)
+SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS
+
+try:
+    import bz2  # noqa
+    SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS
+except ImportError:
+    logger.debug('bz2 module is not available')
+
+try:
+    # Only for Python 3.3+
+    import lzma  # noqa
+    SUPPORTED_EXTENSIONS += XZ_EXTENSIONS
+except ImportError:
+    logger.debug('lzma module is not available')
+
+
+def ensure_dir(path):
+    # type: (AnyStr) -> None
+    """os.path.makedirs without EEXIST."""
+    try:
+        os.makedirs(path)
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+
+
+def get_prog():
+    # type: () -> str
+    try:
+        prog = os.path.basename(sys.argv[0])
+        if prog in ('__main__.py', '-c'):
+            return "%s -m pip" % sys.executable
+        else:
+            return prog
+    except (AttributeError, TypeError, IndexError):
+        pass
+    return 'pip'
+
+
+# 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
+    shutil.rmtree(dir, ignore_errors=ignore_errors,
+                  onerror=rmtree_errorhandler)
+
+
+def rmtree_errorhandler(func, path, exc_info):
+    """On Windows, the files in .svn are read-only, so when rmtree() tries to
+    remove them, an exception is thrown.  We catch that here, remove the
+    read-only attribute, and hopefully continue without problems."""
+    # if file type currently read only
+    if os.stat(path).st_mode & stat.S_IREAD:
+        # convert to read/write
+        os.chmod(path, stat.S_IWRITE)
+        # use the original function to repeat the operation
+        func(path)
+        return
+    else:
+        raise
+
+
+def display_path(path):
+    # type: (Union[str, Text]) -> str
+    """Gives the display value for a given path, making it relative to cwd
+    if possible."""
+    path = os.path.normcase(os.path.abspath(path))
+    if sys.version_info[0] == 2:
+        path = path.decode(sys.getfilesystemencoding(), 'replace')
+        path = path.encode(sys.getdefaultencoding(), 'replace')
+    if path.startswith(os.getcwd() + os.path.sep):
+        path = '.' + path[len(os.getcwd()):]
+    return path
+
+
+def backup_dir(dir, ext='.bak'):
+    # type: (str, str) -> str
+    """Figure out the name of a directory to back up the given dir to
+    (adding .bak, .bak2, etc)"""
+    n = 1
+    extension = ext
+    while os.path.exists(dir + extension):
+        n += 1
+        extension = ext + str(n)
+    return dir + extension
+
+
+def ask_path_exists(message, options):
+    # type: (str, Iterable[str]) -> str
+    for action in os.environ.get('PIP_EXISTS_ACTION', '').split():
+        if action in options:
+            return action
+    return ask(message, options)
+
+
+def ask(message, options):
+    # type: (str, Iterable[str]) -> str
+    """Ask the message interactively, with the given possible responses"""
+    while 1:
+        if os.environ.get('PIP_NO_INPUT'):
+            raise Exception(
+                'No input was expected ($PIP_NO_INPUT set); question: %s' %
+                message
+            )
+        response = input(message)
+        response = response.strip().lower()
+        if response not in options:
+            print(
+                'Your response (%r) was not one of the expected responses: '
+                '%s' % (response, ', '.join(options))
+            )
+        else:
+            return response
+
+
+def format_size(bytes):
+    # type: (float) -> str
+    if bytes > 1000 * 1000:
+        return '%.1fMB' % (bytes / 1000.0 / 1000)
+    elif bytes > 10 * 1000:
+        return '%ikB' % (bytes / 1000)
+    elif bytes > 1000:
+        return '%.1fkB' % (bytes / 1000.0)
+    else:
+        return '%ibytes' % bytes
+
+
+def is_installable_dir(path):
+    # type: (str) -> bool
+    """Is path is a directory containing setup.py or pyproject.toml?
+    """
+    if not os.path.isdir(path):
+        return False
+    setup_py = os.path.join(path, 'setup.py')
+    if os.path.isfile(setup_py):
+        return True
+    pyproject_toml = os.path.join(path, 'pyproject.toml')
+    if os.path.isfile(pyproject_toml):
+        return True
+    return False
+
+
+def is_svn_page(html):
+    # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]]
+    """
+    Returns true if the page appears to be the index page of an svn repository
+    """
+    return (re.search(r'<title>[^<]*Revision \d+:', html) and
+            re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I))
+
+
+def file_contents(filename):
+    # type: (str) -> Text
+    with open(filename, 'rb') as fp:
+        return fp.read().decode('utf-8')
+
+
+def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE):
+    """Yield pieces of data from a file-like object until EOF."""
+    while True:
+        chunk = file.read(size)
+        if not chunk:
+            break
+        yield chunk
+
+
+def split_leading_dir(path):
+    # type: (Union[str, Text]) -> List[Union[str, Text]]
+    path = path.lstrip('/').lstrip('\\')
+    if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or
+                        '\\' not in path):
+        return path.split('/', 1)
+    elif '\\' in path:
+        return path.split('\\', 1)
+    else:
+        return [path, '']
+
+
+def has_leading_dir(paths):
+    # type: (Iterable[Union[str, Text]]) -> bool
+    """Returns true if all the paths have the same leading path name
+    (i.e., everything is in one subdirectory in an archive)"""
+    common_prefix = None
+    for path in paths:
+        prefix, rest = split_leading_dir(path)
+        if not prefix:
+            return False
+        elif common_prefix is None:
+            common_prefix = prefix
+        elif prefix != common_prefix:
+            return False
+    return True
+
+
+def normalize_path(path, resolve_symlinks=True):
+    # type: (str, bool) -> str
+    """
+    Convert a path to its canonical, case-normalized, absolute version.
+
+    """
+    path = expanduser(path)
+    if resolve_symlinks:
+        path = os.path.realpath(path)
+    else:
+        path = os.path.abspath(path)
+    return os.path.normcase(path)
+
+
+def splitext(path):
+    # type: (str) -> Tuple[str, str]
+    """Like os.path.splitext, but take off .tar too"""
+    base, ext = posixpath.splitext(path)
+    if base.lower().endswith('.tar'):
+        ext = base[-4:] + ext
+        base = base[:-4]
+    return base, ext
+
+
+def renames(old, new):
+    # type: (str, str) -> None
+    """Like os.renames(), but handles renaming across devices."""
+    # Implementation borrowed from os.renames().
+    head, tail = os.path.split(new)
+    if head and tail and not os.path.exists(head):
+        os.makedirs(head)
+
+    shutil.move(old, new)
+
+    head, tail = os.path.split(old)
+    if head and tail:
+        try:
+            os.removedirs(head)
+        except OSError:
+            pass
+
+
+def is_local(path):
+    # type: (str) -> bool
+    """
+    Return True if path is within sys.prefix, if we're running in a virtualenv.
+
+    If we're not in a virtualenv, all paths are considered "local."
+
+    """
+    if not running_under_virtualenv():
+        return True
+    return normalize_path(path).startswith(normalize_path(sys.prefix))
+
+
+def dist_is_local(dist):
+    # type: (Distribution) -> bool
+    """
+    Return True if given Distribution object is installed locally
+    (i.e. within current virtualenv).
+
+    Always True if we're not in a virtualenv.
+
+    """
+    return is_local(dist_location(dist))
+
+
+def dist_in_usersite(dist):
+    # type: (Distribution) -> bool
+    """
+    Return True if given Distribution is installed in user site.
+    """
+    norm_path = normalize_path(dist_location(dist))
+    return norm_path.startswith(normalize_path(user_site))
+
+
+def dist_in_site_packages(dist):
+    # type: (Distribution) -> bool
+    """
+    Return True if given Distribution is installed in
+    sysconfig.get_python_lib().
+    """
+    return normalize_path(
+        dist_location(dist)
+    ).startswith(normalize_path(site_packages))
+
+
+def dist_is_editable(dist):
+    # type: (Distribution) -> bool
+    """
+    Return True if given Distribution is an editable install.
+    """
+    for path_item in sys.path:
+        egg_link = os.path.join(path_item, dist.project_name + '.egg-link')
+        if os.path.isfile(egg_link):
+            return True
+    return False
+
+
+def get_installed_distributions(local_only=True,
+                                skip=stdlib_pkgs,
+                                include_editables=True,
+                                editables_only=False,
+                                user_only=False):
+    # type: (bool, Container[str], bool, bool, bool) -> List[Distribution]
+    """
+    Return a list of installed Distribution objects.
+
+    If ``local_only`` is True (default), only return installations
+    local to the current virtualenv, if in a virtualenv.
+
+    ``skip`` argument is an iterable of lower-case project names to
+    ignore; defaults to stdlib_pkgs
+
+    If ``include_editables`` is False, don't report editables.
+
+    If ``editables_only`` is True , only report editables.
+
+    If ``user_only`` is True , only report installations in the user
+    site directory.
+
+    """
+    if local_only:
+        local_test = dist_is_local
+    else:
+        def local_test(d):
+            return True
+
+    if include_editables:
+        def editable_test(d):
+            return True
+    else:
+        def editable_test(d):
+            return not dist_is_editable(d)
+
+    if editables_only:
+        def editables_only_test(d):
+            return dist_is_editable(d)
+    else:
+        def editables_only_test(d):
+            return True
+
+    if user_only:
+        user_test = dist_in_usersite
+    else:
+        def user_test(d):
+            return True
+
+    # because of pkg_resources vendoring, mypy cannot find stub in typeshed
+    return [d for d in pkg_resources.working_set  # type: ignore
+            if local_test(d) and
+            d.key not in skip and
+            editable_test(d) and
+            editables_only_test(d) and
+            user_test(d)
+            ]
+
+
+def egg_link_path(dist):
+    # type: (Distribution) -> Optional[str]
+    """
+    Return the path for the .egg-link file if it exists, otherwise, None.
+
+    There's 3 scenarios:
+    1) not in a virtualenv
+       try to find in site.USER_SITE, then site_packages
+    2) in a no-global virtualenv
+       try to find in site_packages
+    3) in a yes-global virtualenv
+       try to find in site_packages, then site.USER_SITE
+       (don't look in global location)
+
+    For #1 and #3, there could be odd cases, where there's an egg-link in 2
+    locations.
+
+    This method will just return the first one found.
+    """
+    sites = []
+    if running_under_virtualenv():
+        if virtualenv_no_global():
+            sites.append(site_packages)
+        else:
+            sites.append(site_packages)
+            if user_site:
+                sites.append(user_site)
+    else:
+        if user_site:
+            sites.append(user_site)
+        sites.append(site_packages)
+
+    for site in sites:
+        egglink = os.path.join(site, dist.project_name) + '.egg-link'
+        if os.path.isfile(egglink):
+            return egglink
+    return None
+
+
+def dist_location(dist):
+    # type: (Distribution) -> str
+    """
+    Get the site-packages location of this distribution. Generally
+    this is dist.location, except in the case of develop-installed
+    packages, where dist.location is the source code location, and we
+    want to know where the egg-link file is.
+
+    """
+    egg_link = egg_link_path(dist)
+    if egg_link:
+        return egg_link
+    return dist.location
+
+
+def current_umask():
+    """Get the current umask which involves having to set it temporarily."""
+    mask = os.umask(0)
+    os.umask(mask)
+    return mask
+
+
+def unzip_file(filename, location, flatten=True):
+    # type: (str, str, bool) -> None
+    """
+    Unzip the file (with path `filename`) to the destination `location`.  All
+    files are written based on system defaults and umask (i.e. permissions are
+    not preserved), except that regular file members with any execute
+    permissions (user, group, or world) have "chmod +x" applied after being
+    written. Note that for windows, any execute changes using os.chmod are
+    no-ops per the python docs.
+    """
+    ensure_dir(location)
+    zipfp = open(filename, 'rb')
+    try:
+        zip = zipfile.ZipFile(zipfp, allowZip64=True)
+        leading = has_leading_dir(zip.namelist()) and flatten
+        for info in zip.infolist():
+            name = info.filename
+            fn = name
+            if leading:
+                fn = split_leading_dir(name)[1]
+            fn = os.path.join(location, fn)
+            dir = os.path.dirname(fn)
+            if fn.endswith('/') or fn.endswith('\\'):
+                # A directory
+                ensure_dir(fn)
+            else:
+                ensure_dir(dir)
+                # Don't use read() to avoid allocating an arbitrarily large
+                # chunk of memory for the file's content
+                fp = zip.open(name)
+                try:
+                    with open(fn, 'wb') as destfp:
+                        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))
+    finally:
+        zipfp.close()
+
+
+def untar_file(filename, location):
+    # type: (str, str) -> None
+    """
+    Untar the file (with path `filename`) to the destination `location`.
+    All files are written based on system defaults and umask (i.e. permissions
+    are not preserved), except that regular file members with any execute
+    permissions (user, group, or world) have "chmod +x" applied after being
+    written.  Note that for windows, any execute changes using os.chmod are
+    no-ops per the python docs.
+    """
+    ensure_dir(location)
+    if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'):
+        mode = 'r:gz'
+    elif filename.lower().endswith(BZ2_EXTENSIONS):
+        mode = 'r:bz2'
+    elif filename.lower().endswith(XZ_EXTENSIONS):
+        mode = 'r:xz'
+    elif filename.lower().endswith('.tar'):
+        mode = 'r'
+    else:
+        logger.warning(
+            'Cannot determine compression type for file %s', filename,
+        )
+        mode = 'r:*'
+    tar = tarfile.open(filename, mode)
+    try:
+        leading = has_leading_dir([
+            member.name for member in tar.getmembers()
+        ])
+        for member in tar.getmembers():
+            fn = member.name
+            if leading:
+                # https://github.com/python/mypy/issues/1174
+                fn = split_leading_dir(fn)[1]  # type: ignore
+            path = os.path.join(location, fn)
+            if member.isdir():
+                ensure_dir(path)
+            elif member.issym():
+                try:
+                    # https://github.com/python/typeshed/issues/2673
+                    tar._extract_member(member, path)  # type: ignore
+                except Exception as exc:
+                    # Some corrupt tar files seem to produce this
+                    # (specifically bad symlinks)
+                    logger.warning(
+                        'In the tar file %s the member %s is invalid: %s',
+                        filename, member.name, exc,
+                    )
+                    continue
+            else:
+                try:
+                    fp = tar.extractfile(member)
+                except (KeyError, AttributeError) as exc:
+                    # Some corrupt tar files seem to produce this
+                    # (specifically bad symlinks)
+                    logger.warning(
+                        'In the tar file %s the member %s is invalid: %s',
+                        filename, member.name, exc,
+                    )
+                    continue
+                ensure_dir(os.path.dirname(path))
+                with open(path, 'wb') as destfp:
+                    shutil.copyfileobj(fp, destfp)
+                fp.close()
+                # Update the timestamp (useful for cython compiled files)
+                # https://github.com/python/typeshed/issues/2673
+                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))
+    finally:
+        tar.close()
+
+
+def unpack_file(
+    filename,  # type: str
+    location,  # type: str
+    content_type,  # type: Optional[str]
+    link  # type: Optional[Link]
+):
+    # type: (...) -> None
+    filename = os.path.realpath(filename)
+    if (content_type == 'application/zip' or
+            filename.lower().endswith(ZIP_EXTENSIONS) or
+            zipfile.is_zipfile(filename)):
+        unzip_file(
+            filename,
+            location,
+            flatten=not filename.endswith('.whl')
+        )
+    elif (content_type == 'application/x-gzip' or
+            tarfile.is_tarfile(filename) or
+            filename.lower().endswith(
+                TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)):
+        untar_file(filename, location)
+    elif (content_type and content_type.startswith('text/html') and
+            is_svn_page(file_contents(filename))):
+        # We don't really care about this
+        from pip._internal.vcs.subversion import Subversion
+        Subversion('svn+' + link.url).unpack(location)
+    else:
+        # FIXME: handle?
+        # FIXME: magic signatures?
+        logger.critical(
+            'Cannot unpack file %s (downloaded from %s, content-type: %s); '
+            'cannot detect archive format',
+            filename, location, content_type,
+        )
+        raise InstallationError(
+            'Cannot determine archive format of %s' % location
+        )
+
+
+def format_command_args(args):
+    # type: (List[str]) -> str
+    """
+    Format command arguments for display.
+    """
+    return ' '.join(shlex_quote(arg) for arg in args)
+
+
+def call_subprocess(
+    cmd,  # type: List[str]
+    show_stdout=False,  # 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]]
+    unset_environ=None,  # type: Optional[Iterable[str]]
+    spinner=None  # type: Optional[SpinnerInterface]
+):
+    # type: (...) -> Optional[Text]
+    """
+    Args:
+      show_stdout: if true, use INFO to log the subprocess's stderr and
+        stdout streams.  Otherwise, use DEBUG.  Defaults to False.
+      extra_ok_returncodes: an iterable of integer return codes that are
+        acceptable, in addition to 0. Defaults to None, which means [].
+      unset_environ: an iterable of environment variable names to unset
+        prior to calling subprocess.Popen().
+    """
+    if extra_ok_returncodes is None:
+        extra_ok_returncodes = []
+    if unset_environ is None:
+        unset_environ = []
+    # Most places in pip use show_stdout=False. What this means is--
+    #
+    # - We connect the child's output (combined stderr and stdout) to a
+    #   single pipe, which we read.
+    # - We log this output to stderr at DEBUG level as it is received.
+    # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't
+    #   requested), then we show a spinner so the user can still see the
+    #   subprocess is in progress.
+    # - If the subprocess exits with an error, we log the output to stderr
+    #   at ERROR level if it hasn't already been displayed to the console
+    #   (e.g. if --verbose logging wasn't enabled).  This way we don't log
+    #   the output to the console twice.
+    #
+    # If show_stdout=True, then the above is still done, but with DEBUG
+    # replaced by INFO.
+    if show_stdout:
+        # Then log the subprocess output at INFO level.
+        log_subprocess = subprocess_logger.info
+        used_level = std_logging.INFO
+    else:
+        # Then log the subprocess output using DEBUG.  This also ensures
+        # it will be logged to the log file (aka user_log), if enabled.
+        log_subprocess = subprocess_logger.debug
+        used_level = std_logging.DEBUG
+
+    # Whether the subprocess will be visible in the console.
+    showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level
+
+    # Only use the spinner if we're not showing the subprocess output
+    # and we have a spinner.
+    use_spinner = not showing_subprocess and spinner is not None
+
+    if command_desc is None:
+        command_desc = format_command_args(cmd)
+
+    log_subprocess("Running command %s", command_desc)
+    env = os.environ.copy()
+    if extra_environ:
+        env.update(extra_environ)
+    for name in unset_environ:
+        env.pop(name, None)
+    try:
+        proc = subprocess.Popen(
+            cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE, cwd=cwd, env=env,
+        )
+        proc.stdin.close()
+    except Exception as exc:
+        subprocess_logger.critical(
+            "Error %s while executing command %s", exc, command_desc,
+        )
+        raise
+    all_output = []
+    while True:
+        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)
+        # Update the spinner.
+        if use_spinner:
+            spinner.spin()
+    try:
+        proc.wait()
+    finally:
+        if proc.stdout:
+            proc.stdout.close()
+    proc_had_error = (
+        proc.returncode and proc.returncode not in extra_ok_returncodes
+    )
+    if use_spinner:
+        if proc_had_error:
+            spinner.finish("error")
+        else:
+            spinner.finish("done")
+    if proc_had_error:
+        if on_returncode == 'raise':
+            if not showing_subprocess:
+                # Then the subprocess streams haven't been logged to the
+                # console yet.
+                subprocess_logger.error(
+                    'Complete output from command %s:', command_desc,
+                )
+                # The all_output value already ends in a newline.
+                subprocess_logger.error(''.join(all_output) + LOG_DIVIDER)
+            raise InstallationError(
+                'Command "%s" failed with error code %s in %s'
+                % (command_desc, proc.returncode, cwd))
+        elif on_returncode == 'warn':
+            subprocess_logger.warning(
+                'Command "%s" had error code %s in %s',
+                command_desc, proc.returncode, cwd,
+            )
+        elif on_returncode == 'ignore':
+            pass
+        else:
+            raise ValueError('Invalid value: on_returncode=%s' %
+                             repr(on_returncode))
+    return ''.join(all_output)
+
+
+def _make_build_dir(build_dir):
+    os.makedirs(build_dir)
+    write_delete_marker_file(build_dir)
+
+
+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)
+
+    def readline(self):
+        try:
+            try:
+                return next(self._gen)
+            except NameError:
+                return self._gen.next()
+        except StopIteration:
+            return ''
+
+    def __iter__(self):
+        return self._gen
+
+
+class StreamWrapper(StringIO):
+
+    @classmethod
+    def from_stream(cls, orig_stream):
+        cls.orig_stream = orig_stream
+        return cls()
+
+    # compileall.compile_dir() needs stdout.encoding to print to stdout
+    @property
+    def encoding(self):
+        return self.orig_stream.encoding
+
+
+@contextlib.contextmanager
+def captured_output(stream_name):
+    """Return a context manager used by captured_stdout/stdin/stderr
+    that temporarily replaces the sys stream *stream_name* with a StringIO.
+
+    Taken from Lib/support/__init__.py in the CPython repo.
+    """
+    orig_stdout = getattr(sys, stream_name)
+    setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout))
+    try:
+        yield getattr(sys, stream_name)
+    finally:
+        setattr(sys, stream_name, orig_stdout)
+
+
+def captured_stdout():
+    """Capture the output of sys.stdout:
+
+       with captured_stdout() as stdout:
+           print('hello')
+       self.assertEqual(stdout.getvalue(), 'hello\n')
+
+    Taken from Lib/support/__init__.py in the CPython repo.
+    """
+    return captured_output('stdout')
+
+
+def captured_stderr():
+    """
+    See captured_stdout().
+    """
+    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.
+    req = pkg_resources.Requirement.parse(dist_name)
+
+    if working_set is None:
+        # We want to avoid having this cached, so we need to construct a new
+        # working set each time.
+        working_set = pkg_resources.WorkingSet()
+
+    # Get the installed distribution from our working set
+    dist = working_set.find(req)
+
+    # Check to see if we got an installed distribution or not, if we did
+    # we want to return it's version.
+    return dist.version if dist else None
+
+
+def consume(iterator):
+    """Consume an iterable at C speed."""
+    deque(iterator, maxlen=0)
+
+
+# Simulates an enum
+def enum(*sequential, **named):
+    enums = dict(zip(sequential, range(len(sequential))), **named)
+    reverse = {value: key for key, value in enums.items()}
+    enums['reverse_mapping'] = reverse
+    return type('Enum', (), enums)
+
+
+def split_auth_from_netloc(netloc):
+    """
+    Parse out and remove the auth information from a netloc.
+
+    Returns: (netloc, (username, password)).
+    """
+    if '@' not in netloc:
+        return netloc, (None, None)
+
+    # Split from the right because that's how urllib.parse.urlsplit()
+    # behaves if more than one @ is present (which can be checked using
+    # the password attribute of urlsplit()'s return value).
+    auth, netloc = netloc.rsplit('@', 1)
+    if ':' in auth:
+        # Split from the left because that's how urllib.parse.urlsplit()
+        # behaves if more than one : is present (which again can be checked
+        # using the password attribute of the return value)
+        user_pass = auth.split(':', 1)
+    else:
+        user_pass = auth, None
+
+    user_pass = tuple(
+        None if x is None else urllib_unquote(x) for x in user_pass
+    )
+
+    return netloc, user_pass
+
+
+def redact_netloc(netloc):
+    # type: (str) -> str
+    """
+    Replace the password in a netloc with "****", if it exists.
+
+    For example, "user:pass@example.com" returns "user:****@example.com".
+    """
+    netloc, (user, password) = split_auth_from_netloc(netloc)
+    if user is None:
+        return netloc
+    password = '' if password is None else ':****'
+    return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user),
+                                              password=password,
+                                              netloc=netloc)
+
+
+def _transform_url(url, transform_netloc):
+    purl = urllib_parse.urlsplit(url)
+    netloc = transform_netloc(purl.netloc)
+    # stripped url
+    url_pieces = (
+        purl.scheme, netloc, purl.path, purl.query, purl.fragment
+    )
+    surl = urllib_parse.urlunsplit(url_pieces)
+    return surl
+
+
+def _get_netloc(netloc):
+    return split_auth_from_netloc(netloc)[0]
+
+
+def remove_auth_from_url(url):
+    # type: (str) -> str
+    # Return a copy of url with 'username:password@' removed.
+    # username/pass params are passed to subversion through flags
+    # and are not recognized in the url.
+    return _transform_url(url, _get_netloc)
+
+
+def redact_password_from_url(url):
+    # type: (str) -> str
+    """Replace the password in a given url with ****."""
+    return _transform_url(url, redact_netloc)
+
+
+def protect_pip_from_modification_on_windows(modifying_pip):
+    """Protection of pip.exe from modification on Windows
+
+    On Windows, any operation modifying pip should be run as:
+        python -m pip ...
+    """
+    pip_names = [
+        "pip.exe",
+        "pip{}.exe".format(sys.version_info[0]),
+        "pip{}.{}.exe".format(*sys.version_info[:2])
+    ]
+
+    # See https://github.com/pypa/pip/issues/1299 for more discussion
+    should_show_use_python_msg = (
+        modifying_pip and
+        WINDOWS and
+        os.path.basename(sys.argv[0]) in pip_names
+    )
+
+    if should_show_use_python_msg:
+        new_command = [
+            sys.executable, "-m", "pip"
+        ] + sys.argv[1:]
+        raise CommandError(
+            'To modify pip, please run the following command:\n{}'
+            .format(" ".join(new_command))
+        )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9577419705368ea653e9d48116d380242b666574
GIT binary patch
literal 34905
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py
new file mode 100644
index 00000000..d5cb80a7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py
@@ -0,0 +1,40 @@
+"""Utilities for defining models
+"""
+
+import operator
+
+
+class KeyBasedCompareMixin(object):
+    """Provides comparision capabilities that is based on a key
+    """
+
+    def __init__(self, key, defining_class):
+        self._compare_key = key
+        self._defining_class = defining_class
+
+    def __hash__(self):
+        return hash(self._compare_key)
+
+    def __lt__(self, other):
+        return self._compare(other, operator.__lt__)
+
+    def __le__(self, other):
+        return self._compare(other, operator.__le__)
+
+    def __gt__(self, other):
+        return self._compare(other, operator.__gt__)
+
+    def __ge__(self, other):
+        return self._compare(other, operator.__ge__)
+
+    def __eq__(self, other):
+        return self._compare(other, operator.__eq__)
+
+    def __ne__(self, other):
+        return self._compare(other, operator.__ne__)
+
+    def _compare(self, other, method):
+        if not isinstance(other, self._defining_class):
+            return NotImplemented
+
+        return method(self._compare_key, other._compare_key)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..71f1413016ef84429288a82d3d3bebcbda1b7dd7
GIT binary patch
literal 2950
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJBFfcHrFfc?hFr+Xtq%bk$Ffv3jGNdpwq%tw2
zF*2mEFtji*G&3+nMlpk=gEd$|y5txb7(z=jb23XZQ;QYS@{1HwQqwZ?GV{_Ea`RJC
zbBeh#|NsC0->*c3fq}t0wbCiEI5ovNKer&UDAhN!A~O%}5Jm<D1}Bh_@eB+MsSIGt
z85p9NK+b7lV1U>PVz7W51!Ay59TmmKkirUbT@*V*3LBWg!H~iZW^gj3aDW+H3@Myo
z1~)@cum%^%B3lLqhJd2{vdom!VufU|n=*?t^Yavv6AKcPV16peNGwsvELKPYxm+PX
zPa#nuJGGKaK|w(w85DRR%*4RJ;LO0lP%Os4z)-`;P{Y6w&%jW_1ZFUTf;CtJ<Uc<R
zkjfGs1_p+Bh=r-~*{PK!{2&2Xz{Mx$Bo-HIfXppn0U4T_lU4%afmHH=VhI|;P=%m~
z)Bq91xeN>p`UORqWr-!J`elhl`f2$&DXB%p`q_p0*~LcY=7xn?M&@OP7Usn{mFea2
zCMhN+1_lNO>3RAg`URN<x|w;!C5bsXy5)(MrGXhBAux{5%qvMP%1g}AFD=Q;Db|O?
ztX@H72?xmG@tJv<CGqjxAh&`X%)rRWm<;kR2!lKf4jNtt28I#_P>5tPGBh(Xpo9oW
zTSj7WMi58~IH-a^J_dUWObnRcK(3092SrdZ$SVwt$sh`ZK@J4_Oc)gD3=CP|s4rn;
z$YNq>W`g?<qzn>H&=?1E@(WUn5=-)nO4z_5m{SrT4^A6kZ<m0wR(?rFY7yA)V1oVu
z5Cn=)AyA}(d`q6kgE$!&7=pM!Q4jTKDzZm|Ksf>IJuoo<egvgTQ7Zc}9VIdc-jAR%
zLxS3V9Axnb%AnFz_G4<{;7Y3k3=9mQ`j&!%2qQn{4YGI?WME)WM2bgH=?TN&!d4Sh
zmVisz8U_YXO~M4KbxW8Sf+5vy7Bi><&SFL`f<d)Q38)atEC$zbdC93kpfarllr#MD
zOFVN6a#C|s^GZ@vAQceEMsP_C&b;6<Iybc>BR>UPOo533D62qasR}4;Kt(A7qYxtt
zlLn{&1y?BX@p*~4sqyh(f5yk>=BJeAfVk}7`XwblIX*rJq%R0mWrK_MAW+#C1PX#6
zQ0@r=C9fb*_=6J(*pmoi0K5xo(tuoF3~D;EF|jdmvT!mZLk&>828pB8F!@PYsmUcl
eAiW63gIV<V0XSZ4ATePFN^iv=2eUEpFarQfOr$*k

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py
new file mode 100644
index 00000000..3b58cd5e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.py
@@ -0,0 +1,162 @@
+from __future__ import absolute_import
+
+import datetime
+import json
+import logging
+import os.path
+import sys
+
+from pip._vendor import lockfile, pkg_resources
+from pip._vendor.packaging import version as packaging_version
+
+from pip._internal.index import PackageFinder
+from pip._internal.utils.compat import WINDOWS
+from pip._internal.utils.filesystem import check_path_owner
+from pip._internal.utils.misc import ensure_dir, get_installed_version
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    import optparse
+    from typing import Any, Dict
+    from pip._internal.download import PipSession
+
+
+SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ"
+
+
+logger = logging.getLogger(__name__)
+
+
+class SelfCheckState(object):
+    def __init__(self, cache_dir):
+        # type: (str) -> None
+        self.state = {}  # type: Dict[str, Any]
+        self.statefile_path = None
+
+        # Try to load the existing state
+        if cache_dir:
+            self.statefile_path = os.path.join(cache_dir, "selfcheck.json")
+            try:
+                with open(self.statefile_path) as statefile:
+                    self.state = json.load(statefile)[sys.prefix]
+            except (IOError, ValueError, KeyError):
+                # Explicitly suppressing exceptions, since we don't want to
+                # error out if the cache file is invalid.
+                pass
+
+    def save(self, pypi_version, current_time):
+        # type: (str, datetime.datetime) -> None
+        # If we do not have a path to cache in, don't bother saving.
+        if not self.statefile_path:
+            return
+
+        # Check to make sure that we own the directory
+        if not check_path_owner(os.path.dirname(self.statefile_path)):
+            return
+
+        # Now that we've ensured the directory is owned by this user, we'll go
+        # ahead and make sure that all our directories are created.
+        ensure_dir(os.path.dirname(self.statefile_path))
+
+        # Attempt to write out our version check file
+        with lockfile.LockFile(self.statefile_path):
+            if os.path.exists(self.statefile_path):
+                with open(self.statefile_path) as statefile:
+                    state = json.load(statefile)
+            else:
+                state = {}
+
+            state[sys.prefix] = {
+                "last_check": current_time.strftime(SELFCHECK_DATE_FMT),
+                "pypi_version": pypi_version,
+            }
+
+            with open(self.statefile_path, "w") as statefile:
+                json.dump(state, statefile, sort_keys=True,
+                          separators=(",", ":"))
+
+
+def was_installed_by_pip(pkg):
+    # type: (str) -> bool
+    """Checks whether pkg was installed by pip
+
+    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 (dist.has_metadata('INSTALLER') and
+                'pip' in dist.get_metadata_lines('INSTALLER'))
+    except pkg_resources.DistributionNotFound:
+        return False
+
+
+def pip_version_check(session, options):
+    # type: (PipSession, optparse.Values) -> None
+    """Check for an update for pip.
+
+    Limit the frequency of checks to once per week. State is stored either in
+    the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
+    of the pip script path.
+    """
+    installed_version = get_installed_version("pip")
+    if not installed_version:
+        return
+
+    pip_version = packaging_version.parse(installed_version)
+    pypi_version = None
+
+    try:
+        state = SelfCheckState(cache_dir=options.cache_dir)
+
+        current_time = datetime.datetime.utcnow()
+        # Determine if we need to refresh the state
+        if "last_check" in state.state and "pypi_version" in state.state:
+            last_check = datetime.datetime.strptime(
+                state.state["last_check"],
+                SELFCHECK_DATE_FMT
+            )
+            if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60:
+                pypi_version = state.state["pypi_version"]
+
+        # 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
+            finder = PackageFinder(
+                find_links=options.find_links,
+                index_urls=[options.index_url] + options.extra_index_urls,
+                allow_all_prereleases=False,  # Explicitly set to False
+                trusted_hosts=options.trusted_hosts,
+                session=session,
+            )
+            candidate = finder.find_candidates("pip").get_best()
+            if candidate is None:
+                return
+            pypi_version = str(candidate.version)
+
+            # save that we've performed a check
+            state.save(pypi_version, current_time)
+
+        remote_version = packaging_version.parse(pypi_version)
+
+        # Determine if our pypi_version is older
+        if (pip_version < remote_version and
+                pip_version.base_version != remote_version.base_version and
+                was_installed_by_pip('pip')):
+            # Advise "python -m pip" on Windows to avoid issues
+            # with overwriting pip.exe.
+            if WINDOWS:
+                pip_cmd = "python -m pip"
+            else:
+                pip_cmd = "pip"
+            logger.warning(
+                "You are using pip version %s, however version %s is "
+                "available.\nYou should consider upgrading via the "
+                "'%s install --upgrade pip' command.",
+                pip_version, pypi_version, pip_cmd
+            )
+    except Exception:
+        logger.debug(
+            "There was an error checking the latest version of pip",
+            exc_info=True,
+        )
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/outdated.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3be91d1fd9234f4529a3fb96d5560efdb5b1d8ad
GIT binary patch
literal 5214
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py
new file mode 100644
index 00000000..449f3fd6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py
@@ -0,0 +1,85 @@
+from __future__ import absolute_import
+
+import logging
+import sys
+from email.parser import FeedParser
+
+from pip._vendor import pkg_resources
+from pip._vendor.packaging import specifiers, version
+
+from pip._internal import exceptions
+from pip._internal.utils.misc import display_path
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional
+    from email.message import Message
+    from pip._vendor.pkg_resources import Distribution
+
+
+logger = logging.getLogger(__name__)
+
+
+def check_requires_python(requires_python):
+    # type: (Optional[str]) -> bool
+    """
+    Check if the python version in use match the `requires_python` specifier.
+
+    Returns `True` if the version of python in use matches the requirement.
+    Returns `False` if the version of python in use does not matches the
+    requirement.
+
+    Raises an InvalidSpecifier if `requires_python` have an invalid format.
+    """
+    if requires_python is None:
+        # The package provides no information
+        return True
+    requires_python_specifier = specifiers.SpecifierSet(requires_python)
+
+    # We only use major.minor.micro
+    python_version = version.parse('.'.join(map(str, sys.version_info[:3])))
+    return python_version in requires_python_specifier
+
+
+def get_metadata(dist):
+    # type: (Distribution) -> Message
+    if (isinstance(dist, pkg_resources.DistInfoDistribution) and
+            dist.has_metadata('METADATA')):
+        metadata = dist.get_metadata('METADATA')
+    elif dist.has_metadata('PKG-INFO'):
+        metadata = dist.get_metadata('PKG-INFO')
+    else:
+        logger.warning("No metadata found in %s", display_path(dist.location))
+        metadata = ''
+
+    feed_parser = FeedParser()
+    feed_parser.feed(metadata)
+    return feed_parser.close()
+
+
+def check_dist_requires_python(dist):
+    pkg_info_dict = get_metadata(dist)
+    requires_python = pkg_info_dict.get('Requires-Python')
+    try:
+        if not check_requires_python(requires_python):
+            raise exceptions.UnsupportedPythonVersion(
+                "%s requires Python '%s' but the running Python is %s" % (
+                    dist.project_name,
+                    requires_python,
+                    '.'.join(map(str, sys.version_info[:3])),)
+            )
+    except specifiers.InvalidSpecifier as e:
+        logger.warning(
+            "Package %s has an invalid Requires-Python entry %s - %s",
+            dist.project_name, requires_python, e,
+        )
+        return
+
+
+def get_installer(dist):
+    # type: (Distribution) -> str
+    if dist.has_metadata('INSTALLER'):
+        for line in dist.get_metadata_lines('INSTALLER'):
+            if line.strip():
+                return line.strip()
+    return ''
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..59b5fbf0c36f619998ebe80d3c6dd5c91580ab53
GIT binary patch
literal 3489
zcmZSn%*&NH<x)&C0~9bZFfcecFfbJVV_;xNVPHsMWXNG)$Yo@RVq{<h@tGKMm>8m%
zz;a9sIm`@E%wRS%Lk<f=E-OP6D?}X&Lk=55E;~aMJA}{5ki)@{%gGSM$&ky%5XA)%
zWn;+UX2|7Xh~k0p*%@+p8FKj;qWB<u4u%|lhFk%LC;<k>Q~`#f<6yfu8FB;}a)lV8
zgdnQ87;=Oeazz-TL?C=_h8$6bTrq|yF$Tsw28L87hAeT0R0)P=MusR!h7=x#76yhW
zDTWkYFhiOlg%8Y-VMyTzGh`W3m>7aJ1Q-|?GC|>@!N|bCP{Pl^z>t_!oS#!#k{X|x
zTaaH=;s=r8Vqjo!OHEA)NGvK&ErN*gGB7X{WT(d$r55Lx7A2<^Yk-2b1f;aMAT>EN
zEi<*KxP+a7fuSt5s5mn}526hupIVWeT2PXipH~bK;{ioQW^qAIVr6_mVo3%>REU9r
z!8bA>GTzz4)!92fDAdo-)6X3u$HBnB;14z;F$W?7vdA~JxHvIA6(RsK)FrdHq$o3~
z6l7O2$dAkn3=C`x3=Gbo6cEV3z)-`$kiyK6&B0J4z)-@-5M08<ki`rVZDwSsWn?H}
zVaQ?yrI9Q)h7xv$5)OtEPKGQlQ1B@<Gl9Yzq>hQ9hKZquks+InAy|Wjfq|jeosofo
zOF=<F!8s!}Ia?t!O`#+sRiU7=BqKjh0U90(nRyDO#i<Ipi6zMyVEKfi)WXutqSWGe
zh{^;7cu4ATfsG4FEh#O^D^^GdDJo4(fSC(3Fh31u1+vkp#bCpsX6L5nmFS_G<(8OJ
zOoU-6`KiSUdHE#}2SZE+8-!vqSR^PhvpBU_Au&(EGp{T$Co?4&mLfn-#`I=JVp%Fk
zbtXi$LRx-NZX(o~C7^iI%LK)op9VK5oq|HxFF!A}1jGOZL=Z@_1Qg+LdxBF-f<V$G
zte|8HO15CtS^1fHB_P$gi3MP~xTFX|R~CZ}fCgoJW?ovp21p?|S3rFTi<c5f1_lN+
zv3Ph?mGFVA1V?o|)Hn@rCIb=01q=)f`UORqWr-!J`elhl`f2$&DXB%p`q_p0*~LcY
z=7xn?M&@OP7Usn{mFea2CMhN+1_lNO>3RAg`URN<x|w;!C5bsXy5)(MrGXhBAux{5
z%qvMP%1g}AFD=Q;Db_DYOwLYB&&*5LE2u0HWnf@P2BpM!G*^p*5-TW6GH~-Su`u#8
zYcRs|2`Ko$`D8LE(7{=ygpnbOiJ_T^p~x7NN3xhfS)-W|#$|zWYZ)2x9AFB-xuhrr
z%w+*(98iv7WXO|eC}CyDVgqHr5_YgG2RJ`5F)*gEfb$+FLo)+IEjV*!ae?wzGb00I
z4HH8aH%KB_0~ED>C7`0f*EPh^#WBRO7{m$icGvavbMr3-dCo6iAvd)oF(t7iQ6VkA
zG%p2|>r{(NKyje~N-^L9E3+6Js(Hz&LEu76gn@wpRCajgrR9TYSQ!FNA{mLr@h~&N
z0_mwG2mw&(l9QjFo>~Mh`^poG@-p+%gFwPyr{?4*CxVKjAW*Ufr^&R`)D&<sP0q<L
zPK6{oP}rwr7MFmvz%2u%evs<;0#Jf38sJnFB*(zOpaV)kpx|O)5@O_M1Y;&iMm8o+
zMqWr#0(pfKR^-lwCnZQKs9|KtVuYm{CWcCHh7xdmH#0I6r!tf<Gh~62Obr957_MOg
zB^LCOn1uma5~ndUh&3}ZG%+&dF))PZ88EPva5H4_Fl2Kv6wP2@tYv0kEa7Fy;$ui*
z1t&LFaH-AA(98m^RD&Z@7#M;zKoR9v%+J8U5CkoZbpyb8x!8n(fkCxc0hWUlAi@gj
zs>SLGNu?!_Lbfyy6x}en%wh%A;vi78fy=LAa|Q;60C2`kRZuNf$Vdd2k+4z^%|eCL
zypp0ykUCuj)nW~>lR!ZZF0ay4OM)aojs#_b5)dmiueh`TRA;BAKwK6Esdm9hw4f+I
zD>b<!J})shH3(Gg2MK~SgR0mdVGs)xg^*$tB#T~Z2g!rfC@?TEfUCD46;L$tf{MB9
zbZ}7_pOTqe5(Fw{z{Pdy04L27DR_Yg%0=j<o((9`%7BUhMjl3fMrKAHMm9!fFxF)f
z0@DIa;BpXD8h|jk9CU-U7qY;OMo_8e#86=XPD-#O>=G*jD!D+Znh8`!70H8&El`ok
zzz|$0&k&x+04f24!I|8z1e7g2{enXreSBPlf<SHtO9aV+f)^Aw$R$gBPG(+eF}R=r
zHEIgL%`HewfU+1!cA!HYlp;V*1{bC|IjKedpnwKfFHHQ5VvIbDf{YsABn%RZk54Nt
zDJ@Ekj}HPx1-Q5bm7JjB5|k#v2{$!2F*8RGQr<y|Oi*qr$Slx{FH6l!$uEKw*r1e$
zB&Y|k{lIA&(h>l<4y*=NQwG8F4vMfIxB}J7%`8ra6x*PP!KR|5vH;{(P|LFfRBS-`
zpgO1oWEsTmxsXO_5Gb<24F|AM5XbAGG@ye(p#n}6>8T|?kU9ipSUfn}#>Yc)At<kd
zi{2nzP^L5jWlB)^4Rqv#Txye>pHiBWY6q&@ij^1`7zCJj7<m{4m;@Nbm;@LF7zLQv
RKqR9uGe0w@D5n6YFaT(dOg{hs

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py
new file mode 100644
index 00000000..03973e97
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py
@@ -0,0 +1,8 @@
+# Shim to wrap setup.py invocation with setuptools
+SETUPTOOLS_SHIM = (
+    "import setuptools, tokenize;__file__=%r;"
+    "f=getattr(tokenize, 'open', open)(__file__);"
+    "code=f.read().replace('\\r\\n', '\\n');"
+    "f.close();"
+    "exec(compile(code, __file__, 'exec'))"
+)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f980d6bceff6c9c9f342e30e9da561ad0413a002
GIT binary patch
literal 404
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#FjHKFl6Qy<QJ7F
z6sMMy7L?@Y=M?KGl;mfp=4Do;TF1wyW#**D$J?qFS*O{ir<Np^loV;eq;(Y3^9xe*
z)O8d<l%@tuwWf7)eoCrsnqE<AVv2^QUQud6PGWMZhI&j<3`n(lOrE-?b(&ssPJVH!
zhNg9DMQXA}a(-?>W=^UGNUM$l%qSfNb&#yOrly|;$R{QI3=9mxt|6fTA^!e8!STT!
zp1v9&pCX9jas~zl{eq&*vc!^9{j$U&{j~g?l+>bP{p>>h>|!HxbHl<cBl9vt3-jWf
z%JlMhlN1vZ0|Ntt^gR6#{esK_-ORk=lEj=G-SR}s(!dOm5E#d2=9Q!t<t66mmzHGa
l6zd~GEIz3;Gbcr_pt6L6fq}s$H$SB`C)JJ_6v8040RV3#c6k5*

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py
new file mode 100644
index 00000000..2c81ad55
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py
@@ -0,0 +1,155 @@
+from __future__ import absolute_import
+
+import errno
+import itertools
+import logging
+import os.path
+import tempfile
+
+from pip._internal.utils.misc import rmtree
+
+logger = logging.getLogger(__name__)
+
+
+class TempDirectory(object):
+    """Helper class that owns and cleans up a temporary directory.
+
+    This class can be used as a context manager or as an OO representation of a
+    temporary directory.
+
+    Attributes:
+        path
+            Location to the created temporary directory or None
+        delete
+            Whether the directory should be deleted when exiting
+            (when used as a contextmanager)
+
+    Methods:
+        create()
+            Creates a temporary directory and stores its path in the path
+            attribute.
+        cleanup()
+            Deletes the temporary directory and sets path attribute to None
+
+    When used as a context manager, a temporary directory is created on
+    entering the context and, if the delete attribute is True, on exiting the
+    context the created directory is deleted.
+    """
+
+    def __init__(self, path=None, delete=None, kind="temp"):
+        super(TempDirectory, self).__init__()
+
+        if path is None and delete is None:
+            # If we were not given an explicit directory, and we were not given
+            # an explicit delete option, then we'll default to deleting.
+            delete = True
+
+        self.path = path
+        self.delete = delete
+        self.kind = kind
+
+    def __repr__(self):
+        return "<{} {!r}>".format(self.__class__.__name__, self.path)
+
+    def __enter__(self):
+        self.create()
+        return self
+
+    def __exit__(self, exc, value, tb):
+        if self.delete:
+            self.cleanup()
+
+    def create(self):
+        """Create a temporary directory and store its path in self.path
+        """
+        if self.path is not None:
+            logger.debug(
+                "Skipped creation of temporary directory: {}".format(self.path)
+            )
+            return
+        # We realpath here because some systems have their default tmpdir
+        # symlinked to another directory.  This tends to confuse build
+        # scripts, so we canonicalize the path by traversing potential
+        # symlinks here.
+        self.path = os.path.realpath(
+            tempfile.mkdtemp(prefix="pip-{}-".format(self.kind))
+        )
+        logger.debug("Created temporary directory: {}".format(self.path))
+
+    def cleanup(self):
+        """Remove the temporary directory created and reset state
+        """
+        if self.path is not None and os.path.exists(self.path):
+            rmtree(self.path)
+        self.path = None
+
+
+class AdjacentTempDirectory(TempDirectory):
+    """Helper class that creates a temporary directory adjacent to a real one.
+
+    Attributes:
+        original
+            The original directory to create a temp directory for.
+        path
+            After calling create() or entering, contains the full
+            path to the temporary directory.
+        delete
+            Whether the directory should be deleted when exiting
+            (when used as a contextmanager)
+
+    """
+    # The characters that may be used to name the temp directory
+    # We always prepend a ~ and then rotate through these until
+    # a usable name is found.
+    # pkg_resources raises a different error for .dist-info folder
+    # with leading '-' and invalid metadata
+    LEADING_CHARS = "-~.=%0123456789"
+
+    def __init__(self, original, delete=None):
+        super(AdjacentTempDirectory, self).__init__(delete=delete)
+        self.original = original.rstrip('/\\')
+
+    @classmethod
+    def _generate_names(cls, name):
+        """Generates a series of temporary names.
+
+        The algorithm replaces the leading characters in the name
+        with ones that are valid filesystem characters, but are not
+        valid package names (for both Python and pip definitions of
+        package).
+        """
+        for i in range(1, len(name)):
+            for candidate in itertools.combinations_with_replacement(
+                    cls.LEADING_CHARS, i - 1):
+                new_name = '~' + ''.join(candidate) + name[i:]
+                if new_name != name:
+                    yield new_name
+
+        # If we make it this far, we will have to make a longer name
+        for i in range(len(cls.LEADING_CHARS)):
+            for candidate in itertools.combinations_with_replacement(
+                    cls.LEADING_CHARS, i):
+                new_name = '~' + ''.join(candidate) + name
+                if new_name != name:
+                    yield new_name
+
+    def create(self):
+        root, name = os.path.split(self.original)
+        for candidate in self._generate_names(name):
+            path = os.path.join(root, candidate)
+            try:
+                os.mkdir(path)
+            except OSError as ex:
+                # Continue if the name exists already
+                if ex.errno != errno.EEXIST:
+                    raise
+            else:
+                self.path = os.path.realpath(path)
+                break
+
+        if not self.path:
+            # Final fallback on the default behavior.
+            self.path = os.path.realpath(
+                tempfile.mkdtemp(prefix="pip-{}-".format(self.kind))
+            )
+        logger.debug("Created temporary directory: {}".format(self.path))
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..902970b7e39d2d9d76f78af149a3d39c45ad4817
GIT binary patch
literal 6397
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
Ier7RG0KUQ$B>(^b

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py
new file mode 100644
index 00000000..10170ce2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py
@@ -0,0 +1,29 @@
+"""For neatly implementing static typing in pip.
+
+`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 pip, all static-typing related imports should be guarded as follows:
+
+    from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+    if MYPY_CHECK_RUNNING:
+        from typing import ...
+
+Ref: https://github.com/python/mypy/issues/3216
+"""
+
+MYPY_CHECK_RUNNING = False
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..73508584329eb89eafdcf9b059bed6b50aa2f6a1
GIT binary patch
literal 1350
zcmZSn%*&NH<x)&C0~9baFfceUFfbGgFfcHrFfc?hFr+dvL@_a>Ffs&dFo9&8SQr@G
z@{1JmQWHyZDitzw3vyC(Q}aqP^U@WHOA<>mlNCxT3qZWgJcWYH0zEFSgxt!4$^->n
zg_4X^BsHlDiFt`RmBpFG3MKjZISS>e3Z=!V3c4V&7_2q{Vp4)aZhlH>PO6SVc}8Y(
z23J8*epzNpYOz9ceo?AIT4`Q#NoIatVoqjBC5V@j2y#zijzUSk0?20dVvs0UO=e!Y
z9v7E;YF=tlVopw_jso0<^8C`A6osTzkcaY%N>Wo45=#_{O7luGb3yJ*0XZr~Au~^*
zBqOmzAuX{uBQrlwL6<ADL?JP`q*x)bSRqj%FJCvm09|8BermBoUVe!}Mq(Mrs7jEr
zx?pqj%TkLnQWH}Yk}A1UQj0Uw^Ypm59E%k)OB6~<i}H#U@=HsQ+?WY5rz|xuCBG;!
zDF+l*nI#~X6)O~{79<uWmZT~a=a&{Grxq)u<ri@URF-7q=P4NJLm9?;3LzP##X1Tl
z8JVEaOG!;iEKXHOPRs*4Ftwr}HMs<Adp;;A3W`#TQ}asnxI*$3%JYk|6%vc`OY>5|
zx^=)otB{zJlV1*rEJ$2I!w(epNvR4+sTrAhDGG@SZizX?sk)V1`2~=u0?8K?rIw}U
zf$d8x%FhJ_OCBiQpapzMWkITLa(*r-Qj5WEO#&yB6t0qdg`(8l{IXPVV#!NQO#%5D
z%mHZvB`c6O5|fiti;FWs;gynEl$s1mwkf4WAgiDetjEO_0tyjGGE;!3FHm}gx?CZ>
zG_eSr01_4QGLuttDi!h)b3ryjlR|MmBxxjaC6^Xu=9d;L<R)h3l_X~7r51r*U6h)b
zoS~4BT9gX%d=V(xLD8Vc#pMakC_13Pgk}$2XkZql<|KmBVrFhZeo;xWLU9HxnSz}I
zN~NHf21kMw7ng#9f&w@wLHRB|Gp{7IC@(Qbue2mHr&teaB*Z8M-^hT-cxMk+XYcr+
zP(MFUKX-`s%rq=gR$!CirlXpqr>Doo6_lE0rI1llQc!HAub-Y-l2MwZmz<xgUjR;l
z`k-v6pIKa7np&)HY-DK0<)^{Sz`#(#&cMJBAD@z+93Nl8%D}(?4(t*k1_lO9_i2F2
zC<IZQ%fP^(Ur>};mRORiUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQWL{=yVP2e5nO+`m
zl44?FU|?X7o~Iw8Uyxa#o0(T!l9-dDTb^iH8khkR0%Lf%>4U>fAL3iRg31yO1_lNj
QNE)$|29<@N0+Edg0ITZ2K>z>%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py
new file mode 100644
index 00000000..0902ce71
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.py
@@ -0,0 +1,424 @@
+from __future__ import absolute_import, division
+
+import contextlib
+import itertools
+import logging
+import sys
+import time
+from signal import SIGINT, default_int_handler, signal
+
+from pip._vendor import six
+from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR
+from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar
+from pip._vendor.progress.spinner import Spinner
+
+from pip._internal.utils.compat import WINDOWS
+from pip._internal.utils.logging import get_indentation
+from pip._internal.utils.misc import format_size
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Iterator, IO
+
+try:
+    from pip._vendor import colorama
+# Lots of different errors can come from this, including SystemError and
+# ImportError.
+except Exception:
+    colorama = None
+
+logger = logging.getLogger(__name__)
+
+
+def _select_progress_class(preferred, fallback):
+    encoding = getattr(preferred.file, "encoding", None)
+
+    # If we don't know what encoding this file is in, then we'll just assume
+    # that it doesn't support unicode and use the ASCII bar.
+    if not encoding:
+        return fallback
+
+    # Collect all of the possible characters we want to use with the preferred
+    # bar.
+    characters = [
+        getattr(preferred, "empty_fill", six.text_type()),
+        getattr(preferred, "fill", six.text_type()),
+    ]
+    characters += list(getattr(preferred, "phases", []))
+
+    # Try to decode the characters we're using for the bar using the encoding
+    # of the given file, if this works then we'll assume that we can use the
+    # fancier bar and if not we'll fall back to the plaintext bar.
+    try:
+        six.text_type().join(characters).encode(encoding)
+    except UnicodeEncodeError:
+        return fallback
+    else:
+        return preferred
+
+
+_BaseBar = _select_progress_class(IncrementalBar, Bar)  # type: Any
+
+
+class InterruptibleMixin(object):
+    """
+    Helper to ensure that self.finish() gets called on keyboard interrupt.
+
+    This allows downloads to be interrupted without leaving temporary state
+    (like hidden cursors) behind.
+
+    This class is similar to the progress library's existing SigIntMixin
+    helper, but as of version 1.2, that helper has the following problems:
+
+    1. It calls sys.exit().
+    2. It discards the existing SIGINT handler completely.
+    3. It leaves its own handler in place even after an uninterrupted finish,
+       which will have unexpected delayed effects if the user triggers an
+       unrelated keyboard interrupt some time after a progress-displaying
+       download has already completed, for example.
+    """
+
+    def __init__(self, *args, **kwargs):
+        """
+        Save the original SIGINT handler for later.
+        """
+        super(InterruptibleMixin, self).__init__(*args, **kwargs)
+
+        self.original_handler = signal(SIGINT, self.handle_sigint)
+
+        # If signal() returns None, the previous handler was not installed from
+        # Python, and we cannot restore it. This probably should not happen,
+        # but if it does, we must restore something sensible instead, at least.
+        # The least bad option should be Python's default SIGINT handler, which
+        # just raises KeyboardInterrupt.
+        if self.original_handler is None:
+            self.original_handler = default_int_handler
+
+    def finish(self):
+        """
+        Restore the original SIGINT handler after finishing.
+
+        This should happen regardless of whether the progress display finishes
+        normally, or gets interrupted.
+        """
+        super(InterruptibleMixin, self).finish()
+        signal(SIGINT, self.original_handler)
+
+    def handle_sigint(self, signum, frame):
+        """
+        Call self.finish() before delegating to the original SIGINT handler.
+
+        This handler should only be in place while the progress display is
+        active.
+        """
+        self.finish()
+        self.original_handler(signum, frame)
+
+
+class SilentBar(Bar):
+
+    def update(self):
+        pass
+
+
+class BlueEmojiBar(IncrementalBar):
+
+    suffix = "%(percent)d%%"
+    bar_prefix = " "
+    bar_suffix = " "
+    phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535")  # type: Any
+
+
+class DownloadProgressMixin(object):
+
+    def __init__(self, *args, **kwargs):
+        super(DownloadProgressMixin, self).__init__(*args, **kwargs)
+        self.message = (" " * (get_indentation() + 2)) + self.message
+
+    @property
+    def downloaded(self):
+        return format_size(self.index)
+
+    @property
+    def download_speed(self):
+        # Avoid zero division errors...
+        if self.avg == 0.0:
+            return "..."
+        return format_size(1 / self.avg) + "/s"
+
+    @property
+    def pretty_eta(self):
+        if self.eta:
+            return "eta %s" % self.eta_td
+        return ""
+
+    def iter(self, it, n=1):
+        for x in it:
+            yield x
+            self.next(n)
+        self.finish()
+
+
+class WindowsMixin(object):
+
+    def __init__(self, *args, **kwargs):
+        # The Windows terminal does not support the hide/show cursor ANSI codes
+        # even with colorama. So we'll ensure that hide_cursor is False on
+        # Windows.
+        # This call needs to go before the super() call, so that hide_cursor
+        # is set in time. The base progress bar class writes the "hide cursor"
+        # code to the terminal in its init, so if we don't set this soon
+        # enough, we get a "hide" with no corresponding "show"...
+        if WINDOWS and self.hide_cursor:
+            self.hide_cursor = False
+
+        super(WindowsMixin, self).__init__(*args, **kwargs)
+
+        # Check if we are running on Windows and we have the colorama module,
+        # if we do then wrap our file with it.
+        if WINDOWS and colorama:
+            self.file = colorama.AnsiToWin32(self.file)
+            # The progress code expects to be able to call self.file.isatty()
+            # but the colorama.AnsiToWin32() object doesn't have that, so we'll
+            # add it.
+            self.file.isatty = lambda: self.file.wrapped.isatty()
+            # The progress code expects to be able to call self.file.flush()
+            # but the colorama.AnsiToWin32() object doesn't have that, so we'll
+            # add it.
+            self.file.flush = lambda: self.file.wrapped.flush()
+
+
+class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin,
+                              DownloadProgressMixin):
+
+    file = sys.stdout
+    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
+    pass
+
+
+class DownloadIncrementalBar(BaseDownloadProgressBar,  # type: ignore
+                             IncrementalBar):
+    pass
+
+
+class DownloadFillingCirclesBar(BaseDownloadProgressBar,  # type: ignore
+                                FillingCirclesBar):
+    pass
+
+
+class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar,  # type: ignore
+                                   BlueEmojiBar):
+    pass
+
+
+class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin,
+                              DownloadProgressMixin, Spinner):
+
+    file = sys.stdout
+    suffix = "%(downloaded)s %(download_speed)s"
+
+    def next_phase(self):
+        if not hasattr(self, "_phaser"):
+            self._phaser = itertools.cycle(self.phases)
+        return next(self._phaser)
+
+    def update(self):
+        message = self.message % self
+        phase = self.next_phase()
+        suffix = self.suffix % self
+        line = ''.join([
+            message,
+            " " if message else "",
+            phase,
+            " " if suffix else "",
+            suffix,
+        ])
+
+        self.writeln(line)
+
+
+BAR_TYPES = {
+    "off": (DownloadSilentBar, DownloadSilentBar),
+    "on": (DefaultDownloadProgressBar, DownloadProgressSpinner),
+    "ascii": (DownloadIncrementalBar, DownloadProgressSpinner),
+    "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner),
+    "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner)
+}
+
+
+def DownloadProgressProvider(progress_bar, max=None):
+    if max is None or max == 0:
+        return BAR_TYPES[progress_bar][1]().iter
+    else:
+        return BAR_TYPES[progress_bar][0](max=max).iter
+
+
+################################################################
+# Generic "something is happening" spinners
+#
+# We don't even try using progress.spinner.Spinner here because it's actually
+# simpler to reimplement from scratch than to coerce their code into doing
+# what we need.
+################################################################
+
+@contextlib.contextmanager
+def hidden_cursor(file):
+    # type: (IO) -> Iterator[None]
+    # The Windows terminal does not support the hide/show cursor ANSI codes,
+    # even via colorama. So don't even try.
+    if WINDOWS:
+        yield
+    # We don't want to clutter the output with control characters if we're
+    # writing to a file, or if the user is running with --quiet.
+    # See https://github.com/pypa/pip/issues/3418
+    elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
+        yield
+    else:
+        file.write(HIDE_CURSOR)
+        try:
+            yield
+        finally:
+            file.write(SHOW_CURSOR)
+
+
+class RateLimiter(object):
+    def __init__(self, min_update_interval_seconds):
+        # type: (float) -> None
+        self._min_update_interval_seconds = min_update_interval_seconds
+        self._last_update = 0  # type: float
+
+    def ready(self):
+        # type: () -> bool
+        now = time.time()
+        delta = now - self._last_update
+        return delta >= self._min_update_interval_seconds
+
+    def reset(self):
+        # type: () -> None
+        self._last_update = time.time()
+
+
+class SpinnerInterface(object):
+    def spin(self):
+        # type: () -> None
+        raise NotImplementedError()
+
+    def finish(self, final_status):
+        # type: (str) -> None
+        raise NotImplementedError()
+
+
+class InteractiveSpinner(SpinnerInterface):
+    def __init__(self, message, file=None, spin_chars="-\\|/",
+                 # Empirically, 8 updates/second looks nice
+                 min_update_interval_seconds=0.125):
+        self._message = message
+        if file is None:
+            file = sys.stdout
+        self._file = file
+        self._rate_limiter = RateLimiter(min_update_interval_seconds)
+        self._finished = False
+
+        self._spin_cycle = itertools.cycle(spin_chars)
+
+        self._file.write(" " * get_indentation() + self._message + " ... ")
+        self._width = 0
+
+    def _write(self, status):
+        assert not self._finished
+        # Erase what we wrote before by backspacing to the beginning, writing
+        # spaces to overwrite the old text, and then backspacing again
+        backup = "\b" * self._width
+        self._file.write(backup + " " * self._width + backup)
+        # Now we have a blank slate to add our status
+        self._file.write(status)
+        self._width = len(status)
+        self._file.flush()
+        self._rate_limiter.reset()
+
+    def spin(self):
+        # type: () -> None
+        if self._finished:
+            return
+        if not self._rate_limiter.ready():
+            return
+        self._write(next(self._spin_cycle))
+
+    def finish(self, final_status):
+        # type: (str) -> None
+        if self._finished:
+            return
+        self._write(final_status)
+        self._file.write("\n")
+        self._file.flush()
+        self._finished = True
+
+
+# Used for dumb terminals, non-interactive installs (no tty), etc.
+# We still print updates occasionally (once every 60 seconds by default) to
+# act as a keep-alive for systems like Travis-CI that take lack-of-output as
+# an indication that a task has frozen.
+class NonInteractiveSpinner(SpinnerInterface):
+    def __init__(self, message, min_update_interval_seconds=60):
+        # type: (str, float) -> None
+        self._message = message
+        self._finished = False
+        self._rate_limiter = RateLimiter(min_update_interval_seconds)
+        self._update("started")
+
+    def _update(self, status):
+        assert not self._finished
+        self._rate_limiter.reset()
+        logger.info("%s: %s", self._message, status)
+
+    def spin(self):
+        # type: () -> None
+        if self._finished:
+            return
+        if not self._rate_limiter.ready():
+            return
+        self._update("still running...")
+
+    def finish(self, final_status):
+        # type: (str) -> None
+        if self._finished:
+            return
+        self._update("finished with status '%s'" % (final_status,))
+        self._finished = True
+
+
+@contextlib.contextmanager
+def open_spinner(message):
+    # type: (str) -> Iterator[SpinnerInterface]
+    # Interactive spinner goes directly to sys.stdout rather than being routed
+    # through the logging system, but it acts like it has level INFO,
+    # i.e. it's only displayed if we're at level INFO or better.
+    # Non-interactive spinner goes through the logging system, so it is always
+    # in sync with logging configuration.
+    if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
+        spinner = InteractiveSpinner(message)  # type: SpinnerInterface
+    else:
+        spinner = NonInteractiveSpinner(message)
+    try:
+        with hidden_cursor(sys.stdout):
+            yield spinner
+    except KeyboardInterrupt:
+        spinner.finish("canceled")
+        raise
+    except Exception:
+        spinner.finish("error")
+        raise
+    else:
+        spinner.finish("done")
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/ui.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1c985a851b7ccdc0dcc22060d29a1b859c59d17a
GIT binary patch
literal 17200
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
X2+AxVEWpCUFC-!+D8?mbBqj?0jyFYv

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py
new file mode 100644
index 00000000..6fca0793
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py
@@ -0,0 +1,604 @@
+"""Handles all VCS (version control) support"""
+from __future__ import absolute_import
+
+import errno
+import logging
+import os
+import shutil
+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
+from pip._internal.utils.misc import (
+    ask_path_exists, backup_dir, call_subprocess, display_path, rmtree,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type
+    )
+    from pip._internal.utils.ui import SpinnerInterface
+
+    AuthInfo = Tuple[Optional[str], Optional[str]]
+
+__all__ = ['vcs']
+
+
+logger = logging.getLogger(__name__)
+
+
+def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None):
+    """
+    Return the URL for a VCS requirement.
+
+    Args:
+      repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+").
+      project_name: the (unescaped) project name.
+    """
+    egg_project_name = pkg_resources.to_filename(project_name)
+    req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name)
+    if subdir:
+        req += '&subdirectory={}'.format(subdir)
+
+    return req
+
+
+class RemoteNotFoundError(Exception):
+    pass
+
+
+class RevOptions(object):
+
+    """
+    Encapsulates a VCS-specific revision to install, along with any VCS
+    install options.
+
+    Instances of this class should be treated as if immutable.
+    """
+
+    def __init__(
+        self,
+        vc_class,  # type: Type[VersionControl]
+        rev=None,  # type: Optional[str]
+        extra_args=None,  # type: Optional[List[str]]
+    ):
+        # type: (...) -> None
+        """
+        Args:
+          vc_class: a VersionControl subclass.
+          rev: the name of the revision to install.
+          extra_args: a list of extra options.
+        """
+        if extra_args is None:
+            extra_args = []
+
+        self.extra_args = extra_args
+        self.rev = rev
+        self.vc_class = vc_class
+
+    def __repr__(self):
+        return '<RevOptions {}: rev={!r}>'.format(self.vc_class.name, self.rev)
+
+    @property
+    def arg_rev(self):
+        # type: () -> Optional[str]
+        if self.rev is None:
+            return self.vc_class.default_arg_rev
+
+        return self.rev
+
+    def to_args(self):
+        # type: () -> List[str]
+        """
+        Return the VCS-specific command arguments.
+        """
+        args = []  # type: List[str]
+        rev = self.arg_rev
+        if rev is not None:
+            args += self.vc_class.get_base_rev_args(rev)
+        args += self.extra_args
+
+        return args
+
+    def to_display(self):
+        # type: () -> str
+        if not self.rev:
+            return ''
+
+        return ' (to revision {})'.format(self.rev)
+
+    def make_new(self, rev):
+        # type: (str) -> RevOptions
+        """
+        Make a copy of the current instance, but with a new rev.
+
+        Args:
+          rev: the name of the revision for the new object.
+        """
+        return self.vc_class.make_rev_options(rev, extra_args=self.extra_args)
+
+
+class VcsSupport(object):
+    _registry = {}  # type: Dict[str, Type[VersionControl]]
+    schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn']
+
+    def __init__(self):
+        # type: () -> None
+        # Register more schemes with urlparse for various version control
+        # systems
+        urllib_parse.uses_netloc.extend(self.schemes)
+        # Python >= 2.7.4, 3.3 doesn't have uses_fragment
+        if getattr(urllib_parse, 'uses_fragment', None):
+            urllib_parse.uses_fragment.extend(self.schemes)
+        super(VcsSupport, self).__init__()
+
+    def __iter__(self):
+        return self._registry.__iter__()
+
+    @property
+    def backends(self):
+        # type: () -> List[Type[VersionControl]]
+        return list(self._registry.values())
+
+    @property
+    def dirnames(self):
+        # type: () -> List[str]
+        return [backend.dirname for backend in self.backends]
+
+    @property
+    def all_schemes(self):
+        # type: () -> List[str]
+        schemes = []  # type: List[str]
+        for backend in self.backends:
+            schemes.extend(backend.schemes)
+        return schemes
+
+    def register(self, cls):
+        # type: (Type[VersionControl]) -> None
+        if not hasattr(cls, 'name'):
+            logger.warning('Cannot register VCS %s', cls.__name__)
+            return
+        if cls.name not in self._registry:
+            self._registry[cls.name] = cls
+            logger.debug('Registered VCS backend: %s', cls.name)
+
+    def unregister(self, cls=None, name=None):
+        # type: (Optional[Type[VersionControl]], Optional[str]) -> None
+        if name in self._registry:
+            del self._registry[name]
+        elif cls in self._registry.values():
+            del self._registry[cls.name]
+        else:
+            logger.warning('Cannot unregister because no class or name given')
+
+    def get_backend_type(self, location):
+        # type: (str) -> Optional[Type[VersionControl]]
+        """
+        Return the type of the version control backend if found at given
+        location, e.g. vcs.get_backend_type('/path/to/vcs/checkout')
+        """
+        for vc_type in self._registry.values():
+            if vc_type.controls_location(location):
+                logger.debug('Determine that %s uses VCS: %s',
+                             location, vc_type.name)
+                return vc_type
+        return None
+
+    def get_backend(self, name):
+        # type: (str) -> Optional[Type[VersionControl]]
+        name = name.lower()
+        if name in self._registry:
+            return self._registry[name]
+        return None
+
+
+vcs = VcsSupport()
+
+
+class VersionControl(object):
+    name = ''
+    dirname = ''
+    repo_name = ''
+    # List of supported schemes for this Version Control
+    schemes = ()  # type: Tuple[str, ...]
+    # Iterable of environment variable names to pass to call_subprocess().
+    unset_environ = ()  # type: Tuple[str, ...]
+    default_arg_rev = None  # type: Optional[str]
+
+    @classmethod
+    def should_add_vcs_url_prefix(cls, remote_url):
+        """
+        Return whether the vcs prefix (e.g. "git+") should be added to a
+        repository's remote url when used in a requirement.
+        """
+        return not remote_url.lower().startswith('{}:'.format(cls.name))
+
+    @classmethod
+    def get_subdirectory(cls, repo_dir):
+        """
+        Return the path to setup.py, relative to the repo root.
+        """
+        return None
+
+    @classmethod
+    def get_requirement_revision(cls, repo_dir):
+        """
+        Return the revision string that should be used in a requirement.
+        """
+        return cls.get_revision(repo_dir)
+
+    @classmethod
+    def get_src_requirement(cls, repo_dir, project_name):
+        """
+        Return the requirement string to use to redownload the files
+        currently at the given repository directory.
+
+        Args:
+          project_name: the (unescaped) project name.
+
+        The return value has a form similar to the following:
+
+            {repository_url}@{revision}#egg={project_name}
+        """
+        repo_url = cls.get_remote_url(repo_dir)
+        if repo_url is None:
+            return None
+
+        if cls.should_add_vcs_url_prefix(repo_url):
+            repo_url = '{}+{}'.format(cls.name, repo_url)
+
+        revision = cls.get_requirement_revision(repo_dir)
+        subdir = cls.get_subdirectory(repo_dir)
+        req = make_vcs_requirement_url(repo_url, revision, project_name,
+                                       subdir=subdir)
+
+        return req
+
+    def __init__(self, url=None, *args, **kwargs):
+        self.url = url
+        super(VersionControl, self).__init__(*args, **kwargs)
+
+    @staticmethod
+    def get_base_rev_args(rev):
+        """
+        Return the base revision arguments for a vcs command.
+
+        Args:
+          rev: the name of a revision to install.  Cannot be None.
+        """
+        raise NotImplementedError
+
+    @classmethod
+    def make_rev_options(cls, rev=None, extra_args=None):
+        # type: (Optional[str], Optional[List[str]]) -> RevOptions
+        """
+        Return a RevOptions object.
+
+        Args:
+          rev: the name of a revision to install.
+          extra_args: a list of extra options.
+        """
+        return RevOptions(cls, rev, extra_args=extra_args)
+
+    @classmethod
+    def _is_local_repository(cls, repo):
+        # type: (str) -> bool
+        """
+           posix absolute paths start with os.path.sep,
+           win32 ones start with drive (like c:\\folder)
+        """
+        drive, tail = os.path.splitdrive(repo)
+        return repo.startswith(os.path.sep) or bool(drive)
+
+    def export(self, location):
+        """
+        Export the repository at the url to the destination location
+        i.e. only download the files, without vcs informations
+        """
+        raise NotImplementedError
+
+    @classmethod
+    def get_netloc_and_auth(cls, netloc, scheme):
+        """
+        Parse the repository URL's netloc, and return the new netloc to use
+        along with auth information.
+
+        Args:
+          netloc: the original repository URL netloc.
+          scheme: the repository URL's scheme without the vcs prefix.
+
+        This is mainly for the Subversion class to override, so that auth
+        information can be provided via the --username and --password options
+        instead of through the URL.  For other subclasses like Git without
+        such an option, auth information must stay in the URL.
+
+        Returns: (netloc, (username, password)).
+        """
+        return netloc, (None, None)
+
+    @classmethod
+    def get_url_rev_and_auth(cls, url):
+        # type: (str) -> Tuple[str, Optional[str], AuthInfo]
+        """
+        Parse the repository URL to use, and return the URL, revision,
+        and auth info to use.
+
+        Returns: (url, rev, (username, password)).
+        """
+        scheme, netloc, path, query, frag = urllib_parse.urlsplit(url)
+        if '+' not in scheme:
+            raise ValueError(
+                "Sorry, {!r} is a malformed VCS url. "
+                "The format is <vcs>+<protocol>://<url>, "
+                "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url)
+            )
+        # Remove the vcs prefix.
+        scheme = scheme.split('+', 1)[1]
+        netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme)
+        rev = None
+        if '@' in path:
+            path, rev = path.rsplit('@', 1)
+        url = urllib_parse.urlunsplit((scheme, netloc, path, query, ''))
+        return url, rev, user_pass
+
+    @staticmethod
+    def make_rev_args(username, password):
+        """
+        Return the RevOptions "extra arguments" to use in obtain().
+        """
+        return []
+
+    def get_url_rev_options(self, url):
+        # type: (str) -> Tuple[str, RevOptions]
+        """
+        Return the URL and RevOptions object to use in obtain() and in
+        some cases export(), as a tuple (url, rev_options).
+        """
+        url, rev, user_pass = self.get_url_rev_and_auth(url)
+        username, password = user_pass
+        extra_args = self.make_rev_args(username, password)
+        rev_options = self.make_rev_options(rev, extra_args=extra_args)
+
+        return url, rev_options
+
+    @staticmethod
+    def normalize_url(url):
+        # type: (str) -> str
+        """
+        Normalize a URL for comparison by unquoting it and removing any
+        trailing slash.
+        """
+        return urllib_parse.unquote(url).rstrip('/')
+
+    @classmethod
+    def compare_urls(cls, url1, url2):
+        # type: (str, str) -> bool
+        """
+        Compare two repo URLs for identity, ignoring incidental differences.
+        """
+        return (cls.normalize_url(url1) == cls.normalize_url(url2))
+
+    @classmethod
+    def fetch_new(cls, dest, url, rev_options):
+        """
+        Fetch a revision from a repository, in the case that this is the
+        first fetch from the repository.
+
+        Args:
+          dest: the directory to fetch the repository to.
+          rev_options: a RevOptions object.
+        """
+        raise NotImplementedError
+
+    def switch(self, dest, url, rev_options):
+        """
+        Switch the repo at ``dest`` to point to ``URL``.
+
+        Args:
+          rev_options: a RevOptions object.
+        """
+        raise NotImplementedError
+
+    def update(self, dest, url, rev_options):
+        """
+        Update an already-existing repo to the given ``rev_options``.
+
+        Args:
+          rev_options: a RevOptions object.
+        """
+        raise NotImplementedError
+
+    @classmethod
+    def is_commit_id_equal(cls, dest, name):
+        """
+        Return whether the id of the current commit equals the given name.
+
+        Args:
+          dest: the repository directory.
+          name: a string name.
+        """
+        raise NotImplementedError
+
+    def obtain(self, dest):
+        # type: (str) -> None
+        """
+        Install or update in editable mode the package represented by this
+        VersionControl object.
+
+        Args:
+          dest: the repository directory in which to install or update.
+        """
+        url, rev_options = self.get_url_rev_options(self.url)
+
+        if not os.path.exists(dest):
+            self.fetch_new(dest, url, rev_options)
+            return
+
+        rev_display = rev_options.to_display()
+        if self.is_repository_directory(dest):
+            existing_url = self.get_remote_url(dest)
+            if self.compare_urls(existing_url, url):
+                logger.debug(
+                    '%s in %s exists, and has correct URL (%s)',
+                    self.repo_name.title(),
+                    display_path(dest),
+                    url,
+                )
+                if not self.is_commit_id_equal(dest, rev_options.rev):
+                    logger.info(
+                        'Updating %s %s%s',
+                        display_path(dest),
+                        self.repo_name,
+                        rev_display,
+                    )
+                    self.update(dest, url, rev_options)
+                else:
+                    logger.info('Skipping because already up-to-date.')
+                return
+
+            logger.warning(
+                '%s %s in %s exists with URL %s',
+                self.name,
+                self.repo_name,
+                display_path(dest),
+                existing_url,
+            )
+            prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ',
+                      ('s', 'i', 'w', 'b'))
+        else:
+            logger.warning(
+                'Directory %s already exists, and is not a %s %s.',
+                dest,
+                self.name,
+                self.repo_name,
+            )
+            # https://github.com/python/mypy/issues/1174
+            prompt = ('(i)gnore, (w)ipe, (b)ackup ',  # type: ignore
+                      ('i', 'w', 'b'))
+
+        logger.warning(
+            'The plan is to install the %s repository %s',
+            self.name,
+            url,
+        )
+        response = ask_path_exists('What to do?  %s' % prompt[0], prompt[1])
+
+        if response == 'a':
+            sys.exit(-1)
+
+        if response == 'w':
+            logger.warning('Deleting %s', display_path(dest))
+            rmtree(dest)
+            self.fetch_new(dest, url, rev_options)
+            return
+
+        if response == 'b':
+            dest_dir = backup_dir(dest)
+            logger.warning(
+                'Backing up %s to %s', display_path(dest), dest_dir,
+            )
+            shutil.move(dest, dest_dir)
+            self.fetch_new(dest, url, rev_options)
+            return
+
+        # Do nothing if the response is "i".
+        if response == 's':
+            logger.info(
+                'Switching %s %s to %s%s',
+                self.repo_name,
+                display_path(dest),
+                url,
+                rev_display,
+            )
+            self.switch(dest, url, rev_options)
+
+    def unpack(self, location):
+        # type: (str) -> None
+        """
+        Clean up current location and download the url repository
+        (and vcs infos) into location
+        """
+        if os.path.exists(location):
+            rmtree(location)
+        self.obtain(location)
+
+    @classmethod
+    def get_remote_url(cls, location):
+        """
+        Return the url used at location
+
+        Raises RemoteNotFoundError if the repository does not have a remote
+        url configured.
+        """
+        raise NotImplementedError
+
+    @classmethod
+    def get_revision(cls, location):
+        """
+        Return the current commit id of the files at the given location.
+        """
+        raise NotImplementedError
+
+    @classmethod
+    def run_command(
+        cls,
+        cmd,  # type: List[str]
+        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]
+    ):
+        # type: (...) -> Optional[Text]
+        """
+        Run a VCS subcommand
+        This is simply a wrapper around call_subprocess that adds the VCS
+        command name, and checks that the VCS is available
+        """
+        cmd = [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,
+                                   extra_environ=extra_environ,
+                                   unset_environ=cls.unset_environ,
+                                   spinner=spinner)
+        except OSError as e:
+            # errno.ENOENT = no such file or directory
+            # In other words, the VCS executable isn't available
+            if e.errno == errno.ENOENT:
+                raise BadCommand(
+                    'Cannot find command %r - do you have '
+                    '%r installed and in your '
+                    'PATH?' % (cls.name, cls.name))
+            else:
+                raise  # re-raise exception if a different error occurred
+
+    @classmethod
+    def is_repository_directory(cls, path):
+        # type: (str) -> bool
+        """
+        Return whether a directory path is a repository directory.
+        """
+        logger.debug('Checking in %s for %s (%s)...',
+                     path, cls.dirname, cls.name)
+        return os.path.exists(os.path.join(path, cls.dirname))
+
+    @classmethod
+    def controls_location(cls, location):
+        # type: (str) -> bool
+        """
+        Check if a location is controlled by the vcs.
+        It is meant to be overridden to implement smarter detection
+        mechanisms for specific vcs.
+
+        This can do more than is_repository_directory() alone.  For example,
+        the Git override checks that Git is actually available.
+        """
+        return cls.is_repository_directory(location)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0ca6599b5ad2bb51be2a31c7e0e9710f78a272e8
GIT binary patch
literal 22654
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py
new file mode 100644
index 00000000..3587b3de
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py
@@ -0,0 +1,103 @@
+from __future__ import absolute_import
+
+import logging
+import os
+
+from pip._vendor.six.moves.urllib import parse as urllib_parse
+
+from pip._internal.download import path_to_url
+from pip._internal.utils.misc import display_path, rmtree
+from pip._internal.vcs import VersionControl, vcs
+
+logger = logging.getLogger(__name__)
+
+
+class Bazaar(VersionControl):
+    name = 'bzr'
+    dirname = '.bzr'
+    repo_name = 'branch'
+    schemes = (
+        'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp',
+        'bzr+lp',
+    )
+
+    def __init__(self, url=None, *args, **kwargs):
+        super(Bazaar, self).__init__(url, *args, **kwargs)
+        # This is only needed for python <2.7.5
+        # Register lp but do not expose as a scheme to support bzr+lp.
+        if getattr(urllib_parse, 'uses_fragment', None):
+            urllib_parse.uses_fragment.extend(['lp'])
+
+    @staticmethod
+    def get_base_rev_args(rev):
+        return ['-r', rev]
+
+    def export(self, location):
+        """
+        Export the Bazaar repository at the url to the destination location
+        """
+        # Remove the location to make sure Bazaar can export it correctly
+        if os.path.exists(location):
+            rmtree(location)
+
+        url, rev_options = self.get_url_rev_options(self.url)
+        self.run_command(
+            ['export', location, url] + rev_options.to_args(),
+            show_stdout=False,
+        )
+
+    @classmethod
+    def fetch_new(cls, dest, url, rev_options):
+        rev_display = rev_options.to_display()
+        logger.info(
+            'Checking out %s%s to %s',
+            url,
+            rev_display,
+            display_path(dest),
+        )
+        cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest]
+        cls.run_command(cmd_args)
+
+    def switch(self, dest, url, rev_options):
+        self.run_command(['switch', url], cwd=dest)
+
+    def update(self, dest, url, rev_options):
+        cmd_args = ['pull', '-q'] + rev_options.to_args()
+        self.run_command(cmd_args, cwd=dest)
+
+    @classmethod
+    def get_url_rev_and_auth(cls, url):
+        # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it
+        url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url)
+        if url.startswith('ssh://'):
+            url = 'bzr+' + url
+        return url, rev, user_pass
+
+    @classmethod
+    def get_remote_url(cls, location):
+        urls = cls.run_command(['info'], show_stdout=False, cwd=location)
+        for line in urls.splitlines():
+            line = line.strip()
+            for x in ('checkout of branch: ',
+                      'parent branch: '):
+                if line.startswith(x):
+                    repo = line.split(x)[1]
+                    if cls._is_local_repository(repo):
+                        return path_to_url(repo)
+                    return repo
+        return None
+
+    @classmethod
+    def get_revision(cls, location):
+        revision = cls.run_command(
+            ['revno'], show_stdout=False, cwd=location,
+        )
+        return revision.splitlines()[-1]
+
+    @classmethod
+    def is_commit_id_equal(cls, dest, name):
+        """Always assume the versions don't match"""
+        return False
+
+
+vcs.register(Bazaar)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..54b0e3ec102352aa5e1634f79fd49c658f4ea5c9
GIT binary patch
literal 5097
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
Bf;a#G

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py
new file mode 100644
index 00000000..35ea9301
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py
@@ -0,0 +1,362 @@
+from __future__ import absolute_import
+
+import logging
+import os.path
+import re
+
+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
+from pip._internal.utils.compat import samefile
+from pip._internal.utils.misc import display_path, redact_password_from_url
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.vcs import RemoteNotFoundError, VersionControl, vcs
+
+urlsplit = urllib_parse.urlsplit
+urlunsplit = urllib_parse.urlunsplit
+
+
+logger = logging.getLogger(__name__)
+
+
+HASH_REGEX = re.compile('[a-fA-F0-9]{40}')
+
+
+def looks_like_hash(sha):
+    return bool(HASH_REGEX.match(sha))
+
+
+class Git(VersionControl):
+    name = 'git'
+    dirname = '.git'
+    repo_name = 'clone'
+    schemes = (
+        'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file',
+    )
+    # Prevent the user's environment variables from interfering with pip:
+    # https://github.com/pypa/pip/issues/1130
+    unset_environ = ('GIT_DIR', 'GIT_WORK_TREE')
+    default_arg_rev = 'HEAD'
+
+    def __init__(self, url=None, *args, **kwargs):
+
+        # Works around an apparent Git bug
+        # (see https://article.gmane.org/gmane.comp.version-control.git/146500)
+        if url:
+            scheme, netloc, path, query, fragment = urlsplit(url)
+            if scheme.endswith('file'):
+                initial_slashes = path[:-len(path.lstrip('/'))]
+                newpath = (
+                    initial_slashes +
+                    urllib_request.url2pathname(path)
+                    .replace('\\', '/').lstrip('/')
+                )
+                url = urlunsplit((scheme, netloc, newpath, query, fragment))
+                after_plus = scheme.find('+') + 1
+                url = scheme[:after_plus] + urlunsplit(
+                    (scheme[after_plus:], netloc, newpath, query, fragment),
+                )
+
+        super(Git, self).__init__(url, *args, **kwargs)
+
+    @staticmethod
+    def get_base_rev_args(rev):
+        return [rev]
+
+    def get_git_version(self):
+        VERSION_PFX = 'git version '
+        version = self.run_command(['version'], show_stdout=False)
+        if version.startswith(VERSION_PFX):
+            version = version[len(VERSION_PFX):].split()[0]
+        else:
+            version = ''
+        # get first 3 positions of the git version because
+        # on windows it is x.y.z.windows.t, and this parses as
+        # LegacyVersion which always smaller than a Version.
+        version = '.'.join(version.split('.')[:3])
+        return parse_version(version)
+
+    @classmethod
+    def get_current_branch(cls, location):
+        """
+        Return the current branch, or None if HEAD isn't at a branch
+        (e.g. detached HEAD).
+        """
+        # git-symbolic-ref exits with empty stdout if "HEAD" is a detached
+        # HEAD rather than a symbolic ref.  In addition, the -q causes the
+        # command to exit with status code 1 instead of 128 in this case
+        # 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,
+        )
+        ref = output.strip()
+
+        if ref.startswith('refs/heads/'):
+            return ref[len('refs/heads/'):]
+
+        return None
+
+    def export(self, location):
+        """Export the Git repository at the url to the destination location"""
+        if not location.endswith('/'):
+            location = location + '/'
+
+        with TempDirectory(kind="export") as temp_dir:
+            self.unpack(temp_dir.path)
+            self.run_command(
+                ['checkout-index', '-a', '-f', '--prefix', location],
+                show_stdout=False, cwd=temp_dir.path
+            )
+
+    @classmethod
+    def get_revision_sha(cls, dest, rev):
+        """
+        Return (sha_or_none, is_branch), where sha_or_none is a commit hash
+        if the revision names a remote branch or tag, otherwise None.
+
+        Args:
+          dest: the repository directory.
+          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')
+        refs = {}
+        for line in output.strip().splitlines():
+            try:
+                sha, ref = line.split()
+            except ValueError:
+                # Include the offending line to simplify troubleshooting if
+                # this error ever occurs.
+                raise ValueError('unexpected show-ref line: {!r}'.format(line))
+
+            refs[ref] = sha
+
+        branch_ref = 'refs/remotes/origin/{}'.format(rev)
+        tag_ref = 'refs/tags/{}'.format(rev)
+
+        sha = refs.get(branch_ref)
+        if sha is not None:
+            return (sha, True)
+
+        sha = refs.get(tag_ref)
+
+        return (sha, False)
+
+    @classmethod
+    def resolve_revision(cls, dest, url, rev_options):
+        """
+        Resolve a revision to a new RevOptions object with the SHA1 of the
+        branch, tag, or ref if found.
+
+        Args:
+          rev_options: a RevOptions object.
+        """
+        rev = rev_options.arg_rev
+        sha, is_branch = cls.get_revision_sha(dest, rev)
+
+        if sha is not None:
+            rev_options = rev_options.make_new(sha)
+            rev_options.branch_name = rev if is_branch else None
+
+            return rev_options
+
+        # Do not show a warning for the common case of something that has
+        # the form of a Git commit hash.
+        if not looks_like_hash(rev):
+            logger.warning(
+                "Did not find branch or tag '%s', assuming revision or ref.",
+                rev,
+            )
+
+        if not rev.startswith('refs/'):
+            return rev_options
+
+        # If it looks like a ref, we have to fetch it explicitly.
+        cls.run_command(
+            ['fetch', '-q', url] + rev_options.to_args(),
+            cwd=dest,
+        )
+        # Change the revision to the SHA of the ref we fetched
+        sha = cls.get_revision(dest, rev='FETCH_HEAD')
+        rev_options = rev_options.make_new(sha)
+
+        return rev_options
+
+    @classmethod
+    def is_commit_id_equal(cls, dest, name):
+        """
+        Return whether the current commit hash equals the given name.
+
+        Args:
+          dest: the repository directory.
+          name: a string name.
+        """
+        if not name:
+            # Then avoid an unnecessary subprocess call.
+            return False
+
+        return cls.get_revision(dest) == name
+
+    @classmethod
+    def fetch_new(cls, dest, url, rev_options):
+        rev_display = rev_options.to_display()
+        logger.info(
+            'Cloning %s%s to %s', redact_password_from_url(url),
+            rev_display, display_path(dest),
+        )
+        cls.run_command(['clone', '-q', url, dest])
+
+        if rev_options.rev:
+            # Then a specific revision was requested.
+            rev_options = cls.resolve_revision(dest, url, rev_options)
+            branch_name = getattr(rev_options, 'branch_name', None)
+            if branch_name is None:
+                # Only do a checkout if the current commit id doesn't match
+                # the requested revision.
+                if not cls.is_commit_id_equal(dest, rev_options.rev):
+                    cmd_args = ['checkout', '-q'] + rev_options.to_args()
+                    cls.run_command(cmd_args, cwd=dest)
+            elif cls.get_current_branch(dest) != branch_name:
+                # Then a specific branch was requested, and that branch
+                # is not yet checked out.
+                track_branch = 'origin/{}'.format(branch_name)
+                cmd_args = [
+                    'checkout', '-b', branch_name, '--track', track_branch,
+                ]
+                cls.run_command(cmd_args, cwd=dest)
+
+        #: repo may contain submodules
+        cls.update_submodules(dest)
+
+    def switch(self, dest, url, rev_options):
+        self.run_command(['config', 'remote.origin.url', url], cwd=dest)
+        cmd_args = ['checkout', '-q'] + rev_options.to_args()
+        self.run_command(cmd_args, cwd=dest)
+
+        self.update_submodules(dest)
+
+    def update(self, dest, url, rev_options):
+        # First fetch changes from the default remote
+        if self.get_git_version() >= parse_version('1.9.0'):
+            # fetch tags in addition to everything else
+            self.run_command(['fetch', '-q', '--tags'], cwd=dest)
+        else:
+            self.run_command(['fetch', '-q'], cwd=dest)
+        # Then reset to wanted revision (maybe even origin/master)
+        rev_options = self.resolve_revision(dest, url, rev_options)
+        cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args()
+        self.run_command(cmd_args, cwd=dest)
+        #: update submodules
+        self.update_submodules(dest)
+
+    @classmethod
+    def get_remote_url(cls, location):
+        """
+        Return URL of the first remote encountered.
+
+        Raises RemoteNotFoundError if the repository does not have a remote
+        url configured.
+        """
+        # We need to pass 1 for extra_ok_returncodes since the command
+        # 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,
+        )
+        remotes = stdout.splitlines()
+        try:
+            found_remote = remotes[0]
+        except IndexError:
+            raise RemoteNotFoundError
+
+        for remote in remotes:
+            if remote.startswith('remote.origin.url '):
+                found_remote = remote
+                break
+        url = found_remote.split(' ')[1]
+        return url.strip()
+
+    @classmethod
+    def get_revision(cls, location, rev=None):
+        if rev is None:
+            rev = 'HEAD'
+        current_rev = cls.run_command(
+            ['rev-parse', rev], show_stdout=False, cwd=location,
+        )
+        return current_rev.strip()
+
+    @classmethod
+    def get_subdirectory(cls, location):
+        # find the repo root
+        git_dir = cls.run_command(['rev-parse', '--git-dir'],
+                                  show_stdout=False, cwd=location).strip()
+        if not os.path.isabs(git_dir):
+            git_dir = os.path.join(location, git_dir)
+        root_dir = os.path.join(git_dir, '..')
+        # find setup.py
+        orig_location = location
+        while not os.path.exists(os.path.join(location, 'setup.py')):
+            last_location = location
+            location = os.path.dirname(location)
+            if location == last_location:
+                # We've traversed up to the root of the filesystem without
+                # finding setup.py
+                logger.warning(
+                    "Could not find setup.py for directory %s (tried all "
+                    "parent directories)",
+                    orig_location,
+                )
+                return None
+        # relative path of setup.py to repo root
+        if samefile(root_dir, location):
+            return None
+        return os.path.relpath(location, root_dir)
+
+    @classmethod
+    def get_url_rev_and_auth(cls, url):
+        """
+        Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
+        That's required because although they use SSH they sometimes don't
+        work with a ssh:// scheme (e.g. GitHub). But we need a scheme for
+        parsing. Hence we remove it again afterwards and return it as a stub.
+        """
+        if '://' not in url:
+            assert 'file:' not in url
+            url = url.replace('git+', 'git+ssh://')
+            url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url)
+            url = url.replace('ssh://', '')
+        else:
+            url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url)
+
+        return url, rev, user_pass
+
+    @classmethod
+    def update_submodules(cls, location):
+        if not os.path.exists(os.path.join(location, '.gitmodules')):
+            return
+        cls.run_command(
+            ['submodule', 'update', '--init', '--recursive', '-q'],
+            cwd=location,
+        )
+
+    @classmethod
+    def controls_location(cls, location):
+        if super(Git, cls).controls_location(location):
+            return True
+        try:
+            r = cls.run_command(['rev-parse'],
+                                cwd=location,
+                                show_stdout=False,
+                                on_returncode='ignore')
+            return not r
+        except BadCommand:
+            logger.debug("could not determine if %s is under git control "
+                         "because git is not available", location)
+            return False
+
+
+vcs.register(Git)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8fd15120d6c08ae38e70a3607e7f766f663353c6
GIT binary patch
literal 12401
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
V$}n*<ax(KX^D}d@i2Y~q0RZ;0<R}0D

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py
new file mode 100644
index 00000000..81edc4a0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py
@@ -0,0 +1,105 @@
+from __future__ import absolute_import
+
+import logging
+import os
+
+from pip._vendor.six.moves import configparser
+
+from pip._internal.download import path_to_url
+from pip._internal.utils.misc import display_path
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.vcs import VersionControl, vcs
+
+logger = logging.getLogger(__name__)
+
+
+class Mercurial(VersionControl):
+    name = 'hg'
+    dirname = '.hg'
+    repo_name = 'clone'
+    schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http')
+
+    @staticmethod
+    def get_base_rev_args(rev):
+        return [rev]
+
+    def export(self, location):
+        """Export the Hg repository at the url to the destination location"""
+        with TempDirectory(kind="export") as temp_dir:
+            self.unpack(temp_dir.path)
+
+            self.run_command(
+                ['archive', location], show_stdout=False, cwd=temp_dir.path
+            )
+
+    @classmethod
+    def fetch_new(cls, dest, url, rev_options):
+        rev_display = rev_options.to_display()
+        logger.info(
+            'Cloning hg %s%s to %s',
+            url,
+            rev_display,
+            display_path(dest),
+        )
+        cls.run_command(['clone', '--noupdate', '-q', url, dest])
+        cmd_args = ['update', '-q'] + rev_options.to_args()
+        cls.run_command(cmd_args, cwd=dest)
+
+    def switch(self, dest, url, rev_options):
+        repo_config = os.path.join(dest, self.dirname, 'hgrc')
+        config = configparser.SafeConfigParser()
+        try:
+            config.read(repo_config)
+            config.set('paths', 'default', url)
+            with open(repo_config, 'w') as config_file:
+                config.write(config_file)
+        except (OSError, configparser.NoSectionError) as exc:
+            logger.warning(
+                'Could not switch Mercurial repository to %s: %s', url, exc,
+            )
+        else:
+            cmd_args = ['update', '-q'] + rev_options.to_args()
+            self.run_command(cmd_args, cwd=dest)
+
+    def update(self, dest, url, rev_options):
+        self.run_command(['pull', '-q'], cwd=dest)
+        cmd_args = ['update', '-q'] + rev_options.to_args()
+        self.run_command(cmd_args, cwd=dest)
+
+    @classmethod
+    def get_remote_url(cls, location):
+        url = cls.run_command(
+            ['showconfig', 'paths.default'],
+            show_stdout=False, cwd=location).strip()
+        if cls._is_local_repository(url):
+            url = path_to_url(url)
+        return url.strip()
+
+    @classmethod
+    def get_revision(cls, location):
+        """
+        Return the repository-local changeset revision number, as an integer.
+        """
+        current_revision = cls.run_command(
+            ['parents', '--template={rev}'],
+            show_stdout=False, cwd=location).strip()
+        return current_revision
+
+    @classmethod
+    def get_requirement_revision(cls, location):
+        """
+        Return the changeset identification hash, as a 40-character
+        hexadecimal string
+        """
+        current_rev_hash = cls.run_command(
+            ['parents', '--template={node}'],
+            show_stdout=False, cwd=location).strip()
+        return current_rev_hash
+
+    @classmethod
+    def is_commit_id_equal(cls, dest, name):
+        """Always assume the versions don't match"""
+        return False
+
+
+vcs.register(Mercurial)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..132ee6b79c3ef4736dff2b797337d15ee61886f7
GIT binary patch
literal 5221
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
KG4V5tMFIeFuDDqM

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py
new file mode 100644
index 00000000..01bb1612
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py
@@ -0,0 +1,234 @@
+from __future__ import absolute_import
+
+import logging
+import os
+import re
+
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import (
+    display_path, rmtree, split_auth_from_netloc,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.vcs import VersionControl, vcs
+
+_svn_xml_url_re = re.compile('url="([^"]+)"')
+_svn_rev_re = re.compile(r'committed-rev="(\d+)"')
+_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"')
+_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>')
+
+
+if MYPY_CHECK_RUNNING:
+    from typing import Optional, Tuple
+
+logger = logging.getLogger(__name__)
+
+
+class Subversion(VersionControl):
+    name = 'svn'
+    dirname = '.svn'
+    repo_name = 'checkout'
+    schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn')
+
+    @classmethod
+    def should_add_vcs_url_prefix(cls, remote_url):
+        return True
+
+    @staticmethod
+    def get_base_rev_args(rev):
+        return ['-r', rev]
+
+    def get_vcs_version(self):
+        # type: () -> Optional[Tuple[int, ...]]
+        """Return the version of the currently installed Subversion client.
+
+        :return: A tuple containing the parts of the version information or
+            ``None`` if the version returned from ``svn`` could not be parsed.
+        :raises: BadCommand: If ``svn`` is not installed.
+        """
+        # Example versions:
+        #   svn, version 1.10.3 (r1842928)
+        #      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
+        version_prefix = 'svn, version '
+        version = self.run_command(['--version'], show_stdout=False)
+        if not version.startswith(version_prefix):
+            return None
+
+        version = version[len(version_prefix):].split()[0]
+        version_list = version.split('.')
+        try:
+            parsed_version = tuple(map(int, version_list))
+        except ValueError:
+            return None
+
+        if not parsed_version:
+            return None
+
+        return parsed_version
+
+    def export(self, location):
+        """Export the svn repository at the url to the destination location"""
+        url, rev_options = self.get_url_rev_options(self.url)
+
+        logger.info('Exporting svn repository %s to %s', url, location)
+        with indent_log():
+            if os.path.exists(location):
+                # Subversion doesn't like to check out over an existing
+                # directory --force fixes this, but was only added in svn 1.5
+                rmtree(location)
+            cmd_args = ['export'] + rev_options.to_args() + [url, location]
+            self.run_command(cmd_args, show_stdout=False)
+
+    @classmethod
+    def fetch_new(cls, dest, url, rev_options):
+        rev_display = rev_options.to_display()
+        logger.info(
+            'Checking out %s%s to %s',
+            url,
+            rev_display,
+            display_path(dest),
+        )
+        cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest]
+        cls.run_command(cmd_args)
+
+    def switch(self, dest, url, rev_options):
+        cmd_args = ['switch'] + rev_options.to_args() + [url, dest]
+        self.run_command(cmd_args)
+
+    def update(self, dest, url, rev_options):
+        cmd_args = ['update'] + rev_options.to_args() + [dest]
+        self.run_command(cmd_args)
+
+    @classmethod
+    def get_revision(cls, location):
+        """
+        Return the maximum revision for all files under a given location
+        """
+        # Note: taken from setuptools.command.egg_info
+        revision = 0
+
+        for base, dirs, files in os.walk(location):
+            if cls.dirname not in dirs:
+                dirs[:] = []
+                continue    # no sense walking uncontrolled subdirs
+            dirs.remove(cls.dirname)
+            entries_fn = os.path.join(base, cls.dirname, 'entries')
+            if not os.path.exists(entries_fn):
+                # FIXME: should we warn?
+                continue
+
+            dirurl, localrev = cls._get_svn_url_rev(base)
+
+            if base == location:
+                base = dirurl + '/'   # save the root url
+            elif not dirurl or not dirurl.startswith(base):
+                dirs[:] = []
+                continue    # not part of the same svn tree, skip it
+            revision = max(revision, localrev)
+        return revision
+
+    @classmethod
+    def get_netloc_and_auth(cls, netloc, scheme):
+        """
+        This override allows the auth information to be passed to svn via the
+        --username and --password options instead of via the URL.
+        """
+        if scheme == 'ssh':
+            # The --username and --password options can't be used for
+            # svn+ssh URLs, so keep the auth information in the URL.
+            return super(Subversion, cls).get_netloc_and_auth(netloc, scheme)
+
+        return split_auth_from_netloc(netloc)
+
+    @classmethod
+    def get_url_rev_and_auth(cls, url):
+        # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it
+        url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url)
+        if url.startswith('ssh://'):
+            url = 'svn+' + url
+        return url, rev, user_pass
+
+    @staticmethod
+    def make_rev_args(username, password):
+        extra_args = []
+        if username:
+            extra_args += ['--username', username]
+        if password:
+            extra_args += ['--password', password]
+
+        return extra_args
+
+    @classmethod
+    def get_remote_url(cls, location):
+        # In cases where the source is in a subdirectory, not alongside
+        # setup.py we have to look up in the location until we find a real
+        # setup.py
+        orig_location = location
+        while not os.path.exists(os.path.join(location, 'setup.py')):
+            last_location = location
+            location = os.path.dirname(location)
+            if location == last_location:
+                # We've traversed up to the root of the filesystem without
+                # finding setup.py
+                logger.warning(
+                    "Could not find setup.py for directory %s (tried all "
+                    "parent directories)",
+                    orig_location,
+                )
+                return None
+
+        return cls._get_svn_url_rev(location)[0]
+
+    @classmethod
+    def _get_svn_url_rev(cls, location):
+        from pip._internal.exceptions import InstallationError
+
+        entries_path = os.path.join(location, cls.dirname, 'entries')
+        if os.path.exists(entries_path):
+            with open(entries_path) as f:
+                data = f.read()
+        else:  # subversion >= 1.7 does not have the 'entries' file
+            data = ''
+
+        if (data.startswith('8') or
+                data.startswith('9') or
+                data.startswith('10')):
+            data = list(map(str.splitlines, data.split('\n\x0c\n')))
+            del data[0][0]  # get rid of the '8'
+            url = data[0][3]
+            revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0]
+        elif data.startswith('<?xml'):
+            match = _svn_xml_url_re.search(data)
+            if not match:
+                raise ValueError('Badly formatted data: %r' % data)
+            url = match.group(1)    # get repository URL
+            revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0]
+        else:
+            try:
+                # subversion >= 1.7
+                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:
+                url, revs = None, []
+
+        if revs:
+            rev = max(revs)
+        else:
+            rev = 0
+
+        return url, rev
+
+    @classmethod
+    def is_commit_id_equal(cls, dest, name):
+        """Always assume the versions don't match"""
+        return False
+
+
+vcs.register(Subversion)
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7fc81d9569f6360767351fe9d5d3bc4023cd7e71
GIT binary patch
literal 8818
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
I{LEq(0N2dp5C8xG

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_internal/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/wheel.py
new file mode 100644
index 00000000..1bdbe93a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_internal/wheel.py
@@ -0,0 +1,1098 @@
+"""
+Support for installing and building the "wheel" binary package format.
+"""
+from __future__ import absolute_import
+
+import collections
+import compileall
+import csv
+import hashlib
+import logging
+import os.path
+import re
+import shutil
+import stat
+import sys
+import warnings
+from base64 import urlsafe_b64encode
+from email.parser import Parser
+
+from pip._vendor import pkg_resources
+from pip._vendor.distlib.scripts import ScriptMaker
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.six import StringIO
+
+from pip._internal import pep425tags
+from pip._internal.download import path_to_url, unpack_url
+from pip._internal.exceptions import (
+    InstallationError, InvalidWheelFilename, UnsupportedWheel,
+)
+from pip._internal.locations import (
+    PIP_DELETE_MARKER_FILENAME, distutils_scheme,
+)
+from pip._internal.models.link import Link
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import (
+    LOG_DIVIDER, call_subprocess, captured_stdout, ensure_dir,
+    format_command_args, read_chunks,
+)
+from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM
+from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.ui import open_spinner
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, Iterable
+    )
+    from pip._vendor.packaging.requirements import Requirement
+    from pip._internal.req.req_install import InstallRequirement
+    from pip._internal.download import PipSession
+    from pip._internal.index import FormatControl, PackageFinder
+    from pip._internal.operations.prepare import (
+        RequirementPreparer
+    )
+    from pip._internal.cache import WheelCache
+    from pip._internal.pep425tags import Pep425Tag
+
+    InstalledCSVRow = Tuple[str, ...]
+
+
+VERSION_COMPATIBLE = (1, 0)
+
+
+logger = logging.getLogger(__name__)
+
+
+def normpath(src, p):
+    return os.path.relpath(src, p).replace(os.path.sep, '/')
+
+
+def rehash(path, blocksize=1 << 20):
+    # type: (str, int) -> Tuple[str, str]
+    """Return (hash, length) for path using hashlib.sha256()"""
+    h = hashlib.sha256()
+    length = 0
+    with open(path, 'rb') as f:
+        for block in read_chunks(f, size=blocksize):
+            length += len(block)
+            h.update(block)
+    digest = 'sha256=' + urlsafe_b64encode(
+        h.digest()
+    ).decode('latin1').rstrip('=')
+    # unicode/str python2 issues
+    return (digest, str(length))  # type: ignore
+
+
+def open_for_csv(name, mode):
+    # type: (str, Text) -> IO
+    if sys.version_info[0] < 3:
+        nl = {}  # type: Dict[str, Any]
+        bin = 'b'
+    else:
+        nl = {'newline': ''}  # type: Dict[str, Any]
+        bin = ''
+    return open(name, mode + bin, **nl)
+
+
+def replace_python_tag(wheelname, new_tag):
+    # type: (str, str) -> str
+    """Replace the Python tag in a wheel file name with a new value.
+    """
+    parts = wheelname.split('-')
+    parts[-3] = new_tag
+    return '-'.join(parts)
+
+
+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
+
+
+dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?)
+                                \.dist-info$""", re.VERBOSE)
+
+
+def root_is_purelib(name, wheeldir):
+    # type: (str, str) -> bool
+    """
+    Return True if the extracted wheel in wheeldir should go into purelib.
+    """
+    name_folded = name.replace("-", "_")
+    for item in os.listdir(wheeldir):
+        match = dist_info_re.match(item)
+        if match and match.group('name') == name_folded:
+            with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel:
+                for line in wheel:
+                    line = line.lower().rstrip()
+                    if line == "root-is-purelib: true":
+                        return True
+    return False
+
+
+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):
+        """get the string representation of EntryPoint, remove space and split
+        on '='"""
+        return str(s).replace(" ", "").split("=")
+
+    # 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]
+    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
+    }
+    if not warn_for:
+        return None
+
+    # Format a message
+    msg_lines = []
+    for parent_dir, scripts in warn_for.items():
+        sorted_scripts = sorted(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"))
+
+    # 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
+    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
+
+
+def move_wheel_files(
+    name,  # type: str
+    req,  # type: Requirement
+    wheeldir,  # type: str
+    user=False,  # type: bool
+    home=None,  # type: Optional[str]
+    root=None,  # type: Optional[str]
+    pycompile=True,  # type: bool
+    scheme=None,  # type: Optional[Mapping[str, str]]
+    isolated=False,  # type: bool
+    prefix=None,  # type: Optional[str]
+    warn_script_location=True  # type: bool
+):
+    # type: (...) -> None
+    """Install a wheel"""
+    # TODO: Investigate and break this up.
+    # TODO: Look into moving this into a dedicated class for representing an
+    #       installation.
+
+    if not scheme:
+        scheme = distutils_scheme(
+            name, user=user, home=home, root=root, isolated=isolated,
+            prefix=prefix,
+        )
+
+    if root_is_purelib(name, wheeldir):
+        lib_dir = scheme['purelib']
+    else:
+        lib_dir = scheme['platlib']
+
+    info_dir = []  # type: List[str]
+    data_dirs = []
+    source = wheeldir.rstrip(os.path.sep) + os.path.sep
+
+    # 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):
+        """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, dest, is_base, fixer=None, filter=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.split(os.path.sep, 1)[0].endswith('.data'):
+                continue
+            for s in subdirs:
+                destsubdir = os.path.join(dest, basedir, s)
+                if is_base and basedir == '' and destsubdir.endswith('.data'):
+                    data_dirs.append(s)
+                    continue
+                elif (is_base and
+                        s.endswith('.dist-info') and
+                        canonicalize_name(s).startswith(
+                            canonicalize_name(req.name))):
+                    assert not info_dir, ('Multiple .dist-info directories: ' +
+                                          destsubdir + ', ' +
+                                          ', '.join(info_dir))
+                    info_dir.append(destsubdir)
+            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)
+
+    assert info_dir, "%s .dist-info directory not found" % req
+
+    # Get the defined entry points
+    ep_file = os.path.join(info_dir[0], 'entry_points.txt')
+    console, gui = get_entrypoints(ep_file)
+
+    def is_entrypoint_wrapper(name):
+        # 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 = scheme[subdir]
+            clobber(source, dest, False, fixer=fixer, filter=filter)
+
+    maker = ScriptMaker(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
+
+    # Simplify the script and fix the fact that the default script swallows
+    # every single stack trace.
+    # See https://bitbucket.org/pypa/distlib/issue/34/
+    # See https://bitbucket.org/pypa/distlib/issue/33/
+    def _get_script_text(entry):
+        if entry.suffix is None:
+            raise InstallationError(
+                "Invalid script entry point: %s for req: %s - A callable "
+                "suffix is required. Cf https://packaging.python.org/en/"
+                "latest/distributing.html#console-scripts for more "
+                "information." % (entry, req)
+            )
+        return maker.script_template % {
+            "module": entry.prefix,
+            "import_name": entry.suffix.split(".")[0],
+            "func": entry.suffix,
+        }
+    # ignore type, because mypy disallows assigning to a method,
+    # see https://github.com/python/mypy/issues/2427
+    maker._get_script_text = _get_script_text  # type: ignore
+    maker.script_template = r"""# -*- coding: utf-8 -*-
+import re
+import sys
+
+from %(module)s import %(import_name)s
+
+if __name__ == '__main__':
+    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+    sys.exit(%(func)s())
+"""
+
+    # 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:
+            spec = 'pip = ' + pip_script
+            generated.extend(maker.make(spec))
+
+        if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
+            spec = 'pip%s = %s' % (sys.version[:1], pip_script)
+            generated.extend(maker.make(spec))
+
+        spec = 'pip%s = %s' % (sys.version[:3], pip_script)
+        generated.extend(maker.make(spec))
+        # 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:
+            spec = 'easy_install = ' + easy_install_script
+            generated.extend(maker.make(spec))
+
+        spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script)
+        generated.extend(maker.make(spec))
+        # 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
+    if len(console) > 0:
+        generated_console_scripts = maker.make_multiple(
+            ['%s = %s' % kv for kv in console.items()]
+        )
+        generated.extend(generated_console_scripts)
+
+        if warn_script_location:
+            msg = message_about_scripts_not_on_PATH(generated_console_scripts)
+            if msg is not None:
+                logger.warning(msg)
+
+    if len(gui) > 0:
+        generated.extend(
+            maker.make_multiple(
+                ['%s = %s' % kv for kv in gui.items()],
+                {'gui': True}
+            )
+        )
+
+    # Record pip as the installer
+    installer = os.path.join(info_dir[0], 'INSTALLER')
+    temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip')
+    with open(temp_installer, 'wb') as installer_file:
+        installer_file.write(b'pip\n')
+    shutil.move(temp_installer, installer)
+    generated.append(installer)
+
+    # Record details of all files installed
+    record = os.path.join(info_dir[0], 'RECORD')
+    temp_record = os.path.join(info_dir[0], 'RECORD.pip')
+    with open_for_csv(record, 'r') as record_in:
+        with open_for_csv(temp_record, 'w+') as record_out:
+            reader = csv.reader(record_in)
+            outrows = get_csv_rows_for_installed(
+                reader, installed=installed, changed=changed,
+                generated=generated, lib_dir=lib_dir,
+            )
+            writer = csv.writer(record_out)
+            # Sort to simplify testing.
+            for row in sorted_outrows(outrows):
+                writer.writerow(row)
+    shutil.move(temp_record, record)
+
+
+def wheel_version(source_dir):
+    # type: (Optional[str]) -> Optional[Tuple[int, ...]]
+    """
+    Return the Wheel-Version of an extracted wheel, if possible.
+
+    Otherwise, return None if we couldn't parse / extract it.
+    """
+    try:
+        dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0]
+
+        wheel_data = dist.get_metadata('WHEEL')
+        wheel_data = Parser().parsestr(wheel_data)
+
+        version = wheel_data['Wheel-Version'].strip()
+        version = tuple(map(int, version.split('.')))
+        return version
+    except Exception:
+        return None
+
+
+def check_compatibility(version, name):
+    # type: (Optional[Tuple[int, ...]], str) -> None
+    """
+    Raises errors or warns if called with an incompatible Wheel-Version.
+
+    Pip should refuse to install a Wheel-Version that's a major series
+    ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
+    installing a version only minor version ahead (e.g 1.2 > 1.1).
+
+    version: a 2-tuple representing a Wheel-Version (Major, Minor)
+    name: name of wheel or package to raise exception about
+
+    :raises UnsupportedWheel: when an incompatible Wheel-Version is given
+    """
+    if not version:
+        raise UnsupportedWheel(
+            "%s is in an unsupported or invalid wheel" % name
+        )
+    if version[0] > VERSION_COMPATIBLE[0]:
+        raise UnsupportedWheel(
+            "%s's Wheel-Version (%s) is not compatible with this version "
+            "of pip" % (name, '.'.join(map(str, version)))
+        )
+    elif version > VERSION_COMPATIBLE:
+        logger.warning(
+            'Installing from a newer Wheel-Version (%s)',
+            '.'.join(map(str, version)),
+        )
+
+
+class Wheel(object):
+    """A wheel file"""
+
+    # TODO: Maybe move the class into the models sub-package
+    # TODO: Maybe move the install code into this class
+
+    wheel_file_re = re.compile(
+        r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?))
+        ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
+        \.whl|\.dist-info)$""",
+        re.VERBOSE
+    )
+
+    def __init__(self, filename):
+        # type: (str) -> None
+        """
+        :raises InvalidWheelFilename: when the filename is invalid for a wheel
+        """
+        wheel_info = self.wheel_file_re.match(filename)
+        if not wheel_info:
+            raise InvalidWheelFilename(
+                "%s is not a valid wheel filename." % filename
+            )
+        self.filename = filename
+        self.name = wheel_info.group('name').replace('_', '-')
+        # we'll assume "_" means "-" due to wheel naming scheme
+        # (https://github.com/pypa/pip/issues/1150)
+        self.version = wheel_info.group('ver').replace('_', '-')
+        self.build_tag = wheel_info.group('build')
+        self.pyversions = wheel_info.group('pyver').split('.')
+        self.abis = wheel_info.group('abi').split('.')
+        self.plats = wheel_info.group('plat').split('.')
+
+        # All the tag combinations from this file
+        self.file_tags = {
+            (x, y, z) for x in self.pyversions
+            for y in self.abis for z in self.plats
+        }
+
+    def support_index_min(self, tags=None):
+        # type: (Optional[List[Pep425Tag]]) -> Optional[int]
+        """
+        Return the lowest index that one of the wheel's file_tag combinations
+        achieves in the supported_tags list e.g. if there are 8 supported tags,
+        and one of the file tags is first in the list, then return 0.  Returns
+        None is the wheel is not supported.
+        """
+        if tags is None:  # for mock
+            tags = pep425tags.get_supported()
+        indexes = [tags.index(c) for c in self.file_tags if c in tags]
+        return min(indexes) if indexes else None
+
+    def supported(self, tags=None):
+        # type: (Optional[List[Pep425Tag]]) -> bool
+        """Is this wheel supported on this system?"""
+        if tags is None:  # for mock
+            tags = pep425tags.get_supported()
+        return bool(set(tags).intersection(self.file_tags))
+
+
+def _contains_egg_info(
+        s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)):
+    """Determine whether the string looks like an egg_info.
+
+    :param s: The string to parse. E.g. foo-2.1
+    """
+    return bool(_egg_info_re.search(s))
+
+
+def should_use_ephemeral_cache(
+    req,  # type: InstallRequirement
+    format_control,  # type: FormatControl
+    autobuilding,  # type: bool
+    cache_available  # type: bool
+):
+    # type: (...) -> Optional[bool]
+    """
+    Return whether to build an InstallRequirement object using the
+    ephemeral cache.
+
+    :param cache_available: whether a cache directory is available for the
+        autobuilding=True case.
+
+    :return: True or False to build the requirement with ephem_cache=True
+        or False, respectively; or None not to build the requirement.
+    """
+    if req.constraint:
+        return None
+    if req.is_wheel:
+        if not autobuilding:
+            logger.info(
+                'Skipping %s, due to already being wheel.', req.name,
+            )
+        return None
+    if not autobuilding:
+        return False
+
+    if req.editable or not req.source_dir:
+        return None
+
+    if req.link and not req.link.is_artifact:
+        # VCS checkout. Build wheel just for this run.
+        return True
+
+    if "binary" not in format_control.get_allowed_formats(
+            canonicalize_name(req.name)):
+        logger.info(
+            "Skipping bdist_wheel for %s, due to binaries "
+            "being disabled for it.", req.name,
+        )
+        return None
+
+    link = req.link
+    base, ext = link.splitext()
+    if cache_available and _contains_egg_info(base):
+        return False
+
+    # Otherwise, build the wheel just for this run using the ephemeral
+    # cache since we are either in the case of e.g. a local directory, or
+    # no cache directory is available to use.
+    return True
+
+
+def format_command_result(
+    command_args,  # type: List[str]
+    command_output,  # type: str
+):
+    # type: (...) -> str
+    """
+    Format command information for logging.
+    """
+    command_desc = format_command_args(command_args)
+    text = 'Command arguments: {}\n'.format(command_desc)
+
+    if not command_output:
+        text += 'Command output: None'
+    elif logger.getEffectiveLevel() > logging.DEBUG:
+        text += 'Command output: [use --verbose to show]'
+    else:
+        if not command_output.endswith('\n'):
+            command_output += '\n'
+        text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER)
+
+    return text
+
+
+def get_legacy_build_wheel_path(
+    names,  # type: List[str]
+    temp_dir,  # type: str
+    req,  # type: InstallRequirement
+    command_args,  # type: List[str]
+    command_output,  # type: str
+):
+    # type: (...) -> Optional[str]
+    """
+    Return the path to the wheel in the temporary build directory.
+    """
+    # Sort for determinism.
+    names = sorted(names)
+    if not names:
+        msg = (
+            'Legacy build of wheel for {!r} created no files.\n'
+        ).format(req.name)
+        msg += format_command_result(command_args, command_output)
+        logger.warning(msg)
+        return None
+
+    if len(names) > 1:
+        msg = (
+            'Legacy build of wheel for {!r} created more than one file.\n'
+            'Filenames (choosing first): {}\n'
+        ).format(req.name, names)
+        msg += format_command_result(command_args, command_output)
+        logger.warning(msg)
+
+    return os.path.join(temp_dir, names[0])
+
+
+class WheelBuilder(object):
+    """Build wheels from a RequirementSet."""
+
+    def __init__(
+        self,
+        finder,  # type: PackageFinder
+        preparer,  # type: RequirementPreparer
+        wheel_cache,  # type: WheelCache
+        build_options=None,  # type: Optional[List[str]]
+        global_options=None,  # type: Optional[List[str]]
+        no_clean=False  # type: bool
+    ):
+        # type: (...) -> None
+        self.finder = finder
+        self.preparer = preparer
+        self.wheel_cache = wheel_cache
+
+        self._wheel_dir = preparer.wheel_download_dir
+
+        self.build_options = build_options or []
+        self.global_options = global_options or []
+        self.no_clean = no_clean
+
+    def _build_one(self, req, output_dir, python_tag=None):
+        """Build one wheel.
+
+        :return: The filename of the built wheel, or None if the build failed.
+        """
+        # Install build deps into temporary directory (PEP 518)
+        with req.build_env:
+            return self._build_one_inside_env(req, output_dir,
+                                              python_tag=python_tag)
+
+    def _build_one_inside_env(self, req, output_dir, python_tag=None):
+        with TempDirectory(kind="wheel") as temp_dir:
+            if req.use_pep517:
+                builder = self._build_one_pep517
+            else:
+                builder = self._build_one_legacy
+            wheel_path = builder(req, temp_dir.path, python_tag=python_tag)
+            if wheel_path is not None:
+                wheel_name = os.path.basename(wheel_path)
+                dest_path = os.path.join(output_dir, wheel_name)
+                try:
+                    shutil.move(wheel_path, dest_path)
+                    logger.info('Stored in directory: %s', output_dir)
+                    return dest_path
+                except Exception:
+                    pass
+            # Ignore return, we can't do anything else useful.
+            self._clean_one(req)
+            return None
+
+    def _base_setup_args(self, req):
+        # NOTE: Eventually, we'd want to also -S to the flags here, when we're
+        # isolating. Currently, it breaks Python in virtualenvs, because it
+        # relies on site.py to find parts of the standard library outside the
+        # virtualenv.
+        return [
+            sys.executable, '-u', '-c',
+            SETUPTOOLS_SHIM % req.setup_py
+        ] + list(self.global_options)
+
+    def _build_one_pep517(self, req, tempd, python_tag=None):
+        """Build one InstallRequirement using the PEP 517 build process.
+
+        Returns path to wheel if successfully built. Otherwise, returns None.
+        """
+        assert req.metadata_directory is not None
+        if self.build_options:
+            # PEP 517 does not support --build-options
+            logger.error('Cannot build wheel for %s using PEP 517 when '
+                         '--build-options is present' % (req.name,))
+            return None
+        try:
+            req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,)
+            logger.debug('Destination directory: %s', tempd)
+            wheel_name = req.pep517_backend.build_wheel(
+                tempd,
+                metadata_directory=req.metadata_directory
+            )
+            if python_tag:
+                # General PEP 517 backends don't necessarily support
+                # a "--python-tag" option, so we rename the wheel
+                # file directly.
+                new_name = replace_python_tag(wheel_name, python_tag)
+                os.rename(
+                    os.path.join(tempd, wheel_name),
+                    os.path.join(tempd, new_name)
+                )
+                # Reassign to simplify the return at the end of function
+                wheel_name = new_name
+        except Exception:
+            logger.error('Failed building wheel for %s', req.name)
+            return None
+        return os.path.join(tempd, wheel_name)
+
+    def _build_one_legacy(self, req, tempd, python_tag=None):
+        """Build one InstallRequirement using the "legacy" build process.
+
+        Returns path to wheel if successfully built. Otherwise, returns None.
+        """
+        base_args = self._base_setup_args(req)
+
+        spin_message = 'Building wheel for %s (setup.py)' % (req.name,)
+        with open_spinner(spin_message) as spinner:
+            logger.debug('Destination directory: %s', tempd)
+            wheel_args = base_args + ['bdist_wheel', '-d', tempd] \
+                + self.build_options
+
+            if python_tag is not None:
+                wheel_args += ["--python-tag", python_tag]
+
+            try:
+                output = call_subprocess(wheel_args, cwd=req.setup_py_dir,
+                                         spinner=spinner)
+            except Exception:
+                spinner.finish("error")
+                logger.error('Failed building wheel for %s', req.name)
+                return None
+            names = os.listdir(tempd)
+            wheel_path = get_legacy_build_wheel_path(
+                names=names,
+                temp_dir=tempd,
+                req=req,
+                command_args=wheel_args,
+                command_output=output,
+            )
+            return wheel_path
+
+    def _clean_one(self, req):
+        base_args = self._base_setup_args(req)
+
+        logger.info('Running setup.py clean for %s', req.name)
+        clean_args = base_args + ['clean', '--all']
+        try:
+            call_subprocess(clean_args, cwd=req.source_dir)
+            return True
+        except Exception:
+            logger.error('Failed cleaning build dir for %s', req.name)
+            return False
+
+    def build(
+        self,
+        requirements,  # type: Iterable[InstallRequirement]
+        session,  # type: PipSession
+        autobuilding=False  # type: bool
+    ):
+        # type: (...) -> List[InstallRequirement]
+        """Build wheels.
+
+        :param unpack: If True, replace the sdist we built from with the
+            newly built wheel, in preparation for installation.
+        :return: True if all the wheels built correctly.
+        """
+        buildset = []
+        format_control = self.finder.format_control
+        # Whether a cache directory is available for autobuilding=True.
+        cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir)
+
+        for req in requirements:
+            ephem_cache = should_use_ephemeral_cache(
+                req, format_control=format_control, autobuilding=autobuilding,
+                cache_available=cache_available,
+            )
+            if ephem_cache is None:
+                continue
+
+            buildset.append((req, ephem_cache))
+
+        if not buildset:
+            return []
+
+        # Is any wheel build not using the ephemeral cache?
+        if any(not ephem_cache for _, ephem_cache in buildset):
+            have_directory_for_build = self._wheel_dir or (
+                autobuilding and self.wheel_cache.cache_dir
+            )
+            assert have_directory_for_build
+
+        # TODO by @pradyunsg
+        # Should break up this method into 2 separate methods.
+
+        # Build the wheels.
+        logger.info(
+            'Building wheels for collected packages: %s',
+            ', '.join([req.name for (req, _) in buildset]),
+        )
+        _cache = self.wheel_cache  # shorter name
+        with indent_log():
+            build_success, build_failure = [], []
+            for req, ephem in buildset:
+                python_tag = None
+                if autobuilding:
+                    python_tag = pep425tags.implementation_tag
+                    if ephem:
+                        output_dir = _cache.get_ephem_path_for_link(req.link)
+                    else:
+                        output_dir = _cache.get_path_for_link(req.link)
+                    try:
+                        ensure_dir(output_dir)
+                    except OSError as e:
+                        logger.warning("Building wheel for %s failed: %s",
+                                       req.name, e)
+                        build_failure.append(req)
+                        continue
+                else:
+                    output_dir = self._wheel_dir
+                wheel_file = self._build_one(
+                    req, output_dir,
+                    python_tag=python_tag,
+                )
+                if wheel_file:
+                    build_success.append(req)
+                    if autobuilding:
+                        # XXX: This is mildly duplicative with prepare_files,
+                        # but not close enough to pull out to a single common
+                        # method.
+                        # The code below assumes temporary source dirs -
+                        # prevent it doing bad things.
+                        if req.source_dir and not os.path.exists(os.path.join(
+                                req.source_dir, PIP_DELETE_MARKER_FILENAME)):
+                            raise AssertionError(
+                                "bad source dir - missing marker")
+                        # Delete the source we built the wheel from
+                        req.remove_temporary_source()
+                        # set the build directory again - name is known from
+                        # the work prepare_files did.
+                        req.source_dir = req.build_location(
+                            self.preparer.build_dir
+                        )
+                        # Update the link for this.
+                        req.link = Link(path_to_url(wheel_file))
+                        assert req.link.is_wheel
+                        # extract the wheel into the dir
+                        unpack_url(
+                            req.link, req.source_dir, None, False,
+                            session=session,
+                        )
+                else:
+                    build_failure.append(req)
+
+        # notify success/failure
+        if build_success:
+            logger.info(
+                'Successfully built %s',
+                ' '.join([req.name for req in build_success]),
+            )
+        if build_failure:
+            logger.info(
+                'Failed to build %s',
+                ' '.join([req.name for req in build_failure]),
+            )
+        # Return a list of requirements that failed to build
+        return build_failure
diff --git a/venv/lib/python2.7/site-packages/pip/_internal/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/wheel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3d65c6ba1d5b197df44587298d49baa5a308d2ef
GIT binary patch
literal 32820
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
Ve+Cmy5l%TVTWJnXGfr_%1pwb??=%1a

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py
new file mode 100644
index 00000000..c1d9508d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py
@@ -0,0 +1,109 @@
+"""
+pip._vendor is for vendoring dependencies of pip to prevent needing pip to
+depend on something external.
+
+Files inside of pip._vendor should be considered immutable and should only be
+updated to versions from upstream.
+"""
+from __future__ import absolute_import
+
+import glob
+import os.path
+import sys
+
+# Downstream redistributors which have debundled our dependencies should also
+# patch this value to be true. This will trigger the additional patching
+# to cause things like "six" to be available as pip.
+DEBUNDLED = False
+
+# By default, look in this directory for a bunch of .whl files which we will
+# add to the beginning of sys.path before attempting to import anything. This
+# is done to support downstream re-distributors like Debian and Fedora who
+# wish to create their own Wheels for our dependencies to aid in debundling.
+WHEEL_DIR = os.path.abspath(os.path.dirname(__file__))
+
+
+# Define a small helper function to alias our vendored modules to the real ones
+# if the vendored ones do not exist. This idea of this was taken from
+# https://github.com/kennethreitz/requests/pull/2567.
+def vendored(modulename):
+    vendored_name = "{0}.{1}".format(__name__, 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
+    else:
+        sys.modules[vendored_name] = sys.modules[modulename]
+        base, head = vendored_name.rsplit(".", 1)
+        setattr(sys.modules[base], head, sys.modules[modulename])
+
+
+# If we're operating in a debundled setup, then we want to go ahead and trigger
+# the aliasing of our vendored libraries as well as looking for wheels to add
+# to our sys.path. This will cause all of this code to be a no-op typically
+# however downstream redistributors can enable it in a consistent way across
+# all platforms.
+if DEBUNDLED:
+    # Actually look inside of WHEEL_DIR to find .whl files and add them to the
+    # front of our sys.path.
+    sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path
+
+    # Actually alias all of our vendored dependencies.
+    vendored("cachecontrol")
+    vendored("colorama")
+    vendored("distlib")
+    vendored("distro")
+    vendored("html5lib")
+    vendored("lockfile")
+    vendored("six")
+    vendored("six.moves")
+    vendored("six.moves.urllib")
+    vendored("six.moves.urllib.parse")
+    vendored("packaging")
+    vendored("packaging.version")
+    vendored("packaging.specifiers")
+    vendored("pep517")
+    vendored("pkg_resources")
+    vendored("progress")
+    vendored("pytoml")
+    vendored("retrying")
+    vendored("requests")
+    vendored("requests.exceptions")
+    vendored("requests.packages")
+    vendored("requests.packages.urllib3")
+    vendored("requests.packages.urllib3._collections")
+    vendored("requests.packages.urllib3.connection")
+    vendored("requests.packages.urllib3.connectionpool")
+    vendored("requests.packages.urllib3.contrib")
+    vendored("requests.packages.urllib3.contrib.ntlmpool")
+    vendored("requests.packages.urllib3.contrib.pyopenssl")
+    vendored("requests.packages.urllib3.exceptions")
+    vendored("requests.packages.urllib3.fields")
+    vendored("requests.packages.urllib3.filepost")
+    vendored("requests.packages.urllib3.packages")
+    vendored("requests.packages.urllib3.packages.ordered_dict")
+    vendored("requests.packages.urllib3.packages.six")
+    vendored("requests.packages.urllib3.packages.ssl_match_hostname")
+    vendored("requests.packages.urllib3.packages.ssl_match_hostname."
+             "_implementation")
+    vendored("requests.packages.urllib3.poolmanager")
+    vendored("requests.packages.urllib3.request")
+    vendored("requests.packages.urllib3.response")
+    vendored("requests.packages.urllib3.util")
+    vendored("requests.packages.urllib3.util.connection")
+    vendored("requests.packages.urllib3.util.request")
+    vendored("requests.packages.urllib3.util.response")
+    vendored("requests.packages.urllib3.util.retry")
+    vendored("requests.packages.urllib3.util.ssl_")
+    vendored("requests.packages.urllib3.util.timeout")
+    vendored("requests.packages.urllib3.util.url")
+    vendored("urllib3")
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8f9a4aa20be66012998df4036ccf6de8c8621f75
GIT binary patch
literal 3389
zcmZSn%*&NH<x)&C0~D|@FfcecFfbI?GBGfuFfc?hFr+Xtq%bk$Ff!yaF+?#jFoO8Z
z3^~jUQOsaDW`-OVhA37Tn~fogjUkntA&P?`m6aijlOc->#^7d1<zZ-M1feKih7=Zt
z76yhWK892dhN4QQRAz=OW|&HThE!gL6jp|2CXnJ(Hjp{u5K1GJk0FH(B+Lk6vBOy$
za26+=#RX?^!&zV_fc5gi#rWVXemF}2&Ju*Pgy1Y;I7<Z15{0wG;4E=CO9IZ4gtMgJ
zENM7P2F{X&v*h3`c{ob}&QgT4l;A97I7<c2QiZeB;4F1GO9Rf*gtN5ZENwVT2hP%k
zv-IFBeK^Yi&N76vjNmL|ILidiG6l2p7#LER8G<#;7#J9e?=Ubha1~@0=*5?%=B4Bp
zDP$Haq~#YWKzNyX=?W>S1*v%{sd>qnsl^KUX$l3I1qvnk3I#=}WvO{33VEriDIjGK
zVJ?Vjh5S5);{4pyk_?bkYDGzEQC?z>9v7EeW=?9cLS|lZW=bm5Fu2Xd8Tq9-DGEuc
z3d#9k1x2YT3YodNr6q|;IjIVXc_|7|CHZ+dl?q9zT%`pmi6yBiAm@~&78Pga=M^iY
z73JqDlok}16s0ES>TzX)@|^}F0|P?|KLZ0pVp4H_PH9PMd}eMzeo={EGDrrLC)pSn
z7@R@*atZ@DM`kfFlrS>XFo1GMEh9sv0z(NCh+D$U(9FP4!U7^wm_Py9%*@Cbo+rq_
zQo_oR&BajU%D~9TnCHz9QNqTM#SYRV31u-d*wipGWO0CUCM560Ffr6JG1M|MlyEXY
z6)`bL)-c033=ERZ%nXbv3=F{<AQ$=-vokO-R2$UlRU6ipure?(<fN9R=72p}0`iJp
zCWzGF0{IuDAuYcsH?gFIgMon|K0YroH#I)K1SA;`4S@Lg5|D}MIr&M6ImIO)Ejjtg
zASO2h1A`|xkX(z3@{3BCL8+y(7_2-uKczG$6{5VTxF9F91T0*fT9Q~&QltS2Pp~Zz
zbs%d?co`TNAZaQ!1?-R#kgBA_;#4prBQ-Ha0~}Q#qBxy_fkD5ZD6=fFBvrpGu}D8H
zKPM%%s8~O{P(Qoa$lTnpFw4li%+SKTIHxkbJl-V5#KgeBz#u(OKSaMEvp_d9uec;J
zCr7tD(Xuo!10)2-&_u2uAD@|*SrQ+wS5OHK8<@*vL7o%<Ie}4#iJ4J>k(ZN&NrX{?
zu^1HAT6*OfIVC&{3=GMM$r-81`FSNp`8i+%lJj%&ixP7a!QqgSSzMBnnFJ0^5W6TJ
ztR|x*H^&qt4vLMO{N(Jk%$!t6xMo%qbAqhStkBENFH0>h2Dzaa#?vb;%E`%0Di%Xl
z0u|INNGvK&Edl8+NKDR7OwY_qFBW8AV1V=VU|B;1MYOmeH90daGqng3jRmO%riSL=
zXe!7~k1t9s&Mz%WPAvwzyr3vQy(qO9s<N^qKNsTbqSTV2%FMiUu%e>W!qU{@lHy`v
z1_lNgM=!M^Iklh!lrzDuf{R0(ms(sbiL4qX3iX_Eu^K*Ez4+w(oSf8Ti18|Tl_uxs
z<v~?~(iw(3U^eO@6c*&?=M*avGPR^AGpSgM7*%?CB{{iZL$!%gUQn4|keXLqoKuY7
zYe+$?fY;!(%+#Ee;$kHNigHp5@{3CdD1*gRu|8hYV9NCJi&9dHQd8nnGLuUP#421*
zab`uaDRIUZ7w5$1CYB^;#AoCemw-x~Vpno?>Ve9}oYdUZyplw4(o)55Qht6;Zem_y
zdTJ4Y)B;O%_#>bwwYVTZuQ;_>4zIPPC7C(Jngo>~rDp=c4l+;==0tVE2E*NnKXpQl
zEh(xjRwisHC?1J%XGvymYJMr9L<+XMv?vE$DnklUV+~Nz3KocuPsvY)*N17PC8b5F
z@$o^R(jQzWfht9?!u(>rg2a-H5+())hWz3nP+1GEd)*Rqphd5Xt5c|-i;t@dSR+_5
zs9H@-Du%ODGK)aT5?oZq$AgOg_;_%!9q!@k>J#tc859I6w!sEu<!9!BN+|{eLH8=r
r22y$3f&5Wi#K6G7#wftV!^p$P!^*}c$Hpne#;nQA#Yh#%gxwSXgz=G{

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py b/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py
new file mode 100644
index 00000000..2bd39110
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py
@@ -0,0 +1,604 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2005-2010 ActiveState Software Inc.
+# Copyright (c) 2013 Eddy Petrișor
+
+"""Utilities for determining application-specific dirs.
+
+See <http://github.com/ActiveState/appdirs> for details and usage.
+"""
+# Dev Notes:
+# - MSDN on where to store app data files:
+#   http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120
+# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html
+# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
+
+__version_info__ = (1, 4, 3)
+__version__ = '.'.join(map(str, __version_info__))
+
+
+import sys
+import os
+
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    unicode = str
+
+if sys.platform.startswith('java'):
+    import platform
+    os_name = platform.java_ver()[3][0]
+    if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc.
+        system = 'win32'
+    elif os_name.startswith('Mac'): # "Mac OS X", etc.
+        system = 'darwin'
+    else: # "Linux", "SunOS", "FreeBSD", etc.
+        # Setting this to "linux2" is not ideal, but only Windows or Mac
+        # are actually checked for and the rest of the module expects
+        # *sys.platform* style strings.
+        system = 'linux2'
+else:
+    system = sys.platform
+
+
+
+def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        Mac OS X:               ~/Library/Application Support/<AppName>
+        Unix:                   ~/.local/share/<AppName>    # or in $XDG_DATA_HOME, if defined
+        Win XP (not roaming):   C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName>
+        Win XP (roaming):       C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>
+        Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>
+        Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName>
+
+    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
+    That means, by default "~/.local/share/<AppName>".
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
+        path = os.path.normpath(_get_win_folder(const))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+    elif system == 'darwin':
+        path = os.path.expanduser('~/Library/Application Support/')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def site_data_dir(appname=None, appauthor=None, version=None, multipath=False):
+    r"""Return full path to the user-shared data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "multipath" is an optional parameter only applicable to *nix
+            which indicates that the entire list of data dirs should be
+            returned. By default, the first item from XDG_DATA_DIRS is
+            returned, or '/usr/local/share/<AppName>',
+            if XDG_DATA_DIRS is not set
+
+    Typical site data directories are:
+        Mac OS X:   /Library/Application Support/<AppName>
+        Unix:       /usr/local/share/<AppName> or /usr/share/<AppName>
+        Win XP:     C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName>
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
+        Win 7:      C:\ProgramData\<AppAuthor>\<AppName>   # Hidden, but writeable on Win 7.
+
+    For Unix, this is using the $XDG_DATA_DIRS[0] default.
+
+    WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+    elif system == 'darwin':
+        path = os.path.expanduser('/Library/Application Support')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        # XDG default for $XDG_DATA_DIRS
+        # only first, if multipath is False
+        path = os.getenv('XDG_DATA_DIRS',
+                         os.pathsep.join(['/usr/local/share', '/usr/share']))
+        pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
+        if appname:
+            if version:
+                appname = os.path.join(appname, version)
+            pathlist = [os.sep.join([x, appname]) for x in pathlist]
+
+        if multipath:
+            path = os.pathsep.join(pathlist)
+        else:
+            path = pathlist[0]
+        return path
+
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_config_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific config dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user config directories are:
+        Mac OS X:               same as user_data_dir
+        Unix:                   ~/.config/<AppName>     # or in $XDG_CONFIG_HOME, if defined
+        Win *:                  same as user_data_dir
+
+    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
+    That means, by default "~/.config/<AppName>".
+    """
+    if system in ["win32", "darwin"]:
+        path = user_data_dir(appname, appauthor, None, roaming)
+    else:
+        path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def site_config_dir(appname=None, appauthor=None, version=None, multipath=False):
+    r"""Return full path to the user-shared data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "multipath" is an optional parameter only applicable to *nix
+            which indicates that the entire list of config dirs should be
+            returned. By default, the first item from XDG_CONFIG_DIRS is
+            returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set
+
+    Typical site config directories are:
+        Mac OS X:   same as site_data_dir
+        Unix:       /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in
+                    $XDG_CONFIG_DIRS
+        Win *:      same as site_data_dir
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
+
+    For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False
+
+    WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
+    """
+    if system in ["win32", "darwin"]:
+        path = site_data_dir(appname, appauthor)
+        if appname and version:
+            path = os.path.join(path, version)
+    else:
+        # XDG default for $XDG_CONFIG_DIRS
+        # only first, if multipath is False
+        path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg')
+        pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
+        if appname:
+            if version:
+                appname = os.path.join(appname, version)
+            pathlist = [os.sep.join([x, appname]) for x in pathlist]
+
+        if multipath:
+            path = os.pathsep.join(pathlist)
+        else:
+            path = pathlist[0]
+    return path
+
+
+def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True):
+    r"""Return full path to the user-specific cache dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "opinion" (boolean) can be False to disable the appending of
+            "Cache" to the base app data dir for Windows. See
+            discussion below.
+
+    Typical user cache directories are:
+        Mac OS X:   ~/Library/Caches/<AppName>
+        Unix:       ~/.cache/<AppName> (XDG default)
+        Win XP:     C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache
+        Vista:      C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache
+
+    On Windows the only suggestion in the MSDN docs is that local settings go in
+    the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming
+    app data dir (the default returned by `user_data_dir` above). Apps typically
+    put cache data somewhere *under* the given dir here. Some examples:
+        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
+        ...\Acme\SuperApp\Cache\1.0
+    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
+    This can be disabled with the `opinion=False` option.
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+            if opinion:
+                path = os.path.join(path, "Cache")
+    elif system == 'darwin':
+        path = os.path.expanduser('~/Library/Caches')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache'))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_state_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific state dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user state directories are:
+        Mac OS X:  same as user_data_dir
+        Unix:      ~/.local/state/<AppName>   # or in $XDG_STATE_HOME, if defined
+        Win *:     same as user_data_dir
+
+    For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state>
+    to extend the XDG spec and support $XDG_STATE_HOME.
+
+    That means, by default "~/.local/state/<AppName>".
+    """
+    if system in ["win32", "darwin"]:
+        path = user_data_dir(appname, appauthor, None, roaming)
+    else:
+        path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_log_dir(appname=None, appauthor=None, version=None, opinion=True):
+    r"""Return full path to the user-specific log dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "opinion" (boolean) can be False to disable the appending of
+            "Logs" to the base app data dir for Windows, and "log" to the
+            base cache dir for Unix. See discussion below.
+
+    Typical user log directories are:
+        Mac OS X:   ~/Library/Logs/<AppName>
+        Unix:       ~/.cache/<AppName>/log  # or under $XDG_CACHE_HOME if defined
+        Win XP:     C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs
+        Vista:      C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs
+
+    On Windows the only suggestion in the MSDN docs is that local settings
+    go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in
+    examples of what some windows apps use for a logs dir.)
+
+    OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA`
+    value for Windows and appends "log" to the user cache dir for Unix.
+    This can be disabled with the `opinion=False` option.
+    """
+    if system == "darwin":
+        path = os.path.join(
+            os.path.expanduser('~/Library/Logs'),
+            appname)
+    elif system == "win32":
+        path = user_data_dir(appname, appauthor, version)
+        version = False
+        if opinion:
+            path = os.path.join(path, "Logs")
+    else:
+        path = user_cache_dir(appname, appauthor, version)
+        version = False
+        if opinion:
+            path = os.path.join(path, "log")
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+class AppDirs(object):
+    """Convenience wrapper for getting application dirs."""
+    def __init__(self, appname=None, appauthor=None, version=None,
+            roaming=False, multipath=False):
+        self.appname = appname
+        self.appauthor = appauthor
+        self.version = version
+        self.roaming = roaming
+        self.multipath = multipath
+
+    @property
+    def user_data_dir(self):
+        return user_data_dir(self.appname, self.appauthor,
+                             version=self.version, roaming=self.roaming)
+
+    @property
+    def site_data_dir(self):
+        return site_data_dir(self.appname, self.appauthor,
+                             version=self.version, multipath=self.multipath)
+
+    @property
+    def user_config_dir(self):
+        return user_config_dir(self.appname, self.appauthor,
+                               version=self.version, roaming=self.roaming)
+
+    @property
+    def site_config_dir(self):
+        return site_config_dir(self.appname, self.appauthor,
+                             version=self.version, multipath=self.multipath)
+
+    @property
+    def user_cache_dir(self):
+        return user_cache_dir(self.appname, self.appauthor,
+                              version=self.version)
+
+    @property
+    def user_state_dir(self):
+        return user_state_dir(self.appname, self.appauthor,
+                              version=self.version)
+
+    @property
+    def user_log_dir(self):
+        return user_log_dir(self.appname, self.appauthor,
+                            version=self.version)
+
+
+#---- internal support stuff
+
+def _get_win_folder_from_registry(csidl_name):
+    """This is a fallback technique at best. I'm not sure if using the
+    registry for this guarantees us the correct answer for all CSIDL_*
+    names.
+    """
+    if PY3:
+      import winreg as _winreg
+    else:
+      import _winreg
+
+    shell_folder_name = {
+        "CSIDL_APPDATA": "AppData",
+        "CSIDL_COMMON_APPDATA": "Common AppData",
+        "CSIDL_LOCAL_APPDATA": "Local AppData",
+    }[csidl_name]
+
+    key = _winreg.OpenKey(
+        _winreg.HKEY_CURRENT_USER,
+        r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
+    )
+    dir, type = _winreg.QueryValueEx(key, shell_folder_name)
+    return dir
+
+
+def _get_win_folder_with_pywin32(csidl_name):
+    from win32com.shell import shellcon, shell
+    dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0)
+    # Try to make this a unicode path because SHGetFolderPath does
+    # not return unicode strings when there is unicode data in the
+    # path.
+    try:
+        dir = unicode(dir)
+
+        # Downgrade to short path name if have highbit chars. See
+        # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+        has_high_char = False
+        for c in dir:
+            if ord(c) > 255:
+                has_high_char = True
+                break
+        if has_high_char:
+            try:
+                import win32api
+                dir = win32api.GetShortPathName(dir)
+            except ImportError:
+                pass
+    except UnicodeError:
+        pass
+    return dir
+
+
+def _get_win_folder_with_ctypes(csidl_name):
+    import ctypes
+
+    csidl_const = {
+        "CSIDL_APPDATA": 26,
+        "CSIDL_COMMON_APPDATA": 35,
+        "CSIDL_LOCAL_APPDATA": 28,
+    }[csidl_name]
+
+    buf = ctypes.create_unicode_buffer(1024)
+    ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in buf:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf2 = ctypes.create_unicode_buffer(1024)
+        if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
+            buf = buf2
+
+    return buf.value
+
+def _get_win_folder_with_jna(csidl_name):
+    import array
+    from com.sun import jna
+    from com.sun.jna.platform import win32
+
+    buf_size = win32.WinDef.MAX_PATH * 2
+    buf = array.zeros('c', buf_size)
+    shell = win32.Shell32.INSTANCE
+    shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf)
+    dir = jna.Native.toString(buf.tostring()).rstrip("\0")
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in dir:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf = array.zeros('c', buf_size)
+        kernel = win32.Kernel32.INSTANCE
+        if kernel.GetShortPathName(dir, buf, buf_size):
+            dir = jna.Native.toString(buf.tostring()).rstrip("\0")
+
+    return dir
+
+if system == "win32":
+    try:
+        from ctypes import windll
+        _get_win_folder = _get_win_folder_with_ctypes
+    except ImportError:
+        try:
+            import com.sun.jna
+            _get_win_folder = _get_win_folder_with_jna
+        except ImportError:
+            _get_win_folder = _get_win_folder_from_registry
+
+
+#---- self test code
+
+if __name__ == "__main__":
+    appname = "MyApp"
+    appauthor = "MyCompany"
+
+    props = ("user_data_dir",
+             "user_config_dir",
+             "user_cache_dir",
+             "user_state_dir",
+             "user_log_dir",
+             "site_data_dir",
+             "site_config_dir")
+
+    print("-- app dirs %s --" % __version__)
+
+    print("-- app dirs (with optional 'version')")
+    dirs = AppDirs(appname, appauthor, version="1.0")
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (without optional 'version')")
+    dirs = AppDirs(appname, appauthor)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (without optional 'appauthor')")
+    dirs = AppDirs(appname)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (with disabled 'appauthor')")
+    dirs = AppDirs(appname, appauthor=False)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d287754f7999c25eb9a6d12cf3b330cff4887781
GIT binary patch
literal 23861
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py
new file mode 100644
index 00000000..8fdee66f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py
@@ -0,0 +1,11 @@
+"""CacheControl import Interface.
+
+Make it easy to import from cachecontrol without long namespaces.
+"""
+__author__ = "Eric Larson"
+__email__ = "eric@ionrock.org"
+__version__ = "0.12.5"
+
+from .wrapper import CacheControl
+from .adapter import CacheControlAdapter
+from .controller import CacheController
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1ee2f8098f19a8b8d658fb41ed36dcf5adef54d8
GIT binary patch
literal 630
zcmZSn%*&NH<x)&C0~9bZFfceUFfbJRFfcHrFfc?hFr+XtL@_d?Ffl|iF{CgvL@_g@
zurQ>sGUTu@<gzkEu`)1%_-qV0Yz(>V3{mV5K08AW2SY9=Llh?iV+sdDum&f{)FcK5
z2Is`&j8y0Rypp2)9EHr>g8ZTq1<$;a)S|S+<WxN_F5krLRE5kEh1A62N`;bqn3A-j
z{9J`(kltjd-tx?njQr9Pg`E7nbcMXc+|=TN#N^asJ+5MI1_lP#qReCkpTwf#{JdfT
z1_p-IqReE6%>2Bf{N!xC{G#+?HU<U;13g0{J=07^1_lNV5K+Q|=0J$3Fq)`iN@77t
zY7s<|A5AhRwa8C{i-Ccmgq?wbAwE7OKRG_W1SAk2pIBOwkzW)aUjhn^`1sV^#LS%d
z_!5wN<KxRxi;6Sz^Wx*d8q13k3kp(;f<O@i7D$9x8U%JH$T(;?<fIk_fuc<Vq!K|C
zmoP9e=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-RHm25o1~bS
z7#J8Br03~}=oe%b=w{{>mn7!o=$0p1mIh{kgupnyEHy7BzepcBF7)H$GxIV_;^XxS
hDoZ#R7#M7F^HWN5Qtenku?`AUHbyXH5?~Zy1OV&0q1gZc

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py
new file mode 100644
index 00000000..f1e0ad94
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py
@@ -0,0 +1,57 @@
+import logging
+
+from pip._vendor import requests
+
+from pip._vendor.cachecontrol.adapter import CacheControlAdapter
+from pip._vendor.cachecontrol.cache import DictCache
+from pip._vendor.cachecontrol.controller import logger
+
+from argparse import ArgumentParser
+
+
+def setup_logging():
+    logger.setLevel(logging.DEBUG)
+    handler = logging.StreamHandler()
+    logger.addHandler(handler)
+
+
+def get_session():
+    adapter = CacheControlAdapter(
+        DictCache(), cache_etags=True, serializer=None, heuristic=None
+    )
+    sess = requests.Session()
+    sess.mount("http://", adapter)
+    sess.mount("https://", adapter)
+
+    sess.cache_controller = adapter.controller
+    return sess
+
+
+def get_args():
+    parser = ArgumentParser()
+    parser.add_argument("url", help="The URL to try and cache")
+    return parser.parse_args()
+
+
+def main(args=None):
+    args = get_args()
+    sess = get_session()
+
+    # Make a request to get a response
+    resp = sess.get(args.url)
+
+    # Turn on logging
+    setup_logging()
+
+    # try setting the cache
+    sess.cache_controller.cache_response(resp.request, resp.raw)
+
+    # Now try to get it
+    if sess.cache_controller.cached_request(resp.request):
+        print("Cached!")
+    else:
+        print("Not cached :(")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..695a7c7d3916515ade7f65d2a4c0f6cd294d30df
GIT binary patch
literal 2288
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI)Wnf@PVPHsMWXNG)h=Q=07;+dHa+w&Sm>3vA
za?A`l%nZ3K3{fl)J_|z*D?=_DLlhf?&&rU)&XCK&5XAxEvoYjwGUReGL~$`Nrm!=#
zFfc@MGo)~U89WRroL~ko$j%flh89MKD1L@i0frQAhHNH=qL~b-{0z+u42*eTR|RYE
zFfcG={{R2~zn=yp0|P?|2Ll5`QEFjnYH>+1L`0Z@fx$U3IV06MKd+=HKgTg8v7jWi
z2qMYJz`)>=nOp)^01;wiU|`6}Pfv#_;bUN6a4bqM%}vcK2}mp|PAvk56Ua7DI5~sD
zNf%@_149-gLkSZ@7BfRLBLgFd#R76`EdxUd149-oLk$C1B87n=7;KfF2FR`;W{_r(
zyNgpxd{WC&b4u8uPRPtlFJT3_(A6o_y@Z#6fg!l0C^a$HBQY-}C$*@Ai-Cb5F(n1c
z1)B-hn*ov607WO5C@x@NV9+lp$}CGPN!2e)EYeTQ&q+xwD%Q^~)Xy$9GB-CY%rY`B
zGqf--&Z$f<k2gs%F)=VOFi6kS5795kEYQu&D=taQ$<ZxOv@8wG011I{d|7H<N`8@k
zGAMwPApxu(pPZYbS5OIdaB*r$X+b<FJTvpsL6KDq@-qXY03#10I2=J?2=Y8Q9AiO2
z!N5?$2nx3paA>A5fm0weh-_wL1_dSyC@`BD7-|_AY8V-^*ceh+z+ub8zzF5D!ubpg
zS?nNH@f;vB7#!k$CEN@Q3}7e6r<Nq97lQ+`IJGD<F(<PswWtJ?Dl$?_i!zH#GLwrz
zv5`?yQedU8Ukq|7h+S-@ude}876eKMK_E|*urM$%gcOygf*F4Kd8t95@CQdoaB6XJ
zW_}(xGIR4w^Gd)rLc<FblLBxDAp|wRrh;rwgd|z8!NsY?#o#yv69W^mpx{eSEr|!Y
zB{M%y2$Tgt*@S_SnNg03hf#o0fC(DCpx^-o3^;n#AkhnoItEY-Wif)YITJ$)D9bQ1
z)-W(+F@d5!SOcWTuLP7eN{e#99?wY4DJYfzg>gozLTHeWLP@?tNl~RjVqS^@I4(6n
zs)IlpOL!m|BR&zDZ^6M`0Lr`|A!xw>N{C>wB5+WGiGc}EP^tojXJS!$u^cEcK~7^}
z<YW|POa=uY$YUT34#X_vK!oHJXhvWHhbbs18ETmrO2CB=I7hI8GD!^+I4dwQWN|Pw
zL$eAiLl!3kM539Ip(qg)9qt}^tPCkk4DKG_f(m4>A2<(y%g7YPVqOLY2EY6gNT8=E
zSZQc*F)%O$$$|)RkmEpF(o;)<K#>&$N-IGkAYo7n0Y_APQEG8PeqM1ZIB!5pYj9i_
zC6<@Km8HZ(rN9vjP6MC-3K9bu28!mQ)ZzkgtbvJvi8_!wauYN2R6x-N%Eh2)<75_M
zW@naU7G>mM0@q0K@gOzv@fw1lKmx@sxCko9EYO3Nppddcfq{VmNl*_QT+k9h4_XR<
zOPmr=GQp`5tPN5qDdRH{YI06$5uy@GEJ_Dw3UEe(#2zS8A<+x+V2~;({6R@JK0Yro
zH#I&U9Q+7kU?KwKAe-F$l+v73J5Zh}1|<_7CIKb^aB(ES%*n>d!^y@Y!ovsvPYM(6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py
new file mode 100644
index 00000000..780eb288
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py
@@ -0,0 +1,133 @@
+import types
+import functools
+import zlib
+
+from pip._vendor.requests.adapters import HTTPAdapter
+
+from .controller import CacheController
+from .cache import DictCache
+from .filewrapper import CallbackFileWrapper
+
+
+class CacheControlAdapter(HTTPAdapter):
+    invalidating_methods = {"PUT", "DELETE"}
+
+    def __init__(
+        self,
+        cache=None,
+        cache_etags=True,
+        controller_class=None,
+        serializer=None,
+        heuristic=None,
+        cacheable_methods=None,
+        *args,
+        **kw
+    ):
+        super(CacheControlAdapter, self).__init__(*args, **kw)
+        self.cache = cache or DictCache()
+        self.heuristic = heuristic
+        self.cacheable_methods = cacheable_methods or ("GET",)
+
+        controller_factory = controller_class or CacheController
+        self.controller = controller_factory(
+            self.cache, cache_etags=cache_etags, serializer=serializer
+        )
+
+    def send(self, request, cacheable_methods=None, **kw):
+        """
+        Send a request. Use the request information to see if it
+        exists in the cache and cache the response if we need to and can.
+        """
+        cacheable = cacheable_methods or self.cacheable_methods
+        if request.method in cacheable:
+            try:
+                cached_response = self.controller.cached_request(request)
+            except zlib.error:
+                cached_response = None
+            if cached_response:
+                return self.build_response(request, cached_response, from_cache=True)
+
+            # check for etags and add headers if appropriate
+            request.headers.update(self.controller.conditional_headers(request))
+
+        resp = super(CacheControlAdapter, self).send(request, **kw)
+
+        return resp
+
+    def build_response(
+        self, request, response, from_cache=False, cacheable_methods=None
+    ):
+        """
+        Build a response by making a request or using the cache.
+
+        This will end up calling send and returning a potentially
+        cached response
+        """
+        cacheable = cacheable_methods or self.cacheable_methods
+        if not from_cache and request.method in cacheable:
+            # Check for any heuristics that might update headers
+            # before trying to cache.
+            if self.heuristic:
+                response = self.heuristic.apply(response)
+
+            # apply any expiration heuristics
+            if response.status == 304:
+                # We must have sent an ETag request. This could mean
+                # that we've been expired already or that we simply
+                # have an etag. In either case, we want to try and
+                # update the cache if that is the case.
+                cached_response = self.controller.update_cached_response(
+                    request, response
+                )
+
+                if cached_response is not response:
+                    from_cache = True
+
+                # We are done with the server response, read a
+                # possible response body (compliant servers will
+                # not return one, but we cannot be 100% sure) and
+                # release the connection back to the pool.
+                response.read(decode_content=False)
+                response.release_conn()
+
+                response = cached_response
+
+            # We always cache the 301 responses
+            elif response.status == 301:
+                self.controller.cache_response(request, response)
+            else:
+                # Wrap the response file with a wrapper that will cache the
+                #   response when the stream has been consumed.
+                response._fp = CallbackFileWrapper(
+                    response._fp,
+                    functools.partial(
+                        self.controller.cache_response, request, response
+                    ),
+                )
+                if response.chunked:
+                    super_update_chunk_length = response._update_chunk_length
+
+                    def _update_chunk_length(self):
+                        super_update_chunk_length()
+                        if self.chunk_left == 0:
+                            self._fp._close()
+
+                    response._update_chunk_length = types.MethodType(
+                        _update_chunk_length, response
+                    )
+
+        resp = super(CacheControlAdapter, self).build_response(request, response)
+
+        # See if we should invalidate the cache.
+        if request.method in self.invalidating_methods and resp.ok:
+            cache_url = self.controller.cache_url(request.url)
+            self.cache.delete(cache_url)
+
+        # Give the request a from_cache attr to let people use it
+        resp.from_cache = from_cache
+
+        return resp
+
+    def close(self):
+        self.cache.close()
+        super(CacheControlAdapter, self).close()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..71cde4f50e8cd56021162e35ee2414be2ec859fa
GIT binary patch
literal 4042
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py
new file mode 100644
index 00000000..94e07732
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py
@@ -0,0 +1,39 @@
+"""
+The cache object API for implementing caches. The default is a thread
+safe in-memory dictionary.
+"""
+from threading import Lock
+
+
+class BaseCache(object):
+
+    def get(self, key):
+        raise NotImplementedError()
+
+    def set(self, key, value):
+        raise NotImplementedError()
+
+    def delete(self, key):
+        raise NotImplementedError()
+
+    def close(self):
+        pass
+
+
+class DictCache(BaseCache):
+
+    def __init__(self, init_dict=None):
+        self.lock = Lock()
+        self.data = init_dict or {}
+
+    def get(self, key):
+        return self.data.get(key, None)
+
+    def set(self, key, value):
+        with self.lock:
+            self.data.update({key: value})
+
+    def delete(self, key):
+        with self.lock:
+            if key in self.data:
+                self.data.pop(key)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8d2a421f845a8db73a72eabc5a79e8ec5c7cf3f1
GIT binary patch
literal 2923
zcmZSn%*&NH<x)&C0~9bbFfceUFfbImF)%QsFfc?hFr+Xtq%bk$Ff!yaF+?#jFs3jw
zq%t$4F*2mEFtji*G&3+nMzJuYurj2wfJNEhqO1%l><qyg93b<O7#JA1LNZbnk`t3N
zQWf%(vQm>v6dVIQ71HvH6f$!Qa#C|s^GY)F(jh8}^%Ov=Q&Q6sOLIyTGK&=w6-qLS
zQWI0SiWAdP6*BX5b5nEkiz*dTGLuU(^YapmD)qQB|NsC0UxSf>fuV$jfq}s%KRLUE
zlYxQ3DX}=!8DufsqaZa-AcyHNFfgPtFhnteyxYP6@?r`j$O}=-Ab*2ISQt{6!6K{-
zLBSdzgOiyU7#KhpWQ;S&7+#Q_;LvCSn-mOog&&wK5oTau@XIgpg!wWx#kHs?zeodQ
z0@$I&sX1vSps>$Qt<(TT1(+x<WME*>FDS|^ODsv%FH0=aPs`6qNi8bY&o0!@E;ceZ
zH!RFDGA}c<FfY!jOfQc&Nii`oFfcGk&(jalFUTy=&CDw<NzBR7El;#84a@)ufpL6U
zYF<iykv=#slJoOQit=+H9KC`{ushOIOSnMZ0=bZZF&X4E5GKmIK_E>UAmu?|0u*2+
ztPBhcWr;bZsbHUhi2?LpacT)D!iqsIWnd&NHX+^v=|p%B>>n^OK%Qa)W!Kc4)RI&I
zq-X<07Yu__DJUvZ7#LuQ6P(gO3cx-AyB|ypkS9QCBsnL)I2Dv%pmC!C@>vO}2#Jr+
zOUzA;j|V5r`1suXl+v8k`1l}@t{`>>28JMzsvuBy2YUiR42*YzKmiMKQZa~NW8!26
zL2z;8l9^nBS{#9r6Sz3iM-)da;1Y?E0aOq{N+cFoiNp#kk=Q^b5-0@VX&7V@IIiX4
zB~lFoLp&ox4I@K=C_^R#1BlB6G8>i*z_}EZ7Qkgu4ye!sCzQmJL~s!WP90!}XXa&=
z#Dfalfeu_~iU7MOUJ{h#K`v%s<UwR+kgvc20ZL6Z3=CNe3|Zh%NMT@TW`gGdkg^~?
zQ1Sr<BRB;7^7B#=9uESUJkb6Hr*c`4KSA+}R3d}Y7TA~C4B(i}VqoZ(VPFLLmysch
zi6N7bp@s<*_h!wE42<C^3=Dx0NF@N+_n@K>90Vnx%vM^El30?8R(=P8WClDCK)GB2
z6bPUwVPND!L^jBI;9xLA1cN#QV+|uHwP!IhWV108=|I_8;P3ziM;-$Mp%4KDP(gmd
zU`r05XjcJ+1jyr{kl<(Z(*Ole5UAP?;s&K>K@b6|4#0^AQA8r55zHE((vgROfk7PP
z1CUqPn0Qz?nK@bfAjLh%Bk}Pm`N{F|;9>{T@XO3g4+57`AU{JIkl->l2xJu4D+pp>
ZJOwV5Y#=q09Vm?!gPh97D8MYn4**34o!<Ze

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
new file mode 100644
index 00000000..0e1658fa
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
@@ -0,0 +1,2 @@
+from .file_cache import FileCache  # noqa
+from .redis_cache import RedisCache  # noqa
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d499954b680bb8d8ffd3686ca70a21c748342f3e
GIT binary patch
literal 329
zcmZSn%*&NH<x)&C0~9bZFfceUFfbIWFfcHrFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJsj48|v!5S<K3=El!3=9k!Afkkmfq}s-GbhzKF*zd@BE-eOzz~$0l35HE^8@QB
z0STsM=A_0agA@jVtS{kaU|=W$DTE4w4AcP0Ac*2>1_lQGf}+f_#FA9~vcw|&wEUcu
z)S_bj>_YwQVk2{N!@?{h^D;vV^WvP!^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6
z@<hwhzzmQO7{`~T=B4Bp>4Tk<oS#=xl%E6P6zj*wXXa&=#K-FuRF-fsFfiEU=BJeA
Oq}qYpR}2a<0Y(5+d`<)a

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
new file mode 100644
index 00000000..1ba00806
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
@@ -0,0 +1,146 @@
+import hashlib
+import os
+from textwrap import dedent
+
+from ..cache import BaseCache
+from ..controller import CacheController
+
+try:
+    FileNotFoundError
+except NameError:
+    # py2.X
+    FileNotFoundError = (IOError, OSError)
+
+
+def _secure_open_write(filename, fmode):
+    # We only want to write to this file, so open it in write only mode
+    flags = os.O_WRONLY
+
+    # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only
+    #  will open *new* files.
+    # We specify this because we want to ensure that the mode we pass is the
+    # mode of the file.
+    flags |= os.O_CREAT | os.O_EXCL
+
+    # Do not follow symlinks to prevent someone from making a symlink that
+    # we follow and insecurely open a cache file.
+    if hasattr(os, "O_NOFOLLOW"):
+        flags |= os.O_NOFOLLOW
+
+    # On Windows we'll mark this file as binary
+    if hasattr(os, "O_BINARY"):
+        flags |= os.O_BINARY
+
+    # Before we open our file, we want to delete any existing file that is
+    # there
+    try:
+        os.remove(filename)
+    except (IOError, OSError):
+        # The file must not exist already, so we can just skip ahead to opening
+        pass
+
+    # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a
+    # race condition happens between the os.remove and this line, that an
+    # error will be raised. Because we utilize a lockfile this should only
+    # happen if someone is attempting to attack us.
+    fd = os.open(filename, flags, fmode)
+    try:
+        return os.fdopen(fd, "wb")
+
+    except:
+        # An error occurred wrapping our FD in a file object
+        os.close(fd)
+        raise
+
+
+class FileCache(BaseCache):
+
+    def __init__(
+        self,
+        directory,
+        forever=False,
+        filemode=0o0600,
+        dirmode=0o0700,
+        use_dir_lock=None,
+        lock_class=None,
+    ):
+
+        if use_dir_lock is not None and lock_class is not None:
+            raise ValueError("Cannot use use_dir_lock and lock_class together")
+
+        try:
+            from pip._vendor.lockfile import LockFile
+            from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile
+        except ImportError:
+            notice = dedent(
+                """
+            NOTE: In order to use the FileCache you must have
+            lockfile installed. You can install it via pip:
+              pip install lockfile
+            """
+            )
+            raise ImportError(notice)
+
+        else:
+            if use_dir_lock:
+                lock_class = MkdirLockFile
+
+            elif lock_class is None:
+                lock_class = LockFile
+
+        self.directory = directory
+        self.forever = forever
+        self.filemode = filemode
+        self.dirmode = dirmode
+        self.lock_class = lock_class
+
+    @staticmethod
+    def encode(x):
+        return hashlib.sha224(x.encode()).hexdigest()
+
+    def _fn(self, name):
+        # NOTE: This method should not change as some may depend on it.
+        #       See: https://github.com/ionrock/cachecontrol/issues/63
+        hashed = self.encode(name)
+        parts = list(hashed[:5]) + [hashed]
+        return os.path.join(self.directory, *parts)
+
+    def get(self, key):
+        name = self._fn(key)
+        try:
+            with open(name, "rb") as fh:
+                return fh.read()
+
+        except FileNotFoundError:
+            return None
+
+    def set(self, key, value):
+        name = self._fn(key)
+
+        # Make sure the directory exists
+        try:
+            os.makedirs(os.path.dirname(name), self.dirmode)
+        except (IOError, OSError):
+            pass
+
+        with self.lock_class(name) as lock:
+            # Write our actual file
+            with _secure_open_write(lock.path, self.filemode) as fh:
+                fh.write(value)
+
+    def delete(self, key):
+        name = self._fn(key)
+        if not self.forever:
+            try:
+                os.remove(name)
+            except FileNotFoundError:
+                pass
+
+
+def url_to_file_path(url, filecache):
+    """Return the file cache path based on the URL.
+
+    This does not ensure the file exists!
+    """
+    key = CacheController.cache_url(url)
+    return filecache._fn(key)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6d4b95e56d2330d58c63fc1db04e3dcc9a491f27
GIT binary patch
literal 4755
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
new file mode 100644
index 00000000..ed705ce7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
@@ -0,0 +1,33 @@
+from __future__ import division
+
+from datetime import datetime
+from pip._vendor.cachecontrol.cache import BaseCache
+
+
+class RedisCache(BaseCache):
+
+    def __init__(self, conn):
+        self.conn = conn
+
+    def get(self, key):
+        return self.conn.get(key)
+
+    def set(self, key, value, expires=None):
+        if not expires:
+            self.conn.set(key, value)
+        else:
+            expires = expires - datetime.utcnow()
+            self.conn.setex(key, int(expires.total_seconds()), value)
+
+    def delete(self, key):
+        self.conn.delete(key)
+
+    def clear(self):
+        """Helper for clearing all the keys in a database. Use with
+        caution!"""
+        for key in self.conn.keys():
+            self.conn.delete(key)
+
+    def close(self):
+        """Redis uses connection pooling, no need to close the connection."""
+        pass
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6a15887337059da0c36bb2fccfa5eb336215e299
GIT binary patch
literal 2500
zcmZSn%*&NH<x)&C0~9bbFfceMFfbH*F)%QsFfgPrGUPBY<T5fuF)}cM_)H8rOboe9
z3{gxFJ~KlOGea&5Llg@GV+spHDhopzBSQ)+Lkj~#GXq0p6e~jt8$+-LI|Bnl=Kufy
z|7$QZFff#GfK1OU%Ph{!&qESPEJ-cN%uR)ea56A3I3*URIwvM)q?T|oFfatAreqd_
zxp4O~ffRw<>&U>skjemZW(oty@+c;d+glhIqL@K0NMT}VVPpWgh8Zl&#*o4SX0SsY
z8^ys81aW3E$V?b^2AR#vz`#($$WX(;5DyNNV6X%Iz+?#v0|P^HeqNpiNDG)(oSKss
z1QON&1uB>*u47<e&@U*;EK4j&)h|md(of6JNl7g#*3T}~&n`AHH#aQIGBPhSv@kEu
zsZ1}AH%T!uF)%PNNYB#`(J#m>(9O&%E=kPE(JfE3EDg*634w8ZS!!NNevy7MD3Fr#
z^Gb^Hb0C~z{UT6s#e-$^3M#>29v`2Xmst`Y&&j~RPz-V~10$w)1wh_qV8~)%$YKQf
zyP1&z=3|f+u-8gJ2_-$X1nlb|R#2RRM6y#W!TtpkgTT{4pmfKB<XKR(z%V#&gFv2T
zW+;{cMK9dTHB1c6Obm>9MhrE~3?)nqS<Il+EK$o0Q^f)bm=acybQT*(u9=Ymq=^}v
zD`3F|vK<jz#i=Dh;MC8?z`#&ilAM=cUIGfa;?$DV3UGjC=9QFy5?e`rNn%cXacXjY
zUP`eB$i3ho4gzHxu$HpKoYK@1knyP%1(`*u#oz!36N4etLCK3B6zU)cGcd9-iZKab
zNoXRVut!a3pfUy)dWggZ3b2&aoYaz3M0x`U2H3}7Vla3clySsB-UhjxfiW2r*&rq;
zXMhu%9s>hIg*q$^F@n;KORN|}Eh9{b36!jw85tN01sK9pK=}@&zu1$3fx#m+ry#XR
zAuYd1Avq^Cu_!YyT_G_iN1-GmRUtdIvRENAPa#nuC9xziDX}<JPa(88RiQkyB!f!<
z3X&5`OEUBG6#X<n?tvsrP|^Zv4gxuSFo!KT)r0*l2?}74yBV0pAVCZYW)KDkF-Qgx
zaQ3iTL!q=dwO9dEPNyb=LP4P*KR+ikFI`6=FJB=qH8n+{BwrypC%-rq9H0n=dVb*K
z1upBsnGnJSmF$Bc$w7l9zc^JM6fB^`!ocLG!3iplL3uAeJ})shH9j6(ea6S<=BJeA
zq{hbwfie`hYy?+We))N+K_ETgWDq0-3N&E`1_p#z!K^{x-yl%Z1r>Y6phBIEiIbU=
znTMT|nUl>=1LP;DKhsJ}N{c}L1Vt01%#~wcU?|8e(1TW(df;jiT46#sL7>nBTLAVg
bf*1t;23OuTkm$1mrS)QvZv~hH7zLOC>#<hR

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py
new file mode 100644
index 00000000..33b5aed0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py
@@ -0,0 +1,29 @@
+try:
+    from urllib.parse import urljoin
+except ImportError:
+    from urlparse import urljoin
+
+
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+
+# Handle the case where the requests module has been patched to not have
+# urllib3 bundled as part of its source.
+try:
+    from pip._vendor.requests.packages.urllib3.response import HTTPResponse
+except ImportError:
+    from pip._vendor.urllib3.response import HTTPResponse
+
+try:
+    from pip._vendor.requests.packages.urllib3.util import is_fp_closed
+except ImportError:
+    from pip._vendor.urllib3.util import is_fp_closed
+
+# Replicate some six behaviour
+try:
+    text_type = unicode
+except NameError:
+    text_type = str
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9bd5bc6c434f24531ade73cec956f36694037146
GIT binary patch
literal 849
zcmZSn%*&NH<x)&C0~D|_FfceUFfbG|FfuSyiZG-wFr+Xt<S;PgGBQLlGBAecDKfC6
zGBIRxF%+3IFfuYi6)?jT<S{ZtR0@FgF)`$@FhsF3gy+e^^`yh}Ffrt?f+WG}A@(pc
z<ghX1vNJ@nquMhcriYm!hXbYnNgoSC4ktq{7ef>ms=n(meJl()+%N@TeOwHwJPc91
z4B>g=3@oX9VBh=(sZQkw34_$6FfjycfI=hl|NsC0H5eHf7)sa~7#K>6a<cL>^ZXzp
zJPZsB9w8wCL8-+B`FX{u2+_>q__Tuf<edEC)D#T?kZzFL(xRN4%p|>n#G>NVAW)E(
za5FG4c;*)57nQgc73CL|a6s$;s{mV=9FUouos(L^#=yW(0AcEZnFV_BWvO{7`9*p~
zsfDGf#U;gh1&PVoiRr1udJubz^@^bG3Ie-d22CHjsuC?U1-K0^Ey>IYVgh+f0!<Ih
zP>>3+2TJoYlk-zjOE^KQQ!7g1ODYQ>Jio-;REV#cK}oKpNCOlk2%@-%fq_B4peVB}
zu_RT$EU`#GEk7qEwWwG>yHG#7*vQ=6urSNWyv)$Tyf~*ay*%C|#l*zGz`!6qPd`Mz
zAhSR>Gq1QLF(*g2Jkhc=Fasn6#?XM%PfkqENKMYqD=Es)(NE6LEl4cUE2sp=flY3H
sN@-529Vp<6)fgBUm>ESFc^O5RnHdEbc^L&*p?oGN&CJZm#mLJD0B?B7uK)l5

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py
new file mode 100644
index 00000000..1b2b943c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py
@@ -0,0 +1,367 @@
+"""
+The httplib2 algorithms ported for use with requests.
+"""
+import logging
+import re
+import calendar
+import time
+from email.utils import parsedate_tz
+
+from pip._vendor.requests.structures import CaseInsensitiveDict
+
+from .cache import DictCache
+from .serialize import Serializer
+
+
+logger = logging.getLogger(__name__)
+
+URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
+
+
+def parse_uri(uri):
+    """Parses a URI using the regex given in Appendix B of RFC 3986.
+
+        (scheme, authority, path, query, fragment) = parse_uri(uri)
+    """
+    groups = URI.match(uri).groups()
+    return (groups[1], groups[3], groups[4], groups[6], groups[8])
+
+
+class CacheController(object):
+    """An interface to see if request should cached or not.
+    """
+
+    def __init__(
+        self, cache=None, cache_etags=True, serializer=None, status_codes=None
+    ):
+        self.cache = cache or DictCache()
+        self.cache_etags = cache_etags
+        self.serializer = serializer or Serializer()
+        self.cacheable_status_codes = status_codes or (200, 203, 300, 301)
+
+    @classmethod
+    def _urlnorm(cls, uri):
+        """Normalize the URL to create a safe key for the cache"""
+        (scheme, authority, path, query, fragment) = parse_uri(uri)
+        if not scheme or not authority:
+            raise Exception("Only absolute URIs are allowed. uri = %s" % uri)
+
+        scheme = scheme.lower()
+        authority = authority.lower()
+
+        if not path:
+            path = "/"
+
+        # Could do syntax based normalization of the URI before
+        # computing the digest. See Section 6.2.2 of Std 66.
+        request_uri = query and "?".join([path, query]) or path
+        defrag_uri = scheme + "://" + authority + request_uri
+
+        return defrag_uri
+
+    @classmethod
+    def cache_url(cls, uri):
+        return cls._urlnorm(uri)
+
+    def parse_cache_control(self, headers):
+        known_directives = {
+            # https://tools.ietf.org/html/rfc7234#section-5.2
+            "max-age": (int, True),
+            "max-stale": (int, False),
+            "min-fresh": (int, True),
+            "no-cache": (None, False),
+            "no-store": (None, False),
+            "no-transform": (None, False),
+            "only-if-cached": (None, False),
+            "must-revalidate": (None, False),
+            "public": (None, False),
+            "private": (None, False),
+            "proxy-revalidate": (None, False),
+            "s-maxage": (int, True),
+        }
+
+        cc_headers = headers.get("cache-control", headers.get("Cache-Control", ""))
+
+        retval = {}
+
+        for cc_directive in cc_headers.split(","):
+            if not cc_directive.strip():
+                continue
+
+            parts = cc_directive.split("=", 1)
+            directive = parts[0].strip()
+
+            try:
+                typ, required = known_directives[directive]
+            except KeyError:
+                logger.debug("Ignoring unknown cache-control directive: %s", directive)
+                continue
+
+            if not typ or not required:
+                retval[directive] = None
+            if typ:
+                try:
+                    retval[directive] = typ(parts[1].strip())
+                except IndexError:
+                    if required:
+                        logger.debug(
+                            "Missing value for cache-control " "directive: %s",
+                            directive,
+                        )
+                except ValueError:
+                    logger.debug(
+                        "Invalid value for cache-control directive " "%s, must be %s",
+                        directive,
+                        typ.__name__,
+                    )
+
+        return retval
+
+    def cached_request(self, request):
+        """
+        Return a cached response if it exists in the cache, otherwise
+        return False.
+        """
+        cache_url = self.cache_url(request.url)
+        logger.debug('Looking up "%s" in the cache', cache_url)
+        cc = self.parse_cache_control(request.headers)
+
+        # Bail out if the request insists on fresh data
+        if "no-cache" in cc:
+            logger.debug('Request header has "no-cache", cache bypassed')
+            return False
+
+        if "max-age" in cc and cc["max-age"] == 0:
+            logger.debug('Request header has "max_age" as 0, cache bypassed')
+            return False
+
+        # Request allows serving from the cache, let's see if we find something
+        cache_data = self.cache.get(cache_url)
+        if cache_data is None:
+            logger.debug("No cache entry available")
+            return False
+
+        # Check whether it can be deserialized
+        resp = self.serializer.loads(request, cache_data)
+        if not resp:
+            logger.warning("Cache entry deserialization failed, entry ignored")
+            return False
+
+        # If we have a cached 301, return it immediately. We don't
+        # need to test our response for other headers b/c it is
+        # intrinsically "cacheable" as it is Permanent.
+        # See:
+        #   https://tools.ietf.org/html/rfc7231#section-6.4.2
+        #
+        # Client can try to refresh the value by repeating the request
+        # with cache busting headers as usual (ie no-cache).
+        if resp.status == 301:
+            msg = (
+                'Returning cached "301 Moved Permanently" response '
+                "(ignoring date and etag information)"
+            )
+            logger.debug(msg)
+            return resp
+
+        headers = CaseInsensitiveDict(resp.headers)
+        if not headers or "date" not in headers:
+            if "etag" not in headers:
+                # Without date or etag, the cached response can never be used
+                # and should be deleted.
+                logger.debug("Purging cached response: no date or etag")
+                self.cache.delete(cache_url)
+            logger.debug("Ignoring cached response: no date")
+            return False
+
+        now = time.time()
+        date = calendar.timegm(parsedate_tz(headers["date"]))
+        current_age = max(0, now - date)
+        logger.debug("Current age based on date: %i", current_age)
+
+        # TODO: There is an assumption that the result will be a
+        #       urllib3 response object. This may not be best since we
+        #       could probably avoid instantiating or constructing the
+        #       response until we know we need it.
+        resp_cc = self.parse_cache_control(headers)
+
+        # determine freshness
+        freshness_lifetime = 0
+
+        # Check the max-age pragma in the cache control header
+        if "max-age" in resp_cc:
+            freshness_lifetime = resp_cc["max-age"]
+            logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime)
+
+        # If there isn't a max-age, check for an expires header
+        elif "expires" in headers:
+            expires = parsedate_tz(headers["expires"])
+            if expires is not None:
+                expire_time = calendar.timegm(expires) - date
+                freshness_lifetime = max(0, expire_time)
+                logger.debug("Freshness lifetime from expires: %i", freshness_lifetime)
+
+        # Determine if we are setting freshness limit in the
+        # request. Note, this overrides what was in the response.
+        if "max-age" in cc:
+            freshness_lifetime = cc["max-age"]
+            logger.debug(
+                "Freshness lifetime from request max-age: %i", freshness_lifetime
+            )
+
+        if "min-fresh" in cc:
+            min_fresh = cc["min-fresh"]
+            # adjust our current age by our min fresh
+            current_age += min_fresh
+            logger.debug("Adjusted current age from min-fresh: %i", current_age)
+
+        # Return entry if it is fresh enough
+        if freshness_lifetime > current_age:
+            logger.debug('The response is "fresh", returning cached response')
+            logger.debug("%i > %i", freshness_lifetime, current_age)
+            return resp
+
+        # we're not fresh. If we don't have an Etag, clear it out
+        if "etag" not in headers:
+            logger.debug('The cached response is "stale" with no etag, purging')
+            self.cache.delete(cache_url)
+
+        # return the original handler
+        return False
+
+    def conditional_headers(self, request):
+        cache_url = self.cache_url(request.url)
+        resp = self.serializer.loads(request, self.cache.get(cache_url))
+        new_headers = {}
+
+        if resp:
+            headers = CaseInsensitiveDict(resp.headers)
+
+            if "etag" in headers:
+                new_headers["If-None-Match"] = headers["ETag"]
+
+            if "last-modified" in headers:
+                new_headers["If-Modified-Since"] = headers["Last-Modified"]
+
+        return new_headers
+
+    def cache_response(self, request, response, body=None, status_codes=None):
+        """
+        Algorithm for caching requests.
+
+        This assumes a requests Response object.
+        """
+        # From httplib2: Don't cache 206's since we aren't going to
+        #                handle byte range requests
+        cacheable_status_codes = status_codes or self.cacheable_status_codes
+        if response.status not in cacheable_status_codes:
+            logger.debug(
+                "Status code %s not in %s", response.status, cacheable_status_codes
+            )
+            return
+
+        response_headers = CaseInsensitiveDict(response.headers)
+
+        # If we've been given a body, our response has a Content-Length, that
+        # Content-Length is valid then we can check to see if the body we've
+        # been given matches the expected size, and if it doesn't we'll just
+        # skip trying to cache it.
+        if (
+            body is not None
+            and "content-length" in response_headers
+            and response_headers["content-length"].isdigit()
+            and int(response_headers["content-length"]) != len(body)
+        ):
+            return
+
+        cc_req = self.parse_cache_control(request.headers)
+        cc = self.parse_cache_control(response_headers)
+
+        cache_url = self.cache_url(request.url)
+        logger.debug('Updating cache with response from "%s"', cache_url)
+
+        # Delete it from the cache if we happen to have it stored there
+        no_store = False
+        if "no-store" in cc:
+            no_store = True
+            logger.debug('Response header has "no-store"')
+        if "no-store" in cc_req:
+            no_store = True
+            logger.debug('Request header has "no-store"')
+        if no_store and self.cache.get(cache_url):
+            logger.debug('Purging existing cache entry to honor "no-store"')
+            self.cache.delete(cache_url)
+        if no_store:
+            return
+
+        # If we've been given an etag, then keep the response
+        if self.cache_etags and "etag" in response_headers:
+            logger.debug("Caching due to etag")
+            self.cache.set(
+                cache_url, self.serializer.dumps(request, response, body=body)
+            )
+
+        # Add to the cache any 301s. We do this before looking that
+        # the Date headers.
+        elif response.status == 301:
+            logger.debug("Caching permanant redirect")
+            self.cache.set(cache_url, self.serializer.dumps(request, response))
+
+        # Add to the cache if the response headers demand it. If there
+        # is no date header then we can't do anything about expiring
+        # the cache.
+        elif "date" in response_headers:
+            # cache when there is a max-age > 0
+            if "max-age" in cc and cc["max-age"] > 0:
+                logger.debug("Caching b/c date exists and max-age > 0")
+                self.cache.set(
+                    cache_url, self.serializer.dumps(request, response, body=body)
+                )
+
+            # If the request can expire, it means we should cache it
+            # in the meantime.
+            elif "expires" in response_headers:
+                if response_headers["expires"]:
+                    logger.debug("Caching b/c of expires header")
+                    self.cache.set(
+                        cache_url, self.serializer.dumps(request, response, body=body)
+                    )
+
+    def update_cached_response(self, request, response):
+        """On a 304 we will get a new set of headers that we want to
+        update our cached value with, assuming we have one.
+
+        This should only ever be called when we've sent an ETag and
+        gotten a 304 as the response.
+        """
+        cache_url = self.cache_url(request.url)
+
+        cached_response = self.serializer.loads(request, self.cache.get(cache_url))
+
+        if not cached_response:
+            # we didn't have a cached response
+            return response
+
+        # Lets update our headers with the headers from the new request:
+        # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1
+        #
+        # The server isn't supposed to send headers that would make
+        # the cached body invalid. But... just in case, we'll be sure
+        # to strip out ones we know that might be problmatic due to
+        # typical assumptions.
+        excluded_headers = ["content-length"]
+
+        cached_response.headers.update(
+            dict(
+                (k, v)
+                for k, v in response.headers.items()
+                if k.lower() not in excluded_headers
+            )
+        )
+
+        # we want a 200 b/c we have content via the cache
+        cached_response.status = 200
+
+        # update our cache
+        self.cache.set(cache_url, self.serializer.dumps(request, cached_response))
+
+        return cached_response
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dacb71d2afb22f34a840a333a15179cc00bca1d4
GIT binary patch
literal 10121
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py
new file mode 100644
index 00000000..30ed4c5a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py
@@ -0,0 +1,80 @@
+from io import BytesIO
+
+
+class CallbackFileWrapper(object):
+    """
+    Small wrapper around a fp object which will tee everything read into a
+    buffer, and when that file is closed it will execute a callback with the
+    contents of that buffer.
+
+    All attributes are proxied to the underlying file object.
+
+    This class uses members with a double underscore (__) leading prefix so as
+    not to accidentally shadow an attribute.
+    """
+
+    def __init__(self, fp, callback):
+        self.__buf = BytesIO()
+        self.__fp = fp
+        self.__callback = callback
+
+    def __getattr__(self, name):
+        # The vaguaries of garbage collection means that self.__fp is
+        # not always set.  By using __getattribute__ and the private
+        # name[0] allows looking up the attribute value and raising an
+        # AttributeError when it doesn't exist. This stop thigns from
+        # infinitely recursing calls to getattr in the case where
+        # self.__fp hasn't been set.
+        #
+        # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers
+        fp = self.__getattribute__("_CallbackFileWrapper__fp")
+        return getattr(fp, name)
+
+    def __is_fp_closed(self):
+        try:
+            return self.__fp.fp is None
+
+        except AttributeError:
+            pass
+
+        try:
+            return self.__fp.closed
+
+        except AttributeError:
+            pass
+
+        # We just don't cache it then.
+        # TODO: Add some logging here...
+        return False
+
+    def _close(self):
+        if self.__callback:
+            self.__callback(self.__buf.getvalue())
+
+        # We assign this to None here, because otherwise we can get into
+        # really tricky problems where the CPython interpreter dead locks
+        # because the callback is holding a reference to something which
+        # has a __del__ method. Setting this to None breaks the cycle
+        # and allows the garbage collector to do it's thing normally.
+        self.__callback = None
+
+    def read(self, amt=None):
+        data = self.__fp.read(amt)
+        self.__buf.write(data)
+        if self.__is_fp_closed():
+            self._close()
+
+        return data
+
+    def _safe_read(self, amt):
+        data = self.__fp._safe_read(amt)
+        if amt == 2 and data == b"\r\n":
+            # urllib executes this read to toss the CRLF at the end
+            # of the chunk.
+            return data
+
+        self.__buf.write(data)
+        if self.__is_fp_closed():
+            self._close()
+
+        return data
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..eca5b05497da651b3b7779809650771bf6101ffb
GIT binary patch
literal 3043
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHrF)%QsFfgPrGUPBY<T5fuF)}cwFfpVuF{Cjv
zq%bqIFfcSTFhoW%Go-LE1Z%J|Ffe5P|NsBL1|tIlLkT+r1A|j#NoujDe~B;y1A}v7
zPEJx{a<*G$PHK2jVnIP_5!^~9kXn$H?hFhJsSF^SQWzMbm_T;7Fff2@U;<ee#R9cA
ziWOuhNQ#Xig`FXVm7#@^A&P?`g$=BXlOZTrg9Bt>86yJ&mx6+VLU3+kPL4u3#A1cS
zqWsdl6oo{Ev;u|vq^#8B5{2@N%;XG(^30qZg_6`%h19atqRNtt%)E4kqSV9`h0MH?
ze1$}?QAwp~X{kjz3W<3s3gsE8c?u;Ni6shYnK`KnnZ*jpIr+t@DGHe-5VKM%Qj<$d
zQWX*vlA!^hP@Y+mp-_^M3N|b`Kd&S;ucTNZKMi6I#B@C_u&iTFjzVHdNl|7}X-R6a
zLSj*>LP1e}MP_P>LP<Wz429CXl+>b}N{~CjE`az3sy!qF?4ZQrVujM;)MAC))ZC=h
zqGE^(5*1SNOOtX^Ax0D@=NF|aXvD{BD&(Xlrhv>VC`wJstWYS<S4b=dyCyHc1Y~Vu
za&l%$YF<fVPEMslaYkZFez`(o9>Se^V8zLxbOgen$aMzAg%T)PfYVG314BF`Lk%MX
zh{42A!vtn9gHl^CIQ95xurM$%1c6dyi6jF9Lp+w$6Ca;cnpPr#Q#P%jL=LAUEHX4e
zE-V3AR-BrXRswQsT0sdY>A+Qh9H9Xsipv=o81xH@GRqQ6QuWIci}cg-b5c@^iuJP#
z^|OnO%*_o8vy9Bk3@yxyb1Kuz<4sabObiSR4AS%TL-Y$W3v@H{ib0{KTb^iH8khkR
z0^|6y)V!4ZBK_pV<cw5Mf+)(*(FesQG`Z>(RDzupAD@|*SrQ*F018bukdqjB7&#e}
zL9Pb*1BAgLEyKV73ehZZ=51zVsAXa(VFU*=BSSM2L$C%&hhGp#J(yVnGBG|rJ+%a$
z*y7{CIT$Jg4yGVb4hM%-USe))5Xb@GZ~+qo8aUjbc!oJYK3)_QKA<>d;N)ja29-u2
z401g<bo>|?7%D}e0hGlEN_E*B48h@ff($Gr%naFF3`Ob;jEszVj0_Q#d@yw^s46^R
zDoR)xU}+W<BH%y;hYdKS{POcsOZXTV7#v}_*tMuAzo-PH6jD-@fZXMlm{XhzPWj+K
z28Sq^7|>t^xjQ~Svp7DjARgjaMNr5Jfm0qcqX-i(BMTEVBOi!nfrm3FZGppCAD#+}
zl%Szl!@!Wm$dJVZsyLb%85r}xH4LZ}05f0#35vTQFaa_Qoc7aGOUe>+N>hV)85kG_
zT}XkV6B0y5pb!Fa85lVkCE4M56XX$asMy0pB@0{xLb4|)V3-)Pm_eBo6fht@3n-L|
ztieIY3SxtTs|J*PLCM)q17r(0xq(v}sFn%>*#b^b<wcn#sU@Hi7kkl(9H~K|>KQ4A
zgNlX3+!C;<DTyVC;DiV!1~N4Ui7+rQ*n&cr3!MIh7zG%47<rj6LpU0H2s46O6WL4*
zMS7q>PGMqzvx7mQjXm_kv4lP-eEc#&L0t?Yc)5^b0_3*%;>5JnczApSfr_IbF;IPm
z8qh)FATdw{1`b>>F`yv~s%c$8Aq>j+42(jI63i@2kWlv10Qn4@6XWAS#eaN!2}mS9
zJ~uz5G$$2WUBt(y<R{0+2Z1WkARdtS;Qj_@TyP`?f$RbM7C{WCzd_jvRN54S{LRM2
z#>C0W$-^ng$<4z7X^4Q^1)2Gf_6R83L0VZsAdLt=fLR0S5peX_KqABr<Th~n6krAb
D@gL<;

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py
new file mode 100644
index 00000000..6c0e9790
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py
@@ -0,0 +1,135 @@
+import calendar
+import time
+
+from email.utils import formatdate, parsedate, parsedate_tz
+
+from datetime import datetime, timedelta
+
+TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT"
+
+
+def expire_after(delta, date=None):
+    date = date or datetime.utcnow()
+    return date + delta
+
+
+def datetime_to_header(dt):
+    return formatdate(calendar.timegm(dt.timetuple()))
+
+
+class BaseHeuristic(object):
+
+    def warning(self, response):
+        """
+        Return a valid 1xx warning header value describing the cache
+        adjustments.
+
+        The response is provided too allow warnings like 113
+        http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
+        to explicitly say response is over 24 hours old.
+        """
+        return '110 - "Response is Stale"'
+
+    def update_headers(self, response):
+        """Update the response headers with any new headers.
+
+        NOTE: This SHOULD always include some Warning header to
+              signify that the response was cached by the client, not
+              by way of the provided headers.
+        """
+        return {}
+
+    def apply(self, response):
+        updated_headers = self.update_headers(response)
+
+        if updated_headers:
+            response.headers.update(updated_headers)
+            warning_header_value = self.warning(response)
+            if warning_header_value is not None:
+                response.headers.update({"Warning": warning_header_value})
+
+        return response
+
+
+class OneDayCache(BaseHeuristic):
+    """
+    Cache the response by providing an expires 1 day in the
+    future.
+    """
+
+    def update_headers(self, response):
+        headers = {}
+
+        if "expires" not in response.headers:
+            date = parsedate(response.headers["date"])
+            expires = expire_after(timedelta(days=1), date=datetime(*date[:6]))
+            headers["expires"] = datetime_to_header(expires)
+            headers["cache-control"] = "public"
+        return headers
+
+
+class ExpiresAfter(BaseHeuristic):
+    """
+    Cache **all** requests for a defined time period.
+    """
+
+    def __init__(self, **kw):
+        self.delta = timedelta(**kw)
+
+    def update_headers(self, response):
+        expires = expire_after(self.delta)
+        return {"expires": datetime_to_header(expires), "cache-control": "public"}
+
+    def warning(self, response):
+        tmpl = "110 - Automatically cached for %s. Response might be stale"
+        return tmpl % self.delta
+
+
+class LastModified(BaseHeuristic):
+    """
+    If there is no Expires header already, fall back on Last-Modified
+    using the heuristic from
+    http://tools.ietf.org/html/rfc7234#section-4.2.2
+    to calculate a reasonable value.
+
+    Firefox also does something like this per
+    https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
+    http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397
+    Unlike mozilla we limit this to 24-hr.
+    """
+    cacheable_by_default_statuses = {
+        200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501
+    }
+
+    def update_headers(self, resp):
+        headers = resp.headers
+
+        if "expires" in headers:
+            return {}
+
+        if "cache-control" in headers and headers["cache-control"] != "public":
+            return {}
+
+        if resp.status not in self.cacheable_by_default_statuses:
+            return {}
+
+        if "date" not in headers or "last-modified" not in headers:
+            return {}
+
+        date = calendar.timegm(parsedate_tz(headers["date"]))
+        last_modified = parsedate(headers["last-modified"])
+        if date is None or last_modified is None:
+            return {}
+
+        now = time.time()
+        current_age = max(0, now - date)
+        delta = date - calendar.timegm(last_modified)
+        freshness_lifetime = max(0, min(delta / 10, 24 * 3600))
+        if freshness_lifetime <= current_age:
+            return {}
+
+        expires = date + freshness_lifetime
+        return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))}
+
+    def warning(self, resp):
+        return None
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ec99a54b47ff8433a0a4f4a5b781dcfa4b6c237e
GIT binary patch
literal 6673
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
KF(olUF+l(_`9ci<

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py
new file mode 100644
index 00000000..ec43ff27
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py
@@ -0,0 +1,186 @@
+import base64
+import io
+import json
+import zlib
+
+from pip._vendor import msgpack
+from pip._vendor.requests.structures import CaseInsensitiveDict
+
+from .compat import HTTPResponse, pickle, text_type
+
+
+def _b64_decode_bytes(b):
+    return base64.b64decode(b.encode("ascii"))
+
+
+def _b64_decode_str(s):
+    return _b64_decode_bytes(s).decode("utf8")
+
+
+class Serializer(object):
+
+    def dumps(self, request, response, body=None):
+        response_headers = CaseInsensitiveDict(response.headers)
+
+        if body is None:
+            body = response.read(decode_content=False)
+
+            # NOTE: 99% sure this is dead code. I'm only leaving it
+            #       here b/c I don't have a test yet to prove
+            #       it. Basically, before using
+            #       `cachecontrol.filewrapper.CallbackFileWrapper`,
+            #       this made an effort to reset the file handle. The
+            #       `CallbackFileWrapper` short circuits this code by
+            #       setting the body as the content is consumed, the
+            #       result being a `body` argument is *always* passed
+            #       into cache_response, and in turn,
+            #       `Serializer.dump`.
+            response._fp = io.BytesIO(body)
+
+        # NOTE: This is all a bit weird, but it's really important that on
+        #       Python 2.x these objects are unicode and not str, even when
+        #       they contain only ascii. The problem here is that msgpack
+        #       understands the difference between unicode and bytes and we
+        #       have it set to differentiate between them, however Python 2
+        #       doesn't know the difference. Forcing these to unicode will be
+        #       enough to have msgpack know the difference.
+        data = {
+            u"response": {
+                u"body": body,
+                u"headers": dict(
+                    (text_type(k), text_type(v)) for k, v in response.headers.items()
+                ),
+                u"status": response.status,
+                u"version": response.version,
+                u"reason": text_type(response.reason),
+                u"strict": response.strict,
+                u"decode_content": response.decode_content,
+            }
+        }
+
+        # Construct our vary headers
+        data[u"vary"] = {}
+        if u"vary" in response_headers:
+            varied_headers = response_headers[u"vary"].split(",")
+            for header in varied_headers:
+                header = text_type(header).strip()
+                header_value = request.headers.get(header, None)
+                if header_value is not None:
+                    header_value = text_type(header_value)
+                data[u"vary"][header] = header_value
+
+        return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)])
+
+    def loads(self, request, data):
+        # Short circuit if we've been given an empty set of data
+        if not data:
+            return
+
+        # Determine what version of the serializer the data was serialized
+        # with
+        try:
+            ver, data = data.split(b",", 1)
+        except ValueError:
+            ver = b"cc=0"
+
+        # Make sure that our "ver" is actually a version and isn't a false
+        # positive from a , being in the data stream.
+        if ver[:3] != b"cc=":
+            data = ver + data
+            ver = b"cc=0"
+
+        # Get the version number out of the cc=N
+        ver = ver.split(b"=", 1)[-1].decode("ascii")
+
+        # Dispatch to the actual load method for the given version
+        try:
+            return getattr(self, "_loads_v{}".format(ver))(request, data)
+
+        except AttributeError:
+            # This is a version we don't have a loads function for, so we'll
+            # just treat it as a miss and return None
+            return
+
+    def prepare_response(self, request, cached):
+        """Verify our vary headers match and construct a real urllib3
+        HTTPResponse object.
+        """
+        # Special case the '*' Vary value as it means we cannot actually
+        # determine if the cached response is suitable for this request.
+        if "*" in cached.get("vary", {}):
+            return
+
+        # Ensure that the Vary headers for the cached response match our
+        # request
+        for header, value in cached.get("vary", {}).items():
+            if request.headers.get(header, None) != value:
+                return
+
+        body_raw = cached["response"].pop("body")
+
+        headers = CaseInsensitiveDict(data=cached["response"]["headers"])
+        if headers.get("transfer-encoding", "") == "chunked":
+            headers.pop("transfer-encoding")
+
+        cached["response"]["headers"] = headers
+
+        try:
+            body = io.BytesIO(body_raw)
+        except TypeError:
+            # This can happen if cachecontrol serialized to v1 format (pickle)
+            # using Python 2. A Python 2 str(byte string) will be unpickled as
+            # a Python 3 str (unicode string), which will cause the above to
+            # fail with:
+            #
+            #     TypeError: 'str' does not support the buffer interface
+            body = io.BytesIO(body_raw.encode("utf8"))
+
+        return HTTPResponse(body=body, preload_content=False, **cached["response"])
+
+    def _loads_v0(self, request, data):
+        # The original legacy cache data. This doesn't contain enough
+        # information to construct everything we need, so we'll treat this as
+        # a miss.
+        return
+
+    def _loads_v1(self, request, data):
+        try:
+            cached = pickle.loads(data)
+        except ValueError:
+            return
+
+        return self.prepare_response(request, cached)
+
+    def _loads_v2(self, request, data):
+        try:
+            cached = json.loads(zlib.decompress(data).decode("utf8"))
+        except (ValueError, zlib.error):
+            return
+
+        # We need to decode the items that we've base64 encoded
+        cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"])
+        cached["response"]["headers"] = dict(
+            (_b64_decode_str(k), _b64_decode_str(v))
+            for k, v in cached["response"]["headers"].items()
+        )
+        cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"])
+        cached["vary"] = dict(
+            (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v)
+            for k, v in cached["vary"].items()
+        )
+
+        return self.prepare_response(request, cached)
+
+    def _loads_v3(self, request, data):
+        # Due to Python 2 encoding issues, it's impossible to know for sure
+        # exactly how to load v3 entries, thus we'll treat these as a miss so
+        # that they get rewritten out as v4 entries.
+        return
+
+    def _loads_v4(self, request, data):
+        try:
+            cached = msgpack.loads(data, encoding="utf-8")
+        except ValueError:
+            return
+
+        return self.prepare_response(request, cached)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b89ec0d9ac3d65e096bbb7d1b0715e157f51b3df
GIT binary patch
literal 6411
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py
new file mode 100644
index 00000000..265bfc8b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py
@@ -0,0 +1,29 @@
+from .adapter import CacheControlAdapter
+from .cache import DictCache
+
+
+def CacheControl(
+    sess,
+    cache=None,
+    cache_etags=True,
+    serializer=None,
+    heuristic=None,
+    controller_class=None,
+    adapter_class=None,
+    cacheable_methods=None,
+):
+
+    cache = cache or DictCache()
+    adapter_class = adapter_class or CacheControlAdapter
+    adapter = adapter_class(
+        cache,
+        cache_etags=cache_etags,
+        serializer=serializer,
+        heuristic=heuristic,
+        controller_class=controller_class,
+        cacheable_methods=cacheable_methods,
+    )
+    sess.mount("http://", adapter)
+    sess.mount("https://", adapter)
+
+    return sess
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4fe84a88e892ae7db44071a7a03ee7a74528df73
GIT binary patch
literal 906
zcmZSn%*&NH<x)&C0~ByDFfceUFfbH5F)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJsj43P(sjLhsEU1W?p@p3xiVY+ftij5_z>vwvz`&pZB1(iA7#N%rlQUAC^YcoI
z@^c(h5(`RFiy)Gm3=9k|naL$!1<4?nfJAseT0kz!WME*ZVPq)aVJKl>Xl7ujWn`#f
zV<?bdC}Cu%WdpHm7(wo>VPZ&OVyIzeNMUBE0lTe+l_7<dp@yBInUS@YgQ13jA&ZG2
zg^i(xgQ1y;ff34QN8$%-fUNf`;bvf9NCvq#KD8t<y|{!6<dD>&%*33`s??$qkoz)H
zON%m#OEQy71VD-*{>n)$icii-EG{k)1POvnNKDE}jn7Rj$;eMBE@o$7V8|#bDX`Ml
zF9z8JVi#NK>uWGGFfasxf+`3UAtj*T%gry%E71U1Rl)+czPK1H4t7@%6G#JC7f3P)
zq@jeDfq@|r60#6i1hFwNFqD8Sg$iqcOa~Li#S9D#`UORqWr-!J`elhl`f2$&DXB%p
z`q_p0*~LcY=7xn?M&@OP7Usn{mFea2CMhN+1_lNO>3RAg`URN<x|w;!C5bsXy5)(M
zrGXhBAux_FOU+BkFVY7)GZ_*r`sGE51qG=^dIgmw;CKZE3^XZ#TwW{zau+v0BM&1p
zBO4rYG6^sWF!^bKJP-tm5^&%Ifr11aR^V{)%g;*%GeU|=Q-eUJgZ+mf2F$0R2)4=1
XPbtkwwF5<MF({!3Fbc3TGa?`W%aF)<

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py
new file mode 100644
index 00000000..632db8e1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py
@@ -0,0 +1,3 @@
+from .core import where
+
+__version__ = "2019.03.09"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..89c35b9fd42b099d146fdedf10066f3573529cb5
GIT binary patch
literal 287
zcmZSn%*&NH<x)&C0~9bZFfceUFfbHLF)%QsFfgPrGUPBY<T5fuF)}cwFfl|iF{Cgv
z1Z%J`Ffe2?GB7Y`fQS-S1_p-mjMSpkVlD;-1|tJQOFaW)Jp)TW4Q2)gh7yqK<ou%4
zAdoF3+zbp1@$qG;Ma7x<dGYZYAVCCCoX^0(pkGjwS(aFms$Z5^q@R|blag9gte;(|
zpIvNZZf;nZWn^AvXklKQQ<+{KZ<1nSVqjokke;U>qF<0%pqrUjT#}fRqg$S6SsIuD
z5(4A+vedkk{38A2)S{Biv`qc@_{_Y_lK6PNg31yO1_lP3-29Z%oK!oIhl)YrAix9w
DChkH!

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py
new file mode 100644
index 00000000..ae2aff5c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py
@@ -0,0 +1,2 @@
+from pip._vendor.certifi import where
+print(where())
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b748e62ef7e6c7378bfd41c77bc18a8a25169c24
GIT binary patch
literal 273
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI$FfcHrFfgPrGUPBY<T5fuF)}cwGBPwXFt~f9
zFfjycFf%YPWd8sE|Gx$!0|P?|D+2>Vc}8kcs-FhPj1pl628M#n0=@XM)V!4ZBE96)
zqLR$C%pj0G8mL5ZJ_7@TenC-YSz<}5epzCXep-G`N@`KDes-aLcCnGUxnW_Jk$IV+
zg?VvKWqNtMNs5Vyfq{WRdY*oWenDn|Zf0I_Nn%cpZh4|*X<!CO2#le2>qG6<kB`qy
g%*>0A*DI(j;b353u*uC&Da}c>19_kr<Z1y%02!P`NB{r;

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem
new file mode 100644
index 00000000..84636dde
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem
@@ -0,0 +1,4658 @@
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946069240
+# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
+# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
+# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Label: "QuoVadis Root CA"
+# Serial: 985026699
+# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
+# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
+# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2"
+# Serial: 1289
+# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
+# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
+# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3"
+# Serial: 1478
+# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
+# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
+# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
+# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
+# Label: "Security Communication Root CA"
+# Serial: 0
+# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
+# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
+# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Sonera Class2 CA O=Sonera
+# Subject: CN=Sonera Class2 CA O=Sonera
+# Label: "Sonera Class 2 Root CA"
+# Serial: 29
+# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
+# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
+# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: O=Government Root Certification Authority
+# Subject: O=Government Root Certification Authority
+# Label: "Taiwan GRCA"
+# Serial: 42023070807708724159991140556527066870
+# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
+# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
+# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=Class 2 Primary CA O=Certplus
+# Subject: CN=Class 2 Primary CA O=Certplus
+# Label: "Certplus Class 2 Primary CA"
+# Serial: 177770208045934040241468760488327595043
+# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
+# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
+# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Label: "DST Root CA X3"
+# Serial: 91299735575339953335919266965803778155
+# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
+# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
+# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Label: "SwissSign Gold CA - G2"
+# Serial: 13492815561806991280
+# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
+# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
+# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Label: "SwissSign Silver CA - G2"
+# Serial: 5700383053117599563
+# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
+# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
+# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
+# Subject: CN=SecureTrust CA O=SecureTrust Corporation
+# Label: "SecureTrust CA"
+# Serial: 17199774589125277788362757014266862032
+# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
+# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
+# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Global CA O=SecureTrust Corporation
+# Subject: CN=Secure Global CA O=SecureTrust Corporation
+# Label: "Secure Global CA"
+# Serial: 9751836167731051554232119481456978597
+# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
+# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
+# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GA CA"
+# Serial: 86718877871133159090080555911823548314
+# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
+# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
+# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna O=Dhimyotis
+# Subject: CN=Certigna O=Dhimyotis
+# Label: "Certigna"
+# Serial: 18364802974209362175
+# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
+# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
+# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Label: "Deutsche Telekom Root CA 2"
+# Serial: 38
+# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
+# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
+# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Label: "ePKI Root Certification Authority"
+# Serial: 28956088682735189655030529057352760477
+# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
+# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
+# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+# Issuer: O=certSIGN OU=certSIGN ROOT CA
+# Subject: O=certSIGN OU=certSIGN ROOT CA
+# Label: "certSIGN ROOT CA"
+# Serial: 35210227249154
+# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
+# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
+# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny"
+# Serial: 80544274841616
+# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
+# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
+# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G2"
+# Serial: 10000012
+# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
+# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
+# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Label: "Hongkong Post Root CA 1"
+# Serial: 1000
+# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
+# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
+# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Label: "SecureSign RootCA11"
+# Serial: 1
+# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
+# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
+# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Label: "Microsec e-Szigno Root CA 2009"
+# Serial: 14014712776195784473
+# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
+# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
+# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Serial: 6047274297262753887
+# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
+# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
+# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+# Issuer: CN=Izenpe.com O=IZENPE S.A.
+# Subject: CN=Izenpe.com O=IZENPE S.A.
+# Label: "Izenpe.com"
+# Serial: 917563065490389241595536686991402621
+# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
+# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
+# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Label: "Chambers of Commerce Root - 2008"
+# Serial: 11806822484801597146
+# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
+# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
+# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Label: "Global Chambersign Root - 2008"
+# Serial: 14541511773111788494
+# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
+# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
+# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA"
+# Serial: 279744
+# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
+# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
+# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Root Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
+# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
+# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Label: "Security Communication RootCA2"
+# Serial: 0
+# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
+# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
+# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2011"
+# Serial: 0
+# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
+# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
+# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Label: "Actalis Authentication Root CA"
+# Serial: 6271844772424770508
+# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
+# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
+# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
+# Subject: O=Trustis Limited OU=Trustis FPS Root CA
+# Label: "Trustis FPS Root CA"
+# Serial: 36053640375399034304724988975563710553
+# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
+# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
+# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 2 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
+# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
+# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 3 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
+# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
+# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 3"
+# Serial: 1
+# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
+# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
+# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Label: "EE Certification Centre Root CA"
+# Serial: 112324828676200291871926431888494945866
+# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
+# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
+# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 2009"
+# Serial: 623603
+# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
+# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
+# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
+# Serial: 623604
+# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
+# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
+# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R2 O=Disig a.s.
+# Subject: CN=CA Disig Root R2 O=Disig a.s.
+# Label: "CA Disig Root R2"
+# Serial: 10572350602393338211
+# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
+# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
+# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Label: "ACCVRAIZ1"
+# Serial: 6828503384748696800
+# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
+# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
+# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
+AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
+CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
+BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
+VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
+qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
+HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
+G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
+lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
+IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
+0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
+k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
+4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
+m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
+cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
+uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
+KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
+ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
+AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
+VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
+CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
+cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
+QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
+7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
+cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
+QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
+czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
+aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
+aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
+DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
+BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
+D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
+JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
+AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
+vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
+tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
+7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
+h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
+d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
+pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Global Root CA"
+# Serial: 3262
+# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
+# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
+# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
+EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
+VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
+NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
+B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
+10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
+0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
+MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
+zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
+46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
+yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
+laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
+oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
+BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
+qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
+4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
+1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
+H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
+RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
+15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
+6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
+nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
+wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
+aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
+KwbQBM0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Label: "TeliaSonera Root CA v1"
+# Serial: 199041966741090107964904287217786801558
+# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
+# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
+# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
+NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
+b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
+VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
+VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
+7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
+Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
+81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
+dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
+Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
+sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
+pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
+slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
+arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
+9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
+dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
+TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
+Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
+Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
+OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
+vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
+t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
+HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
+SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
+# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
+# Label: "E-Tugra Certification Authority"
+# Serial: 7667447206703254355
+# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49
+# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39
+# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
+BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
+aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
+BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
+Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
+MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
+em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
+B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
+D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
+Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
+q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
+k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
+fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
+dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
+ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
+zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
+U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
+Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
+XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
+Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
+HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
+GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
+77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
+vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
+FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
+yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
+AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
+y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
+NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 2"
+# Serial: 1
+# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
+# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
+# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
+AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
+FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
+1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
+jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
+wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
+WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
+NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
+uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
+IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
+g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
+BSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Atos TrustedRoot 2011 O=Atos
+# Subject: CN=Atos TrustedRoot 2011 O=Atos
+# Label: "Atos TrustedRoot 2011"
+# Serial: 6643877497813316402
+# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
+# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
+# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
+AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
+EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
+FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
+REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
+Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
+VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
+4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
+cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
+eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
+A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
+DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
+vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
+DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
+maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
+lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
+KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 1 G3"
+# Serial: 687049649626669250736271037606554624078720034195
+# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
+# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
+# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
+MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
+wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
+rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
+68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
+4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
+UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
+abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
+3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
+KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
+hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
+Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
+zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
+ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
+cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
+qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
+YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
+b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
+8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
+NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
+ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
+q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
+nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2 G3"
+# Serial: 390156079458959257446133169266079962026824725800
+# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
+# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
+# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
+MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
+qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
+n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
+c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
+o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
+IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
+IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
+8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
+vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
+7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
+cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
+ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
+roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
+W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
+lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
+csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
+dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
+KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
+HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
+WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3 G3"
+# Serial: 268090761170461462463995952157327242137089239581
+# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
+# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
+# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
+MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
+/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
+FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
+U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
+ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
+FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
+A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
+eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
+sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
+VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
+A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
+ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
+FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
+oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
+u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
+0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
+3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
+8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
+PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
+ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G2"
+# Serial: 15385348160840213938643033620894905419
+# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
+# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
+# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
+n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
+biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
+EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
+bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
+YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
+BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
+QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
+0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
+lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
+B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
+ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G3"
+# Serial: 15459312981008553731928384953135426796
+# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
+# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
+# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
+RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
+Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
+RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
+AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
+JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
+6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G2"
+# Serial: 4293743540046975378534879503202253541
+# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
+# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
+# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G3"
+# Serial: 7089244469030293291760083333884364146
+# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
+# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
+# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Trusted Root G4"
+# Serial: 7451500558977370777930084869016614236
+# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
+# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
+# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
+RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
+ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
+xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
+ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
+DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
+jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
+CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
+EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
+fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
+uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
+chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
+9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
+SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
+fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
+sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
+cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
+0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
+4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
+r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
+/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
+gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Label: "COMODO RSA Certification Authority"
+# Serial: 101909084537582093308941363524873193117
+# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
+# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
+# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Label: "USERTrust RSA Certification Authority"
+# Serial: 2645093764781058787591871645665788717
+# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
+# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
+# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Label: "USERTrust ECC Certification Authority"
+# Serial: 123013823720199481456569720443997572134
+# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
+# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
+# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Label: "GlobalSign ECC Root CA - R4"
+# Serial: 14367148294922964480859022125800977897474
+# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
+# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
+# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
+FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
+uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
+kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
+ewv4n4Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Label: "GlobalSign ECC Root CA - R5"
+# Serial: 32785792099990507226680698011560947931244
+# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
+# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
+# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
+8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
+hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
+KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
+515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
+xwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G3"
+# Serial: 10003001
+# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
+# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
+# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
+DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
+cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
+IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
+xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
+KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
+9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
+5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
+6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
+Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
+bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
+BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
+XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
+INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
+LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
+Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
+gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
+/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
+0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
+fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
+4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
+1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
+QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
+94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden EV Root CA"
+# Serial: 10000013
+# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
+# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
+# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
+MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
+TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
+M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
+UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
+Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
+rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
+pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
+j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
+KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
+/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
+cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
+1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
+px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
+MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
+2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
+v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
+wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
+CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
+vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
+Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
+Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
+eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
+FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
+7uzXLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Label: "IdenTrust Commercial Root CA 1"
+# Serial: 13298821034946342390520003877796839426
+# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
+# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
+# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
+VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
+MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
+JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
+3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
+S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
+bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
+T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
+vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
+Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
+dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
+c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
+l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
+iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
+ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
+LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
+nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
+W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
+AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
+l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
+4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
+mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
+7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Label: "IdenTrust Public Sector Root CA 1"
+# Serial: 13298821034946342390521976156843933698
+# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
+# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
+# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
+VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
+MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
+MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
+ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
+RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
+bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
+/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
+3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
+EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
+9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
+GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
+2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
+WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
+W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
+AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
+DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
+TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
+lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
+mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
+WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
+tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
+GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
+8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - G2"
+# Serial: 1246989352
+# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
+# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
+# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
+cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
+IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
+dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
+NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
+dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
+dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
+aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
+RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
+cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
+wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
+U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
+jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
+BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
+jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
+1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
+nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
+VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - EC1"
+# Serial: 51543124481930649114116133369
+# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
+# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
+# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
+d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
+dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
+RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
+MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
+VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
+Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
+A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
+ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
+Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
+R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
+hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Label: "CFCA EV ROOT"
+# Serial: 407555286
+# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
+# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
+# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Root CA"
+# Serial: 1
+# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f
+# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8
+# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
+BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
+MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
+FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
+Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
+fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
+LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
+WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
+TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
+5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
+CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
+wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
+wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
+m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
+F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
+WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
+2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
+0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
+F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
+g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
+qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
+h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
+ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
+btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
+Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
+8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
+gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GB CA"
+# Serial: 157768595616588414422159278966750757568
+# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
+# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
+# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
+MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
+Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
+YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
+CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
+b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
+HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
+WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
+1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
+u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
+99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
+M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
+BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
+cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
+gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
+ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
+aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Label: "SZAFIR ROOT CA2"
+# Serial: 357043034767186914217277344587386743377558296292
+# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
+# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
+# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
+BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
+ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
+NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
+cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
+Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
+QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
+3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
+3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
+3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
+BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
+XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
+AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
+8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
+nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
+oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
+d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
+LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA 2"
+# Serial: 44979900017204383099463764357512596969
+# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
+# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
+# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
+gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
+A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
+OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
+VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
+b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
+DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
+0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
+OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
+fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
+Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
+o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
+sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
+OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
+Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
+adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
+3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
+F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
+CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
+XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
+djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
+WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
+AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
+P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
+b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
+XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
+5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
+DrW5viSP
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
+# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
+# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
+DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
+IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
+N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
+dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
+A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
+ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
+QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
+4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
+AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
+4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
+ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
+9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
+gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
+Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
+NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
+LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
+ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
+XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
+M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
+9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
+Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
+j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
+X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
+l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
+bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
+pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
+e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
+vm9qp/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
+# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
+# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
+BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
+bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
+b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
+BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
+YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
+MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
+dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
+QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
+jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
+C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
+lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
+TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
+# Subject: CN=ISRG Root X1 O=Internet Security Research Group
+# Label: "ISRG Root X1"
+# Serial: 172886928669790476064670243504169061120
+# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
+# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
+# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Label: "AC RAIZ FNMT-RCM"
+# Serial: 485876308206448804701554682760554759
+# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
+# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
+# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
+CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
+WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
+BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
+Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
+yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
+BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
+WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
+tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
+374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
+IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
+mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
+wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
+MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
+ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
+UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
+YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
+LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
+RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
+LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
+77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
+JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
+fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
+6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
+1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
+9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
+RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
+uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 1 O=Amazon
+# Subject: CN=Amazon Root CA 1 O=Amazon
+# Label: "Amazon Root CA 1"
+# Serial: 143266978916655856878034712317230054538369994
+# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
+# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
+# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
+ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
+9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
+IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
+VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
+93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
+jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
+A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
+U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
+N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
+o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
+5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
+rqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 2 O=Amazon
+# Subject: CN=Amazon Root CA 2 O=Amazon
+# Label: "Amazon Root CA 2"
+# Serial: 143266982885963551818349160658925006970653239
+# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
+# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
+# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
+gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
+W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
+1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
+8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
+2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
+z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
+8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
+mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
+7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
+0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
+UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
+LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
+k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
+7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
+btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
+urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
+n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
+76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
+9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
+4PsJYGw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 3 O=Amazon
+# Subject: CN=Amazon Root CA 3 O=Amazon
+# Label: "Amazon Root CA 3"
+# Serial: 143266986699090766294700635381230934788665930
+# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
+# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
+# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
+ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
+ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
+BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
+YyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 4 O=Amazon
+# Subject: CN=Amazon Root CA 4 O=Amazon
+# Label: "Amazon Root CA 4"
+# Serial: 143266989758080763974105200630763877849284878
+# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
+# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
+# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
+9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
+M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
+MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
+CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
+1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Label: "LuxTrust Global Root 2"
+# Serial: 59914338225734147123941058376788110305822489521
+# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c
+# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f
+# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
+# Serial: 1
+# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
+# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
+# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
+bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
+KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
+BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
+dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
+EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
+IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
+QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
+TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
+LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
+a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
+LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
+N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
+YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
+iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
+AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
+V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
+BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
+IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
+lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
+8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
+lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Label: "GDCA TrustAUTH R5 ROOT"
+# Serial: 9009899650740120186
+# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
+# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
+# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
+BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
+MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
+HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
+Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
+TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
+KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
+qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
+MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
+ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
+zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
+L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
+jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
+HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
+AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
+DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
+COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
+L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
+JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
+IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
+2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
+09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
+XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
+T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
+MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-1"
+# Serial: 15752444095811006489
+# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
+# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
+# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
+IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
+pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
+IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
+A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
+cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
+RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
+seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
+9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
+EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
+hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
+DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
+ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
+/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
+yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
+L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
+zl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-2"
+# Serial: 2711694510199101698
+# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
+# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
+# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
+-----BEGIN CERTIFICATE-----
+MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
+Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
+MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
+Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
+VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
+dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
+1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
+2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
+DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
+az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
+3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
+oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
+g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
+mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
+8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
+BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
+nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
+DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
+dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
+/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
+CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
+ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
+2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
+N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
+Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
+As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
+5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
+1uwJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor ECA-1"
+# Serial: 9548242946988625984
+# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
+# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
+# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
+IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
+RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
+3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
+BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
+3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
+owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
+wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
+ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
+BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
+civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
+AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
+soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
+WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
+tJ/X5g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Label: "SSL.com Root Certification Authority RSA"
+# Serial: 8875640296558310041
+# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
+# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
+# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
+BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
+DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
+OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
+xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
+qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
+C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
+6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
+/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
+YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
+JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
+US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
+ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
+M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
+A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
+cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
+Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
+PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
+q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
+cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
+a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
+H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
+K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
+nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
+oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
+Ic2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com Root Certification Authority ECC"
+# Serial: 8495723813297216424
+# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
+# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
+# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
+WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
+b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
+b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
+7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
+CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
+EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
+VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
+kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
+gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority RSA R2"
+# Serial: 6248227494352943350
+# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
+# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
+# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
+BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
+CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
+MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
+A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
+DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
+M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
+OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
+4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
+HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
+aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
+b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
+Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
+PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
+pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
+UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
+MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
+9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
+s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
+Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
+cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
+79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
+/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
+ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
+Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
+QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
+w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
+S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
+mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority ECC"
+# Serial: 3182246526754555285
+# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
+# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
+# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
+NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
+bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
+AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
+VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
+WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
+5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
+ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
+h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
+# Label: "GlobalSign Root CA - R6"
+# Serial: 1417766617973444989252670301619537
+# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae
+# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1
+# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg
+MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh
+bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx
+MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET
+MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI
+xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k
+ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD
+aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw
+LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw
+1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX
+k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2
+SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h
+bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n
+WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY
+rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce
+MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu
+bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt
+Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61
+55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj
+vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf
+cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz
+oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp
+nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs
+pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v
+JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R
+8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4
+5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GC CA"
+# Serial: 44084345621038548146064804565436152554
+# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23
+# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31
+# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw
+CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91
+bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg
+Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ
+BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu
+ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS
+b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni
+eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W
+p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T
+rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV
+57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg
+Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
+-----END CERTIFICATE-----
+
+# Issuer: CN=GTS Root R1 O=Google Trust Services LLC
+# Subject: CN=GTS Root R1 O=Google Trust Services LLC
+# Label: "GTS Root R1"
+# Serial: 146587175971765017618439757810265552097
+# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85
+# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8
+# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH
+MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
+QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
+MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
+cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
+f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX
+mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7
+zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P
+fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc
+vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4
+Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp
+zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO
+Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW
+k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+
+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF
+lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW
+Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
+d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z
+XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR
+gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3
+d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv
+J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg
+DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM
++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy
+F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9
+SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws
+E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl
+-----END CERTIFICATE-----
+
+# Issuer: CN=GTS Root R2 O=Google Trust Services LLC
+# Subject: CN=GTS Root R2 O=Google Trust Services LLC
+# Label: "GTS Root R2"
+# Serial: 146587176055767053814479386953112547951
+# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b
+# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d
+# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH
+MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
+QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
+MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
+cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
+CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg
+GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu
+XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd
+re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu
+PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1
+mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K
+8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj
+x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR
+nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0
+kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok
+twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp
+8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
+vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT
+z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA
+pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb
+pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB
+R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R
+RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk
+0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC
+5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF
+izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn
+yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC
+-----END CERTIFICATE-----
+
+# Issuer: CN=GTS Root R3 O=Google Trust Services LLC
+# Subject: CN=GTS Root R3 O=Google Trust Services LLC
+# Label: "GTS Root R3"
+# Serial: 146587176140553309517047991083707763997
+# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25
+# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5
+# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5
+-----BEGIN CERTIFICATE-----
+MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw
+CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
+MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
+MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
+Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
+736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A
+DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk
+fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA
+njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd
+-----END CERTIFICATE-----
+
+# Issuer: CN=GTS Root R4 O=Google Trust Services LLC
+# Subject: CN=GTS Root R4 O=Google Trust Services LLC
+# Label: "GTS Root R4"
+# Serial: 146587176229350439916519468929765261721
+# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26
+# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb
+# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd
+-----BEGIN CERTIFICATE-----
+MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw
+CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
+MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
+MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
+Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
+hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l
+xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0
+CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx
+sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=UCA Global G2 Root O=UniTrust
+# Subject: CN=UCA Global G2 Root O=UniTrust
+# Label: "UCA Global G2 Root"
+# Serial: 124779693093741543919145257850076631279
+# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8
+# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a
+# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9
+MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH
+bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x
+CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds
+b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr
+b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9
+kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm
+VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R
+VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc
+C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj
+tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY
+D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv
+j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl
+NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6
+iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP
+O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV
+ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj
+L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
+1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl
+1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU
+b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV
+PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj
+y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb
+EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg
+DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI
++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy
+YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX
+UB+K+wb1whnw0A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=UCA Extended Validation Root O=UniTrust
+# Subject: CN=UCA Extended Validation Root O=UniTrust
+# Label: "UCA Extended Validation Root"
+# Serial: 106100277556486529736699587978573607008
+# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2
+# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a
+# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH
+MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF
+eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx
+MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV
+BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog
+D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS
+sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop
+O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk
+sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi
+c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj
+VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz
+KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/
+TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G
+sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs
+1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD
+fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN
+l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
+ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ
+VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5
+c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp
+4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s
+t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj
+2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO
+vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C
+xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx
+cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM
+fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
+# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
+# Label: "Certigna Root CA"
+# Serial: 269714418870597844693661054334862075617
+# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77
+# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43
+# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68
+-----BEGIN CERTIFICATE-----
+MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw
+WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw
+MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x
+MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD
+VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX
+BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO
+ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M
+CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu
+I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm
+TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh
+C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf
+ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz
+IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT
+Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k
+JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5
+hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB
+GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
+1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov
+L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo
+dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr
+aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq
+hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L
+6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG
+HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6
+0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB
+lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi
+o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1
+gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v
+faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63
+Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh
+jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw
+3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
+# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
+# Label: "emSign Root CA - G1"
+# Serial: 235931866688319308814040
+# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac
+# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c
+# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67
+-----BEGIN CERTIFICATE-----
+MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD
+VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU
+ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH
+MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO
+MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv
+Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz
+f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO
+8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq
+d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM
+tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt
+Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB
+o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x
+PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM
+wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d
+GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH
+6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby
+RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
+iN66zB+Afko=
+-----END CERTIFICATE-----
+
+# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
+# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
+# Label: "emSign ECC Root CA - G3"
+# Serial: 287880440101571086945156
+# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40
+# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1
+# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b
+-----BEGIN CERTIFICATE-----
+MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG
+EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo
+bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
+RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ
+TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s
+b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw
+djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0
+WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS
+fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB
+zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq
+hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB
+CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD
++JbNR6iC8hZVdyR+EhCVBCyj
+-----END CERTIFICATE-----
+
+# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
+# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
+# Label: "emSign Root CA - C1"
+# Serial: 825510296613316004955058
+# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68
+# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01
+# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG
+A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg
+SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw
+MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
+biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v
+dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ
+BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ
+HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH
+3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH
+GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c
+xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1
+aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq
+TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
+BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87
+/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4
+kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG
+YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT
++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo
+WXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
+# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
+# Label: "emSign ECC Root CA - C3"
+# Serial: 582948710642506000014504
+# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5
+# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66
+# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3
+-----BEGIN CERTIFICATE-----
+MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG
+EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx
+IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw
+MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
+biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND
+IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci
+MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti
+sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O
+BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
+Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c
+3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J
+0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post
+# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post
+# Label: "Hongkong Post Root CA 3"
+# Serial: 46170865288971385588281144162979347873371282084
+# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0
+# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02
+# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6
+-----BEGIN CERTIFICATE-----
+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
+mpv0
+-----END CERTIFICATE-----
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py
new file mode 100644
index 00000000..7271acf4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+"""
+certifi.py
+~~~~~~~~~~
+
+This module returns the installation location of cacert.pem.
+"""
+import os
+
+
+def where():
+    f = os.path.dirname(__file__)
+
+    return os.path.join(f, 'cacert.pem')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d0a5ab0c650eda24b5a2293965f067979e7f9e20
GIT binary patch
literal 633
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI$GcYiuFfc?hFr+Xtq%bk$Ffv3jGNdpwv@kG4
zF@Z#aHCR9jLm3ztxRO(gN;1<j^$IGv>fnHjD<mVcSRpq*r8Fm1p(wSav?#Awp(G<!
zAv3SIBrzu^u_QA;Pa!8i8N$d<Q%Ft(nWR^cnybf^`Tzg_|9)VXF)}bPFf%YPID;%y
zWnf?^VPME&WXNJ-C}C!3W@M;^i?A@%fL+|o#1O0j@{C_G7Xt$W!dwkjkamzvesKxN
z0|kjC871r>-)0u&CFZ7<a4;}1#K)&)=A_2QgH>eZXXa^uoKONH(lkIp1tyBK85kJ!
z3yLz!5=&C`%My$9)ADmtQj3c9vkUdJi;c|94GXi3%*zZd%!_j>)63&cQcO$?3=9m?
z^YlaX3o;9Ip#h;=o@iMbm;n+3<M^`Fyp;SReNbRzre*3U=NF~w6;zgh++LoMT9nEI
z3J8$v85o6_G(bTE_CkDoN`7*Dd=SWmL2L{R3}9y>2)a8M6qYu*-~?a?Vi$wl%*M#W
F3;^Z!p&I}I

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py
new file mode 100644
index 00000000..0f9f820e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py
@@ -0,0 +1,39 @@
+######################## BEGIN LICENSE BLOCK ########################
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+
+from .compat import PY2, PY3
+from .universaldetector import UniversalDetector
+from .version import __version__, VERSION
+
+
+def detect(byte_str):
+    """
+    Detect the encoding of the given byte string.
+
+    :param byte_str:     The byte sequence to examine.
+    :type byte_str:      ``bytes`` or ``bytearray``
+    """
+    if not isinstance(byte_str, bytearray):
+        if not isinstance(byte_str, bytes):
+            raise TypeError('Expected object of type bytes or bytearray, got: '
+                            '{0}'.format(type(byte_str)))
+        else:
+            byte_str = bytearray(byte_str)
+    detector = UniversalDetector()
+    detector.feed(byte_str)
+    return detector.close()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3fad0a868ab18047b61f8e2d0b186b1a4530e7d8
GIT binary patch
literal 1088
zcmZSn%*&NH<x)&C0~9bZFfceUFfbH*GB7ZtFfgPrGUPBY<T5fuF*4*bF+?#jFoHyx
z7;=~ya#<LnSRj06h8$LgTsDR%HilewhA4Ih#uOHY76yhW4u%v~hF}dg1_p*qMg|53
z4Uh#T%nS?+0g*;f+E@c5QzFQ~zz~|3S(aK<oS5U1T9TSvl3xT-&&|NV5FZbc$;{7-
zk1t_oU|<My4GQ-3_e%!p1sTf1z`)=Pa(Olb149V|Lk$B%2_r)@6GO2#jLQV(+Ax$b
zgZ!1n!cf8rQr67K06|TR429kxT{R3Kky-|ZJO+jmHil*fhFV638b*dJcBpzr5QhUK
z5e#-=@nQxB1}+5!1qF!16-qKv6;kt(^HVbO(iQU4!2I;gveZ0<q{@<1h2oN;%)E3x
zF0dA>g2bZ4T(CrZaY>OC$QXr?j8w3QLUC$gX=+|_szOP=LTW`~Zf0Jp9z<J7WdTGD
zLYG290?7R0gan2BA}A-Zs3@^AApxwX*o1+B!L_0wHMt};MIk>aD>b<U>^zuJ#UOnk
zBfz?J6w>octQ4vZYBe}Pp~?k{#^TJp;*!L?<kS+77+h@$D+2=qh*u0252-9jbuB8&
zFDe1WeOi7|ZemFZD2_m`4gy6On3tBCngZ6DoReRi3J%K>4yZvOZ-F@}u*3jLq#7Wi
zIG=%mLBF6Vvn;VBRlh8;NIxw<CndG0SU<Z^KfBn-+}yA*%gDUU(89bpr!u`f-Xz7u
z#K6G7AU#h%M86=jKo{(ZoE+WqM9b2^43H2Q$Cst%rQ{dsCubxUrKFbV$H!;pWtPOp
z>lIXjJpyrx1Sp*efE>ck&&bcn$tcPMB6%78AmIe^a&mrdL1IY|NKp_dje^s6DJ*?M
z%*ii;gajx(LsNGUC~pLT0xF0flwUyl!CnRv1LAK`eAwjXr<CTT+6jYv4)UHDqX45A
FGXQ{#3Ml{p

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py
new file mode 100644
index 00000000..38f32517
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py
@@ -0,0 +1,386 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Big5 frequency table
+# by Taiwan's Mandarin Promotion Council
+# <http://www.edu.tw:81/mandr/>
+#
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+#Char to FreqOrder table
+BIG5_TABLE_SIZE = 5376
+
+BIG5_CHAR_TO_FREQ_ORDER = (
+   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
+3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
+1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
+  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
+3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
+4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
+5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
+ 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
+ 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
+ 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
+2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
+1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
+3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
+ 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
+3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
+2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
+ 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
+3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
+1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
+5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
+ 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
+5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
+1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
+  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
+ 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
+3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
+3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
+ 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
+2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
+2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
+ 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
+ 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
+3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
+1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
+1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
+1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
+2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
+ 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
+4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
+1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
+5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
+2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
+ 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
+  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
+ 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
+ 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
+5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
+ 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
+1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
+ 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
+ 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
+5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
+1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
+ 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
+3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
+4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
+3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
+ 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
+ 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
+1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
+4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
+3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
+3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
+2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
+5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
+3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
+5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
+1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
+2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
+1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
+  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
+1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
+4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
+3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
+ 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
+ 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
+ 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
+2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
+5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
+1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
+2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
+1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
+1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
+5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
+5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
+5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
+3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
+4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
+4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
+2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
+5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
+3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
+ 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
+5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
+5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
+1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
+2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
+3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
+4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
+5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
+3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
+4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
+1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
+1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
+4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
+1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
+ 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
+1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
+1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
+3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
+ 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
+5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
+2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
+1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
+1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
+5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
+ 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
+4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
+ 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
+2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
+ 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
+1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
+1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
+ 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
+4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
+4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
+1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
+3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
+5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
+5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
+1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
+2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
+1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
+3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
+2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
+3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
+2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
+4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
+4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
+3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
+  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
+3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
+ 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
+3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
+4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
+3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
+1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
+5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
+ 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
+5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
+1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
+ 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
+4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
+4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
+ 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
+2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
+2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
+3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
+1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
+4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
+2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
+1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
+1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
+2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
+3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
+1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
+5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
+1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
+4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
+1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
+ 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
+1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
+4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
+4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
+2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
+1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
+4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
+ 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
+5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
+2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
+3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
+4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
+ 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
+5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
+5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
+1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
+4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
+4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
+2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
+3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
+3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
+2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
+1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
+4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
+3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
+3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
+2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
+4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
+5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
+3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
+2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
+3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
+1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
+2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
+3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
+4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
+2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
+2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
+5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
+1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
+2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
+1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
+3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
+4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
+2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
+3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
+3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
+2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
+4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
+2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
+3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
+4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
+5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
+3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
+ 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
+1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
+4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
+1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
+4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
+5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
+ 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
+5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
+5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
+2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
+3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
+2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
+2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
+ 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
+1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
+4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
+3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
+3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
+ 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
+2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
+ 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
+2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
+4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
+1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
+4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
+1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
+3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
+ 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
+3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
+5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
+5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
+3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
+3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
+1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
+2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
+5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
+1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
+1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
+3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
+ 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
+1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
+4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
+5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
+2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
+3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
+ 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
+1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
+2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
+2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
+5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
+5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
+5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
+2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
+2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
+1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
+4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
+3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
+3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
+4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
+4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
+2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
+2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
+5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
+4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
+5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
+4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
+ 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
+ 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
+1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
+3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
+4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
+1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
+5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
+2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
+2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
+3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
+5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
+1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
+3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
+5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
+1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
+5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
+2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
+3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
+2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
+3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
+3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
+3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
+4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
+ 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
+2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
+4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
+3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
+5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
+1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
+5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
+ 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
+1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
+ 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
+4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
+1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
+4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
+1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
+ 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
+3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
+4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
+5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
+ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
+3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
+ 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
+2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376
+)
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d156f124ee6f3006d2f653f76a4c8654c1158aaf
GIT binary patch
literal 54748
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py
new file mode 100644
index 00000000..98f99701
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py
@@ -0,0 +1,47 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import Big5DistributionAnalysis
+from .mbcssm import BIG5_SM_MODEL
+
+
+class Big5Prober(MultiByteCharSetProber):
+    def __init__(self):
+        super(Big5Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(BIG5_SM_MODEL)
+        self.distribution_analyzer = Big5DistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "Big5"
+
+    @property
+    def language(self):
+        return "Chinese"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a9c3f180edc617fa36e55f0449fb5b8b0f71059a
GIT binary patch
literal 1592
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHHF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XH{Gn8M1C%E*w$$dJOu(89pb%)k&C#leum
z&Je7@!N9<f$;iOKpaCLE#26SDd`ojmGMy?*Qk^pri-J>20*dmJQi~w+LJSNH&iN^s
zdFjC=i6yDNiOCt6d8rUN2?hoRr_6Lym(1dlqRgbylFa-($GpUx%Hqsohzeei3Qu>_
z_+a07Uw;=@pAs&RNM^bz#16RcnLxrI-|I6lFr+eoJe|S-a(WaKLn<>UFhJg5WQbw`
zbD2O=&5R(w2L)?@f-V{48xRI@oIxhpFfcHbFff!bGSo0IG&3<|F@eH?v4okSgoU9Q
zEE><sP{IZhtzlq@X9uav;s9|$;T;V2fu9B^$QV|Tfu#khML{eeE+`D+<1_OzOXA~$
zK$Zr9Y%SqrU|>iFhgE!WZV<>zC8D6nL<*kxL{Rutr52Tdj4VnmPAvi3Qvx!#I5j6t
z1C$)VL~$Vl1A~4+QD#|UNveKXVv&AYeojhiQL%n@p?-F;k-52HVV043nW2SwaZY7=
zdAv!AiHU)MfkAqneu#cSW`S;IUU5lcPL6JQqGf4d21p2u<I7U>Qu2%RlQR;FQc_Fw
zlQPpy3&2sXS5O(m#=yX!4Dv3>lMIZ)jQor|jPTF}c@`YHAor#)G6ZXYyy*vaJ}4=G
zT@Ln95GbZ0T#%Or#y2HApeV^mEGkYdiO);SP1OYX4CG`6CW3xq2PJ(_YA;TO_ygqm
z!Qm}X+~g$YrI#kAr|KfSqydV&5|Cs(*thZV;QSUJpPQdjnv)tI4~|{1f`X#_g4Cjt
z${<h(1@VE(15h+UJPKkBOoV~+mlDWFAg{17a<cKWK=U9!0|P^D5-8CYr<Op{YY@nx
zC7>b-lI@B?MN}@Nhyv%!5&>xZry%7)NX`VApPQ6iT$~HeykLtFz6Y}gCJ4aMV*`mX
PI~h<=fFe|Y5e%6DR=##=

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py
new file mode 100644
index 00000000..c0395f4a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py
@@ -0,0 +1,233 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE,
+                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)
+from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE,
+                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)
+from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE,
+                         GB2312_TYPICAL_DISTRIBUTION_RATIO)
+from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE,
+                       BIG5_TYPICAL_DISTRIBUTION_RATIO)
+from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE,
+                      JIS_TYPICAL_DISTRIBUTION_RATIO)
+
+
+class CharDistributionAnalysis(object):
+    ENOUGH_DATA_THRESHOLD = 1024
+    SURE_YES = 0.99
+    SURE_NO = 0.01
+    MINIMUM_DATA_THRESHOLD = 3
+
+    def __init__(self):
+        # Mapping table to get frequency order from char order (get from
+        # GetOrder())
+        self._char_to_freq_order = None
+        self._table_size = None  # Size of above table
+        # This is a constant value which varies from language to language,
+        # used in calculating confidence.  See
+        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
+        # for further detail.
+        self.typical_distribution_ratio = None
+        self._done = None
+        self._total_chars = None
+        self._freq_chars = None
+        self.reset()
+
+    def reset(self):
+        """reset analyser, clear any state"""
+        # If this flag is set to True, detection is done and conclusion has
+        # been made
+        self._done = False
+        self._total_chars = 0  # Total characters encountered
+        # The number of characters whose frequency order is less than 512
+        self._freq_chars = 0
+
+    def feed(self, char, char_len):
+        """feed a character with known length"""
+        if char_len == 2:
+            # we only care about 2-bytes character in our distribution analysis
+            order = self.get_order(char)
+        else:
+            order = -1
+        if order >= 0:
+            self._total_chars += 1
+            # order is valid
+            if order < self._table_size:
+                if 512 > self._char_to_freq_order[order]:
+                    self._freq_chars += 1
+
+    def get_confidence(self):
+        """return confidence based on existing data"""
+        # if we didn't receive any character in our consideration range,
+        # return negative answer
+        if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD:
+            return self.SURE_NO
+
+        if self._total_chars != self._freq_chars:
+            r = (self._freq_chars / ((self._total_chars - self._freq_chars)
+                 * self.typical_distribution_ratio))
+            if r < self.SURE_YES:
+                return r
+
+        # normalize confidence (we don't want to be 100% sure)
+        return self.SURE_YES
+
+    def got_enough_data(self):
+        # It is not necessary to receive all data to draw conclusion.
+        # For charset detection, certain amount of data is enough
+        return self._total_chars > self.ENOUGH_DATA_THRESHOLD
+
+    def get_order(self, byte_str):
+        # We do not handle characters based on the original encoding string,
+        # but convert this encoding string to a number, here called order.
+        # This allows multiple encodings of a language to share one frequency
+        # table.
+        return -1
+
+
+class EUCTWDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(EUCTWDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER
+        self._table_size = EUCTW_TABLE_SIZE
+        self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for euc-TW encoding, we are interested
+        #   first  byte range: 0xc4 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char = byte_str[0]
+        if first_char >= 0xC4:
+            return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1
+        else:
+            return -1
+
+
+class EUCKRDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(EUCKRDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
+        self._table_size = EUCKR_TABLE_SIZE
+        self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for euc-KR encoding, we are interested
+        #   first  byte range: 0xb0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char = byte_str[0]
+        if first_char >= 0xB0:
+            return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1
+        else:
+            return -1
+
+
+class GB2312DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(GB2312DistributionAnalysis, self).__init__()
+        self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER
+        self._table_size = GB2312_TABLE_SIZE
+        self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for GB2312 encoding, we are interested
+        #  first  byte range: 0xb0 -- 0xfe
+        #  second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = byte_str[0], byte_str[1]
+        if (first_char >= 0xB0) and (second_char >= 0xA1):
+            return 94 * (first_char - 0xB0) + second_char - 0xA1
+        else:
+            return -1
+
+
+class Big5DistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(Big5DistributionAnalysis, self).__init__()
+        self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER
+        self._table_size = BIG5_TABLE_SIZE
+        self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for big5 encoding, we are interested
+        #   first  byte range: 0xa4 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = byte_str[0], byte_str[1]
+        if first_char >= 0xA4:
+            if second_char >= 0xA1:
+                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
+            else:
+                return 157 * (first_char - 0xA4) + second_char - 0x40
+        else:
+            return -1
+
+
+class SJISDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(SJISDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
+        self._table_size = JIS_TABLE_SIZE
+        self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for sjis encoding, we are interested
+        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
+        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
+        # no validation needed here. State machine has done that
+        first_char, second_char = byte_str[0], byte_str[1]
+        if (first_char >= 0x81) and (first_char <= 0x9F):
+            order = 188 * (first_char - 0x81)
+        elif (first_char >= 0xE0) and (first_char <= 0xEF):
+            order = 188 * (first_char - 0xE0 + 31)
+        else:
+            return -1
+        order = order + second_char - 0x40
+        if second_char > 0x7F:
+            order = -1
+        return order
+
+
+class EUCJPDistributionAnalysis(CharDistributionAnalysis):
+    def __init__(self):
+        super(EUCJPDistributionAnalysis, self).__init__()
+        self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
+        self._table_size = JIS_TABLE_SIZE
+        self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
+
+    def get_order(self, byte_str):
+        # for euc-JP encoding, we are interested
+        #   first  byte range: 0xa0 -- 0xfe
+        #   second byte range: 0xa1 -- 0xfe
+        # no validation needed here. State machine has done that
+        char = byte_str[0]
+        if char >= 0xA0:
+            return 94 * (char - 0xA1) + byte_str[1] - 0xa1
+        else:
+            return -1
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aafc8a6487dd9b2b0e37966aef32c67701457bbb
GIT binary patch
literal 9073
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
B<*5Jw

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py
new file mode 100644
index 00000000..8b3738ef
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py
@@ -0,0 +1,106 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import ProbingState
+from .charsetprober import CharSetProber
+
+
+class CharSetGroupProber(CharSetProber):
+    def __init__(self, lang_filter=None):
+        super(CharSetGroupProber, self).__init__(lang_filter=lang_filter)
+        self._active_num = 0
+        self.probers = []
+        self._best_guess_prober = None
+
+    def reset(self):
+        super(CharSetGroupProber, self).reset()
+        self._active_num = 0
+        for prober in self.probers:
+            if prober:
+                prober.reset()
+                prober.active = True
+                self._active_num += 1
+        self._best_guess_prober = None
+
+    @property
+    def charset_name(self):
+        if not self._best_guess_prober:
+            self.get_confidence()
+            if not self._best_guess_prober:
+                return None
+        return self._best_guess_prober.charset_name
+
+    @property
+    def language(self):
+        if not self._best_guess_prober:
+            self.get_confidence()
+            if not self._best_guess_prober:
+                return None
+        return self._best_guess_prober.language
+
+    def feed(self, byte_str):
+        for prober in self.probers:
+            if not prober:
+                continue
+            if not prober.active:
+                continue
+            state = prober.feed(byte_str)
+            if not state:
+                continue
+            if state == ProbingState.FOUND_IT:
+                self._best_guess_prober = prober
+                return self.state
+            elif state == ProbingState.NOT_ME:
+                prober.active = False
+                self._active_num -= 1
+                if self._active_num <= 0:
+                    self._state = ProbingState.NOT_ME
+                    return self.state
+        return self.state
+
+    def get_confidence(self):
+        state = self.state
+        if state == ProbingState.FOUND_IT:
+            return 0.99
+        elif state == ProbingState.NOT_ME:
+            return 0.01
+        best_conf = 0.0
+        self._best_guess_prober = None
+        for prober in self.probers:
+            if not prober:
+                continue
+            if not prober.active:
+                self.logger.debug('%s not active', prober.charset_name)
+                continue
+            conf = prober.get_confidence()
+            self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf)
+            if best_conf < conf:
+                best_conf = conf
+                self._best_guess_prober = prober
+        if not self._best_guess_prober:
+            return 0.0
+        return best_conf
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a0eb850748e1c6e390e32b1f4f1b109f5abaea7c
GIT binary patch
literal 3249
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
Lfl6BeMge93;ZL`l

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py
new file mode 100644
index 00000000..eac4e598
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py
@@ -0,0 +1,145 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import logging
+import re
+
+from .enums import ProbingState
+
+
+class CharSetProber(object):
+
+    SHORTCUT_THRESHOLD = 0.95
+
+    def __init__(self, lang_filter=None):
+        self._state = None
+        self.lang_filter = lang_filter
+        self.logger = logging.getLogger(__name__)
+
+    def reset(self):
+        self._state = ProbingState.DETECTING
+
+    @property
+    def charset_name(self):
+        return None
+
+    def feed(self, buf):
+        pass
+
+    @property
+    def state(self):
+        return self._state
+
+    def get_confidence(self):
+        return 0.0
+
+    @staticmethod
+    def filter_high_byte_only(buf):
+        buf = re.sub(b'([\x00-\x7F])+', b' ', buf)
+        return buf
+
+    @staticmethod
+    def filter_international_words(buf):
+        """
+        We define three types of bytes:
+        alphabet: english alphabets [a-zA-Z]
+        international: international characters [\x80-\xFF]
+        marker: everything else [^a-zA-Z\x80-\xFF]
+
+        The input buffer can be thought to contain a series of words delimited
+        by markers. This function works to filter all words that contain at
+        least one international character. All contiguous sequences of markers
+        are replaced by a single space ascii character.
+
+        This filter applies to all scripts which do not use English characters.
+        """
+        filtered = bytearray()
+
+        # This regex expression filters out only words that have at-least one
+        # international character. The word may include one marker character at
+        # the end.
+        words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?',
+                           buf)
+
+        for word in words:
+            filtered.extend(word[:-1])
+
+            # If the last character in the word is a marker, replace it with a
+            # space as markers shouldn't affect our analysis (they are used
+            # similarly across all languages and may thus have similar
+            # frequencies).
+            last_char = word[-1:]
+            if not last_char.isalpha() and last_char < b'\x80':
+                last_char = b' '
+            filtered.extend(last_char)
+
+        return filtered
+
+    @staticmethod
+    def filter_with_english_letters(buf):
+        """
+        Returns a copy of ``buf`` that retains only the sequences of English
+        alphabet and high byte characters that are not between <> characters.
+        Also retains English alphabet and high byte characters immediately
+        before occurrences of >.
+
+        This filter can be applied to all scripts which contain both English
+        characters and extended ASCII characters, but is currently only used by
+        ``Latin1Prober``.
+        """
+        filtered = bytearray()
+        in_tag = False
+        prev = 0
+
+        for curr in range(len(buf)):
+            # Slice here to get bytes instead of an int with Python 3
+            buf_char = buf[curr:curr + 1]
+            # Check if we're coming out of or entering an HTML tag
+            if buf_char == b'>':
+                in_tag = False
+            elif buf_char == b'<':
+                in_tag = True
+
+            # If current character is not extended-ASCII and not alphabetic...
+            if buf_char < b'\x80' and not buf_char.isalpha():
+                # ...and we're not in a tag
+                if curr > prev and not in_tag:
+                    # Keep everything after last non-extended-ASCII,
+                    # non-alphabetic character
+                    filtered.extend(buf[prev:curr])
+                    # Output a space to delimit stretch we kept
+                    filtered.extend(b' ')
+                prev = curr + 1
+
+        # If we're not in a tag...
+        if not in_tag:
+            # Keep everything after last non-extended-ASCII, non-alphabetic
+            # character
+            filtered.extend(buf[prev:])
+
+        return filtered
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..85e3eaf80fe2cda460900ff040c79b6089d95059
GIT binary patch
literal 4666
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
RY9|ZwAIPCRj66&N%m9%-mBau5

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py
@@ -0,0 +1 @@
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..34edeacf6d96ae124769fbd20987ba5250cc0ecf
GIT binary patch
literal 202
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaWMk}gML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GM%Tn`F@{9D7GZKqZQcLucb29bg<1_OzOXB183MxxD
V7#J9Aa`RJ4b5iX<t^>J)0RXThGn)Va

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py
new file mode 100644
index 00000000..c61136b6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+"""
+Script which takes one or more file paths and reports on their detected
+encodings
+
+Example::
+
+    % chardetect somefile someotherfile
+    somefile: windows-1252 with confidence 0.5
+    someotherfile: ascii with confidence 1.0
+
+If no paths are provided, it takes its input from stdin.
+
+"""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import argparse
+import sys
+
+from pip._vendor.chardet import __version__
+from pip._vendor.chardet.compat import PY2
+from pip._vendor.chardet.universaldetector import UniversalDetector
+
+
+def description_of(lines, name='stdin'):
+    """
+    Return a string describing the probable encoding of a file or
+    list of strings.
+
+    :param lines: The lines to get the encoding of.
+    :type lines: Iterable of bytes
+    :param name: Name of file or collection of lines
+    :type name: str
+    """
+    u = UniversalDetector()
+    for line in lines:
+        line = bytearray(line)
+        u.feed(line)
+        # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
+        if u.done:
+            break
+    u.close()
+    result = u.result
+    if PY2:
+        name = name.decode(sys.getfilesystemencoding(), 'ignore')
+    if result['encoding']:
+        return '{0}: {1} with confidence {2}'.format(name, result['encoding'],
+                                                     result['confidence'])
+    else:
+        return '{0}: no result'.format(name)
+
+
+def main(argv=None):
+    """
+    Handles command line arguments and gets things started.
+
+    :param argv: List of arguments, as if specified on the command-line.
+                 If None, ``sys.argv[1:]`` is used instead.
+    :type argv: list of str
+    """
+    # Get command line arguments
+    parser = argparse.ArgumentParser(
+        description="Takes one or more file paths and reports their detected \
+                     encodings")
+    parser.add_argument('input',
+                        help='File whose encoding we would like to determine. \
+                              (default: stdin)',
+                        type=argparse.FileType('rb'), nargs='*',
+                        default=[sys.stdin if PY2 else sys.stdin.buffer])
+    parser.add_argument('--version', action='version',
+                        version='%(prog)s {0}'.format(__version__))
+    args = parser.parse_args(argv)
+
+    for f in args.input:
+        if f.isatty():
+            print("You are running chardetect interactively. Press " +
+                  "CTRL-D twice at the start of a blank line to signal the " +
+                  "end of your input. If you want help, run chardetect " +
+                  "--help\n", file=sys.stderr)
+        print(description_of(f, f.name))
+
+
+if __name__ == '__main__':
+    main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a2e23991b4bbd792639a7edf0d77a95a01c6ed64
GIT binary patch
literal 3331
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py
new file mode 100644
index 00000000..68fba44f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py
@@ -0,0 +1,88 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import logging
+
+from .enums import MachineState
+
+
+class CodingStateMachine(object):
+    """
+    A state machine to verify a byte sequence for a particular encoding. For
+    each byte the detector receives, it will feed that byte to every active
+    state machine available, one byte at a time. The state machine changes its
+    state based on its previous state and the byte it receives. There are 3
+    states in a state machine that are of interest to an auto-detector:
+
+    START state: This is the state to start with, or a legal byte sequence
+                 (i.e. a valid code point) for character has been identified.
+
+    ME state:  This indicates that the state machine identified a byte sequence
+               that is specific to the charset it is designed for and that
+               there is no other possible encoding which can contain this byte
+               sequence. This will to lead to an immediate positive answer for
+               the detector.
+
+    ERROR state: This indicates the state machine identified an illegal byte
+                 sequence for that encoding. This will lead to an immediate
+                 negative answer for this encoding. Detector will exclude this
+                 encoding from consideration from here on.
+    """
+    def __init__(self, sm):
+        self._model = sm
+        self._curr_byte_pos = 0
+        self._curr_char_len = 0
+        self._curr_state = None
+        self.logger = logging.getLogger(__name__)
+        self.reset()
+
+    def reset(self):
+        self._curr_state = MachineState.START
+
+    def next_state(self, c):
+        # for each byte we get its class
+        # if it is first byte, we also get byte length
+        byte_class = self._model['class_table'][c]
+        if self._curr_state == MachineState.START:
+            self._curr_byte_pos = 0
+            self._curr_char_len = self._model['char_len_table'][byte_class]
+        # from byte's class and state_table, we get its next state
+        curr_state = (self._curr_state * self._model['class_factor']
+                      + byte_class)
+        self._curr_state = self._model['state_table'][curr_state]
+        self._curr_byte_pos += 1
+        return self._curr_state
+
+    def get_current_charlen(self):
+        return self._curr_char_len
+
+    def get_coding_state_machine(self):
+        return self._model['name']
+
+    @property
+    def language(self):
+        return self._model['language']
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cc9e9f57b641979350a99a6409f014efece2973f
GIT binary patch
literal 3736
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py
new file mode 100644
index 00000000..ddd74687
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py
@@ -0,0 +1,34 @@
+######################## BEGIN LICENSE BLOCK ########################
+# Contributor(s):
+#   Dan Blanchard
+#   Ian Cordasco
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+import sys
+
+
+if sys.version_info < (3, 0):
+    PY2 = True
+    PY3 = False
+    base_str = (str, unicode)
+    text_type = unicode
+else:
+    PY2 = False
+    PY3 = True
+    base_str = (bytes, str)
+    text_type = str
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..29dd4ab0bca067b07dec0956b74ff0d3d00e56b8
GIT binary patch
literal 451
zcmZSn%*&NH<x)&C0~9bbFfceUFfbIyF)%QsFfgPrGUPBYL@_X=GB9K@GNiCDWHT@n
z*)XIsF+?#lq_QwXu`;BxF{H9Hq%ko>aex?6oD6w#U@2y>GFFCEE|40i0yc&yPLQ#|
z8mtTq44MD`|Nrlo39>d5<OB^SkRXD~&A`A=0^$}|7MJiaFff#*78Pga=f!8{rRA5f
zFfcHL6qTleRRlyDm4J+NOUx;Ti5P=ric5-0*cliYO7k+4^HWkwI2afhk`jwk<3SRf
zARAIEO5#f@3sS)bBvqEA7HfcA11E}e85kJ!3yLz!5=&C`%My$9)ADmtQj3c9vkUdJ
zi;c|94GXi3%*zZd%!_j>)63&cQcO$?3=9m?^YlaX3o;9IGxLf|5_58N%M&e212aHE
zU>skTnwOGaq@SFTSd@}lqMw|fTaZ|yS5OIdrA=;rN@-52ofs%egcukYc$oPa*%;Xv
Kc^EmFAT$6mKVzT(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py
new file mode 100644
index 00000000..efd793ab
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py
@@ -0,0 +1,49 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .chardistribution import EUCKRDistributionAnalysis
+from .codingstatemachine import CodingStateMachine
+from .mbcharsetprober import MultiByteCharSetProber
+from .mbcssm import CP949_SM_MODEL
+
+
+class CP949Prober(MultiByteCharSetProber):
+    def __init__(self):
+        super(CP949Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(CP949_SM_MODEL)
+        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
+        #       not different.
+        self.distribution_analyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "CP949"
+
+    @property
+    def language(self):
+        return "Korean"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..22a88c0b8258c0217896b3e1212ea4f4af013d67
GIT binary patch
literal 1600
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHHF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XH{Gn8M1C%F2+&$dJOu(89pb%)k&C#leum
z&Je7@!N9<f$;iOKpaCLEBpDbOTtl6`gIqF;ONug+N=q{H^BnUMb1I87iy=yc7#J9w
z^HVbO(t}G9OHzFklQS~&QXz6;3=9mur8y;;PL(C8&KZeC!KozyMfpjoMG$#Dklp}G
z6U+Eu-*{ht7gwJWZkP~69XtS-7#J9wKmnl7z`&5o0P=SV1IYDJObn^apzr|sgpnbN
z1<YjvNi{QqydM;-0SdijkcU7R#Bm0hWW&I~P{P1a!pKm=z|hRZki`TF3dRy<h7uNr
zX0T{HD?<qzNVJB5A)XziE{g-i1qFF9*bjahoFHRZK?ar<q!tCSfViMwjE~RE%PfhH
z4+2>l1hTb+lYxOD85~ye#koPCs4Wo%#V1nW#wUV8w<@)$1Y~4UYH?}_*q#!Qxy7kD
zX&NAHV4}E)fq_B4peVB}u_RT$EU`#GEk7qEwWwG>yHG#7*vQ=6urSNWyv)$Tyf~*a
zy*%C|#l*zGz`!6qPd`MzAhSR>Gq1QLF(*g2Jkhc=Fasn6#_?sTc`5lt`pFrIMJcHz
z`pE^BCYA-@c+)GW3}RzoU{D767vxI@Mqx&NW*$a(@Pd2`4qlLhQy3Y7H9%442lkFL
zD6YY72m2|A3zX0X+CL>cpjgRBEGkYdiO);SP1OeZ4diGBCW5{Kg@t#1QEFn|pz{_e
zc5)K)(n}N5Q$d-g7~&-jkdsS5lJQ{Q#>ba{q9Hy$H$SB`CpA7E9KT=%1x5J<sYNA~
zL7)%{0%cZ+CkHylz<Epw6iXn#urYFS@UuYkp#U^4Q;@P0B%^`KDM;Qc29;B}ka7x~
zIZOB%7#MPsK*_y0wFHvTgFvBG0x~~0DY>{f7o35?77vav07sAwB+l$)Kw$xjQUOLV
GWCj2x@^-%f

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py
new file mode 100644
index 00000000..04512072
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py
@@ -0,0 +1,76 @@
+"""
+All of the Enums that are used throughout the chardet package.
+
+:author: Dan Blanchard (dan.blanchard@gmail.com)
+"""
+
+
+class InputState(object):
+    """
+    This enum represents the different states a universal detector can be in.
+    """
+    PURE_ASCII = 0
+    ESC_ASCII = 1
+    HIGH_BYTE = 2
+
+
+class LanguageFilter(object):
+    """
+    This enum represents the different language filters we can apply to a
+    ``UniversalDetector``.
+    """
+    CHINESE_SIMPLIFIED = 0x01
+    CHINESE_TRADITIONAL = 0x02
+    JAPANESE = 0x04
+    KOREAN = 0x08
+    NON_CJK = 0x10
+    ALL = 0x1F
+    CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL
+    CJK = CHINESE | JAPANESE | KOREAN
+
+
+class ProbingState(object):
+    """
+    This enum represents the different states a prober can be in.
+    """
+    DETECTING = 0
+    FOUND_IT = 1
+    NOT_ME = 2
+
+
+class MachineState(object):
+    """
+    This enum represents the different states a state machine can be in.
+    """
+    START = 0
+    ERROR = 1
+    ITS_ME = 2
+
+
+class SequenceLikelihood(object):
+    """
+    This enum represents the likelihood of a character following the previous one.
+    """
+    NEGATIVE = 0
+    UNLIKELY = 1
+    LIKELY = 2
+    POSITIVE = 3
+
+    @classmethod
+    def get_num_categories(cls):
+        """:returns: The number of likelihood categories in the enum."""
+        return 4
+
+
+class CharacterCategory(object):
+    """
+    This enum represents the different categories language models for
+    ``SingleByteCharsetProber`` put characters into.
+
+    Anything less than CONTROL is considered a letter.
+    """
+    UNDEFINED = 255
+    LINE_BREAK = 254
+    SYMBOL = 253
+    DIGIT = 252
+    CONTROL = 251
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3395ece6789b2f5487f719cb76b980a7eeca5bea
GIT binary patch
literal 3505
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJNF)%QsFfc?hFr+Xtq%tz3F*2kuF|;r+G&3+n
zMlms@FvCPy;G)b7DXcJ2Hn=DYLkc@glmjlx%8<ed6Xk-7vN5D^!$f)DqU;PQybQq_
zd?0rfF)%Q2Ip*Xj<fkc=WTYy%=9T6aE0km;mMA0^r7Dybr=}>BWEAC>rf1}rmVlKc
zXCxM-q?RZYBqnDkrl;z0aakpnmSp4?St+<A<|#PkB<6vYC}^Z4=IJHDxDM&LiJ3Wi
z$@#gOTqRr#3=E!m1*IjyC5a`e@Ze%(U|?_pIZJ_ofgzQFA&L<kXiT6$i(&?aSQHB=
zsG?XIf`T<zKq`Yl9#BwFPzcG$ELKR(E6r6XN-Zc#El$lV0eK`<Atf^{Ewv~$uSB63
zWLdF7qC#n2W?5=cabk`_N@_`Ja!G!XLULlBLQ<+iW}Y4w$h1sQ1ZINVlgY%uz@Wj#
zz`#(#!N9-}AD@?)n;IVv_CkDoZhlH>4v5PRmP^S`hDrs52D!#N20MFtmT)pKFt`Rg
zBk?>u-96%+B12p?K-M6L;v5DB2K|Df%(BFiRQ<BVBK@@doRrj}V*Ttw{p?~Rb92MO
zEF<$WLksiboXYg_c#{+p69WSSgY-Q85dDJ80^Q8K;*!Li9NqFn%hJFMkPsNhm!;;V
z<QM6KBPO*(9~4f-dIgn1Ap1eyDh3g3%xsJxSOQ8KK8bnhrHSdOZkahHsYUQ80)+-R
zio6I$Q3?w~6dNcFN3k=curWk&Fr+dwq_QwLMR78uax$c{GB~BOF*rqWfg%$We#KcN
zL}m`ueF|w{2No-or-CCfv7jKQQlTVYArTyr2??RF$aaCobwUC(j^WXp2}(+tpdiQ;
zU|?X#lm|sQHv<Dh5J*W7$j?EbtXv|*z`)?_;pyiZ>>3~J=^NnV>E`L`QX-5b91`T{
z;u+%U@8{?PPB31M0gfQ`C7>ka?H}ao=vM;rte?MMyt9{g3CLVWA0Mz7)M&7nvzIp_
zVSrimPaPn43W9PO$lq)%ptOO&T#O|=3=9kbMfpjYdFd2qWOowc9-fg4it>|EiORg_
zF$v0)F0LW2&LN(D?%;@W^AGiNiT4ZvN0gs`NWAaBXHQUS1eJxT*%K7(zKO{hnR%%c
z2fH6R!43|8g<Oaez`2e<(TN`VtPBhc!6A-8AtfM|YfzAX5IER9LxKlGu!}G-Fld6(
zJ*Y^4mx`cF5S&_AnwpoK>XVtBnv<E4pPzzRGMW-uGN!VF3P(^IfDu$U1_gs_nc@h7
zF_Htf98_&5Du7D$#N?9HB89a4oSgjf%)E4PO<howT9%n#TC9+tmkKTNK;=E6TFV3#
zKFOdm4u+jUz6O<sDU1xk8lZx&*ouLH!Kx^=q_iln*h(QJBUK@<G#8ZX^3xQMT#}qv
zlA4}hl$lzrkeLUz9#qNbfs0mf@udN>16;Hv=M+OkK(3*CsRk~@(^E_0^Gb8$5w5ld
z`5fe724)RV;eeiGK}o^S)!i|~Gt3oSUWEGjczV0~M1m78lnGK4;2-P>Rs^a*l5-M^
zi*r*;GV)V`q(HR_$jbxh`5*}f1_mRLS3!jcENQbbvN4r_3VP>^#3FD?a)!iaB|LS5
zA`e{e>kyf`Q&<_I*g-WrsNO5yK`>DxnrVnQQGi$Sx%nxnImHTT`9;uLJvcKjJtx(v
zvLqGc=Hk>6P(74dl#rlMP+Ee>5un6alCQ@F*5#O2S&{+D9671QptfORo`SQ#Ur3O@
zk3wd#LUMjyab`+tQEG}pqC!q;Nl9uEG}HVCwF&-#h`%7>4~X~;icC;+qo)&4+6nb@
zadq?bb9Di?5`8@VT;rXBTphi^NhLVa*U8@pT=2Pgx_gE|YJP}25Ge!9qI=#50#!DS
z@Z`aUsO|kUz@7ya7+_!ICuOB3mw?-kL7-+r5U8pO0u`L#BnCDJ><0uvci(`ssSTuw
UZU?GpiXn+!j8lwXj1xox0BdPVSO5S3

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py
new file mode 100644
index 00000000..c70493f2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py
@@ -0,0 +1,101 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .codingstatemachine import CodingStateMachine
+from .enums import LanguageFilter, ProbingState, MachineState
+from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL,
+                    ISO2022KR_SM_MODEL)
+
+
+class EscCharSetProber(CharSetProber):
+    """
+    This CharSetProber uses a "code scheme" approach for detecting encodings,
+    whereby easily recognizable escape or shift sequences are relied on to
+    identify these encodings.
+    """
+
+    def __init__(self, lang_filter=None):
+        super(EscCharSetProber, self).__init__(lang_filter=lang_filter)
+        self.coding_sm = []
+        if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED:
+            self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL))
+            self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL))
+        if self.lang_filter & LanguageFilter.JAPANESE:
+            self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL))
+        if self.lang_filter & LanguageFilter.KOREAN:
+            self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL))
+        self.active_sm_count = None
+        self._detected_charset = None
+        self._detected_language = None
+        self._state = None
+        self.reset()
+
+    def reset(self):
+        super(EscCharSetProber, self).reset()
+        for coding_sm in self.coding_sm:
+            if not coding_sm:
+                continue
+            coding_sm.active = True
+            coding_sm.reset()
+        self.active_sm_count = len(self.coding_sm)
+        self._detected_charset = None
+        self._detected_language = None
+
+    @property
+    def charset_name(self):
+        return self._detected_charset
+
+    @property
+    def language(self):
+        return self._detected_language
+
+    def get_confidence(self):
+        if self._detected_charset:
+            return 0.99
+        else:
+            return 0.00
+
+    def feed(self, byte_str):
+        for c in byte_str:
+            for coding_sm in self.coding_sm:
+                if not coding_sm or not coding_sm.active:
+                    continue
+                coding_state = coding_sm.next_state(c)
+                if coding_state == MachineState.ERROR:
+                    coding_sm.active = False
+                    self.active_sm_count -= 1
+                    if self.active_sm_count <= 0:
+                        self._state = ProbingState.NOT_ME
+                        return self.state
+                elif coding_state == MachineState.ITS_ME:
+                    self._state = ProbingState.FOUND_IT
+                    self._detected_charset = coding_sm.get_coding_state_machine()
+                    self._detected_language = coding_sm.language
+                    return self.state
+
+        return self.state
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..733803bf2296bce07b6a9a5e0d85e010b73a3804
GIT binary patch
literal 3607
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
ATmS$7

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py
new file mode 100644
index 00000000..0069523a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py
@@ -0,0 +1,246 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import MachineState
+
+HZ_CLS = (
+1,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,0,0,0,0,  # 20 - 27
+0,0,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,0,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,4,0,5,2,0,  # 78 - 7f
+1,1,1,1,1,1,1,1,  # 80 - 87
+1,1,1,1,1,1,1,1,  # 88 - 8f
+1,1,1,1,1,1,1,1,  # 90 - 97
+1,1,1,1,1,1,1,1,  # 98 - 9f
+1,1,1,1,1,1,1,1,  # a0 - a7
+1,1,1,1,1,1,1,1,  # a8 - af
+1,1,1,1,1,1,1,1,  # b0 - b7
+1,1,1,1,1,1,1,1,  # b8 - bf
+1,1,1,1,1,1,1,1,  # c0 - c7
+1,1,1,1,1,1,1,1,  # c8 - cf
+1,1,1,1,1,1,1,1,  # d0 - d7
+1,1,1,1,1,1,1,1,  # d8 - df
+1,1,1,1,1,1,1,1,  # e0 - e7
+1,1,1,1,1,1,1,1,  # e8 - ef
+1,1,1,1,1,1,1,1,  # f0 - f7
+1,1,1,1,1,1,1,1,  # f8 - ff
+)
+
+HZ_ST = (
+MachineState.START,MachineState.ERROR,     3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,     4,MachineState.ERROR,# 10-17
+     5,MachineState.ERROR,     6,MachineState.ERROR,     5,     5,     4,MachineState.ERROR,# 18-1f
+     4,MachineState.ERROR,     4,     4,     4,MachineState.ERROR,     4,MachineState.ERROR,# 20-27
+     4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f
+)
+
+HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
+
+HZ_SM_MODEL = {'class_table': HZ_CLS,
+               'class_factor': 6,
+               'state_table': HZ_ST,
+               'char_len_table': HZ_CHAR_LEN_TABLE,
+               'name': "HZ-GB-2312",
+               'language': 'Chinese'}
+
+ISO2022CN_CLS = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,0,0,0,0,  # 20 - 27
+0,3,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,4,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022CN_ST = (
+MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
+MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
+MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,# 18-1f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27
+     5,     6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f
+)
+
+ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS,
+                      'class_factor': 9,
+                      'state_table': ISO2022CN_ST,
+                      'char_len_table': ISO2022CN_CHAR_LEN_TABLE,
+                      'name': "ISO-2022-CN",
+                      'language': 'Chinese'}
+
+ISO2022JP_CLS = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,2,2,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,7,0,0,0,  # 20 - 27
+3,0,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+6,0,4,0,8,0,0,0,  # 40 - 47
+0,9,5,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022JP_ST = (
+MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
+MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f
+MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,MachineState.ERROR,# 20-27
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47
+)
+
+ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS,
+                      'class_factor': 10,
+                      'state_table': ISO2022JP_ST,
+                      'char_len_table': ISO2022JP_CHAR_LEN_TABLE,
+                      'name': "ISO-2022-JP",
+                      'language': 'Japanese'}
+
+ISO2022KR_CLS = (
+2,0,0,0,0,0,0,0,  # 00 - 07
+0,0,0,0,0,0,0,0,  # 08 - 0f
+0,0,0,0,0,0,0,0,  # 10 - 17
+0,0,0,1,0,0,0,0,  # 18 - 1f
+0,0,0,0,3,0,0,0,  # 20 - 27
+0,4,0,0,0,0,0,0,  # 28 - 2f
+0,0,0,0,0,0,0,0,  # 30 - 37
+0,0,0,0,0,0,0,0,  # 38 - 3f
+0,0,0,5,0,0,0,0,  # 40 - 47
+0,0,0,0,0,0,0,0,  # 48 - 4f
+0,0,0,0,0,0,0,0,  # 50 - 57
+0,0,0,0,0,0,0,0,  # 58 - 5f
+0,0,0,0,0,0,0,0,  # 60 - 67
+0,0,0,0,0,0,0,0,  # 68 - 6f
+0,0,0,0,0,0,0,0,  # 70 - 77
+0,0,0,0,0,0,0,0,  # 78 - 7f
+2,2,2,2,2,2,2,2,  # 80 - 87
+2,2,2,2,2,2,2,2,  # 88 - 8f
+2,2,2,2,2,2,2,2,  # 90 - 97
+2,2,2,2,2,2,2,2,  # 98 - 9f
+2,2,2,2,2,2,2,2,  # a0 - a7
+2,2,2,2,2,2,2,2,  # a8 - af
+2,2,2,2,2,2,2,2,  # b0 - b7
+2,2,2,2,2,2,2,2,  # b8 - bf
+2,2,2,2,2,2,2,2,  # c0 - c7
+2,2,2,2,2,2,2,2,  # c8 - cf
+2,2,2,2,2,2,2,2,  # d0 - d7
+2,2,2,2,2,2,2,2,  # d8 - df
+2,2,2,2,2,2,2,2,  # e0 - e7
+2,2,2,2,2,2,2,2,  # e8 - ef
+2,2,2,2,2,2,2,2,  # f0 - f7
+2,2,2,2,2,2,2,2,  # f8 - ff
+)
+
+ISO2022KR_ST = (
+MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
+MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,MachineState.ERROR,# 10-17
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f
+MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27
+)
+
+ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
+
+ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS,
+                      'class_factor': 6,
+                      'state_table': ISO2022KR_ST,
+                      'char_len_table': ISO2022KR_CHAR_LEN_TABLE,
+                      'name': "ISO-2022-KR",
+                      'language': 'Korean'}
+
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5b7570a5b24608f7679c67b1fe567ef86b68b15c
GIT binary patch
literal 8062
zcmZSn%*&NH<x)&C0}L=SFgP$UFcgchF)*YsFr+Xt<S;PgGBQLlGBBn{F+?#jq%tyO
zF@s4Kh7>k11HwfnS-|4>Nmj5L{3NmoF!NI&3>JnIm~09=*eI|_3JU{50bC_BND!+y
z$U6`>KosL9(+n7**ceiz8KT%3GT9hXnHW+y7|c@G8B#bI%u?AHQn(n*QrQ_&xEah+
zco<T68O&1n7*hBd%%V6LQe+sSIKhr&h6NhL@wlx6ISe8TQAsKZ@f4{fsx9yk133m&
z3M2wC98(+;5wJ)Bsl=uRpEz!l@#%utf~=RBA<cmyii;sdmLZB89BZ7ASQCK68W$wi
zxFNA7h!Sf&3@LI9QM}~F8YOXu>=B4}NF^aAz({ybK@L3vk;}pW%~lYrAx0syAtLxm
zh<XT#sS=ksrb=WHWL=OzW@bq9V2I*lNRelV;s?hvFC>;lAhFB`iDiCBEQ>;7Sqzdl
z1sGBk7@`D;i)CbI;9^6Zho3~%OE4lJv4%AgAyVih#CBNVfMj9pG!2F*A%+x1hA3fh
zKnX$u3R;K>K>|t`5>VohfRca&ln6tLBtx)<5(5K6CL;p_g9eBw;bCB4@J&q4$jnO(
zE=ep&%>-2>nJgehtRR93L@<L0HU<WU5^e?thUA>Y;^O#{#H5^5uyzPPEit(yzX+_L
z7-SGs0Ut<1Mq*KXPHG-RsF;g^fx#n6*WF3i$k@=R1Y}oUVs2^)I|BoQGsq#usU;i?
z3=BDmdFiEz>8Y8Vpb8CSvuCisu91O}k*>2}CP;NANLePxykZn-uK=(CUWo;Xd8x&z
zsFL16B_OYO=NF|W=J{zbFhauv;&ZU~2Z{j2$RKdWKzV=I+Y3tSkoZO9EwHD-5kE>m
z3MO#rG)lmVB|0Pv4N!pyNtoc|h=qWZli=C_i!6S<RF?$@3B}F;*J>1-LWu#0@_-Uk
zMvz```Wqz}GDpK;Ai_Wc)Dk7BG^1v*iHLJDb394KCb)f#X3;>En272LQDTCd{%Gz4
zbHQ;0ZeM}9qr^bul+gl;VKmr5qXwWtO9RwHC#l#3E2d`INpUGaQrU^KoJ15~6g!Aa
z14au*25{mcngAu>(b8<RG#j9FKup(M6f`mm%GjxSrMbmHpppSR#OV<g@9Yy?0+I<1
zaSRFpvs{CM{2?Qto*}{UzOG<FkEr<IkP<=gz-+v;hhtE@kE>sNh@+E_D|kc~B<~yV
z>+j;~Q^L!@z~C9|4;qJc_5)i08bd~i1c#JJpejK%PY6Xa7>lu90qDkh1%TX#WGqMt
zPGdo;u^8(egl?>N5Sp<dB{+=*sfHS>0SaRTQJllTz@T4Hlv$QolB!>pSfrnppOcbW
zRIHy}sGnVIWNvO)m}O*MW@uqvoKu-z9&eIjVq#!mV33}tAEIB7S)iMlS6q^qlcQUn
zXjvMV0TKe^__EZzl>8$7<c!3kl++Ua)Z*mgT)l!y@bI=xZhlH>PO6;@Xn4GUk%2*g
znSqfK$i||}Xuzn;sK}_uXw1yU#Kp)Cg<MoI8DzErqZXq9qZv(12bm4>0d36JWz<D;
FHvp`wT9*I-

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py
new file mode 100644
index 00000000..20ce8f7d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py
@@ -0,0 +1,92 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import ProbingState, MachineState
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCJPDistributionAnalysis
+from .jpcntx import EUCJPContextAnalysis
+from .mbcssm import EUCJP_SM_MODEL
+
+
+class EUCJPProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(EUCJPProber, self).__init__()
+        self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL)
+        self.distribution_analyzer = EUCJPDistributionAnalysis()
+        self.context_analyzer = EUCJPContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        super(EUCJPProber, self).reset()
+        self.context_analyzer.reset()
+
+    @property
+    def charset_name(self):
+        return "EUC-JP"
+
+    @property
+    def language(self):
+        return "Japanese"
+
+    def feed(self, byte_str):
+        for i in range(len(byte_str)):
+            # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte
+            coding_state = self.coding_sm.next_state(byte_str[i])
+            if coding_state == MachineState.ERROR:
+                self.logger.debug('%s %s prober hit error at byte %s',
+                                  self.charset_name, self.language, i)
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                char_len = self.coding_sm.get_current_charlen()
+                if i == 0:
+                    self._last_char[1] = byte_str[0]
+                    self.context_analyzer.feed(self._last_char, char_len)
+                    self.distribution_analyzer.feed(self._last_char, char_len)
+                else:
+                    self.context_analyzer.feed(byte_str[i - 1:i + 1],
+                                                char_len)
+                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
+                                                     char_len)
+
+        self._last_char[0] = byte_str[-1]
+
+        if self.state == ProbingState.DETECTING:
+            if (self.context_analyzer.got_enough_data() and
+               (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        context_conf = self.context_analyzer.get_confidence()
+        distrib_conf = self.distribution_analyzer.get_confidence()
+        return max(context_conf, distrib_conf)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4e42c8a09b4e0c41a0795331b5a247bf2af5de57
GIT binary patch
literal 3422
zcmZSn%*&NH<x)&C0~9bbFfceUFfbH1FfcHrFfgPrGUPBY<T5fuF*4*bF+?#jFoHyx
z7;=~ya#<LnSRj06h8$LgTsDR%HVB`EA%~qImxCdS1Hxxz$l+wj<zk59g7DcGa=00C
zc^IO27#LI78B$po(ij<1I2c+O7@8RvBBOX2QaBlcHMkfU7%~|d7#K8|7#J8zco-NM
z0*dmJGV{`dOA<>`!2-UC$r+h>sbB#OklGS41_lP-(wve^r^=F4=ZwUn;M5Y3w$vhs
zybuEegL8fg%oL~r5IIQ(1_swqXRiR4%;J)w%%swi%=|pZyu_T!;>==*5)qgZ=lr~q
z)QS>RSw5I-e6Vl4ufL0{PYE|n2;vBMScClJ1PW^}1_p*y22c>EFo1#}iU}0%Ees4%
z%%Gr2VFC#@GcrW6g1O8vE*nD%3y2-X&XB?iW^gbB1#7S|Ffb&8LIQ+A5$X)G!~+z9
z3=AcV3^fc4%}fkgOrW4<EMaCSVPR+ni^j7ul(2zBYZw^f*%?YWU~Ep1o-8g97Zm-$
z;DGSc0C}v06=Zm6L26MDJIDqO1_p-s_{_Y_lKA)_kmW%j=ag`Q+yoBu_~P6k7LZC&
zPzpl|<@iKUFju7(1%Zq#5diA|hcH|QY*|riacT+J1tlPJic@paG(f2rOcWO}FfiyB
z6lInrmZa*JB^K$Y<>#cN78UDf7wTsh8=0FM7G@clml;}^7w1%_m&co=n3xzC7#O7I
z>4)eSWESXV<`tJD=H%#>Ct8*UW`KmiIKC`3FD1W7KRF|@C?&N-KeaSDtDvALKPk0H
zub?sr<UdtVNPv<o1EVk_KO+w#4<lwYsDQkV84WcI3|Y*uI7wk(fCVwghe4n)1&3}B
zF9QQZ5GWgf{T~EMY+!GLiGlJv$Wb~Vzk?hL@;ltupacj`d?1+=MuuQ;KK3gHB?;G1
zXI-xVu)_zDXTU`YD2|I$OXBkqb5jjK9s}i61|~w@DgnilS7Je8UTSgbpz|2WaXE>3
z>7|M3sU}FC0{IP;;XrW$j;n=?3=9=^j3tmn$_OeOni&~fVzn4+nZV@$6DX<HFf!CI
zF-SHuGSo6N)PM_-ELMhWCWfM1up%~wEOt;S21?i*U=dD`hGrH9#u6@uEN+lcJP$)a
zp)gE0FIaaE14x<=Q<@(vEew*#Vq(Y=02M~HEFd#en7~rs7-|?9QkWPdK~@Sfq%bqs
zfLKBdSrAQv3^gpEf{zg-DuN+eXbYBrC<l8kg_%L3h6!YlxFUvDTq+8M8486N!a+`9
zfjfl>;uKM^-^9SKodvT^9ORKA2v-8c202fXA)AGvXcjoAU|~@>i!qM@?0r#&U=2`|
z`4uZNFfgbVE2tJLK#C%TjLZ^+)S{yNB89{fg`~=oR0Y-IOi<|vu0}Ke|NsAALkd&`
zf%F$8=B1~WfC}lH)Vv@rkT8hIORXr0F9ubxL7)r_E_7Xkg8YL@Kxrf=KRrFQ2rQVA
znpBz|#1ATy1VIGI9<Ule|B!fJS1=P|5SZy15)2XrB}6y>P(PP=&k(RN!6A-8Atk~L
z3=HY1CGp9nMMbH3CGnt4n3I}U0&-D&PGT`c1YG!m%l)*})RZ7Z4Fqy7xR!Bo4RLi2
z@$_>q0XZx^za&02FTXTBBR(auB(VfkVuEeS&r8cpNzF@6EdezLf<63$LYzZG;zK-w
zT!TIQeO$l+3@%{7*%}m-@x>)YC7=+=gp?A{>I`f%$WtH}$LFNxL9#w5Fb1kbmS<pK
zumI(8P)289lw=YE*GIyPJd7-07KjAZP=btNjFL>!jO>ikjC@RjOhSzOjG~M}kfIKh
zFhCewDrhr6(jEgt79%K?)-r;VA`^_u#8AQv%78UYpge|BeSzw$AZ1Vj0Y?|e$lSyV
z4G;|pV32}jNMkBKIX^EA9K0!zrU6)B;6oJT{76uUg0cVuBR?ZQqXs7^!+;__9$Ztz
z$3xO;d~SY9X-;Z<Jh)K+uCl>NsGumnAhoEZ5-G!g;t3ow2oHi;1C?$-EjUmEr5F?=
zY>b@joGkn-{4AV`ej1>R1J13fd8N6<L7>zPDIGw$EH??1_KQ<XAf-?cs7?Xrt7LE<
z0hcAYkajw_O$ce+fm%|KNCvmEA+17C_+}L(=ap1Int>pGZc=h_aW1$a32p{~!w5kP
ZP-uZ8)dmvTb~2!}0SYxSMgbUP1^|NR{h|N>

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py
new file mode 100644
index 00000000..b68078cb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py
@@ -0,0 +1,195 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+
+# 128  --> 0.79
+# 256  --> 0.92
+# 512  --> 0.986
+# 1024 --> 0.99944
+# 2048 --> 0.99999
+#
+# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
+# Random Distribution Ration = 512 / (2350-512) = 0.279.
+#
+# Typical Distribution Ratio
+
+EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
+
+EUCKR_TABLE_SIZE = 2352
+
+# Char to FreqOrder table ,
+EUCKR_CHAR_TO_FREQ_ORDER = (
+  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
+1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
+1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
+ 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
+ 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
+ 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
+1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
+ 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
+ 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
+1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
+1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
+1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
+1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
+1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
+ 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
+1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
+1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
+1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
+1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
+ 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
+1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
+ 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
+ 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
+1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
+ 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
+1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
+ 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
+   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
+1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
+1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
+1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
+1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
+ 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
+1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
+ 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
+ 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
+1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
+1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
+1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
+1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
+1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
+1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
+  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
+ 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
+ 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
+1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
+ 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
+1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
+ 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
+ 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
+2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
+ 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
+ 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
+2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
+2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
+2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
+ 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
+ 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
+2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
+ 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
+1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
+2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
+1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
+2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
+2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
+1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
+ 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
+2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
+2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
+  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
+ 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
+2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
+1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
+2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
+2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
+2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
+2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
+2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
+2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
+1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
+2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
+2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
+2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
+2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
+2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
+1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
+1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
+2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
+1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
+2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
+1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
+ 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
+2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
+ 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
+2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
+ 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
+2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
+2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
+ 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
+2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
+1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
+ 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
+1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
+2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
+1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
+2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
+ 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
+2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
+1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
+2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
+1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
+2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
+1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
+ 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
+2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
+2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
+ 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
+ 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
+1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
+1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
+ 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
+2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
+2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
+ 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
+ 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
+ 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
+2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
+  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
+ 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
+2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
+2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
+ 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
+2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
+1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
+ 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
+2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
+2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
+2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
+   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
+ 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
+ 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
+2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
+2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
+2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
+1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
+2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
+ 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
+)
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..101557d1ec4ebaea802e0c8260bc3fc46be3e6a6
GIT binary patch
literal 24134
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py
new file mode 100644
index 00000000..345a060d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py
@@ -0,0 +1,47 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCKRDistributionAnalysis
+from .mbcssm import EUCKR_SM_MODEL
+
+
+class EUCKRProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(EUCKRProber, self).__init__()
+        self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL)
+        self.distribution_analyzer = EUCKRDistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "EUC-KR"
+
+    @property
+    def language(self):
+        return "Korean"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6905d59de7f938adf5b846222e926590b4db7de6
GIT binary patch
literal 1601
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHHF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XH{Gn8M1C%E*w$$dJOu(89pb%)k&C#leum
z&Je7@!N9<f$;iOKpaCLE#26SDd`ojmGMy?*Qk^pri-J>20*dmJQi~w+LJSNH&iN^s
zdFjC=i6yDNiOCt6d8rUNNd^W6*HCBgAeYSIlA_F{(vr;lJjcAmoXX<NVu%txn3DKl
z-*{ht7gwJWZkQ0n8h8LOF)%PVfdW9Efq@~F0p#x#29WEcm>5!-LE!=N2_r)k3z*9U
zl4@oIc|Ryv0~C76AP<2sh~o@0$%cV}p@e~<gpr|!fuWg+A&UtV6pSUz3?(cK&0x`Z
zR)!KbkZ279Lp(c3T^0w33kvdJupj(1I6=m+f($GzNG%Ft0dYaW7$2XRmst`Y9|W>A
z2xMysCj$dRGB~*6i*tiOUMdj<#V1k##V3M7s4BIn1Y~4UYH?}_*q#!Qxy7kDX&Rsu
z0Vaxz7#JAz3yLz!5=&C`%My$9)ADmtQj3c9vkUdJi;c|94GXi3%*zZd%!_j>)63&c
zQcO$?3=9m?^YlaX3o;9IGxLf|5_58N%M&e212aHEU>skTnwOGaq@SFTSd@}lqMurt
zoLy7^j&{9*${;od1_ou2e?h)vU=(KLXXIgo2QSFC;NS&0IE9fRSOerwzhaOs*HC9&
z?;x<_!JZ1@0;RNp_D~5AC|WWSi;7cA;`0)7Q#C=J1G$=kiIBHSK;H7sFG@|!8+6_R
zMNdv*UV3R_da5qMOBx_2mw+VW!M=@;F9AhEe0*+xN@-4Nd^|XU!3qkB@(WUnN-Bdu
zxiW|sC9=TY9jGJ-N?S@GFM<5R#>mOW&jQVe{0s~Xxk;duTbx<~NwYzq1Xcnnsvvo<
z7*tf{LW(MI<}49_CV&*Aj0nk|AoFvRl8cLT!8sV5yTLw35Caqj;0UsT#F?E8C@erx
JD!>Sa%mCroddL6(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py
new file mode 100644
index 00000000..ed7a995a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py
@@ -0,0 +1,387 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# EUCTW frequency table
+# Converted from big5 work
+# by Taiwan's Mandarin Promotion Council
+# <http:#www.edu.tw:81/mandr/>
+
+# 128  --> 0.42261
+# 256  --> 0.57851
+# 512  --> 0.74851
+# 1024 --> 0.89384
+# 2048 --> 0.97583
+#
+# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
+# Random Distribution Ration = 512/(5401-512)=0.105
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
+
+EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
+
+# Char to FreqOrder table ,
+EUCTW_TABLE_SIZE = 5376
+
+EUCTW_CHAR_TO_FREQ_ORDER = (
+   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110,  # 2742
+3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643,  # 2758
+1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931,  # 2774
+  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809,  # 2790
+3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315,  # 2806
+4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604,  # 2822
+7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80,  # 2838
+ 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591,  # 2854
+ 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180,  # 2870
+ 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359,  # 2886
+2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732,  # 2902
+1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529,  # 2918
+3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063,  # 2934
+ 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246,  # 2950
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221,  # 2966
+3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897,  # 2982
+2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300,  # 2998
+ 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618,  # 3014
+3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228,  # 3030
+1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077,  # 3046
+7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212,  # 3062
+ 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876,  # 3078
+7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029,  # 3094
+1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305,  # 3110
+  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788,  # 3126
+ 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520,  # 3142
+3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794,  # 3158
+3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707,  # 3174
+ 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409,  # 3190
+2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346,  # 3206
+2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411,  # 3222
+ 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412,  # 3238
+ 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933,  # 3254
+3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895,  # 3270
+1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369,  # 3286
+1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000,  # 3302
+1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7,  # 3318
+2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313,  # 3334
+ 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513,  # 3350
+4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647,  # 3366
+1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357,  # 3382
+7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438,  # 3398
+2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978,  # 3414
+ 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210,  # 3430
+  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642,  # 3446
+ 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592,  # 3462
+ 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320,  # 3478
+7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258,  # 3494
+ 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702,  # 3510
+1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372,  # 3526
+ 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836,  # 3542
+ 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629,  # 3558
+7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686,  # 3574
+1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496,  # 3590
+ 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560,  # 3606
+3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496,  # 3622
+4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082,  # 3638
+3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083,  # 3654
+ 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264,  # 3670
+ 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411,  # 3686
+1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483,  # 3702
+4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680,  # 3718
+3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672,  # 3734
+3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681,  # 3750
+2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380,  # 3766
+7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809,  # 3782
+3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183,  # 3798
+7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934,  # 3814
+1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351,  # 3830
+2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545,  # 3846
+1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358,  # 3862
+  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338,  # 3878
+1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423,  # 3894
+4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859,  # 3910
+3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636,  # 3926
+ 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344,  # 3942
+ 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816,  # 3958
+ 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891,  # 3974
+2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662,  # 3990
+7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234,  # 4006
+1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431,  # 4022
+2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676,  # 4038
+1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437,  # 4054
+1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131,  # 4070
+7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307,  # 4086
+7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519,  # 4102
+7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980,  # 4118
+3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401,  # 4134
+4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101,  # 4150
+1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937,  # 4166
+7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466,  # 4182
+2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526,  # 4198
+7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598,  # 4214
+3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471,  # 4230
+3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473,  # 4246
+7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323,  # 4262
+2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416,  # 4278
+7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427,  # 4294
+ 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110,  # 4310
+4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485,  # 4326
+2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428,  # 4342
+7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907,  # 4358
+3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901,  # 4374
+2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870,  # 4390
+2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366,  # 4406
+ 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031,  # 4422
+2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240,  # 4438
+1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521,  # 4454
+1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673,  # 4470
+2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260,  # 4486
+1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619,  # 4502
+7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506,  # 4518
+7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382,  # 4534
+2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324,  # 4550
+4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384,  # 4566
+1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122,  # 4582
+7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192,  # 4598
+ 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388,  # 4614
+4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129,  # 4630
+ 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523,  # 4646
+2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692,  # 4662
+ 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915,  # 4678
+1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219,  # 4694
+1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825,  # 4710
+ 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975,  # 4726
+3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394,  # 4742
+3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758,  # 4758
+1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434,  # 4774
+3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990,  # 4790
+7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335,  # 4806
+7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545,  # 4822
+1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137,  # 4838
+2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471,  # 4854
+1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555,  # 4870
+3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139,  # 4886
+2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729,  # 4902
+3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482,  # 4918
+2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652,  # 4934
+4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867,  # 4950
+4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499,  # 4966
+3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250,  # 4982
+  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830,  # 4998
+3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188,  # 5014
+ 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408,  # 5030
+3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447,  # 5046
+3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527,  # 5062
+3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932,  # 5078
+1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411,  # 5094
+7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270,  # 5110
+ 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589,  # 5126
+7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591,  # 5142
+1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756,  # 5158
+ 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145,  # 5174
+4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730,  # 5190
+3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069,  # 5206
+ 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938,  # 5222
+2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625,  # 5238
+2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686,  # 5254
+3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797,  # 5270
+1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958,  # 5286
+4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528,  # 5302
+2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241,  # 5318
+1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169,  # 5334
+1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540,  # 5350
+2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342,  # 5366
+3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425,  # 5382
+1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427,  # 5398
+7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141,  # 5414
+1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949,  # 5430
+4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625,  # 5446
+1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202,  # 5462
+ 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640,  # 5478
+1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936,  # 5494
+3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955,  # 5510
+3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910,  # 5526
+2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325,  # 5542
+1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024,  # 5558
+4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340,  # 5574
+ 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918,  # 5590
+7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439,  # 5606
+2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701,  # 5622
+3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494,  # 5638
+4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285,  # 5654
+ 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077,  # 5670
+7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443,  # 5686
+7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169,  # 5702
+1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906,  # 5718
+4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968,  # 5734
+3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804,  # 5750
+2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590,  # 5766
+3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676,  # 5782
+3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680,  # 5798
+2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285,  # 5814
+1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687,  # 5830
+4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454,  # 5846
+3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403,  # 5862
+3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973,  # 5878
+2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454,  # 5894
+4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977,  # 5910
+7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695,  # 5926
+3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945,  # 5942
+2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460,  # 5958
+3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179,  # 5974
+1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706,  # 5990
+2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982,  # 6006
+3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183,  # 6022
+4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090,  # 6038
+2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717,  # 6054
+2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985,  # 6070
+7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184,  # 6086
+1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472,  # 6102
+2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351,  # 6118
+1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714,  # 6134
+3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404,  # 6150
+4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838,  # 6166
+2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620,  # 6182
+3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738,  # 6198
+3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869,  # 6214
+2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558,  # 6230
+4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107,  # 6246
+2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216,  # 6262
+3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984,  # 6278
+4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705,  # 6294
+7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687,  # 6310
+3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840,  # 6326
+ 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521,  # 6342
+1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632,  # 6358
+4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295,  # 6374
+1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765,  # 6390
+4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769,  # 6406
+7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572,  # 6422
+ 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776,  # 6438
+7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911,  # 6454
+2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693,  # 6470
+1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672,  # 6486
+1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013,  # 6502
+3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816,  # 6518
+ 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010,  # 6534
+ 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175,  # 6550
+ 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473,  # 6566
+3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298,  # 6582
+2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359,  # 6598
+ 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805,  # 6614
+7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807,  # 6630
+1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810,  # 6646
+3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812,  # 6662
+7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814,  # 6678
+1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818,  # 6694
+7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821,  # 6710
+4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877,  # 6726
+1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702,  # 6742
+2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813,  # 6758
+2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503,  # 6774
+4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484,  # 6790
+ 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833,  # 6806
+ 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457,  # 6822
+3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704,  # 6838
+3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878,  # 6854
+1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508,  # 6870
+2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451,  # 6886
+7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509,  # 6902
+1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858,  # 6918
+1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428,  # 6934
+3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800,  # 6950
+ 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550,  # 6966
+1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347,  # 6982
+4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515,  # 6998
+7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665,  # 7014
+2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518,  # 7030
+3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833,  # 7046
+ 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961,  # 7062
+1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508,  # 7078
+2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482,  # 7094
+2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098,  # 7110
+7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483,  # 7126
+7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834,  # 7142
+7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904,  # 7158
+2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724,  # 7174
+2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910,  # 7190
+1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701,  # 7206
+4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062,  # 7222
+3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922,  # 7238
+3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925,  # 7254
+4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248,  # 7270
+4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487,  # 7286
+2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015,  # 7302
+2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935,  # 7318
+7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104,  # 7334
+4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580,  # 7350
+7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380,  # 7366
+2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951,  # 7382
+1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948,  # 7398
+3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488,  # 7414
+4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737,  # 7430
+2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017,  # 7446
+ 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047,  # 7462
+2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967,  # 7478
+1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385,  # 7494
+2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975,  # 7510
+2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979,  # 7526
+4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982,  # 7542
+7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306,  # 7558
+1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270,  # 7574
+3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012,  # 7590
+7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236,  # 7606
+1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550,  # 7622
+8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746,  # 7638
+2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066,  # 7654
+8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977,  # 7670
+2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009,  # 7686
+2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013,  # 7702
+8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552,  # 7718
+8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023,  # 7734
+8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143,  # 7750
+ 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278,  # 7766
+8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698,  # 7782
+4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706,  # 7798
+3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859,  # 7814
+8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344,  # 7830
+1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894,  # 7846
+8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194,  # 7862
+ 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760,  # 7878
+1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210,  # 7894
+ 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642,  # 7910
+4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013,  # 7926
+1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889,  # 7942
+4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239,  # 7958
+1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240,  # 7974
+ 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083,  # 7990
+3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088,  # 8006
+4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094,  # 8022
+8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101,  # 8038
+ 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104,  # 8054
+3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015,  # 8070
+ 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941,  # 8086
+2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118,  # 8102
+)
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..898bb8f46a4c28b500e8236a7f9f96916a07f322
GIT binary patch
literal 54757
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py
new file mode 100644
index 00000000..35669cc4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py
@@ -0,0 +1,46 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import EUCTWDistributionAnalysis
+from .mbcssm import EUCTW_SM_MODEL
+
+class EUCTWProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(EUCTWProber, self).__init__()
+        self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL)
+        self.distribution_analyzer = EUCTWDistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "EUC-TW"
+
+    @property
+    def language(self):
+        return "Taiwan"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b80484b75be5a43a6182a45409251ed0393c66f5
GIT binary patch
literal 1601
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHHF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XH{Gn8M1C%E*w$$dJOu(89pb%)k&C#leum
z&Je7@!N9<f$;iOKpaCLE#26SDd`ojmGMy?*Qk^pri-J>20*dmJQi~w+LJSNH&iN^s
zdFjC=i6yDNiOCt6d8rUNNd^W6*HGt>aF@*DlA_F{(vr;lJjcAmoXX<NVu%txn3DKl
z-*{ht7gwJWZkQ0n8h8LOF)%PVfdW9Efq@~F0p#x#29WEcm>5!-LE!=N2_r)k3z*9U
zl4@oIc|Ryv0~C76AP<2sh~o@0$%cV}p@e~<gpr|!fuWg+A&UtV6pSUz3?(cK&0x`Z
zR)!KbkZ279Lp(c3T^0w33kvdJupj(1I6=m+f($GzNG%Ft0dYaW7$2XRmst`Y9|W>A
z2xMysCj$dRGB~*6i*tiOUMdj<#V1k##V3M7s4BIn1Y~4UYH?}_*q#!Qxy7kDX&Rsu
z0Vaxz7#JAz3yLz!5=&C`%My$9)ADmtQj3c9vkUdJi;c|94GXi3%*zZd%!_j>)63&c
zQcO$?3=9m?^YlaX3o;9IGxLf|5_58N%M&e212aHEU>skTnwOGaq@SFTSd@}lqMurt
zTvA>Dj&{9*${;od1_mXNe?h)vU=(KLXXIgo2QSFC;NS&0IE9fRSOerwzhaOs*HCBO
zkZ`c$!JZ1@0;RNp_D~5AC|WWSi;7cA;`0)7Q$Y?a2DzGniIBHSK;8;T%q&mL1L=Zf
zn?d3&Q1s*^=B1Y=rl;zF;tS#>4Um&dK$7ub-^Rz6fTAHjJ~uz5G$%Da9vs171qDU<
z1*t_Pl|i6f8N`bcSzzxDR1yTGEk%%*Kz?Ck<YeP#fo4R01_p-QBv8sNPA!3?*&t8?
zD*+W%ki1t6DyniJMHM)6mIy!-KnhYugk(>U`MF8S#l^Yc91PCgV4ow10SW_f1ld61
Q%uWUr7N95<U<5-Z0DYEwMF0Q*

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py
new file mode 100644
index 00000000..697837bd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py
@@ -0,0 +1,283 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# GB2312 most frequently used character table
+#
+# Char to FreqOrder table , from hz6763
+
+# 512  --> 0.79  -- 0.79
+# 1024 --> 0.92  -- 0.13
+# 2048 --> 0.98  -- 0.06
+# 6768 --> 1.00  -- 0.02
+#
+# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
+# Random Distribution Ration = 512 / (3755 - 512) = 0.157
+#
+# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
+
+GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
+
+GB2312_TABLE_SIZE = 3760
+
+GB2312_CHAR_TO_FREQ_ORDER = (
+1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
+2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
+2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
+ 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
+1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
+1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
+ 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
+1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
+2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
+3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
+ 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
+1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
+ 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
+2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
+ 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
+2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
+1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
+3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
+ 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
+1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
+ 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
+2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
+1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
+3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
+1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
+2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
+1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
+ 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
+3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
+3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
+ 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
+3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
+ 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
+1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
+3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
+2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
+1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
+ 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
+1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
+4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
+ 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
+3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
+3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
+ 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
+1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
+2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
+1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
+1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
+ 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
+3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
+3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
+4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
+ 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
+3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
+1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
+1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
+4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
+ 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
+ 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
+3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
+1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
+ 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
+1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
+2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
+ 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
+ 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
+ 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
+3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
+4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
+3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
+ 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
+2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
+2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
+2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
+ 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
+2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
+ 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
+ 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
+ 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
+3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
+2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
+2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
+1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
+  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
+2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
+  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
+ 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
+1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
+1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
+ 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
+ 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
+1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
+2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
+3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
+2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
+2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
+2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
+3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
+1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
+1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
+2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
+1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
+3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
+1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
+1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
+3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
+ 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
+2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
+1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
+4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
+1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
+1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
+3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
+1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
+  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
+ 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
+1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
+ 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
+1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
+1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
+ 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
+3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
+4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
+3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
+2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
+2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
+1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
+3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
+2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
+1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
+1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
+ 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
+2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
+2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
+3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
+4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
+3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
+ 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
+3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
+2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
+1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
+ 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
+ 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
+3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
+4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
+2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
+1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
+1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
+ 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
+1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
+3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
+ 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
+ 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
+1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
+  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
+1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
+ 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
+2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
+ 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
+2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
+2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
+1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
+1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
+2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
+ 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
+1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
+1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
+2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
+2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
+3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
+1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
+4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
+ 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
+ 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
+3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
+1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
+ 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
+3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
+1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
+4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
+1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
+2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
+1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
+ 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
+1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
+3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
+ 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
+2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
+ 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
+1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
+1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
+1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
+3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
+2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
+3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
+3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
+3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
+ 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
+2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
+ 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
+2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
+  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
+1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
+ 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
+ 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
+1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
+3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
+3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
+1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
+1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
+3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
+2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
+2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
+1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
+3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
+ 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
+4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
+1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
+2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
+3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
+3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
+1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
+ 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
+ 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
+2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
+ 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
+1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
+ 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
+1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
+1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
+1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
+1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
+1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
+ 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
+ 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  #last 512
+)
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..98d67cd95e814c7813c96133e8782e277605ec0b
GIT binary patch
literal 38399
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
L42+|2xP<@!HdV88

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py
new file mode 100644
index 00000000..8446d2dd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py
@@ -0,0 +1,46 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import GB2312DistributionAnalysis
+from .mbcssm import GB2312_SM_MODEL
+
+class GB2312Prober(MultiByteCharSetProber):
+    def __init__(self):
+        super(GB2312Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(GB2312_SM_MODEL)
+        self.distribution_analyzer = GB2312DistributionAnalysis()
+        self.reset()
+
+    @property
+    def charset_name(self):
+        return "GB2312"
+
+    @property
+    def language(self):
+        return "Chinese"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a88d924faa686c41d15218622be1586f6a00071
GIT binary patch
literal 1610
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHHF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XH{Gn8M1C%E*w$$dJOu(89pb%)k&C#leum
z&Je7@!N9<f$;iOKpaCLE#26SDd`ojmGMy?*Qk^pri-J>20*dmJQi~w+LJSNH&iN^s
zdFjC=i6yDNiOCt6d8rUNDFy}xcPArbLnD{W;*z4wq|%bi{5;3J#GK0F%wmWdez=<W
zVBdIOe-~Gu5+1l1#3pzcFflMNIDx`IpMilPl>y}S6b6t7qL>&`nL$AU@(d$G6bqQk
z1d?iI1cg9Qum&gqlR<t0VGzd|WReX7149V|LkS~84Ff|n6GIjgC^Q&Lm>Eh~7@EPN
z@vICbY#`AZ28MWckh&}m5Em5c!C+tbX>fv!VFejjT98^4!~)`iLNY!+GcU6wK0XL!
zX%NWP5>5sNhGcMv#TVxWfxJ{A3W`#sAc{`}g;7;%Q3=S%qSWHl60kibAajdTbJ8?G
zi2_U%7c($0=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-RHm25
zo1~bS7#J8Br03~}=oe%b=w{{>mn7!o=$0p1mIh{kgupnyEHy7BzeqnhBe5tYwM0KX
z2^5h9;HcLts0?CbU|>)Jc^KqP21a2<enuWfc=&?63l3k9i&GdGf;B)M^(z7Cf+PvB
z>%qPX;sT|%0rwF&*@1jpoLUl}mzbLha$zyZ*$hks{lyN-2B4H*4Aut8JcGq!pcu+Y
z%u6p#Oi$GTMH$3X8lcE10ZGP#{Tm-&0*Z<F_}u)I(wx-zcyJtp6%-WZ7o--IR0e^v
zW)L4re1U?AVZf3hD19k{`~>n08zUzhKMOQB@-r|n<R(EQ6q0U(K#8mbRAfOiU@@r3
z%7qkJ;2c^a0Lq-86pxe}A$b&Jer{57ad9p<8-uer*y{*lpaKCLMK+LFvy%Y@1}IVm
I7{QPU005SEumAu6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py
new file mode 100644
index 00000000..b0e1bf49
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py
@@ -0,0 +1,292 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Shy Shalom
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState
+
+# This prober doesn't actually recognize a language or a charset.
+# It is a helper prober for the use of the Hebrew model probers
+
+### General ideas of the Hebrew charset recognition ###
+#
+# Four main charsets exist in Hebrew:
+# "ISO-8859-8" - Visual Hebrew
+# "windows-1255" - Logical Hebrew
+# "ISO-8859-8-I" - Logical Hebrew
+# "x-mac-hebrew" - ?? Logical Hebrew ??
+#
+# Both "ISO" charsets use a completely identical set of code points, whereas
+# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
+# these code points. windows-1255 defines additional characters in the range
+# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
+# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
+# x-mac-hebrew defines similar additional code points but with a different
+# mapping.
+#
+# As far as an average Hebrew text with no diacritics is concerned, all four
+# charsets are identical with respect to code points. Meaning that for the
+# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
+# (including final letters).
+#
+# The dominant difference between these charsets is their directionality.
+# "Visual" directionality means that the text is ordered as if the renderer is
+# not aware of a BIDI rendering algorithm. The renderer sees the text and
+# draws it from left to right. The text itself when ordered naturally is read
+# backwards. A buffer of Visual Hebrew generally looks like so:
+# "[last word of first line spelled backwards] [whole line ordered backwards
+# and spelled backwards] [first word of first line spelled backwards]
+# [end of line] [last word of second line] ... etc' "
+# adding punctuation marks, numbers and English text to visual text is
+# naturally also "visual" and from left to right.
+#
+# "Logical" directionality means the text is ordered "naturally" according to
+# the order it is read. It is the responsibility of the renderer to display
+# the text from right to left. A BIDI algorithm is used to place general
+# punctuation marks, numbers and English text in the text.
+#
+# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
+# what little evidence I could find, it seems that its general directionality
+# is Logical.
+#
+# To sum up all of the above, the Hebrew probing mechanism knows about two
+# charsets:
+# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
+#    backwards while line order is natural. For charset recognition purposes
+#    the line order is unimportant (In fact, for this implementation, even
+#    word order is unimportant).
+# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
+#
+# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
+#    specifically identified.
+# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
+#    that contain special punctuation marks or diacritics is displayed with
+#    some unconverted characters showing as question marks. This problem might
+#    be corrected using another model prober for x-mac-hebrew. Due to the fact
+#    that x-mac-hebrew texts are so rare, writing another model prober isn't
+#    worth the effort and performance hit.
+#
+#### The Prober ####
+#
+# The prober is divided between two SBCharSetProbers and a HebrewProber,
+# all of which are managed, created, fed data, inquired and deleted by the
+# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
+# fact some kind of Hebrew, Logical or Visual. The final decision about which
+# one is it is made by the HebrewProber by combining final-letter scores
+# with the scores of the two SBCharSetProbers to produce a final answer.
+#
+# The SBCSGroupProber is responsible for stripping the original text of HTML
+# tags, English characters, numbers, low-ASCII punctuation characters, spaces
+# and new lines. It reduces any sequence of such characters to a single space.
+# The buffer fed to each prober in the SBCS group prober is pure text in
+# high-ASCII.
+# The two SBCharSetProbers (model probers) share the same language model:
+# Win1255Model.
+# The first SBCharSetProber uses the model normally as any other
+# SBCharSetProber does, to recognize windows-1255, upon which this model was
+# built. The second SBCharSetProber is told to make the pair-of-letter
+# lookup in the language model backwards. This in practice exactly simulates
+# a visual Hebrew model using the windows-1255 logical Hebrew model.
+#
+# The HebrewProber is not using any language model. All it does is look for
+# final-letter evidence suggesting the text is either logical Hebrew or visual
+# Hebrew. Disjointed from the model probers, the results of the HebrewProber
+# alone are meaningless. HebrewProber always returns 0.00 as confidence
+# since it never identifies a charset by itself. Instead, the pointer to the
+# HebrewProber is passed to the model probers as a helper "Name Prober".
+# When the Group prober receives a positive identification from any prober,
+# it asks for the name of the charset identified. If the prober queried is a
+# Hebrew model prober, the model prober forwards the call to the
+# HebrewProber to make the final decision. In the HebrewProber, the
+# decision is made according to the final-letters scores maintained and Both
+# model probers scores. The answer is returned in the form of the name of the
+# charset identified, either "windows-1255" or "ISO-8859-8".
+
+class HebrewProber(CharSetProber):
+    # windows-1255 / ISO-8859-8 code points of interest
+    FINAL_KAF = 0xea
+    NORMAL_KAF = 0xeb
+    FINAL_MEM = 0xed
+    NORMAL_MEM = 0xee
+    FINAL_NUN = 0xef
+    NORMAL_NUN = 0xf0
+    FINAL_PE = 0xf3
+    NORMAL_PE = 0xf4
+    FINAL_TSADI = 0xf5
+    NORMAL_TSADI = 0xf6
+
+    # Minimum Visual vs Logical final letter score difference.
+    # If the difference is below this, don't rely solely on the final letter score
+    # distance.
+    MIN_FINAL_CHAR_DISTANCE = 5
+
+    # Minimum Visual vs Logical model score difference.
+    # If the difference is below this, don't rely at all on the model score
+    # distance.
+    MIN_MODEL_DISTANCE = 0.01
+
+    VISUAL_HEBREW_NAME = "ISO-8859-8"
+    LOGICAL_HEBREW_NAME = "windows-1255"
+
+    def __init__(self):
+        super(HebrewProber, self).__init__()
+        self._final_char_logical_score = None
+        self._final_char_visual_score = None
+        self._prev = None
+        self._before_prev = None
+        self._logical_prober = None
+        self._visual_prober = None
+        self.reset()
+
+    def reset(self):
+        self._final_char_logical_score = 0
+        self._final_char_visual_score = 0
+        # The two last characters seen in the previous buffer,
+        # mPrev and mBeforePrev are initialized to space in order to simulate
+        # a word delimiter at the beginning of the data
+        self._prev = ' '
+        self._before_prev = ' '
+        # These probers are owned by the group prober.
+
+    def set_model_probers(self, logicalProber, visualProber):
+        self._logical_prober = logicalProber
+        self._visual_prober = visualProber
+
+    def is_final(self, c):
+        return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN,
+                     self.FINAL_PE, self.FINAL_TSADI]
+
+    def is_non_final(self, c):
+        # The normal Tsadi is not a good Non-Final letter due to words like
+        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
+        # apostrophe is converted to a space in FilterWithoutEnglishLetters
+        # causing the Non-Final tsadi to appear at an end of a word even
+        # though this is not the case in the original text.
+        # The letters Pe and Kaf rarely display a related behavior of not being
+        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
+        # for example legally end with a Non-Final Pe or Kaf. However, the
+        # benefit of these letters as Non-Final letters outweighs the damage
+        # since these words are quite rare.
+        return c in [self.NORMAL_KAF, self.NORMAL_MEM,
+                     self.NORMAL_NUN, self.NORMAL_PE]
+
+    def feed(self, byte_str):
+        # Final letter analysis for logical-visual decision.
+        # Look for evidence that the received buffer is either logical Hebrew
+        # or visual Hebrew.
+        # The following cases are checked:
+        # 1) A word longer than 1 letter, ending with a final letter. This is
+        #    an indication that the text is laid out "naturally" since the
+        #    final letter really appears at the end. +1 for logical score.
+        # 2) A word longer than 1 letter, ending with a Non-Final letter. In
+        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
+        #    should not end with the Non-Final form of that letter. Exceptions
+        #    to this rule are mentioned above in isNonFinal(). This is an
+        #    indication that the text is laid out backwards. +1 for visual
+        #    score
+        # 3) A word longer than 1 letter, starting with a final letter. Final
+        #    letters should not appear at the beginning of a word. This is an
+        #    indication that the text is laid out backwards. +1 for visual
+        #    score.
+        #
+        # The visual score and logical score are accumulated throughout the
+        # text and are finally checked against each other in GetCharSetName().
+        # No checking for final letters in the middle of words is done since
+        # that case is not an indication for either Logical or Visual text.
+        #
+        # We automatically filter out all 7-bit characters (replace them with
+        # spaces) so the word boundary detection works properly. [MAP]
+
+        if self.state == ProbingState.NOT_ME:
+            # Both model probers say it's not them. No reason to continue.
+            return ProbingState.NOT_ME
+
+        byte_str = self.filter_high_byte_only(byte_str)
+
+        for cur in byte_str:
+            if cur == ' ':
+                # We stand on a space - a word just ended
+                if self._before_prev != ' ':
+                    # next-to-last char was not a space so self._prev is not a
+                    # 1 letter word
+                    if self.is_final(self._prev):
+                        # case (1) [-2:not space][-1:final letter][cur:space]
+                        self._final_char_logical_score += 1
+                    elif self.is_non_final(self._prev):
+                        # case (2) [-2:not space][-1:Non-Final letter][
+                        #  cur:space]
+                        self._final_char_visual_score += 1
+            else:
+                # Not standing on a space
+                if ((self._before_prev == ' ') and
+                        (self.is_final(self._prev)) and (cur != ' ')):
+                    # case (3) [-2:space][-1:final letter][cur:not space]
+                    self._final_char_visual_score += 1
+            self._before_prev = self._prev
+            self._prev = cur
+
+        # Forever detecting, till the end or until both model probers return
+        # ProbingState.NOT_ME (handled above)
+        return ProbingState.DETECTING
+
+    @property
+    def charset_name(self):
+        # Make the decision: is it Logical or Visual?
+        # If the final letter score distance is dominant enough, rely on it.
+        finalsub = self._final_char_logical_score - self._final_char_visual_score
+        if finalsub >= self.MIN_FINAL_CHAR_DISTANCE:
+            return self.LOGICAL_HEBREW_NAME
+        if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE:
+            return self.VISUAL_HEBREW_NAME
+
+        # It's not dominant enough, try to rely on the model scores instead.
+        modelsub = (self._logical_prober.get_confidence()
+                    - self._visual_prober.get_confidence())
+        if modelsub > self.MIN_MODEL_DISTANCE:
+            return self.LOGICAL_HEBREW_NAME
+        if modelsub < -self.MIN_MODEL_DISTANCE:
+            return self.VISUAL_HEBREW_NAME
+
+        # Still no good, back to final letter distance, maybe it'll save the
+        # day.
+        if finalsub < 0.0:
+            return self.VISUAL_HEBREW_NAME
+
+        # (finalsub > 0 - Logical) or (don't know what to do) default to
+        # Logical.
+        return self.LOGICAL_HEBREW_NAME
+
+    @property
+    def language(self):
+        return 'Hebrew'
+
+    @property
+    def state(self):
+        # Remain active as long as any of the model probers are active.
+        if (self._logical_prober.state == ProbingState.NOT_ME) and \
+           (self._visual_prober.state == ProbingState.NOT_ME):
+            return ProbingState.NOT_ME
+        return ProbingState.DETECTING
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2c250db94c9b3052b00980f7f8f6035873387b57
GIT binary patch
literal 4331
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
U{FKt1R69_77lUF^fKebB0N!Y}8vp<R

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py
new file mode 100644
index 00000000..83fc082b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py
@@ -0,0 +1,325 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# Sampling from about 20M text materials include literature and computer technology
+#
+# Japanese frequency table, applied to both S-JIS and EUC-JP
+# They are sorted in order.
+
+# 128  --> 0.77094
+# 256  --> 0.85710
+# 512  --> 0.92635
+# 1024 --> 0.97130
+# 2048 --> 0.99431
+#
+# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
+# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
+#
+# Typical Distribution Ratio, 25% of IDR
+
+JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
+
+# Char to FreqOrder table ,
+JIS_TABLE_SIZE = 4368
+
+JIS_CHAR_TO_FREQ_ORDER = (
+  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
+3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
+1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
+2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
+2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
+5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
+1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
+5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
+5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
+5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
+5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
+5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
+5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
+1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
+1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
+1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
+2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
+3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
+3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
+   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
+  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
+1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
+ 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
+5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
+ 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
+  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
+  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
+ 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
+  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
+5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
+5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
+5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
+4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
+5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
+5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
+5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
+5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
+5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
+5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
+5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
+5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
+5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
+3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
+5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
+5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
+5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
+5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
+5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
+5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
+5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
+5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
+5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
+5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
+5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
+5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
+5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
+5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
+5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
+5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
+5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
+5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
+5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
+5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
+5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
+5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
+5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
+5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
+5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
+5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
+5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
+5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
+5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
+5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
+5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
+5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
+5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
+6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
+6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
+6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
+6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
+6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
+6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
+6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
+6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
+4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
+ 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
+ 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
+1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
+1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
+ 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
+3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
+3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
+ 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
+3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
+3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
+ 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
+2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
+ 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
+3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
+1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
+ 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
+1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
+ 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
+2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
+2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
+2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
+2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
+1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
+1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
+1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
+1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
+2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
+1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
+2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
+1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
+1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
+1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
+1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
+1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
+1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
+ 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
+ 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
+1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
+2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
+2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
+2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
+3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
+3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
+ 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
+3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
+1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
+ 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
+2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
+1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
+ 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
+3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
+4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
+2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
+1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
+2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
+1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
+ 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
+ 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
+1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
+2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
+2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
+2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
+3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
+1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
+2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
+ 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
+ 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
+ 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
+1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
+2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
+ 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
+1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
+1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
+ 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
+1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
+1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
+1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
+ 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
+2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
+ 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
+2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
+3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
+2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
+1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
+6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
+1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
+2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
+1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
+ 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
+  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
+3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
+3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
+1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
+1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
+1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
+1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
+ 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
+ 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
+2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
+ 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
+3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
+2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
+ 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
+1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
+2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
+ 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
+1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
+ 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
+4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
+2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
+1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
+ 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
+1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
+2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
+ 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
+6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
+1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
+1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
+2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
+3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
+ 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
+3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
+1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
+ 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
+1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
+ 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
+3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
+ 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
+2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
+ 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
+4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
+2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
+1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
+1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
+1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
+ 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
+1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
+3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
+1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
+3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
+ 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
+ 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
+ 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
+2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
+1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
+ 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
+1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
+ 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
+1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
+ 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
+ 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
+ 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
+1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
+1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
+2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
+4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
+ 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
+1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
+ 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
+1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
+3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
+1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
+2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
+2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
+1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
+1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
+2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
+ 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
+2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
+1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
+1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
+1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
+1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
+3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
+2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
+2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
+ 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
+3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
+3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
+1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
+2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
+1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
+2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
+)
+
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..97c167f5ec6d91201147d45aff8394ed04e71251
GIT binary patch
literal 44543
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
LQ8*d`xI+K{pAuv0

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py
new file mode 100644
index 00000000..20044e4b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py
@@ -0,0 +1,233 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+
+# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
+jp2CharContext = (
+(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
+(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
+(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
+(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
+(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
+(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
+(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
+(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
+(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
+(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
+(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
+(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
+(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
+(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
+(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
+(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
+(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
+(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
+(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
+(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
+(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
+(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
+(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
+(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
+(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
+(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
+(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
+(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
+(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
+(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
+(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
+(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
+(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
+(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
+(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
+(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
+(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
+(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
+(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
+(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
+(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
+(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
+(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
+(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
+(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
+(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
+(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
+(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
+(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
+(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
+(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
+(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
+(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
+(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
+(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
+(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
+(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
+(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
+(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
+(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
+(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
+(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
+(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
+(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
+(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
+(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
+(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
+(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
+(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
+(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
+(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
+(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
+(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
+)
+
+class JapaneseContextAnalysis(object):
+    NUM_OF_CATEGORY = 6
+    DONT_KNOW = -1
+    ENOUGH_REL_THRESHOLD = 100
+    MAX_REL_THRESHOLD = 1000
+    MINIMUM_DATA_THRESHOLD = 4
+
+    def __init__(self):
+        self._total_rel = None
+        self._rel_sample = None
+        self._need_to_skip_char_num = None
+        self._last_char_order = None
+        self._done = None
+        self.reset()
+
+    def reset(self):
+        self._total_rel = 0  # total sequence received
+        # category counters, each integer counts sequence in its category
+        self._rel_sample = [0] * self.NUM_OF_CATEGORY
+        # if last byte in current buffer is not the last byte of a character,
+        # we need to know how many bytes to skip in next buffer
+        self._need_to_skip_char_num = 0
+        self._last_char_order = -1  # The order of previous char
+        # If this flag is set to True, detection is done and conclusion has
+        # been made
+        self._done = False
+
+    def feed(self, byte_str, num_bytes):
+        if self._done:
+            return
+
+        # The buffer we got is byte oriented, and a character may span in more than one
+        # buffers. In case the last one or two byte in last buffer is not
+        # complete, we record how many byte needed to complete that character
+        # and skip these bytes here.  We can choose to record those bytes as
+        # well and analyse the character once it is complete, but since a
+        # character will not make much difference, by simply skipping
+        # this character will simply our logic and improve performance.
+        i = self._need_to_skip_char_num
+        while i < num_bytes:
+            order, char_len = self.get_order(byte_str[i:i + 2])
+            i += char_len
+            if i > num_bytes:
+                self._need_to_skip_char_num = i - num_bytes
+                self._last_char_order = -1
+            else:
+                if (order != -1) and (self._last_char_order != -1):
+                    self._total_rel += 1
+                    if self._total_rel > self.MAX_REL_THRESHOLD:
+                        self._done = True
+                        break
+                    self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1
+                self._last_char_order = order
+
+    def got_enough_data(self):
+        return self._total_rel > self.ENOUGH_REL_THRESHOLD
+
+    def get_confidence(self):
+        # This is just one way to calculate confidence. It works well for me.
+        if self._total_rel > self.MINIMUM_DATA_THRESHOLD:
+            return (self._total_rel - self._rel_sample[0]) / self._total_rel
+        else:
+            return self.DONT_KNOW
+
+    def get_order(self, byte_str):
+        return -1, 1
+
+class SJISContextAnalysis(JapaneseContextAnalysis):
+    def __init__(self):
+        super(SJISContextAnalysis, self).__init__()
+        self._charset_name = "SHIFT_JIS"
+
+    @property
+    def charset_name(self):
+        return self._charset_name
+
+    def get_order(self, byte_str):
+        if not byte_str:
+            return -1, 1
+        # find out current char's byte length
+        first_char = byte_str[0]
+        if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC):
+            char_len = 2
+            if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
+                self._charset_name = "CP932"
+        else:
+            char_len = 1
+
+        # return its order if it is hiragana
+        if len(byte_str) > 1:
+            second_char = byte_str[1]
+            if (first_char == 202) and (0x9F <= second_char <= 0xF1):
+                return second_char - 0x9F, char_len
+
+        return -1, char_len
+
+class EUCJPContextAnalysis(JapaneseContextAnalysis):
+    def get_order(self, byte_str):
+        if not byte_str:
+            return -1, 1
+        # find out current char's byte length
+        first_char = byte_str[0]
+        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
+            char_len = 2
+        elif first_char == 0x8F:
+            char_len = 3
+        else:
+            char_len = 1
+
+        # return its order if it is hiragana
+        if len(byte_str) > 1:
+            second_char = byte_str[1]
+            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
+                return second_char - 0xA1, char_len
+
+        return -1, char_len
+
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7af73d63575e58b2ba2f707c7aa5dbe90ffb855c
GIT binary patch
literal 25988
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
new file mode 100644
index 00000000..2aa4fb2e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
@@ -0,0 +1,228 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+# this table is modified base on win1251BulgarianCharToOrderMap, so
+# only number <64 is sure valid
+
+Latin5_BulgarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
+210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
+ 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
+ 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
+)
+
+win1251BulgarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
+206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
+221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
+ 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
+ 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 96.9392%
+# first 1024 sequences:3.0618%
+# rest  sequences:     0.2992%
+# negative sequences:  0.0020%
+BulgarianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
+3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
+0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
+0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
+0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
+0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
+0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
+2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
+3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
+3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
+1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
+3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
+1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
+2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
+2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
+3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
+1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
+2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
+2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
+1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
+2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
+2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
+2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
+1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
+2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
+1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
+3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
+1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
+3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
+1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
+2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
+1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
+2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
+1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
+2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
+1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
+2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
+1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
+2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
+1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
+0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
+1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
+1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
+1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
+0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
+1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
+1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+)
+
+Latin5BulgarianModel = {
+  'char_to_order_map': Latin5_BulgarianCharToOrderMap,
+  'precedence_matrix': BulgarianLangModel,
+  'typical_positive_ratio': 0.969392,
+  'keep_english_letter': False,
+  'charset_name': "ISO-8859-5",
+  'language': 'Bulgairan',
+}
+
+Win1251BulgarianModel = {
+  'char_to_order_map': win1251BulgarianCharToOrderMap,
+  'precedence_matrix': BulgarianLangModel,
+  'typical_positive_ratio': 0.969392,
+  'keep_english_letter': False,
+  'charset_name': "windows-1251",
+  'language': 'Bulgarian',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..56100655a5d244ce7ad746cae6680024f248ea52
GIT binary patch
literal 25011
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
Ha-r}5zik%i

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py
new file mode 100644
index 00000000..e5f9a1fd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py
@@ -0,0 +1,333 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# KOI8-R language model
+# Character Mapping Table:
+KOI8R_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
+223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
+238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
+ 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
+ 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
+ 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
+ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
+)
+
+win1251_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+)
+
+latin5_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+macCyrillic_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
+)
+
+IBM855_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
+206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
+  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
+220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
+230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
+  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
+ 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
+250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
+)
+
+IBM866_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 97.6601%
+# first 1024 sequences: 2.3389%
+# rest  sequences:      0.1237%
+# negative sequences:   0.0009%
+RussianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
+0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
+0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
+1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
+1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
+2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
+1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
+3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
+1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
+2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
+1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
+1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
+1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
+1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
+1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
+2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
+1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
+2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
+1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
+1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
+1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
+3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
+3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
+1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
+1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
+0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
+1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
+1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
+0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
+1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
+2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
+1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
+1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
+2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
+1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
+0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
+2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
+1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
+1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
+0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
+0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
+1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
+0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+)
+
+Koi8rModel = {
+  'char_to_order_map': KOI8R_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "KOI8-R",
+  'language': 'Russian',
+}
+
+Win1251CyrillicModel = {
+  'char_to_order_map': win1251_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "windows-1251",
+  'language': 'Russian',
+}
+
+Latin5CyrillicModel = {
+  'char_to_order_map': latin5_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "ISO-8859-5",
+  'language': 'Russian',
+}
+
+MacCyrillicModel = {
+  'char_to_order_map': macCyrillic_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "MacCyrillic",
+  'language': 'Russian',
+}
+
+Ibm866Model = {
+  'char_to_order_map': IBM866_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "IBM866",
+  'language': 'Russian',
+}
+
+Ibm855Model = {
+  'char_to_order_map': IBM855_char_to_order_map,
+  'precedence_matrix': RussianLangModel,
+  'typical_positive_ratio': 0.976601,
+  'keep_english_letter': False,
+  'charset_name': "IBM855",
+  'language': 'Russian',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..60f480c16720e8e213b34c381f599c0d4764220f
GIT binary patch
literal 30731
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
O#>~vf4u@P+;Q;{WJLhu%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py
new file mode 100644
index 00000000..53322216
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin7_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+win1253_char_to_order_map = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
+253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 98.2851%
+# first 1024 sequences:1.7001%
+# rest  sequences:     0.0359%
+# negative sequences:  0.0148%
+GreekLangModel = (
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
+2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
+2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
+2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
+0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
+3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
+3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
+2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
+2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
+0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
+0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
+0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
+0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
+0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
+0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
+0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
+0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
+0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
+0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
+0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
+0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
+0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
+0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
+0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
+0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
+0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
+0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
+0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
+0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
+0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
+0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
+0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
+0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
+0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
+0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin7GreekModel = {
+  'char_to_order_map': Latin7_char_to_order_map,
+  'precedence_matrix': GreekLangModel,
+  'typical_positive_ratio': 0.982851,
+  'keep_english_letter': False,
+  'charset_name': "ISO-8859-7",
+  'language': 'Greek',
+}
+
+Win1253GreekModel = {
+  'char_to_order_map': win1253_char_to_order_map,
+  'precedence_matrix': GreekLangModel,
+  'typical_positive_ratio': 0.982851,
+  'keep_english_letter': False,
+  'charset_name': "windows-1253",
+  'language': 'Greek',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..600f0797715b4492c0279148cb56340cf04031ee
GIT binary patch
literal 24686
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
Z;FD!wWaGjwKip;6n3);b;gAc32LJ(1#Vh~-

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py
new file mode 100644
index 00000000..58f4c875
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py
@@ -0,0 +1,200 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+#          Simon Montagu
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Shoshannah Forbes - original C code (?)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Windows-1255 language model
+# Character Mapping Table:
+WIN1255_CHAR_TO_ORDER_MAP = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
+ 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
+253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
+ 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
+124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
+215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
+ 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
+106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
+ 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
+238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
+  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
+ 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 98.4004%
+# first 1024 sequences: 1.5981%
+# rest  sequences:      0.087%
+# negative sequences:   0.0015%
+HEBREW_LANG_MODEL = (
+0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
+3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
+1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
+1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
+1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
+1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
+0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
+1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
+0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
+0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
+0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
+0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
+0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
+0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
+0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
+3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
+0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
+0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
+0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
+0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
+0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
+0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
+0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
+0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
+0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
+1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
+0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
+1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
+2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
+2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
+0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
+0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
+)
+
+Win1255HebrewModel = {
+  'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP,
+  'precedence_matrix': HEBREW_LANG_MODEL,
+  'typical_positive_ratio': 0.984004,
+  'keep_english_letter': False,
+  'charset_name': "windows-1255",
+  'language': 'Hebrew',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e7ac16818e6e05d766b7d4896264d36c9edefb74
GIT binary patch
literal 23497
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
N!(Wb#nVFFt4gore(d+;K

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py
new file mode 100644
index 00000000..bb7c095e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py
@@ -0,0 +1,225 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin2_HungarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
+175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
+ 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
+ 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
+245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+win1250HungarianCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
+ 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
+177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
+191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
+ 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
+221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
+232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
+ 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
+245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 94.7368%
+# first 1024 sequences:5.2623%
+# rest  sequences:     0.8894%
+# negative sequences:  0.0009%
+HungarianLangModel = (
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
+3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
+0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
+3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
+1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
+1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
+3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
+2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
+2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
+2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
+2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
+2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
+1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
+1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
+3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
+1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
+1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
+2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
+2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
+2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
+3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
+2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
+1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
+1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
+2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
+1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
+2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
+1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
+1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
+2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
+2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
+2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
+1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
+1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
+0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
+2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
+1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
+2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
+1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
+1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
+2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
+2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
+2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
+1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
+2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
+0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
+2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin2HungarianModel = {
+  'char_to_order_map': Latin2_HungarianCharToOrderMap,
+  'precedence_matrix': HungarianLangModel,
+  'typical_positive_ratio': 0.947368,
+  'keep_english_letter': True,
+  'charset_name': "ISO-8859-2",
+  'language': 'Hungarian',
+}
+
+Win1250HungarianModel = {
+  'char_to_order_map': win1250HungarianCharToOrderMap,
+  'precedence_matrix': HungarianLangModel,
+  'typical_positive_ratio': 0.947368,
+  'keep_english_letter': True,
+  'charset_name': "windows-1250",
+  'language': 'Hungarian',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bd33660a205fad39dc748bebb71cfbba17b7b7fd
GIT binary patch
literal 24981
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
Hg~9^>L-;Ji

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py
new file mode 100644
index 00000000..15f94c2d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py
@@ -0,0 +1,199 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# The following result for thai was collected from a limited sample (1M).
+
+# Character Mapping Table:
+TIS620CharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
+253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
+188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
+253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
+ 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
+209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
+223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
+236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
+ 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
+ 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
+ 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
+ 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
+ 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
+)
+
+# Model Table:
+# total sequences: 100%
+# first 512 sequences: 92.6386%
+# first 1024 sequences:7.3177%
+# rest  sequences:     1.0230%
+# negative sequences:  0.0436%
+ThaiLangModel = (
+0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
+0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
+3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
+0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
+3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
+3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
+3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
+3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
+3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
+2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
+3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
+0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
+1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
+3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
+3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
+1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
+0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
+0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
+3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
+2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
+3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
+0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
+3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
+2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
+2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
+3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
+3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
+3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
+3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
+3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
+1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
+0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
+0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
+3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
+3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
+1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
+3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
+3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
+0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
+0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
+1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
+1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
+3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
+0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
+3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
+0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
+0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
+0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
+0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
+0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
+3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
+0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
+0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
+3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
+2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
+0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
+3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
+1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
+1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
+1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
+1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+TIS620ThaiModel = {
+  'char_to_order_map': TIS620CharToOrderMap,
+  'precedence_matrix': ThaiLangModel,
+  'typical_positive_ratio': 0.926386,
+  'keep_english_letter': False,
+  'charset_name': "TIS-620",
+  'language': 'Thai',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..abd19049a5b90e8e4825eee1bc489f92622ddaea
GIT binary patch
literal 23476
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
E0Vb5sR{#J2

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py
new file mode 100644
index 00000000..a427a457
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Communicator client code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Özgür Baskın - Turkish Language Model
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+# 255: Control characters that usually does not exist in any text
+# 254: Carriage/Return
+# 253: symbol (punctuation) that does not belong to word
+# 252: 0 - 9
+
+# Character Mapping Table:
+Latin5_TurkishCharToOrderMap = (
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42,
+ 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255,
+255,  1, 21, 28, 12,  2, 18, 27, 25,  3, 24, 10,  5, 13,  4, 15,
+ 26, 64,  7,  8,  9, 14, 32, 57, 58, 11, 22,255,255,255,255,255,
+180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,
+164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106,
+150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136,
+ 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125,
+124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119,
+ 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86,
+ 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96,
+ 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17,  6, 19,107,
+)
+
+TurkishLangModel = (
+3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3,
+3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1,
+3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3,
+3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1,
+3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3,
+3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1,
+3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2,
+2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1,
+3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2,
+2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,
+1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1,
+2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2,
+3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1,
+3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2,
+2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1,
+3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2,
+2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,
+3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2,
+3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0,
+3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3,
+0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,
+3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1,
+0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,
+3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1,
+1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1,
+3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3,
+2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3,
+2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1,
+3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0,
+0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0,
+1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2,
+3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1,
+1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,
+3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2,
+2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0,
+0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0,
+3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1,
+0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1,
+1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,
+1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3,
+2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1,
+2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,
+0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1,
+2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0,
+3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0,
+0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1,
+1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2,
+0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1,
+3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1,
+0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0,
+3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,
+3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,
+1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2,
+2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1,
+0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0,
+3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0,
+0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0,
+3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0,
+0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0,
+3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0,
+0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0,
+0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0,
+3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0,
+0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1,
+3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,
+0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1,
+0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,
+3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0,
+0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0,
+3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0,
+0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0,
+3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0,
+0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0,
+0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0,
+3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0,
+0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
+3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0,
+0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,
+3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0,
+0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0,
+0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0,
+0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0,
+1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0,
+0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1,
+0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0,
+3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0,
+0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,
+2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,
+2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0,
+0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
+1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,
+0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+)
+
+Latin5TurkishModel = {
+  'char_to_order_map': Latin5_TurkishCharToOrderMap,
+  'precedence_matrix': TurkishLangModel,
+  'typical_positive_ratio': 0.970290,
+  'keep_english_letter': True,
+  'charset_name': "ISO-8859-9",
+  'language': 'Turkish',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e474acc93550aa8aa8728439156c65d92475d0bf
GIT binary patch
literal 23493
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py
new file mode 100644
index 00000000..7d1e8c20
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py
@@ -0,0 +1,145 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState
+
+FREQ_CAT_NUM = 4
+
+UDF = 0  # undefined
+OTH = 1  # other
+ASC = 2  # ascii capital letter
+ASS = 3  # ascii small letter
+ACV = 4  # accent capital vowel
+ACO = 5  # accent capital other
+ASV = 6  # accent small vowel
+ASO = 7  # accent small other
+CLASS_NUM = 8  # total classes
+
+Latin1_CharToClass = (
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
+    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
+    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
+    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
+    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
+    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
+    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
+    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
+    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
+    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
+    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
+    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
+    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
+    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
+    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
+    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
+    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
+)
+
+# 0 : illegal
+# 1 : very unlikely
+# 2 : normal
+# 3 : very likely
+Latin1ClassModel = (
+# UDF OTH ASC ASS ACV ACO ASV ASO
+    0,  0,  0,  0,  0,  0,  0,  0,  # UDF
+    0,  3,  3,  3,  3,  3,  3,  3,  # OTH
+    0,  3,  3,  3,  3,  3,  3,  3,  # ASC
+    0,  3,  3,  3,  1,  1,  3,  3,  # ASS
+    0,  3,  3,  3,  1,  2,  1,  2,  # ACV
+    0,  3,  3,  3,  3,  3,  3,  3,  # ACO
+    0,  3,  1,  3,  1,  1,  1,  3,  # ASV
+    0,  3,  1,  3,  1,  1,  3,  3,  # ASO
+)
+
+
+class Latin1Prober(CharSetProber):
+    def __init__(self):
+        super(Latin1Prober, self).__init__()
+        self._last_char_class = None
+        self._freq_counter = None
+        self.reset()
+
+    def reset(self):
+        self._last_char_class = OTH
+        self._freq_counter = [0] * FREQ_CAT_NUM
+        CharSetProber.reset(self)
+
+    @property
+    def charset_name(self):
+        return "ISO-8859-1"
+
+    @property
+    def language(self):
+        return ""
+
+    def feed(self, byte_str):
+        byte_str = self.filter_with_english_letters(byte_str)
+        for c in byte_str:
+            char_class = Latin1_CharToClass[c]
+            freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM)
+                                    + char_class]
+            if freq == 0:
+                self._state = ProbingState.NOT_ME
+                break
+            self._freq_counter[freq] += 1
+            self._last_char_class = char_class
+
+        return self.state
+
+    def get_confidence(self):
+        if self.state == ProbingState.NOT_ME:
+            return 0.01
+
+        total = sum(self._freq_counter)
+        if total < 0.01:
+            confidence = 0.0
+        else:
+            confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0)
+                          / total)
+        if confidence < 0.0:
+            confidence = 0.0
+        # lower the confidence of latin1 so that other more accurate
+        # detector can take priority.
+        confidence = confidence * 0.73
+        return confidence
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..038171b26916967f1ae610640474edea3b0e50d5
GIT binary patch
literal 4117
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
V6B{EMWR_s01j=zTFd{=X765uW3B~{b

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py
new file mode 100644
index 00000000..6256ecfd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py
@@ -0,0 +1,91 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState, MachineState
+
+
+class MultiByteCharSetProber(CharSetProber):
+    """
+    MultiByteCharSetProber
+    """
+
+    def __init__(self, lang_filter=None):
+        super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter)
+        self.distribution_analyzer = None
+        self.coding_sm = None
+        self._last_char = [0, 0]
+
+    def reset(self):
+        super(MultiByteCharSetProber, self).reset()
+        if self.coding_sm:
+            self.coding_sm.reset()
+        if self.distribution_analyzer:
+            self.distribution_analyzer.reset()
+        self._last_char = [0, 0]
+
+    @property
+    def charset_name(self):
+        raise NotImplementedError
+
+    @property
+    def language(self):
+        raise NotImplementedError
+
+    def feed(self, byte_str):
+        for i in range(len(byte_str)):
+            coding_state = self.coding_sm.next_state(byte_str[i])
+            if coding_state == MachineState.ERROR:
+                self.logger.debug('%s %s prober hit error at byte %s',
+                                  self.charset_name, self.language, i)
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                char_len = self.coding_sm.get_current_charlen()
+                if i == 0:
+                    self._last_char[1] = byte_str[0]
+                    self.distribution_analyzer.feed(self._last_char, char_len)
+                else:
+                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
+                                                    char_len)
+
+        self._last_char[0] = byte_str[-1]
+
+        if self.state == ProbingState.DETECTING:
+            if (self.distribution_analyzer.got_enough_data() and
+                    (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        return self.distribution_analyzer.get_confidence()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..946ed7200d25e6fc1c356997dbd79f3ad74ff681
GIT binary patch
literal 3171
zcmZSn%*&NH<x)&C0~9bbFfceUFfbH@h!h5f6h?*|28LWlhA2h`Mi8HgA%}?}mzg1o
znIV^jA&P~8F@>2Sm60Khks*bJp@o5=nSmiPij^USl_6Mzje&t7laYaeK?6jT@G>wk
zIA<gl1*et-6y+zS7HKdsFff$xFfcHH_?da>!6k_$sbB%$#N>?3yi|yQ7y|=?Z)r|R
zrc-4}DvAkkhl5OV0y#XGfq@~F0p#8k28Jjmh7@*?Ct4UmZcSkVxiE^AA(f3Gg&D+d
zW@LzB2Xi5gXJm-t0J*(|fgy^MA%zX3CW?z8C|H97WViwY0|S?Wf`S5e*MOyxK~4c-
zP*^&HblHJ?$-q#;$WX(;(9Fb;#RPIv4I@J{10yI<YZw^fSr}3nK+^H73@J<?l+Fa^
zvVp{dH9%(hm2fjKFytiWrN^gb=9HusWr8A2gB@f#E6ASGg4CiQkjfH}W8>p9^D;}~
z<4af=7#RHW^HNJh85kH+GK))!GLuS6GV}A|6Y~;tDyve9N;nx97?Sf-GV{{oi*rl3
z7#JAha}tY7;*&EHp^*eKq&PJvEeOQW09y<qipv-n81xH@GRqQ6QuWIci}cg-b5c@^
ziuJP#^|OnO%*_o8vy9Bk3@yxyb1Kuz<4sabObiSR4AS%TL-Y$W3v@H{ic1o6a&*fR
zElUG4Ktf;~UzVDel3%0`azRRJiGFSph*g|gQUFdldIgn1pwy)f@;Au042+VDoQ#}|
z$)J=5!k};fhkgVod{9HbnSp_^hJhiAnW0Dr6v|o5pf~}E=7A$2i-n=c6)eGmB$2`h
ziZ*DxutMSm6wiK;cmO#k2ow*HC;+jFQj1edf<S>A1ae~#C}6=^AqW(cgCi6{xlb1q
ziXa99qc9^UqW~DgLlP94;E)74zl4FIi4o#=khmY%J0-&4Bv#^?Tac5Qo0?aWn&Mhi
zlwSmv96Wvn7c9_Z6rY!vn`#R3Hz*1jm`Lz#5U3m*Y+eJUFHq4?nwXwyiR3Mi??6cr
zlsdtY2r7>&*ceM7If9X)8H`+FKQYuYfs;HFC|}etGSo0JNH#Mv)G{;FFf){}Fl4bZ
zWHT`o<$@KlF=T<uRZuSC0E=*fG&Hj?FqUvJWO0Lp;&~VX3WZ_1dBM7S7(mi|n9}@U
zX<?8=786630H_|RWdWI)!UUFjz)-^oDi<X|RtkcOZyOLxh#?E2Nsyt21yr~)7P5l#
zHbesKjTB}Ei5e!57I8(GB4LI?VTN#!kt_@_BbgY$Mv8#lC<?YU31*fU$U#LAt~iJd
zvRr~8n}wk$3G8K<p9+&0p@oPDL$C%Y=>3Wn85kH;ixpIh6(FUTLPlnZLMkYSC?u9B
zBvqEADySBNOA%1)Fl7G!|Np;+B&gg1=`TvmOHVBUm1jArdEn9nTteriR+PjSgDT7*
zP$ZXtl)455`3IGN;yNckJw3GuESQp-RGJ>d$H2f4#1A4s`4+6k&p#yI*A>i!7zAc|
zh6IB|K?%yuKh)19-ZKPjOmK)}PzX4ur>B<0Czlo#rRG6u2#~Y5KqiCqfUBFd)YKHP
zCb0X!)r*U3h^upmr=NQX$PwxJCGn|w`K9R@@hOQVi6tP{fsM`2OUq12%}Y)#5n^Cq
z2=?#~3ULk%i4XAzat-$I_i+J-D7Z)gS8|}Ri!UxIDgk*a6OzH9^%y8*z-mA_K0YTk
zZ*Y{iG7Jn1wxA5E2dY0AB^kvS`5Ac_g&BDmS->n12@(-xlw^`-<YN+K5@O_M6lD~`
zQbvJFB2YqPV8{ZsCK!Uj#gZSmT?MIfKrI%qAUMnhM-YJA6a@+bP`YJc^wR*<hTy1*
z2N%on@!$j=AD^3_Qks(*A727$<HX0O<R{0+2Z7k&x<3e1V}Z356y+DB7L`;YC2~+O
z2Z1a?cp1zZ$Oa223oC*A4NC27%xp|NY@8hYEc`5-vVP#UGPs2dO0MvBP7o-OfOAr6
oUTJP|5Ga|0vpcwv0rnAs7(l;)qrnCeUv_dJKZ4qc0*qqJ0DPdzhyVZp

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
new file mode 100644
index 00000000..530abe75
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
@@ -0,0 +1,54 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#   Proofpoint, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .utf8prober import UTF8Prober
+from .sjisprober import SJISProber
+from .eucjpprober import EUCJPProber
+from .gb2312prober import GB2312Prober
+from .euckrprober import EUCKRProber
+from .cp949prober import CP949Prober
+from .big5prober import Big5Prober
+from .euctwprober import EUCTWProber
+
+
+class MBCSGroupProber(CharSetGroupProber):
+    def __init__(self, lang_filter=None):
+        super(MBCSGroupProber, self).__init__(lang_filter=lang_filter)
+        self.probers = [
+            UTF8Prober(),
+            SJISProber(),
+            EUCJPProber(),
+            GB2312Prober(),
+            EUCKRProber(),
+            CP949Prober(),
+            Big5Prober(),
+            EUCTWProber()
+        ]
+        self.reset()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5b49d900904f11ba9375b04e8c116fe2ff82869d
GIT binary patch
literal 1477
zcmZSn%*&NH<x)&C0~9bbFfceUFfbIaVqjoMVPHsMWXNG)$Yo@RVq{<h@tGKMm>6=I
z8KRgWd}f9m7KU6_hA37DpM@cZjUktvA&MQsXJyFYV94cUh~k9s*%)%T7;?E8qPQV^
zc7_}thFo5TC|(GkgCU2HA(x*aiXXz~WXKU<$Q5LW5@cXZ;bKT-WJqIVNa1E^VPI%x
zV2F$oVo2d(2-e_bU|`5(WME*>01+iZ3=9m;8Hq)~sU_}3`K1K`MfpjoMG!eI1_p-E
z5H|~Sv0yLHU}Q0F1_lP#P-m|IWI-MV1_pO0BV$7&WKpP6?;vzR=KxC+OJqTi<xZLD
zrpRJY-67!+!4iH31_oaz=U^n4!{djEfq}sZ6h9&i3=F9ZplC^91VvN}BPdFOf;B)Y
zl0gIrbAZADq&$IvfuV$fp@fm4hJm4(i6M&#6ty*s49yITj3vyVuq<H#ldNEp4NS6w
zNe(c{2`0HfWI6}Plz46snZ*MV0VNHH)qW))@8l%rrN^gb=9Husfup8`737H0g4CiQ
zPLNAL?uw7k%*!l^j}HRHSP;myL7>zZ#KOS95Cl>m#0Fxqg9woN5)i8Z9FfIf^NLc7
zQ%k`9Edl8%PR&UR0)?*zC@q7D;xYyX2K|Df%(BFiRQ<BVBK@@doRrj}V*Ttw{p?~R
zb92MOEF<$WLksiboXYg_c#{+p69WSSgY-Q85dDJ80^Q8K;*!Li9NqFn%hJFMkPsNh
zm!;;V<QM5DXCxM-q?YLCCM6fAgAy9VeR>6zL7<eP1@bj0rWhC{nb;VSAwQF!2FTSV
zAg{&8=OyN*#>ba{oF5;bo1ape1LA@d_~qxNf(--v2tf>_-#8f<7&JkC1H~E}qo0N_
zC{jV04iq58sU=8Z5d?}2u*XVE(kvk11CDaASaDWnF;om>7C7;wmL_KvKm|c5q68F_
z=}DkW2NeZ{3ruNt5mXSAWWa*S1(qh3P(e@<0$Y@nnQjUd1EnLd!qn2_l5(gZC>p?N
d6A{8-)&K@GIBD2G5`&!_D7Zl(EWn5cnE^lpLaP7(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py
new file mode 100644
index 00000000..8360d0f2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py
@@ -0,0 +1,572 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .enums import MachineState
+
+# BIG5
+
+BIG5_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,1,  # 78 - 7f
+    4,4,4,4,4,4,4,4,  # 80 - 87
+    4,4,4,4,4,4,4,4,  # 88 - 8f
+    4,4,4,4,4,4,4,4,  # 90 - 97
+    4,4,4,4,4,4,4,4,  # 98 - 9f
+    4,3,3,3,3,3,3,3,  # a0 - a7
+    3,3,3,3,3,3,3,3,  # a8 - af
+    3,3,3,3,3,3,3,3,  # b0 - b7
+    3,3,3,3,3,3,3,3,  # b8 - bf
+    3,3,3,3,3,3,3,3,  # c0 - c7
+    3,3,3,3,3,3,3,3,  # c8 - cf
+    3,3,3,3,3,3,3,3,  # d0 - d7
+    3,3,3,3,3,3,3,3,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,3,3,3,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,3,3,0  # f8 - ff
+)
+
+BIG5_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17
+)
+
+BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0)
+
+BIG5_SM_MODEL = {'class_table': BIG5_CLS,
+                 'class_factor': 5,
+                 'state_table': BIG5_ST,
+                 'char_len_table': BIG5_CHAR_LEN_TABLE,
+                 'name': 'Big5'}
+
+# CP949
+
+CP949_CLS  = (
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f
+    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f
+    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f
+    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f
+    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f
+    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f
+    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f
+    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f
+    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af
+    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf
+    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff
+)
+
+CP949_ST = (
+#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =
+    MachineState.ERROR,MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,     4,     5,MachineState.ERROR,     6, # MachineState.START
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6
+)
+
+CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
+
+CP949_SM_MODEL = {'class_table': CP949_CLS,
+                  'class_factor': 10,
+                  'state_table': CP949_ST,
+                  'char_len_table': CP949_CHAR_LEN_TABLE,
+                  'name': 'CP949'}
+
+# EUC-JP
+
+EUCJP_CLS = (
+    4,4,4,4,4,4,4,4,  # 00 - 07
+    4,4,4,4,4,4,5,5,  # 08 - 0f
+    4,4,4,4,4,4,4,4,  # 10 - 17
+    4,4,4,5,4,4,4,4,  # 18 - 1f
+    4,4,4,4,4,4,4,4,  # 20 - 27
+    4,4,4,4,4,4,4,4,  # 28 - 2f
+    4,4,4,4,4,4,4,4,  # 30 - 37
+    4,4,4,4,4,4,4,4,  # 38 - 3f
+    4,4,4,4,4,4,4,4,  # 40 - 47
+    4,4,4,4,4,4,4,4,  # 48 - 4f
+    4,4,4,4,4,4,4,4,  # 50 - 57
+    4,4,4,4,4,4,4,4,  # 58 - 5f
+    4,4,4,4,4,4,4,4,  # 60 - 67
+    4,4,4,4,4,4,4,4,  # 68 - 6f
+    4,4,4,4,4,4,4,4,  # 70 - 77
+    4,4,4,4,4,4,4,4,  # 78 - 7f
+    5,5,5,5,5,5,5,5,  # 80 - 87
+    5,5,5,5,5,5,1,3,  # 88 - 8f
+    5,5,5,5,5,5,5,5,  # 90 - 97
+    5,5,5,5,5,5,5,5,  # 98 - 9f
+    5,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,2,2,2,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,2,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,0,5  # f8 - ff
+)
+
+EUCJP_ST = (
+          3,     4,     3,     5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+     MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
+     MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     3,MachineState.ERROR,#18-1f
+          3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27
+)
+
+EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0)
+
+EUCJP_SM_MODEL = {'class_table': EUCJP_CLS,
+                  'class_factor': 6,
+                  'state_table': EUCJP_ST,
+                  'char_len_table': EUCJP_CHAR_LEN_TABLE,
+                  'name': 'EUC-JP'}
+
+# EUC-KR
+
+EUCKR_CLS  = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    1,1,1,1,1,1,1,1,  # 40 - 47
+    1,1,1,1,1,1,1,1,  # 48 - 4f
+    1,1,1,1,1,1,1,1,  # 50 - 57
+    1,1,1,1,1,1,1,1,  # 58 - 5f
+    1,1,1,1,1,1,1,1,  # 60 - 67
+    1,1,1,1,1,1,1,1,  # 68 - 6f
+    1,1,1,1,1,1,1,1,  # 70 - 77
+    1,1,1,1,1,1,1,1,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,3,3,3,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,3,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    2,2,2,2,2,2,2,2,  # e0 - e7
+    2,2,2,2,2,2,2,2,  # e8 - ef
+    2,2,2,2,2,2,2,2,  # f0 - f7
+    2,2,2,2,2,2,2,0   # f8 - ff
+)
+
+EUCKR_ST = (
+    MachineState.ERROR,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f
+)
+
+EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0)
+
+EUCKR_SM_MODEL = {'class_table': EUCKR_CLS,
+                'class_factor': 4,
+                'state_table': EUCKR_ST,
+                'char_len_table': EUCKR_CHAR_LEN_TABLE,
+                'name': 'EUC-KR'}
+
+# EUC-TW
+
+EUCTW_CLS = (
+    2,2,2,2,2,2,2,2,  # 00 - 07
+    2,2,2,2,2,2,0,0,  # 08 - 0f
+    2,2,2,2,2,2,2,2,  # 10 - 17
+    2,2,2,0,2,2,2,2,  # 18 - 1f
+    2,2,2,2,2,2,2,2,  # 20 - 27
+    2,2,2,2,2,2,2,2,  # 28 - 2f
+    2,2,2,2,2,2,2,2,  # 30 - 37
+    2,2,2,2,2,2,2,2,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,2,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,6,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,3,4,4,4,4,4,4,  # a0 - a7
+    5,5,1,1,1,1,1,1,  # a8 - af
+    1,1,1,1,1,1,1,1,  # b0 - b7
+    1,1,1,1,1,1,1,1,  # b8 - bf
+    1,1,3,1,3,3,3,3,  # c0 - c7
+    3,3,3,3,3,3,3,3,  # c8 - cf
+    3,3,3,3,3,3,3,3,  # d0 - d7
+    3,3,3,3,3,3,3,3,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,3,3,3,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,3,3,0   # f8 - ff
+)
+
+EUCTW_ST = (
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,     3,     3,     3,     4,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17
+    MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
+         5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27
+    MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
+)
+
+EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3)
+
+EUCTW_SM_MODEL = {'class_table': EUCTW_CLS,
+                'class_factor': 7,
+                'state_table': EUCTW_ST,
+                'char_len_table': EUCTW_CHAR_LEN_TABLE,
+                'name': 'x-euc-tw'}
+
+# GB2312
+
+GB2312_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    3,3,3,3,3,3,3,3,  # 30 - 37
+    3,3,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,4,  # 78 - 7f
+    5,6,6,6,6,6,6,6,  # 80 - 87
+    6,6,6,6,6,6,6,6,  # 88 - 8f
+    6,6,6,6,6,6,6,6,  # 90 - 97
+    6,6,6,6,6,6,6,6,  # 98 - 9f
+    6,6,6,6,6,6,6,6,  # a0 - a7
+    6,6,6,6,6,6,6,6,  # a8 - af
+    6,6,6,6,6,6,6,6,  # b0 - b7
+    6,6,6,6,6,6,6,6,  # b8 - bf
+    6,6,6,6,6,6,6,6,  # c0 - c7
+    6,6,6,6,6,6,6,6,  # c8 - cf
+    6,6,6,6,6,6,6,6,  # d0 - d7
+    6,6,6,6,6,6,6,6,  # d8 - df
+    6,6,6,6,6,6,6,6,  # e0 - e7
+    6,6,6,6,6,6,6,6,  # e8 - ef
+    6,6,6,6,6,6,6,6,  # f0 - f7
+    6,6,6,6,6,6,6,0   # f8 - ff
+)
+
+GB2312_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,     3,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17
+         4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
+    MachineState.ERROR,MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
+)
+
+# To be accurate, the length of class 6 can be either 2 or 4.
+# But it is not necessary to discriminate between the two since
+# it is used for frequency analysis only, and we are validating
+# each code range there as well. So it is safe to set it to be
+# 2 here.
+GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2)
+
+GB2312_SM_MODEL = {'class_table': GB2312_CLS,
+                   'class_factor': 7,
+                   'state_table': GB2312_ST,
+                   'char_len_table': GB2312_CHAR_LEN_TABLE,
+                   'name': 'GB2312'}
+
+# Shift_JIS
+
+SJIS_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    2,2,2,2,2,2,2,2,  # 40 - 47
+    2,2,2,2,2,2,2,2,  # 48 - 4f
+    2,2,2,2,2,2,2,2,  # 50 - 57
+    2,2,2,2,2,2,2,2,  # 58 - 5f
+    2,2,2,2,2,2,2,2,  # 60 - 67
+    2,2,2,2,2,2,2,2,  # 68 - 6f
+    2,2,2,2,2,2,2,2,  # 70 - 77
+    2,2,2,2,2,2,2,1,  # 78 - 7f
+    3,3,3,3,3,2,2,3,  # 80 - 87
+    3,3,3,3,3,3,3,3,  # 88 - 8f
+    3,3,3,3,3,3,3,3,  # 90 - 97
+    3,3,3,3,3,3,3,3,  # 98 - 9f
+    #0xa0 is illegal in sjis encoding, but some pages does
+    #contain such byte. We need to be more error forgiven.
+    2,2,2,2,2,2,2,2,  # a0 - a7
+    2,2,2,2,2,2,2,2,  # a8 - af
+    2,2,2,2,2,2,2,2,  # b0 - b7
+    2,2,2,2,2,2,2,2,  # b8 - bf
+    2,2,2,2,2,2,2,2,  # c0 - c7
+    2,2,2,2,2,2,2,2,  # c8 - cf
+    2,2,2,2,2,2,2,2,  # d0 - d7
+    2,2,2,2,2,2,2,2,  # d8 - df
+    3,3,3,3,3,3,3,3,  # e0 - e7
+    3,3,3,3,3,4,4,4,  # e8 - ef
+    3,3,3,3,3,3,3,3,  # f0 - f7
+    3,3,3,3,3,0,0,0)  # f8 - ff
+
+
+SJIS_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17
+)
+
+SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0)
+
+SJIS_SM_MODEL = {'class_table': SJIS_CLS,
+               'class_factor': 6,
+               'state_table': SJIS_ST,
+               'char_len_table': SJIS_CHAR_LEN_TABLE,
+               'name': 'Shift_JIS'}
+
+# UCS2-BE
+
+UCS2BE_CLS = (
+    0,0,0,0,0,0,0,0,  # 00 - 07
+    0,0,1,0,0,2,0,0,  # 08 - 0f
+    0,0,0,0,0,0,0,0,  # 10 - 17
+    0,0,0,3,0,0,0,0,  # 18 - 1f
+    0,0,0,0,0,0,0,0,  # 20 - 27
+    0,3,3,3,3,3,0,0,  # 28 - 2f
+    0,0,0,0,0,0,0,0,  # 30 - 37
+    0,0,0,0,0,0,0,0,  # 38 - 3f
+    0,0,0,0,0,0,0,0,  # 40 - 47
+    0,0,0,0,0,0,0,0,  # 48 - 4f
+    0,0,0,0,0,0,0,0,  # 50 - 57
+    0,0,0,0,0,0,0,0,  # 58 - 5f
+    0,0,0,0,0,0,0,0,  # 60 - 67
+    0,0,0,0,0,0,0,0,  # 68 - 6f
+    0,0,0,0,0,0,0,0,  # 70 - 77
+    0,0,0,0,0,0,0,0,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,0,0,0,0,0,0,0,  # a0 - a7
+    0,0,0,0,0,0,0,0,  # a8 - af
+    0,0,0,0,0,0,0,0,  # b0 - b7
+    0,0,0,0,0,0,0,0,  # b8 - bf
+    0,0,0,0,0,0,0,0,  # c0 - c7
+    0,0,0,0,0,0,0,0,  # c8 - cf
+    0,0,0,0,0,0,0,0,  # d0 - d7
+    0,0,0,0,0,0,0,0,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,4,5   # f8 - ff
+)
+
+UCS2BE_ST  = (
+          5,     7,     7,MachineState.ERROR,     4,     3,MachineState.ERROR,MachineState.ERROR,#00-07
+     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+     MachineState.ITS_ME,MachineState.ITS_ME,     6,     6,     6,     6,MachineState.ERROR,MachineState.ERROR,#10-17
+          6,     6,     6,     6,     6,MachineState.ITS_ME,     6,     6,#18-1f
+          6,     6,     6,     6,     5,     7,     7,MachineState.ERROR,#20-27
+          5,     8,     6,     6,MachineState.ERROR,     6,     6,     6,#28-2f
+          6,     6,     6,     6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37
+)
+
+UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2)
+
+UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS,
+                   'class_factor': 6,
+                   'state_table': UCS2BE_ST,
+                   'char_len_table': UCS2BE_CHAR_LEN_TABLE,
+                   'name': 'UTF-16BE'}
+
+# UCS2-LE
+
+UCS2LE_CLS = (
+    0,0,0,0,0,0,0,0,  # 00 - 07
+    0,0,1,0,0,2,0,0,  # 08 - 0f
+    0,0,0,0,0,0,0,0,  # 10 - 17
+    0,0,0,3,0,0,0,0,  # 18 - 1f
+    0,0,0,0,0,0,0,0,  # 20 - 27
+    0,3,3,3,3,3,0,0,  # 28 - 2f
+    0,0,0,0,0,0,0,0,  # 30 - 37
+    0,0,0,0,0,0,0,0,  # 38 - 3f
+    0,0,0,0,0,0,0,0,  # 40 - 47
+    0,0,0,0,0,0,0,0,  # 48 - 4f
+    0,0,0,0,0,0,0,0,  # 50 - 57
+    0,0,0,0,0,0,0,0,  # 58 - 5f
+    0,0,0,0,0,0,0,0,  # 60 - 67
+    0,0,0,0,0,0,0,0,  # 68 - 6f
+    0,0,0,0,0,0,0,0,  # 70 - 77
+    0,0,0,0,0,0,0,0,  # 78 - 7f
+    0,0,0,0,0,0,0,0,  # 80 - 87
+    0,0,0,0,0,0,0,0,  # 88 - 8f
+    0,0,0,0,0,0,0,0,  # 90 - 97
+    0,0,0,0,0,0,0,0,  # 98 - 9f
+    0,0,0,0,0,0,0,0,  # a0 - a7
+    0,0,0,0,0,0,0,0,  # a8 - af
+    0,0,0,0,0,0,0,0,  # b0 - b7
+    0,0,0,0,0,0,0,0,  # b8 - bf
+    0,0,0,0,0,0,0,0,  # c0 - c7
+    0,0,0,0,0,0,0,0,  # c8 - cf
+    0,0,0,0,0,0,0,0,  # d0 - d7
+    0,0,0,0,0,0,0,0,  # d8 - df
+    0,0,0,0,0,0,0,0,  # e0 - e7
+    0,0,0,0,0,0,0,0,  # e8 - ef
+    0,0,0,0,0,0,0,0,  # f0 - f7
+    0,0,0,0,0,0,4,5   # f8 - ff
+)
+
+UCS2LE_ST = (
+          6,     6,     7,     6,     4,     3,MachineState.ERROR,MachineState.ERROR,#00-07
+     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
+     MachineState.ITS_ME,MachineState.ITS_ME,     5,     5,     5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17
+          5,     5,     5,MachineState.ERROR,     5,MachineState.ERROR,     6,     6,#18-1f
+          7,     6,     8,     8,     5,     5,     5,MachineState.ERROR,#20-27
+          5,     5,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,     5,#28-2f
+          5,     5,     5,MachineState.ERROR,     5,MachineState.ERROR,MachineState.START,MachineState.START #30-37
+)
+
+UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2)
+
+UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS,
+                 'class_factor': 6,
+                 'state_table': UCS2LE_ST,
+                 'char_len_table': UCS2LE_CHAR_LEN_TABLE,
+                 'name': 'UTF-16LE'}
+
+# UTF-8
+
+UTF8_CLS = (
+    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
+    1,1,1,1,1,1,0,0,  # 08 - 0f
+    1,1,1,1,1,1,1,1,  # 10 - 17
+    1,1,1,0,1,1,1,1,  # 18 - 1f
+    1,1,1,1,1,1,1,1,  # 20 - 27
+    1,1,1,1,1,1,1,1,  # 28 - 2f
+    1,1,1,1,1,1,1,1,  # 30 - 37
+    1,1,1,1,1,1,1,1,  # 38 - 3f
+    1,1,1,1,1,1,1,1,  # 40 - 47
+    1,1,1,1,1,1,1,1,  # 48 - 4f
+    1,1,1,1,1,1,1,1,  # 50 - 57
+    1,1,1,1,1,1,1,1,  # 58 - 5f
+    1,1,1,1,1,1,1,1,  # 60 - 67
+    1,1,1,1,1,1,1,1,  # 68 - 6f
+    1,1,1,1,1,1,1,1,  # 70 - 77
+    1,1,1,1,1,1,1,1,  # 78 - 7f
+    2,2,2,2,3,3,3,3,  # 80 - 87
+    4,4,4,4,4,4,4,4,  # 88 - 8f
+    4,4,4,4,4,4,4,4,  # 90 - 97
+    4,4,4,4,4,4,4,4,  # 98 - 9f
+    5,5,5,5,5,5,5,5,  # a0 - a7
+    5,5,5,5,5,5,5,5,  # a8 - af
+    5,5,5,5,5,5,5,5,  # b0 - b7
+    5,5,5,5,5,5,5,5,  # b8 - bf
+    0,0,6,6,6,6,6,6,  # c0 - c7
+    6,6,6,6,6,6,6,6,  # c8 - cf
+    6,6,6,6,6,6,6,6,  # d0 - d7
+    6,6,6,6,6,6,6,6,  # d8 - df
+    7,8,8,8,8,8,8,8,  # e0 - e7
+    8,8,8,8,8,9,8,8,  # e8 - ef
+    10,11,11,11,11,11,11,11,  # f0 - f7
+    12,13,13,13,14,15,0,0    # f8 - ff
+)
+
+UTF8_ST = (
+    MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     12,   10,#00-07
+         9,     11,     8,     7,     6,     5,     4,    3,#08-0f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27
+    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f
+    MachineState.ERROR,MachineState.ERROR,     5,     5,     5,     5,MachineState.ERROR,MachineState.ERROR,#30-37
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,     5,     5,MachineState.ERROR,MachineState.ERROR,#40-47
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f
+    MachineState.ERROR,MachineState.ERROR,     7,     7,     7,     7,MachineState.ERROR,MachineState.ERROR,#50-57
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     7,     7,MachineState.ERROR,MachineState.ERROR,#60-67
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f
+    MachineState.ERROR,MachineState.ERROR,     9,     9,     9,     9,MachineState.ERROR,MachineState.ERROR,#70-77
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     9,MachineState.ERROR,MachineState.ERROR,#80-87
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f
+    MachineState.ERROR,MachineState.ERROR,    12,    12,    12,    12,MachineState.ERROR,MachineState.ERROR,#90-97
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,    12,MachineState.ERROR,MachineState.ERROR,#a0-a7
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af
+    MachineState.ERROR,MachineState.ERROR,    12,    12,    12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf
+    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7
+    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf
+)
+
+UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
+
+UTF8_SM_MODEL = {'class_table': UTF8_CLS,
+                 'class_factor': 16,
+                 'state_table': UTF8_ST,
+                 'char_len_table': UTF8_CHAR_LEN_TABLE,
+                 'name': 'UTF-8'}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9ed0e72c3e9405639ed23594a6d6da3993d79c4b
GIT binary patch
literal 19168
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py
new file mode 100644
index 00000000..0adb51de
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py
@@ -0,0 +1,132 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import CharacterCategory, ProbingState, SequenceLikelihood
+
+
+class SingleByteCharSetProber(CharSetProber):
+    SAMPLE_SIZE = 64
+    SB_ENOUGH_REL_THRESHOLD = 1024  #  0.25 * SAMPLE_SIZE^2
+    POSITIVE_SHORTCUT_THRESHOLD = 0.95
+    NEGATIVE_SHORTCUT_THRESHOLD = 0.05
+
+    def __init__(self, model, reversed=False, name_prober=None):
+        super(SingleByteCharSetProber, self).__init__()
+        self._model = model
+        # TRUE if we need to reverse every pair in the model lookup
+        self._reversed = reversed
+        # Optional auxiliary prober for name decision
+        self._name_prober = name_prober
+        self._last_order = None
+        self._seq_counters = None
+        self._total_seqs = None
+        self._total_char = None
+        self._freq_char = None
+        self.reset()
+
+    def reset(self):
+        super(SingleByteCharSetProber, self).reset()
+        # char order of last character
+        self._last_order = 255
+        self._seq_counters = [0] * SequenceLikelihood.get_num_categories()
+        self._total_seqs = 0
+        self._total_char = 0
+        # characters that fall in our sampling range
+        self._freq_char = 0
+
+    @property
+    def charset_name(self):
+        if self._name_prober:
+            return self._name_prober.charset_name
+        else:
+            return self._model['charset_name']
+
+    @property
+    def language(self):
+        if self._name_prober:
+            return self._name_prober.language
+        else:
+            return self._model.get('language')
+
+    def feed(self, byte_str):
+        if not self._model['keep_english_letter']:
+            byte_str = self.filter_international_words(byte_str)
+        if not byte_str:
+            return self.state
+        char_to_order_map = self._model['char_to_order_map']
+        for i, c in enumerate(byte_str):
+            # XXX: Order is in range 1-64, so one would think we want 0-63 here,
+            #      but that leads to 27 more test failures than before.
+            order = char_to_order_map[c]
+            # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but
+            #      CharacterCategory.SYMBOL is actually 253, so we use CONTROL
+            #      to make it closer to the original intent. The only difference
+            #      is whether or not we count digits and control characters for
+            #      _total_char purposes.
+            if order < CharacterCategory.CONTROL:
+                self._total_char += 1
+            if order < self.SAMPLE_SIZE:
+                self._freq_char += 1
+                if self._last_order < self.SAMPLE_SIZE:
+                    self._total_seqs += 1
+                    if not self._reversed:
+                        i = (self._last_order * self.SAMPLE_SIZE) + order
+                        model = self._model['precedence_matrix'][i]
+                    else:  # reverse the order of the letters in the lookup
+                        i = (order * self.SAMPLE_SIZE) + self._last_order
+                        model = self._model['precedence_matrix'][i]
+                    self._seq_counters[model] += 1
+            self._last_order = order
+
+        charset_name = self._model['charset_name']
+        if self.state == ProbingState.DETECTING:
+            if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD:
+                confidence = self.get_confidence()
+                if confidence > self.POSITIVE_SHORTCUT_THRESHOLD:
+                    self.logger.debug('%s confidence = %s, we have a winner',
+                                      charset_name, confidence)
+                    self._state = ProbingState.FOUND_IT
+                elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD:
+                    self.logger.debug('%s confidence = %s, below negative '
+                                      'shortcut threshhold %s', charset_name,
+                                      confidence,
+                                      self.NEGATIVE_SHORTCUT_THRESHOLD)
+                    self._state = ProbingState.NOT_ME
+
+        return self.state
+
+    def get_confidence(self):
+        r = 0.01
+        if self._total_seqs > 0:
+            r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) /
+                 self._total_seqs / self._model['typical_positive_ratio'])
+            r = r * self._freq_char / self._total_char
+            if r >= 1.0:
+                r = 0.99
+        return r
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c1f43210447b8106381f4eb8c2ca37da51916a2
GIT binary patch
literal 4050
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
new file mode 100644
index 00000000..98e95dc1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
@@ -0,0 +1,73 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetgroupprober import CharSetGroupProber
+from .sbcharsetprober import SingleByteCharSetProber
+from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel,
+                                Latin5CyrillicModel, MacCyrillicModel,
+                                Ibm866Model, Ibm855Model)
+from .langgreekmodel import Latin7GreekModel, Win1253GreekModel
+from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
+# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
+from .langthaimodel import TIS620ThaiModel
+from .langhebrewmodel import Win1255HebrewModel
+from .hebrewprober import HebrewProber
+from .langturkishmodel import Latin5TurkishModel
+
+
+class SBCSGroupProber(CharSetGroupProber):
+    def __init__(self):
+        super(SBCSGroupProber, self).__init__()
+        self.probers = [
+            SingleByteCharSetProber(Win1251CyrillicModel),
+            SingleByteCharSetProber(Koi8rModel),
+            SingleByteCharSetProber(Latin5CyrillicModel),
+            SingleByteCharSetProber(MacCyrillicModel),
+            SingleByteCharSetProber(Ibm866Model),
+            SingleByteCharSetProber(Ibm855Model),
+            SingleByteCharSetProber(Latin7GreekModel),
+            SingleByteCharSetProber(Win1253GreekModel),
+            SingleByteCharSetProber(Latin5BulgarianModel),
+            SingleByteCharSetProber(Win1251BulgarianModel),
+            # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250)
+            #       after we retrain model.
+            # SingleByteCharSetProber(Latin2HungarianModel),
+            # SingleByteCharSetProber(Win1250HungarianModel),
+            SingleByteCharSetProber(TIS620ThaiModel),
+            SingleByteCharSetProber(Latin5TurkishModel),
+        ]
+        hebrew_prober = HebrewProber()
+        logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel,
+                                                        False, hebrew_prober)
+        visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True,
+                                                       hebrew_prober)
+        hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober)
+        self.probers.extend([hebrew_prober, logical_hebrew_prober,
+                             visual_hebrew_prober])
+
+        self.reset()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..29d618becb6f716c67e3c115298f89dacea28538
GIT binary patch
literal 2070
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHfVPIfLVPHsMWXNG)$Yo@RVq{<h@tGKMm>6=I
z8KRgWd}f9m7KU6_hA38sTsDR%HilewhA4K1Tn>gP4u)J#hA2*kTrP$vE{JLth8%8&
zTporf9)?_AhA3W$C@Vt_A44ubLli$lt^h-n07R6HAxDrQSBN1>2*PJ)$Ps496=8@H
zf$%vPazq(&#TcT*Abd`S9C3zR35F;M2F4UFhEzs|G)9ILZiW^HhGqta$S6sM6ds0P
z4PFKYhD=5V1_lifQ6j{^z~G#bSQMOE;$D<rS`bi_pOjhzkrQWNU<l64OV3Glsw_!`
zs)8zDV_;w?5n*6p2+zzjG%_`Gt}M#T$;nLi%}+_qDdA#ZVDQe*v?zjbg&7zad=g7C
z^Gs2d2{14)_$DT!3UV_rFnA{AT9}zZG{g9&reMAX6Ub(ePOypQ?nSAo*<hIxLAY~_
z5uy<FAeVyGn>v-|q$d_-Cgwr(h{E+4qRK#mfS-YZA;dG-%*Y@lBQX=K1tI|oH;C6w
zJyMg3Qp=I#co-NMAcD}qf`>H32_dCL*_p)|U>zkO8-ksjgONfXo*F^=oIt4&<g-);
zP$EoW07YmN6GKoi*dfUvH7pDa44`;*2C01m3LgfB5=Mp^28L!PhAbvf{4<s?GnB9}
zG&3@Q7_2Y`8;rpYV{pJ2oG=C#jKK|K@W2?nFa{rt!4G1j^MLG*7hot61le5+u~dkm
zM3|w5k)fHHp_U2k3?Wbwf{HMMq_RXAYM2;mm_hDltYKit5@5&@14%$c)0si0gC)d4
z27_`WBpCcOBtYI~1qDE9L26MDD1nr4FfcI0$7kkcmc+*gfdVQBlz4(bnLG#-W<enJ
zL7=1@#LmFL5Cl>m#0g@75^xYG<pqHvGYAw(B_JgQ;OtQx#0OFY3i1+=5pIb&#i=DA
z6GMthQ^D!5IJG1`7nB#`p;}5n)}&UHq~@i7^%SKRr<Q1d^nf)Mr{<)UfDFt4rzWVb
z5>WEY$xqKrPRxl%l@VcJU?|HhE=8Bn0F`85qPUEKfkD5ZD6=fFBvrpGu}D8HKPM%%
zs8~O{P(Qoa$lTnpFw4li%+SKTIHxkbJl-V5#KgeBz#u(OKSaMEvp_d9uec;JCr7tD
z(Xuo!10)2-@nxxbDfvbE$r*`7DXAs;#YxG<>7c>`;#IwZ${<ko&;dmTh+tq8X5wVT
zfUKO1LQI^DY>Yf$IRQp~MlL1|P~<=(E-x`RH9j6(n8bquvot3)J|1i|*nbFOAbko-
zXxbp3f|3>+qo0NpC?SIU4+@^*)DonS2?E6pIL8+!L1iI922Pydbd!^qm!1qQOTp;}
zf08W$B}9;(bWkw}(Ev}y;KCgwnFK5IAPV4#8=T-k3Q95(Ga+)I<PLTrNEnjhAQGUo
zSpt%U2twTrvc3cq1R&)lrQmW6q8^lGz_}0+O<>jl#uYeO+2rP@l;)(`$%5hx6iot*
S0*rdhVvJ%;AeI2505bpsves+>

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py
new file mode 100644
index 00000000..9e29623b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py
@@ -0,0 +1,92 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .mbcharsetprober import MultiByteCharSetProber
+from .codingstatemachine import CodingStateMachine
+from .chardistribution import SJISDistributionAnalysis
+from .jpcntx import SJISContextAnalysis
+from .mbcssm import SJIS_SM_MODEL
+from .enums import ProbingState, MachineState
+
+
+class SJISProber(MultiByteCharSetProber):
+    def __init__(self):
+        super(SJISProber, self).__init__()
+        self.coding_sm = CodingStateMachine(SJIS_SM_MODEL)
+        self.distribution_analyzer = SJISDistributionAnalysis()
+        self.context_analyzer = SJISContextAnalysis()
+        self.reset()
+
+    def reset(self):
+        super(SJISProber, self).reset()
+        self.context_analyzer.reset()
+
+    @property
+    def charset_name(self):
+        return self.context_analyzer.charset_name
+
+    @property
+    def language(self):
+        return "Japanese"
+
+    def feed(self, byte_str):
+        for i in range(len(byte_str)):
+            coding_state = self.coding_sm.next_state(byte_str[i])
+            if coding_state == MachineState.ERROR:
+                self.logger.debug('%s %s prober hit error at byte %s',
+                                  self.charset_name, self.language, i)
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                char_len = self.coding_sm.get_current_charlen()
+                if i == 0:
+                    self._last_char[1] = byte_str[0]
+                    self.context_analyzer.feed(self._last_char[2 - char_len:],
+                                               char_len)
+                    self.distribution_analyzer.feed(self._last_char, char_len)
+                else:
+                    self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3
+                                                        - char_len], char_len)
+                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
+                                                    char_len)
+
+        self._last_char[0] = byte_str[-1]
+
+        if self.state == ProbingState.DETECTING:
+            if (self.context_analyzer.got_enough_data() and
+               (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        context_conf = self.context_analyzer.get_confidence()
+        distrib_conf = self.distribution_analyzer.get_confidence()
+        return max(context_conf, distrib_conf)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a73aaec6a7e33f74ad250a99de6e51a9c77eff81
GIT binary patch
literal 3443
zcmZSn%*&NH<x)&C0~9bbFfceUFfbH1FfcHrFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3qvj|Lli57&%%(y#*oX-5XBDRvohpxFywMFL~%m+Yz#SE47uD4QQQo<
zJPc7h42&u445^F^X^adh91JZC49yG-kx{%1DVz+!8e9wv44I4!3=A3|qC|{=fx)*l
zrzF#<vLw|xBe5trwIrY@KPj~cA}_?iz~G#pl9`ttT#{Il>YJFHk(rkYk&|FxU<mf|
z40g#ZE-A`PDlN&(&vVR6%&9ESEQY8MhN^JR&nro-C_$Cvg-XT;`^NkFySVyjFflMN
zl<+VxFo0YDvl1)-wHNG$5|9@__JUNU7Qw?Aq}vG;&Rz@*45<vD;7wrwc|VE?6y_}q
zpa4!~VMt*D2{to=!WYD4hH=>#QdmIjD0YSvRxpEuAt+dbje&t785CF`42n!=kR=`<
zw=yu4Ff!CIFf=nUWHEt)nX!bKp@fB@87vyl%22`v60Koih-YUg;efF@L3*;dKwMA)
z2nGk1p9VL`NLG;Hr3I-)LF^zd2Ll5`e0*kJW=VW}5Xb>REFfV{kek5K5?`Df1oC-_
zC@6Iy#YB7}C@QK_i-JIIE)f9h07nB{rUYbJQEG8&3D^ZCAft;@bJ8?GDHlu>7cwv~
z=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-RHm25o1~bS7#J8B
zr03~}=oe%b=w{{>mn7!o=$0p1mIh{kgupnyEHy7BzeqnhBe5tYwM4%-E3>!&obL1r
zDuY1YQw0SCD5@D4g&Fx7c^G*ZF=Igm6d0JXP{Y8G#SDv*6b1%Z2!lKr1PW4c;0A$G
zU=S$1fxREZ2g(%#?RAiwbU<DQxfSGfxTis}4^DcZKmqxXfgy_#?ln*v0Q&`;UqHcH
zoLUl}mzWF5tb@aI{0s~X1|ZLYT+6_O={1n2Q$U^qDex-+MU_`#L1JENaVj`H4xWet
zyDcX%FTFG|J=FxsPav0r@)fAq07utGMh1ooKgJSBGGzo64$X`VF0odOwM^iGfC-dX
zYZw`7m>49R85wGs8EU|#NERzYHWNcpE?5y8Ll!%z7z0H-2Uvs?q@kIGfw6>(A&VO%
z6wkvDP$&%3%?sAu!vK=z!<6O+OACV}vX~gM1VE)xEepuZ6eh6LKZY7cP+=(vvQm&C
zg_*$y#1dl2f@l&16_+(E3=;A+ET9sQ5hN>ukcEmC`hq1O+Q6PnVP+5q>8oJ^m9t=`
zB2+QL2$)I<kSb;dahQriVTM9shH#M6*cf0=V}dwM6zo?qu<KXBY!wH2tO&xD0I@-K
zNHS!zFchr<2OTVI3Rf}aF@S?Zlp$CHRQmcAD>5)Js1_@z7ArssCxwj65{1;FqWmI-
z#1e(1%92zC)#6N0nE|d-GeMD`2`X<h|NsC0UqcF1Jb@BJQDR<tY6(apCp9mK3nUC8
z@=_~G;)_8QYY-^8fXidopdkOC5)d~hKRrFQ2rQVAnpBz|1j;@^f(#4{K_D~1YW(~|
z;(cAgOo%~Xre{bnNEDQP-26lRT;e@Lz{UiJI0l832s1D+q^Fj|Czlo#rRJ5yg9?kB
z)I4y#8lRI`3=x48CZG(NmYSLpgs7ZA&Mg6z&@QeauFfHze(oh8ho$G2#HZ%vm!@aL
zrzDmnmVioAur2v{X_+ahdC93IpvFY7hksCrb7)9>h)0lXu!p~oiw4Lu;PMHar$B)k
zUtCgD0xIt^OF+eQGPI@x+YIs)$i?wFsd<nx0TlcLR8h$@FfdqvGQSzf5sZ?IV&JMu
zn30E(1<V4Gpvp^-QJj&TQIbiVQJ7Jhk&j7`Nr;i3QIt^#QV4=l1_*--3~dHTG6a|J
z%?u2+jNnws1S;-9TqcGRW>DU&VFG14l)4QRT0zR76atPfkde8G6&fHK62c$_$&l7q
zd~$wX8aRAYAk7A_z<>uS$n}w+AO&Rs21b5Hent&WP=*0Td_1^Di;st-)%e`}l+v8k
z_;_%G0bHGflTblXenDzcNhMN-0YwxzU=aQTvj!;LfJzro+oc#3A8d@A?3^t8Ec`5-
zihdfPd;`u<xk;d8UYuG2DSCoHDGZ#2AlU(2Y~(`P<KUJdq=^S=PeGy++#ZLt4M9Pf
zRgj!lQUPfUg7~>f$;HLFkme*P2d3tg<`#ns7I0YvZXtn#2tf=?V1c951`^eFGN6<J
M3N!&m7!+d$0Q^J!3;+NC

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py
new file mode 100644
index 00000000..7b4e92d6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py
@@ -0,0 +1,286 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is Mozilla Universal charset detector code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2001
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#   Shy Shalom - original C code
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+"""
+Module containing the UniversalDetector detector class, which is the primary
+class a user of ``chardet`` should use.
+
+:author: Mark Pilgrim (initial port to Python)
+:author: Shy Shalom (original C code)
+:author: Dan Blanchard (major refactoring for 3.0)
+:author: Ian Cordasco
+"""
+
+
+import codecs
+import logging
+import re
+
+from .charsetgroupprober import CharSetGroupProber
+from .enums import InputState, LanguageFilter, ProbingState
+from .escprober import EscCharSetProber
+from .latin1prober import Latin1Prober
+from .mbcsgroupprober import MBCSGroupProber
+from .sbcsgroupprober import SBCSGroupProber
+
+
+class UniversalDetector(object):
+    """
+    The ``UniversalDetector`` class underlies the ``chardet.detect`` function
+    and coordinates all of the different charset probers.
+
+    To get a ``dict`` containing an encoding and its confidence, you can simply
+    run:
+
+    .. code::
+
+            u = UniversalDetector()
+            u.feed(some_bytes)
+            u.close()
+            detected = u.result
+
+    """
+
+    MINIMUM_THRESHOLD = 0.20
+    HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]')
+    ESC_DETECTOR = re.compile(b'(\033|~{)')
+    WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]')
+    ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252',
+                   'iso-8859-2': 'Windows-1250',
+                   'iso-8859-5': 'Windows-1251',
+                   'iso-8859-6': 'Windows-1256',
+                   'iso-8859-7': 'Windows-1253',
+                   'iso-8859-8': 'Windows-1255',
+                   'iso-8859-9': 'Windows-1254',
+                   'iso-8859-13': 'Windows-1257'}
+
+    def __init__(self, lang_filter=LanguageFilter.ALL):
+        self._esc_charset_prober = None
+        self._charset_probers = []
+        self.result = None
+        self.done = None
+        self._got_data = None
+        self._input_state = None
+        self._last_char = None
+        self.lang_filter = lang_filter
+        self.logger = logging.getLogger(__name__)
+        self._has_win_bytes = None
+        self.reset()
+
+    def reset(self):
+        """
+        Reset the UniversalDetector and all of its probers back to their
+        initial states.  This is called by ``__init__``, so you only need to
+        call this directly in between analyses of different documents.
+        """
+        self.result = {'encoding': None, 'confidence': 0.0, 'language': None}
+        self.done = False
+        self._got_data = False
+        self._has_win_bytes = False
+        self._input_state = InputState.PURE_ASCII
+        self._last_char = b''
+        if self._esc_charset_prober:
+            self._esc_charset_prober.reset()
+        for prober in self._charset_probers:
+            prober.reset()
+
+    def feed(self, byte_str):
+        """
+        Takes a chunk of a document and feeds it through all of the relevant
+        charset probers.
+
+        After calling ``feed``, you can check the value of the ``done``
+        attribute to see if you need to continue feeding the
+        ``UniversalDetector`` more data, or if it has made a prediction
+        (in the ``result`` attribute).
+
+        .. note::
+           You should always call ``close`` when you're done feeding in your
+           document if ``done`` is not already ``True``.
+        """
+        if self.done:
+            return
+
+        if not len(byte_str):
+            return
+
+        if not isinstance(byte_str, bytearray):
+            byte_str = bytearray(byte_str)
+
+        # First check for known BOMs, since these are guaranteed to be correct
+        if not self._got_data:
+            # If the data starts with BOM, we know it is UTF
+            if byte_str.startswith(codecs.BOM_UTF8):
+                # EF BB BF  UTF-8 with BOM
+                self.result = {'encoding': "UTF-8-SIG",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith((codecs.BOM_UTF32_LE,
+                                      codecs.BOM_UTF32_BE)):
+                # FF FE 00 00  UTF-32, little-endian BOM
+                # 00 00 FE FF  UTF-32, big-endian BOM
+                self.result = {'encoding': "UTF-32",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith(b'\xFE\xFF\x00\x00'):
+                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-3412",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith(b'\x00\x00\xFF\xFE'):
+                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
+                self.result = {'encoding': "X-ISO-10646-UCS-4-2143",
+                               'confidence': 1.0,
+                               'language': ''}
+            elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)):
+                # FF FE  UTF-16, little endian BOM
+                # FE FF  UTF-16, big endian BOM
+                self.result = {'encoding': "UTF-16",
+                               'confidence': 1.0,
+                               'language': ''}
+
+            self._got_data = True
+            if self.result['encoding'] is not None:
+                self.done = True
+                return
+
+        # If none of those matched and we've only see ASCII so far, check
+        # for high bytes and escape sequences
+        if self._input_state == InputState.PURE_ASCII:
+            if self.HIGH_BYTE_DETECTOR.search(byte_str):
+                self._input_state = InputState.HIGH_BYTE
+            elif self._input_state == InputState.PURE_ASCII and \
+                    self.ESC_DETECTOR.search(self._last_char + byte_str):
+                self._input_state = InputState.ESC_ASCII
+
+        self._last_char = byte_str[-1:]
+
+        # If we've seen escape sequences, use the EscCharSetProber, which
+        # uses a simple state machine to check for known escape sequences in
+        # HZ and ISO-2022 encodings, since those are the only encodings that
+        # use such sequences.
+        if self._input_state == InputState.ESC_ASCII:
+            if not self._esc_charset_prober:
+                self._esc_charset_prober = EscCharSetProber(self.lang_filter)
+            if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT:
+                self.result = {'encoding':
+                               self._esc_charset_prober.charset_name,
+                               'confidence':
+                               self._esc_charset_prober.get_confidence(),
+                               'language':
+                               self._esc_charset_prober.language}
+                self.done = True
+        # If we've seen high bytes (i.e., those with values greater than 127),
+        # we need to do more complicated checks using all our multi-byte and
+        # single-byte probers that are left.  The single-byte probers
+        # use character bigram distributions to determine the encoding, whereas
+        # the multi-byte probers use a combination of character unigram and
+        # bigram distributions.
+        elif self._input_state == InputState.HIGH_BYTE:
+            if not self._charset_probers:
+                self._charset_probers = [MBCSGroupProber(self.lang_filter)]
+                # If we're checking non-CJK encodings, use single-byte prober
+                if self.lang_filter & LanguageFilter.NON_CJK:
+                    self._charset_probers.append(SBCSGroupProber())
+                self._charset_probers.append(Latin1Prober())
+            for prober in self._charset_probers:
+                if prober.feed(byte_str) == ProbingState.FOUND_IT:
+                    self.result = {'encoding': prober.charset_name,
+                                   'confidence': prober.get_confidence(),
+                                   'language': prober.language}
+                    self.done = True
+                    break
+            if self.WIN_BYTE_DETECTOR.search(byte_str):
+                self._has_win_bytes = True
+
+    def close(self):
+        """
+        Stop analyzing the current document and come up with a final
+        prediction.
+
+        :returns:  The ``result`` attribute, a ``dict`` with the keys
+                   `encoding`, `confidence`, and `language`.
+        """
+        # Don't bother with checks if we're already done
+        if self.done:
+            return self.result
+        self.done = True
+
+        if not self._got_data:
+            self.logger.debug('no data received!')
+
+        # Default to ASCII if it is all we've seen so far
+        elif self._input_state == InputState.PURE_ASCII:
+            self.result = {'encoding': 'ascii',
+                           'confidence': 1.0,
+                           'language': ''}
+
+        # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD
+        elif self._input_state == InputState.HIGH_BYTE:
+            prober_confidence = None
+            max_prober_confidence = 0.0
+            max_prober = None
+            for prober in self._charset_probers:
+                if not prober:
+                    continue
+                prober_confidence = prober.get_confidence()
+                if prober_confidence > max_prober_confidence:
+                    max_prober_confidence = prober_confidence
+                    max_prober = prober
+            if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD):
+                charset_name = max_prober.charset_name
+                lower_charset_name = max_prober.charset_name.lower()
+                confidence = max_prober.get_confidence()
+                # Use Windows encoding name instead of ISO-8859 if we saw any
+                # extra Windows-specific bytes
+                if lower_charset_name.startswith('iso-8859'):
+                    if self._has_win_bytes:
+                        charset_name = self.ISO_WIN_MAP.get(lower_charset_name,
+                                                            charset_name)
+                self.result = {'encoding': charset_name,
+                               'confidence': confidence,
+                               'language': max_prober.language}
+
+        # Log all prober confidences if none met MINIMUM_THRESHOLD
+        if self.logger.getEffectiveLevel() == logging.DEBUG:
+            if self.result['encoding'] is None:
+                self.logger.debug('no probers hit minimum threshold')
+                for group_prober in self._charset_probers:
+                    if not group_prober:
+                        continue
+                    if isinstance(group_prober, CharSetGroupProber):
+                        for prober in group_prober.probers:
+                            self.logger.debug('%s %s confidence = %s',
+                                              prober.charset_name,
+                                              prober.language,
+                                              prober.get_confidence())
+                    else:
+                        self.logger.debug('%s %s confidence = %s',
+                                          prober.charset_name,
+                                          prober.language,
+                                          prober.get_confidence())
+        return self.result
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cf419e717606879531a9155a568da8056a604624
GIT binary patch
literal 7403
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
IfKh-M062cG@&Et;

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py
new file mode 100644
index 00000000..6c3196cc
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py
@@ -0,0 +1,82 @@
+######################## BEGIN LICENSE BLOCK ########################
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mark Pilgrim - port to Python
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301  USA
+######################### END LICENSE BLOCK #########################
+
+from .charsetprober import CharSetProber
+from .enums import ProbingState, MachineState
+from .codingstatemachine import CodingStateMachine
+from .mbcssm import UTF8_SM_MODEL
+
+
+
+class UTF8Prober(CharSetProber):
+    ONE_CHAR_PROB = 0.5
+
+    def __init__(self):
+        super(UTF8Prober, self).__init__()
+        self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
+        self._num_mb_chars = None
+        self.reset()
+
+    def reset(self):
+        super(UTF8Prober, self).reset()
+        self.coding_sm.reset()
+        self._num_mb_chars = 0
+
+    @property
+    def charset_name(self):
+        return "utf-8"
+
+    @property
+    def language(self):
+        return ""
+
+    def feed(self, byte_str):
+        for c in byte_str:
+            coding_state = self.coding_sm.next_state(c)
+            if coding_state == MachineState.ERROR:
+                self._state = ProbingState.NOT_ME
+                break
+            elif coding_state == MachineState.ITS_ME:
+                self._state = ProbingState.FOUND_IT
+                break
+            elif coding_state == MachineState.START:
+                if self.coding_sm.get_current_charlen() >= 2:
+                    self._num_mb_chars += 1
+
+        if self.state == ProbingState.DETECTING:
+            if self.get_confidence() > self.SHORTCUT_THRESHOLD:
+                self._state = ProbingState.FOUND_IT
+
+        return self.state
+
+    def get_confidence(self):
+        unlike = 0.99
+        if self._num_mb_chars < 6:
+            unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars
+            return 1.0 - unlike
+        else:
+            return unlike
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c9a13bd8e1a2aebcc508f7b6a88d8fa091be30f2
GIT binary patch
literal 2892
zcmZSn%*&NH<x)&C0~9bbFfceUFfbG+FfcHrFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJsxhxD(ED%v<h8$LgTsDR%HVB`EA%~qImxCdSgMl%Hl_8apA&rqCg^i(wfuWg!
zAu@`SA%&eGSc8LsfgzKTfq_8-M3nF{Ffcf0Bo+mymIM^#C#4o?FflMNl<+VxFo5`(
zdFjC=i6yCE0pG;rjLf`LumD825J-1^3QQGL0YnaDa%hN~MSQStysy8Dt4|3R0|Ns{
z1Y~e(5#0YE3!Omz4`5(mNM!(dJB5KEiU|}DEes%Er!awh5yirg%F2+!3}QDkg8U8Q
zvcS0P3@NN2b`%HH*HN4dLBSgA3=9nEkdS_0pA7Od2!q1h8Dys=$hQm(C5#L;3=GXo
z3|UN|&|)lMW+-7{Xa<YMvw~u!hJhiT9i%9W1FRy2fgu>|Q9lh%kQuBX(@G0ci-JI`
z5>PP5$7kkcmc+*gfouz60jc6-U|>iF2UvV@ZV5=pFF!9891HPzrMdCBN%6@UiABXF
zAVZ2$i&IO$c7RnDr{<(-fP4ZbiVGPS81xH@GRqQ6QuWIci}cg-b5c@^iuJP#^|OnO
z%*_o8vy9Bk3@yxyb1Kuz<4sabObiSR4AS%TL-Y$W3v@H{ic1o6a&*fRElUG4Ktf;~
zUzVDel3%0`az{#PiGFEGnneLPY3LPH27!W84dhjj2N@WJ8TlDG88L%Z7vx#YV69<b
z$YO?taS9_SIOADBp&JZNc7B;)?}7Xt#KyqD01nC^ZV(G(T@WY%fx{yRls>`1044?~
zEI<y^0fhy~t)Q^rMT7(>k%1E!D2`JY8K5342KlYDBu&=>?C`<knG#Tlf}*@QwIn_-
zF*nr^<S|gzWMG0vFAh(YfMX3zfK&{M$N^`-oW#8J(!}&sQzXBDyab995C%ukEd~aL
zis=kBj0`TZ{S38CphTI)z>vkrP{RZ&0cx2UYM2>Hm_R8vn~9;w4pcH^v4WJvvoQn|
zvcsg=89>spU}+9aX-=>-qzGYP$l?N(A}Ndv*{lpj(?F_OvbY&im>A5N;<*_Lr!f?=
zgHSjq$MArS<OS=$3{slK2ht3Z;%CTaVJNx`RsgfJ@G?Ul16UakL$C&@?D5M4`5IE{
z3&3&{xH!&Bttg2v29@wZASK{p$2BO(KPU(klO>>p?dKm7@9PR?LR5m8o*}^?QBbyY
z^AGiNiT4ZvYYq-^3<@a`1{J!gCGp9nMMbH3CEzkGCp8b8fx*haR+exwFfh2dhPXP1
zc>1}Q@WC|Y=cQ$)q~;~3mVoM)U=RPG5a-a4_z;gE*I*BS9~TW!+<{XWIF^$tOH$*D
zONvTBPELj-WM~l!@)#tefl}wd6cgaGJ1sRe1yt1(%Yhui$jd0i$j`{b$O0!t86}y7
z7)2R{Ah`_`8K9U0r%;f_6h?+xMsTDufKo{|14EG^D9wTr0Zd%jvX&84Kh`iZNCej~
zG6aL`C{SSerLS{;SS7OVy?rJqN}=`P2YYa-3yBq81_lOyKi7C?567VRfFOS-h#aU`
z07rOfUQT9q>Oco(kQ4(0gAXV>bAbbrjgg;Ggpq?u1H=WVhInx46(0{y-tqCd`6;D2
zsqyha3ZQfks=dJV30P@CQGP*cQAuSG$nQb?AO-Ru0%QlmqhQv+Bpq=5rwsBfC~vSa
zvN3V8akBEW@Uw6V`$4=6ayqowhE&o)pl|`_vDCcM++uJ(hU9HfW`eXmz_~9M(wYM|
uPQWpoo0ME!oC|KJfGq}l96=0B5P&1f1`>;QGN7OU6*&ToVvGWe0xSSA(tn5m

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py
new file mode 100644
index 00000000..bb2a34a7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py
@@ -0,0 +1,9 @@
+"""
+This module exists only to simplify retrieving the version number of chardet
+from within setup.py and from chardet subpackages.
+
+:author: Dan Blanchard (dan.blanchard@gmail.com)
+"""
+
+__version__ = "3.0.4"
+VERSION = __version__.split('.')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..61017e74b7e0b7e14b176a32169b39d2676739c4
GIT binary patch
literal 478
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI$GcYiuFfc?hFr+XtL@_d?GBRW_F{CgtG&3?p
zF*BqvGX!g}fD~?KU|`@1$;d2L$jwhF%}G^At;j4cDOSkO%c)c-$yX@O%q_^tOsiBV
zN-ZhMOfAdIOIIk#NL46HEh^5;&r`@N%}q)zQpitJNX|$sN=Yr@N-N6GRVdFa$;ix8
zC{8UYEzm2dR7lKAQ2<LoRVfsgCKV(mXD6no7VB|wStXX1WaJlFDYzu&DLCaM=7E(d
zXrv_O=_SFq4(YjxnK^pN`MH{0#jFer490o}dL|`|3=9l<eqi5}urn|)#K))PC&$N^
zaD&-UcgDw;fOHfW<YbnBRfV|*1$+AYX@CL_K@{gPFfiyB6lInrmZa*JB^K$Y<>#cN
z78UDf7wTsh8=0FM7G@clml;}^7w1%_m&co=n3xzC7#O7I>4)eSWESXV<`tJD=H%#>
zCt8*UW`KmiIKC`3FD1W7AMCHx5`Cz%^a?6VI2afhY;wVYZ^s6T5>ULbF|jcM0GGjs
AYybcN

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py
new file mode 100644
index 00000000..2a3bf471
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py
@@ -0,0 +1,6 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+from .initialise import init, deinit, reinit, colorama_text
+from .ansi import Fore, Back, Style, Cursor
+from .ansitowin32 import AnsiToWin32
+
+__version__ = '0.4.1'
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4eb82492b5b57e5fad193c285c7817df01903664
GIT binary patch
literal 530
zcmZSn%*&NH<x)&C0~9bZFfceUFfbIyF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*D?{FhsF1FoIMtG32l^<gzhDu`%SbGeog7<Z>`XaWLd^GDLAgR4_B-a53a^GemJS
zFs86DMDZ}BurdT|urV+&WHK@^FlewaFff#Wh|Ijqk`j=3N-CUL1Yz<rFfb(N=j0b9
z<|f9Mq*jz5bh+ghrGm9PB_?N=ure?(1ea9iq=F4{E-fm~FVX;6Q^L)_z~GoyoEefI
zo|$KCR18vSpl70I=%)cPy@U(opuEhI%*33`;?y8ekOYA=27y8)h#BU{#Ju9nAdqW=
zKn4VXoEyXrk_4F#k}SzD2bmwl0TYamFH0>d&dkq?kJkX1iXe&$7#JAz3yLz!5=&C`
z%My$9)ADmtQj3c9vkUdJi;c|94GXi3%*zZd%!_j>)63&cQcO$?3=9m?^YlaX3o;9I
zGxLf|5_58N%M&e212aHEU>skTnwOGaqz?-+{rGrLh{nh36;zgh9A=Z7pHiBWY6tRL
NF~|=}j7p3GOaSXkaV-D<

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py
new file mode 100644
index 00000000..78776588
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py
@@ -0,0 +1,102 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+'''
+This module generates ANSI character codes to printing colors to terminals.
+See: http://en.wikipedia.org/wiki/ANSI_escape_code
+'''
+
+CSI = '\033['
+OSC = '\033]'
+BEL = '\007'
+
+
+def code_to_chars(code):
+    return CSI + str(code) + 'm'
+
+def set_title(title):
+    return OSC + '2;' + title + BEL
+
+def clear_screen(mode=2):
+    return CSI + str(mode) + 'J'
+
+def clear_line(mode=2):
+    return CSI + str(mode) + 'K'
+
+
+class AnsiCodes(object):
+    def __init__(self):
+        # the subclasses declare class attributes which are numbers.
+        # Upon instantiation we define instance attributes, which are the same
+        # as the class attributes but wrapped with the ANSI escape sequence
+        for name in dir(self):
+            if not name.startswith('_'):
+                value = getattr(self, name)
+                setattr(self, name, code_to_chars(value))
+
+
+class AnsiCursor(object):
+    def UP(self, n=1):
+        return CSI + str(n) + 'A'
+    def DOWN(self, n=1):
+        return CSI + str(n) + 'B'
+    def FORWARD(self, n=1):
+        return CSI + str(n) + 'C'
+    def BACK(self, n=1):
+        return CSI + str(n) + 'D'
+    def POS(self, x=1, y=1):
+        return CSI + str(y) + ';' + str(x) + 'H'
+
+
+class AnsiFore(AnsiCodes):
+    BLACK           = 30
+    RED             = 31
+    GREEN           = 32
+    YELLOW          = 33
+    BLUE            = 34
+    MAGENTA         = 35
+    CYAN            = 36
+    WHITE           = 37
+    RESET           = 39
+
+    # These are fairly well supported, but not part of the standard.
+    LIGHTBLACK_EX   = 90
+    LIGHTRED_EX     = 91
+    LIGHTGREEN_EX   = 92
+    LIGHTYELLOW_EX  = 93
+    LIGHTBLUE_EX    = 94
+    LIGHTMAGENTA_EX = 95
+    LIGHTCYAN_EX    = 96
+    LIGHTWHITE_EX   = 97
+
+
+class AnsiBack(AnsiCodes):
+    BLACK           = 40
+    RED             = 41
+    GREEN           = 42
+    YELLOW          = 43
+    BLUE            = 44
+    MAGENTA         = 45
+    CYAN            = 46
+    WHITE           = 47
+    RESET           = 49
+
+    # These are fairly well supported, but not part of the standard.
+    LIGHTBLACK_EX   = 100
+    LIGHTRED_EX     = 101
+    LIGHTGREEN_EX   = 102
+    LIGHTYELLOW_EX  = 103
+    LIGHTBLUE_EX    = 104
+    LIGHTMAGENTA_EX = 105
+    LIGHTCYAN_EX    = 106
+    LIGHTWHITE_EX   = 107
+
+
+class AnsiStyle(AnsiCodes):
+    BRIGHT    = 1
+    DIM       = 2
+    NORMAL    = 22
+    RESET_ALL = 0
+
+Fore   = AnsiFore()
+Back   = AnsiBack()
+Style  = AnsiStyle()
+Cursor = AnsiCursor()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..110c9904cb524eca4e5750394d4de9afe1fa4bbe
GIT binary patch
literal 5184
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py
new file mode 100644
index 00000000..359c92be
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py
@@ -0,0 +1,257 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+import re
+import sys
+import os
+
+from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style
+from .winterm import WinTerm, WinColor, WinStyle
+from .win32 import windll, winapi_test
+
+
+winterm = None
+if windll is not None:
+    winterm = WinTerm()
+
+
+class StreamWrapper(object):
+    '''
+    Wraps a stream (such as stdout), acting as a transparent proxy for all
+    attribute access apart from method 'write()', which is delegated to our
+    Converter instance.
+    '''
+    def __init__(self, wrapped, converter):
+        # double-underscore everything to prevent clashes with names of
+        # attributes on the wrapped stream object.
+        self.__wrapped = wrapped
+        self.__convertor = converter
+
+    def __getattr__(self, name):
+        return getattr(self.__wrapped, name)
+
+    def __enter__(self, *args, **kwargs):
+        # special method lookup bypasses __getattr__/__getattribute__, see
+        # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit
+        # thus, contextlib magic methods are not proxied via __getattr__
+        return self.__wrapped.__enter__(*args, **kwargs)
+
+    def __exit__(self, *args, **kwargs):
+        return self.__wrapped.__exit__(*args, **kwargs)
+
+    def write(self, text):
+        self.__convertor.write(text)
+
+    def isatty(self):
+        stream = self.__wrapped
+        if 'PYCHARM_HOSTED' in os.environ:
+            if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__):
+                return True
+        try:
+            stream_isatty = stream.isatty
+        except AttributeError:
+            return False
+        else:
+            return stream_isatty()
+
+    @property
+    def closed(self):
+        stream = self.__wrapped
+        try:
+            return stream.closed
+        except AttributeError:
+            return True
+
+
+class AnsiToWin32(object):
+    '''
+    Implements a 'write()' method which, on Windows, will strip ANSI character
+    sequences from the text, and if outputting to a tty, will convert them into
+    win32 function calls.
+    '''
+    ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?')   # Control Sequence Introducer
+    ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?')        # Operating System Command
+
+    def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
+        # The wrapped stream (normally sys.stdout or sys.stderr)
+        self.wrapped = wrapped
+
+        # should we reset colors to defaults after every .write()
+        self.autoreset = autoreset
+
+        # create the proxy wrapping our output stream
+        self.stream = StreamWrapper(wrapped, self)
+
+        on_windows = os.name == 'nt'
+        # We test if the WinAPI works, because even if we are on Windows
+        # we may be using a terminal that doesn't support the WinAPI
+        # (e.g. Cygwin Terminal). In this case it's up to the terminal
+        # to support the ANSI codes.
+        conversion_supported = on_windows and winapi_test()
+
+        # should we strip ANSI sequences from our output?
+        if strip is None:
+            strip = conversion_supported or (not self.stream.closed and not self.stream.isatty())
+        self.strip = strip
+
+        # should we should convert ANSI sequences into win32 calls?
+        if convert is None:
+            convert = conversion_supported and not self.stream.closed and self.stream.isatty()
+        self.convert = convert
+
+        # dict of ansi codes to win32 functions and parameters
+        self.win32_calls = self.get_win32_calls()
+
+        # are we wrapping stderr?
+        self.on_stderr = self.wrapped is sys.stderr
+
+    def should_wrap(self):
+        '''
+        True if this class is actually needed. If false, then the output
+        stream will not be affected, nor will win32 calls be issued, so
+        wrapping stdout is not actually required. This will generally be
+        False on non-Windows platforms, unless optional functionality like
+        autoreset has been requested using kwargs to init()
+        '''
+        return self.convert or self.strip or self.autoreset
+
+    def get_win32_calls(self):
+        if self.convert and winterm:
+            return {
+                AnsiStyle.RESET_ALL: (winterm.reset_all, ),
+                AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
+                AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
+                AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
+                AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
+                AnsiFore.RED: (winterm.fore, WinColor.RED),
+                AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
+                AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
+                AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
+                AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
+                AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
+                AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
+                AnsiFore.RESET: (winterm.fore, ),
+                AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),
+                AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),
+                AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),
+                AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),
+                AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),
+                AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),
+                AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),
+                AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),
+                AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
+                AnsiBack.RED: (winterm.back, WinColor.RED),
+                AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
+                AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
+                AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
+                AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
+                AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
+                AnsiBack.WHITE: (winterm.back, WinColor.GREY),
+                AnsiBack.RESET: (winterm.back, ),
+                AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),
+                AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),
+                AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),
+                AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),
+                AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),
+                AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),
+                AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),
+                AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),
+            }
+        return dict()
+
+    def write(self, text):
+        if self.strip or self.convert:
+            self.write_and_convert(text)
+        else:
+            self.wrapped.write(text)
+            self.wrapped.flush()
+        if self.autoreset:
+            self.reset_all()
+
+
+    def reset_all(self):
+        if self.convert:
+            self.call_win32('m', (0,))
+        elif not self.strip and not self.stream.closed:
+            self.wrapped.write(Style.RESET_ALL)
+
+
+    def write_and_convert(self, text):
+        '''
+        Write the given text to our wrapped stream, stripping any ANSI
+        sequences from the text, and optionally converting them into win32
+        calls.
+        '''
+        cursor = 0
+        text = self.convert_osc(text)
+        for match in self.ANSI_CSI_RE.finditer(text):
+            start, end = match.span()
+            self.write_plain_text(text, cursor, start)
+            self.convert_ansi(*match.groups())
+            cursor = end
+        self.write_plain_text(text, cursor, len(text))
+
+
+    def write_plain_text(self, text, start, end):
+        if start < end:
+            self.wrapped.write(text[start:end])
+            self.wrapped.flush()
+
+
+    def convert_ansi(self, paramstring, command):
+        if self.convert:
+            params = self.extract_params(command, paramstring)
+            self.call_win32(command, params)
+
+
+    def extract_params(self, command, paramstring):
+        if command in 'Hf':
+            params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))
+            while len(params) < 2:
+                # defaults:
+                params = params + (1,)
+        else:
+            params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)
+            if len(params) == 0:
+                # defaults:
+                if command in 'JKm':
+                    params = (0,)
+                elif command in 'ABCD':
+                    params = (1,)
+
+        return params
+
+
+    def call_win32(self, command, params):
+        if command == 'm':
+            for param in params:
+                if param in self.win32_calls:
+                    func_args = self.win32_calls[param]
+                    func = func_args[0]
+                    args = func_args[1:]
+                    kwargs = dict(on_stderr=self.on_stderr)
+                    func(*args, **kwargs)
+        elif command in 'J':
+            winterm.erase_screen(params[0], on_stderr=self.on_stderr)
+        elif command in 'K':
+            winterm.erase_line(params[0], on_stderr=self.on_stderr)
+        elif command in 'Hf':     # cursor position - absolute
+            winterm.set_cursor_position(params, on_stderr=self.on_stderr)
+        elif command in 'ABCD':   # cursor position - relative
+            n = params[0]
+            # A - up, B - down, C - forward, D - back
+            x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]
+            winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)
+
+
+    def convert_osc(self, text):
+        for match in self.ANSI_OSC_RE.finditer(text):
+            start, end = match.span()
+            text = text[:start] + text[end:]
+            paramstring, command = match.groups()
+            if command in '\x07':       # \x07 = BEL
+                params = paramstring.split(";")
+                # 0 - change title and icon (we will only change title)
+                # 1 - change icon (we don't support this)
+                # 2 - change title
+                if params[0] in '02':
+                    winterm.set_title(params[1])
+        return text
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b5c8636c7282f89718071de3a0d0c9a3a6d6599f
GIT binary patch
literal 11113
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py
new file mode 100644
index 00000000..430d0668
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py
@@ -0,0 +1,80 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+import atexit
+import contextlib
+import sys
+
+from .ansitowin32 import AnsiToWin32
+
+
+orig_stdout = None
+orig_stderr = None
+
+wrapped_stdout = None
+wrapped_stderr = None
+
+atexit_done = False
+
+
+def reset_all():
+    if AnsiToWin32 is not None:    # Issue #74: objects might become None at exit
+        AnsiToWin32(orig_stdout).reset_all()
+
+
+def init(autoreset=False, convert=None, strip=None, wrap=True):
+
+    if not wrap and any([autoreset, convert, strip]):
+        raise ValueError('wrap=False conflicts with any other arg=True')
+
+    global wrapped_stdout, wrapped_stderr
+    global orig_stdout, orig_stderr
+
+    orig_stdout = sys.stdout
+    orig_stderr = sys.stderr
+
+    if sys.stdout is None:
+        wrapped_stdout = None
+    else:
+        sys.stdout = wrapped_stdout = \
+            wrap_stream(orig_stdout, convert, strip, autoreset, wrap)
+    if sys.stderr is None:
+        wrapped_stderr = None
+    else:
+        sys.stderr = wrapped_stderr = \
+            wrap_stream(orig_stderr, convert, strip, autoreset, wrap)
+
+    global atexit_done
+    if not atexit_done:
+        atexit.register(reset_all)
+        atexit_done = True
+
+
+def deinit():
+    if orig_stdout is not None:
+        sys.stdout = orig_stdout
+    if orig_stderr is not None:
+        sys.stderr = orig_stderr
+
+
+@contextlib.contextmanager
+def colorama_text(*args, **kwargs):
+    init(*args, **kwargs)
+    try:
+        yield
+    finally:
+        deinit()
+
+
+def reinit():
+    if wrapped_stdout is not None:
+        sys.stdout = wrapped_stdout
+    if wrapped_stderr is not None:
+        sys.stderr = wrapped_stderr
+
+
+def wrap_stream(stream, convert, strip, autoreset, wrap):
+    if wrap:
+        wrapper = AnsiToWin32(stream,
+            convert=convert, strip=strip, autoreset=autoreset)
+        if wrapper.should_wrap():
+            stream = wrapper.stream
+    return stream
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d3ffa0e5ec79427e7edf1c1dfc5989dddcd52ceb
GIT binary patch
literal 2683
zcmZSn%*&NH<x)&C0~D|_FfceUFfbG^WME)OVPHsMWXNG)h=Q{j8KM|r;!F%tObjVZ
z3@OYEIm`^XEDTXB42&s^42f(YZHeq)k^@X~GNf`bByuyPurRbRFhucyxG9VvsZ?Hu
z6jp{77KSK3h7>liEI&gkBSV$|Lkc^H+sw!iCCHG%0b)l9F{E&U8NwjF!5Ul)3=En7
z|NsB*m&wS$z@PylO1K#q7##D8Geh#jGxLm%;C^FbU|?_t`AwODfuRKKrEE@yB6$$I
zgo&Y<ks*tjp_ze!F%K*k3^vVAgN1>CAqW&aB_NhxeqJirhWw(;^!VbEl>E|?5>5sN
zhN9Hs)ROqboE#01S_DyC#K6FyUr>};mRORiUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQ
zWL{=yVP2e5nO+`ml44?FU|?X7o~Iw8Uyxa#o0(T!l9-dDTb^iH8khkR0^|6y)V!4Z
zBK_q2ocyB1+(iA%yv&l!#GK6HRK0@AAZ7*z1|g7dL9S+C<Y7z(F+i9N77nKw7#M1p
z8F-4cK|xT%z)-`;P{YKK&I}3*kRUjQni(0I7#Z>y7)qEx0hGuBX0U>y86uLxz>v+s
zP!tME7l|AUdGZV;oD3x_P}4xhGBY%@GO&~|F~l=7ByvFYL$&pQwQ<3;v0>H5%8<y#
zP{Pene4L?#haroXp@a|QM#d6;P^yB(7bt@Ligg$m7|M$h3vAsIbBa?HlJoP@ax#-k
ziWSN;OEMG^^C}hcOEOZ66cUTlZ9|GmQ#AxY$pI8xiFuVJpcECBm{XeST2z!@R00w%
zt}HGAg&8EWgFv>x_^CxjD2XAps3-`W2Kk_lC`e6#B@$4w1i34|xTGjGF}DOw3CyU(
zlGKXKlK2!*Is@4X;g@iLlURCYaY<?sIBvnI5$t|YoPv{JVrfY}I2o3(GcYhD=jWBB
z7L}BMvUG7tQDy;H2gn5jo;blS0VP*)Py&?#Wf&$IMt)XKMouPvMowmVMli|D#>mTv
znSD(_@deJJpzJFFO1qGx1xlkVpyUJ+HvlC;kT@$S?WQm=!16OFP{EN1j;SCp7ZhGW
zpj;dT3TH(4fLQ~SgTZMmB^4A*#-LyVxeSz#c|ds?9Apd(44}Br2g#~J0tJ-Y7#aE)
z7#OQKK_L;w7@oqwP{If<*CLQY0hEe^L_tNH7^vU`alx^YSd<P)?b+oZCO81V#6X1t
zFE}Yfin#ca)QS=-kaxj>!NkkR%*e?^n-l^n2+&gq4=B7qR)a$XK@3#bfYNReIE8@g
zHIU2TDFl@5LGmC$uq=qEVPPn;2W6NVaMfPJ2&%tpz*Tq+sMKe!Wo4*gWyk`jmm+&G
zn~9;8fuYbIl#6OWxd@cx{DMGLOOP-qJOn}M2UJc%DoIc=SDcYwnv)U_Dr>;07*gVC
zfSeN~1JZ-4J4ghSctLp(q@y6UXuv}@2;>VdP(lMmIRhgbBPXLMBM&1#qXx*WL7=i5
zTva6J=Yi5>PG%CgAOTkfiFw7DCHdu`wg)&!AgKtH!yrWrIAwv%1sBcWS}F*X%E85Y
z5U4gnWK3`^0ktGIF)uMawJ1mu6oQ~a6YNSvSb<psl@vkA%qBNKr8Fni4&>EhP&|W*
aDjp^QW;RAPCNO5^WEGX+WEbM(WCsAFCrJbV

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py
new file mode 100644
index 00000000..c2d83603
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py
@@ -0,0 +1,152 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+
+# from winbase.h
+STDOUT = -11
+STDERR = -12
+
+try:
+    import ctypes
+    from ctypes import LibraryLoader
+    windll = LibraryLoader(ctypes.WinDLL)
+    from ctypes import wintypes
+except (AttributeError, ImportError):
+    windll = None
+    SetConsoleTextAttribute = lambda *_: None
+    winapi_test = lambda *_: None
+else:
+    from ctypes import byref, Structure, c_char, POINTER
+
+    COORD = wintypes._COORD
+
+    class CONSOLE_SCREEN_BUFFER_INFO(Structure):
+        """struct in wincon.h."""
+        _fields_ = [
+            ("dwSize", COORD),
+            ("dwCursorPosition", COORD),
+            ("wAttributes", wintypes.WORD),
+            ("srWindow", wintypes.SMALL_RECT),
+            ("dwMaximumWindowSize", COORD),
+        ]
+        def __str__(self):
+            return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
+                self.dwSize.Y, self.dwSize.X
+                , self.dwCursorPosition.Y, self.dwCursorPosition.X
+                , self.wAttributes
+                , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right
+                , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X
+            )
+
+    _GetStdHandle = windll.kernel32.GetStdHandle
+    _GetStdHandle.argtypes = [
+        wintypes.DWORD,
+    ]
+    _GetStdHandle.restype = wintypes.HANDLE
+
+    _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
+    _GetConsoleScreenBufferInfo.argtypes = [
+        wintypes.HANDLE,
+        POINTER(CONSOLE_SCREEN_BUFFER_INFO),
+    ]
+    _GetConsoleScreenBufferInfo.restype = wintypes.BOOL
+
+    _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
+    _SetConsoleTextAttribute.argtypes = [
+        wintypes.HANDLE,
+        wintypes.WORD,
+    ]
+    _SetConsoleTextAttribute.restype = wintypes.BOOL
+
+    _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
+    _SetConsoleCursorPosition.argtypes = [
+        wintypes.HANDLE,
+        COORD,
+    ]
+    _SetConsoleCursorPosition.restype = wintypes.BOOL
+
+    _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA
+    _FillConsoleOutputCharacterA.argtypes = [
+        wintypes.HANDLE,
+        c_char,
+        wintypes.DWORD,
+        COORD,
+        POINTER(wintypes.DWORD),
+    ]
+    _FillConsoleOutputCharacterA.restype = wintypes.BOOL
+
+    _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
+    _FillConsoleOutputAttribute.argtypes = [
+        wintypes.HANDLE,
+        wintypes.WORD,
+        wintypes.DWORD,
+        COORD,
+        POINTER(wintypes.DWORD),
+    ]
+    _FillConsoleOutputAttribute.restype = wintypes.BOOL
+
+    _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW
+    _SetConsoleTitleW.argtypes = [
+        wintypes.LPCWSTR
+    ]
+    _SetConsoleTitleW.restype = wintypes.BOOL
+
+    def _winapi_test(handle):
+        csbi = CONSOLE_SCREEN_BUFFER_INFO()
+        success = _GetConsoleScreenBufferInfo(
+            handle, byref(csbi))
+        return bool(success)
+
+    def winapi_test():
+        return any(_winapi_test(h) for h in
+                   (_GetStdHandle(STDOUT), _GetStdHandle(STDERR)))
+
+    def GetConsoleScreenBufferInfo(stream_id=STDOUT):
+        handle = _GetStdHandle(stream_id)
+        csbi = CONSOLE_SCREEN_BUFFER_INFO()
+        success = _GetConsoleScreenBufferInfo(
+            handle, byref(csbi))
+        return csbi
+
+    def SetConsoleTextAttribute(stream_id, attrs):
+        handle = _GetStdHandle(stream_id)
+        return _SetConsoleTextAttribute(handle, attrs)
+
+    def SetConsoleCursorPosition(stream_id, position, adjust=True):
+        position = COORD(*position)
+        # If the position is out of range, do nothing.
+        if position.Y <= 0 or position.X <= 0:
+            return
+        # Adjust for Windows' SetConsoleCursorPosition:
+        #    1. being 0-based, while ANSI is 1-based.
+        #    2. expecting (x,y), while ANSI uses (y,x).
+        adjusted_position = COORD(position.Y - 1, position.X - 1)
+        if adjust:
+            # Adjust for viewport's scroll position
+            sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
+            adjusted_position.Y += sr.Top
+            adjusted_position.X += sr.Left
+        # Resume normal processing
+        handle = _GetStdHandle(stream_id)
+        return _SetConsoleCursorPosition(handle, adjusted_position)
+
+    def FillConsoleOutputCharacter(stream_id, char, length, start):
+        handle = _GetStdHandle(stream_id)
+        char = c_char(char.encode())
+        length = wintypes.DWORD(length)
+        num_written = wintypes.DWORD(0)
+        # Note that this is hard-coded for ANSI (vs wide) bytes.
+        success = _FillConsoleOutputCharacterA(
+            handle, char, length, start, byref(num_written))
+        return num_written.value
+
+    def FillConsoleOutputAttribute(stream_id, attr, length, start):
+        ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''
+        handle = _GetStdHandle(stream_id)
+        attribute = wintypes.WORD(attr)
+        length = wintypes.DWORD(length)
+        num_written = wintypes.DWORD(0)
+        # Note that this is hard-coded for ANSI (vs wide) bytes.
+        return _FillConsoleOutputAttribute(
+            handle, attribute, length, start, byref(num_written))
+
+    def SetConsoleTitle(title):
+        return _SetConsoleTitleW(title)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..030dde211ef1081f358a1d0661c94add68c96a3e
GIT binary patch
literal 5862
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py
new file mode 100644
index 00000000..0fdb4ec4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py
@@ -0,0 +1,169 @@
+# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
+from . import win32
+
+
+# from wincon.h
+class WinColor(object):
+    BLACK   = 0
+    BLUE    = 1
+    GREEN   = 2
+    CYAN    = 3
+    RED     = 4
+    MAGENTA = 5
+    YELLOW  = 6
+    GREY    = 7
+
+# from wincon.h
+class WinStyle(object):
+    NORMAL              = 0x00 # dim text, dim background
+    BRIGHT              = 0x08 # bright text, dim background
+    BRIGHT_BACKGROUND   = 0x80 # dim text, bright background
+
+class WinTerm(object):
+
+    def __init__(self):
+        self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
+        self.set_attrs(self._default)
+        self._default_fore = self._fore
+        self._default_back = self._back
+        self._default_style = self._style
+        # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style.
+        # So that LIGHT_EX colors and BRIGHT style do not clobber each other,
+        # we track them separately, since LIGHT_EX is overwritten by Fore/Back
+        # and BRIGHT is overwritten by Style codes.
+        self._light = 0
+
+    def get_attrs(self):
+        return self._fore + self._back * 16 + (self._style | self._light)
+
+    def set_attrs(self, value):
+        self._fore = value & 7
+        self._back = (value >> 4) & 7
+        self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)
+
+    def reset_all(self, on_stderr=None):
+        self.set_attrs(self._default)
+        self.set_console(attrs=self._default)
+        self._light = 0
+
+    def fore(self, fore=None, light=False, on_stderr=False):
+        if fore is None:
+            fore = self._default_fore
+        self._fore = fore
+        # Emulate LIGHT_EX with BRIGHT Style
+        if light:
+            self._light |= WinStyle.BRIGHT
+        else:
+            self._light &= ~WinStyle.BRIGHT
+        self.set_console(on_stderr=on_stderr)
+
+    def back(self, back=None, light=False, on_stderr=False):
+        if back is None:
+            back = self._default_back
+        self._back = back
+        # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style
+        if light:
+            self._light |= WinStyle.BRIGHT_BACKGROUND
+        else:
+            self._light &= ~WinStyle.BRIGHT_BACKGROUND
+        self.set_console(on_stderr=on_stderr)
+
+    def style(self, style=None, on_stderr=False):
+        if style is None:
+            style = self._default_style
+        self._style = style
+        self.set_console(on_stderr=on_stderr)
+
+    def set_console(self, attrs=None, on_stderr=False):
+        if attrs is None:
+            attrs = self.get_attrs()
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        win32.SetConsoleTextAttribute(handle, attrs)
+
+    def get_position(self, handle):
+        position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
+        # Because Windows coordinates are 0-based,
+        # and win32.SetConsoleCursorPosition expects 1-based.
+        position.X += 1
+        position.Y += 1
+        return position
+
+    def set_cursor_position(self, position=None, on_stderr=False):
+        if position is None:
+            # I'm not currently tracking the position, so there is no default.
+            # position = self.get_position()
+            return
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        win32.SetConsoleCursorPosition(handle, position)
+
+    def cursor_adjust(self, x, y, on_stderr=False):
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        position = self.get_position(handle)
+        adjusted_position = (position.Y + y, position.X + x)
+        win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)
+
+    def erase_screen(self, mode=0, on_stderr=False):
+        # 0 should clear from the cursor to the end of the screen.
+        # 1 should clear from the cursor to the beginning of the screen.
+        # 2 should clear the entire screen, and move cursor to (1,1)
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        csbi = win32.GetConsoleScreenBufferInfo(handle)
+        # get the number of character cells in the current buffer
+        cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y
+        # get number of character cells before current cursor position
+        cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X
+        if mode == 0:
+            from_coord = csbi.dwCursorPosition
+            cells_to_erase = cells_in_screen - cells_before_cursor
+        elif mode == 1:
+            from_coord = win32.COORD(0, 0)
+            cells_to_erase = cells_before_cursor
+        elif mode == 2:
+            from_coord = win32.COORD(0, 0)
+            cells_to_erase = cells_in_screen
+        else:
+            # invalid mode
+            return
+        # fill the entire screen with blanks
+        win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
+        # now set the buffer's attributes accordingly
+        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
+        if mode == 2:
+            # put the cursor where needed
+            win32.SetConsoleCursorPosition(handle, (1, 1))
+
+    def erase_line(self, mode=0, on_stderr=False):
+        # 0 should clear from the cursor to the end of the line.
+        # 1 should clear from the cursor to the beginning of the line.
+        # 2 should clear the entire line.
+        handle = win32.STDOUT
+        if on_stderr:
+            handle = win32.STDERR
+        csbi = win32.GetConsoleScreenBufferInfo(handle)
+        if mode == 0:
+            from_coord = csbi.dwCursorPosition
+            cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X
+        elif mode == 1:
+            from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
+            cells_to_erase = csbi.dwCursorPosition.X
+        elif mode == 2:
+            from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
+            cells_to_erase = csbi.dwSize.X
+        else:
+            # invalid mode
+            return
+        # fill the entire screen with blanks
+        win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
+        # now set the buffer's attributes accordingly
+        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
+
+    def set_title(self, title):
+        win32.SetConsoleTitle(title)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fed737367732e0c7d2b6d1fbfc41103bac73b354
GIT binary patch
literal 6935
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
JBE~Jo3IO<NnGpa0

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py
new file mode 100644
index 00000000..a786b4d3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2017 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+import logging
+
+__version__ = '0.2.8'
+
+class DistlibException(Exception):
+    pass
+
+try:
+    from logging import NullHandler
+except ImportError: # pragma: no cover
+    class NullHandler(logging.Handler):
+        def handle(self, record): pass
+        def emit(self, record): pass
+        def createLock(self): self.lock = None
+
+logger = logging.getLogger(__name__)
+logger.addHandler(NullHandler())
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ac94f8c26e2e48ec246dbe7106b8940931856fde
GIT binary patch
literal 1623
zcmZSn%*&NH<x)&C0~D|_FfceUFfbJNFfcHrFfgPrGUPBYL@_X=Ffl|iGNdpwq%tw2
zF*2mEFtji*G&3+nMlmx~ihz}}f|Ta6FhsF1Fox%8F|eevGGucx6lE|lGBT#HF{Cmu
zWU+xYv%@vBFyt{ZM1W-28B#eIni(0QI2lqo8M3$-QdvOeH#0IYrZ6%DYj7|yFl7G!
z|Np;VG02eydPaH{B?1f#3@(|)B{`W%t`*6t1tppJd2qilGB7YWf&2o}n#urje^9Un
z$fFue3=9k<AmRA<yu{qp`1leo1_p-s_}u)I(wx-zc!(;nQV>y`&%nT-Ur>};mRORi
zUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQWL{=yVP2e5nO+`ml44?FU|?X7o~Iw8Uyxa#
zo0(T!l9-dDTb^iH8khkR0^|6y)V!4ZBK;JIAN1qnGxIV_;^XxSDuX~4bAy}@ax5F8
z2FN=lAOXM9oE(qDyp){Oq9A4l1_n$ID>E>FLK_re44|NnVgf~E3j;$GGbkcK3>Jo<
zU=6Ttkntc4GT#|w9}6VvgTXfXL4pFLpadjQoSKtX!p6YBP?VaSUz7ro1vzyf!U*h;
z3~*2gfm{x9M>5E%AWYCdK_LGGffCaI`vT;S)ZEMxVYnYaZU<qIKfrOq3yG5&28MV>
zP-cTg4oCqwUi|X&Qo)Rz{N!wK%z?c(z&-=zs^p^7#FA8>{N!vAnEy0DfgS|%U=YXy
zL7?;$#LmFL5CqbIa5I=S5D5#MuLMEP1v!n4k&}^=Q3I6sN<gm6$xlzu%u5Gn#`yTM
z)S}|d{Ji-15>5sN26!<9&c9%D!0J463-XIfT#JhGi@;_;GcZ_BdTNPJetLRp5jaS|
zi5g@@Y7w|pN=!+CDh3A!f*6Q^0T-G!kYdsf6c)vxBAADXjY*7|nNft1mr<6LpAi5O
CDtWj7

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py
new file mode 100644
index 00000000..f7dbf4c9
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py
@@ -0,0 +1,6 @@
+"""Modules copied from Python 3 standard libraries, for internal use only.
+
+Individual classes and functions are found in d2._backport.misc.  Intended
+usage is to always import things missing from 3.1 from that module: the
+built-in/stdlib objects will be used if found.
+"""
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..724c2e4e1a14bcceec5cee436e781e2d7280da92
GIT binary patch
literal 498
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#JCw57<}_nN^??+
z6_WD{GE-9&(u(qP6#^<tGV=2jj1`JY67y0Li&7MFGLwoDi!xJ-brjO_ixe{RN>YpR
z5_1$vi&GWy^KvTnxVSv?QZmajQ%Vza6q0iii;Gi>6%zAO6w*rbl1no4^NJM`i&7QR
z@=Nnl6f*M^QjGNClM<7&3-XIf^l~$cll2r7Jo8FY^HNe%xJru?(^C~Pixo=p6%upG
z6Dx}qGIK#H6-qKP^U{kIax;sIGxO3Rt~J&(gfL1n5=#_v!TzyQD9K3WN-E9FDbdZ$
z(=RSb$;nJo$WO{jO)e=`D9_BvQAkP!xjsc9GY#S@JuW{DP-vB~GcYj3$EV~c$H!}c
zLJ>g}S28d#=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-RHm25
zo1~bS7#J8Br03~}=oe%b=w{{>mn7!o=$0p1mIh{kgupnyEHy7BzeqnNv$!NDGf5vF
gH2U%JnR%Hd@$q^El_eYu3=B39|JkvD;t%9H0FGyxUH||9

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py
new file mode 100644
index 00000000..cfb318d3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Backports for individual classes and functions."""
+
+import os
+import sys
+
+__all__ = ['cache_from_source', 'callable', 'fsencode']
+
+
+try:
+    from imp import cache_from_source
+except ImportError:
+    def cache_from_source(py_file, debug=__debug__):
+        ext = debug and 'c' or 'o'
+        return py_file + ext
+
+
+try:
+    callable = callable
+except NameError:
+    from collections import Callable
+
+    def callable(obj):
+        return isinstance(obj, Callable)
+
+
+try:
+    fsencode = os.fsencode
+except AttributeError:
+    def fsencode(filename):
+        if isinstance(filename, bytes):
+            return filename
+        elif isinstance(filename, str):
+            return filename.encode(sys.getfilesystemencoding())
+        else:
+            raise TypeError("expect bytes or str, not %s" %
+                            type(filename).__name__)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bf4e3ba8be1370cd4fed32c166f9ff6129c2ccb8
GIT binary patch
literal 1616
zcmZSn%*&NH<x)&C0~D|_FfceUFfbG!V_;xNVPJ@2U`SzPNMT~gVPuG6gt3_zqL>&`
zm>E)77*bdn(wP~em>DWXz_M%%IV=phtPD}C42<D<vJ5P#Yz*043`GeHjEsz_><lUF
z3@wZx**r#uh)OPoR1StH4u<eNEe4iUPO!@9AeA6XIT&)d7;?E8qPQ6tQ#ct~7(gn)
z+ISgK85y#87@~L>!t<mUSW<bxIuC+%a)DLyFo0C1FfjycaD)7#&%nUol$e}dkY7|%
ztdN#pq>!1Hl3A9SQks~fkeriPT%200keHXEkXD+PT#}ieSFD%$|NsC0ekFno3=GMM
z$r-8fX+`<D@x}S2Maiip9AMF$oW!IY2q&#LH7_|oB~^owfq@|i6r9OS3=9m+3=9k)
z+8N{sDFz0H8b*d99#Bvf@Pop&mWiQ;fuV+pK|ELkq}Hzlq(2!<=4*hA0SlL~GcYg|
zRK}-e=A@Q@A}J*`sWiO=q$9PW1fmY4xVV&ofkD5ZD6=fFBvrpGu}D8HKPM%%s8~O{
zP(Qoa$lTnpFw4li%+SKTIHxkbJl-V5#KgeBz#u(OKSaMEvp_d9uec;JCr7tD(Xuo!
z10)2-@nxxbDfvbEDVfD3IhjfN@k!9Y)X&W<PSz`^1bZ12R>dqJhcF5;f<povP|k^v
zfJz4W4TM4N28ReQ0|P?|11Jbe7#W&Du?3R$(*Olo2^RwcLuN79L3zokL7*Uqm<iIJ
zpOiHyybW@%G$?XGPG(?)dl3{0U@w9K2HA^6!XWPkLxq??zAiEa31u-el&~;lu`)C>
zFf=nV1edUZl1T|WNUoWYA&Y}SteKIai4l}9gTW!>R}8W_wW1(3xkMqUvLv-wA-_nW
zxTHu&Auqo~LA6+e6O<T11US)vm4FjXaY<1L8v_FaB+WvEDvL`*85kJSQ%gXpthlnc
zBsCW-pP83l0x~0{vLMy9s3^av1mwAr$^uBrkB`qw%uS7thr|simO%PJVuK=rK=Gmk
ziXa|vy5whMVdQ5NW@2O1-~%N-P{xXnPsvY?k1qi!%`Xl@5>L#@iH`>dPiAfbC?*+7
zK*fn?E~p%Vgas&M;^V>jF+M&BlpMf;<(HTX4J?p`<oukRR7kl3PRBtYt4cr?IhK?Z
zWhRxDKolcF49pt1><rGgHo5sJr8%i~pp;Uqz`(%3#>B(O!^F?b%qYUh%P7Fg%*X|z
NnRr>48F?9b83Fq8dItai

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py
new file mode 100644
index 00000000..159e49ee
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py
@@ -0,0 +1,761 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Utility functions for copying and archiving files and directory trees.
+
+XXX The functions here don't copy the resource fork or other metadata on Mac.
+
+"""
+
+import os
+import sys
+import stat
+from os.path import abspath
+import fnmatch
+import collections
+import errno
+from . import tarfile
+
+try:
+    import bz2
+    _BZ2_SUPPORTED = True
+except ImportError:
+    _BZ2_SUPPORTED = False
+
+try:
+    from pwd import getpwnam
+except ImportError:
+    getpwnam = None
+
+try:
+    from grp import getgrnam
+except ImportError:
+    getgrnam = None
+
+__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
+           "copytree", "move", "rmtree", "Error", "SpecialFileError",
+           "ExecError", "make_archive", "get_archive_formats",
+           "register_archive_format", "unregister_archive_format",
+           "get_unpack_formats", "register_unpack_format",
+           "unregister_unpack_format", "unpack_archive", "ignore_patterns"]
+
+class Error(EnvironmentError):
+    pass
+
+class SpecialFileError(EnvironmentError):
+    """Raised when trying to do a kind of operation (e.g. copying) which is
+    not supported on a special file (e.g. a named pipe)"""
+
+class ExecError(EnvironmentError):
+    """Raised when a command could not be executed"""
+
+class ReadError(EnvironmentError):
+    """Raised when an archive cannot be read"""
+
+class RegistryError(Exception):
+    """Raised when a registry operation with the archiving
+    and unpacking registries fails"""
+
+
+try:
+    WindowsError
+except NameError:
+    WindowsError = None
+
+def copyfileobj(fsrc, fdst, length=16*1024):
+    """copy data from file-like object fsrc to file-like object fdst"""
+    while 1:
+        buf = fsrc.read(length)
+        if not buf:
+            break
+        fdst.write(buf)
+
+def _samefile(src, dst):
+    # Macintosh, Unix.
+    if hasattr(os.path, 'samefile'):
+        try:
+            return os.path.samefile(src, dst)
+        except OSError:
+            return False
+
+    # All other platforms: check for same pathname.
+    return (os.path.normcase(os.path.abspath(src)) ==
+            os.path.normcase(os.path.abspath(dst)))
+
+def copyfile(src, dst):
+    """Copy data from src to dst"""
+    if _samefile(src, dst):
+        raise Error("`%s` and `%s` are the same file" % (src, dst))
+
+    for fn in [src, dst]:
+        try:
+            st = os.stat(fn)
+        except OSError:
+            # File most likely does not exist
+            pass
+        else:
+            # XXX What about other special files? (sockets, devices...)
+            if stat.S_ISFIFO(st.st_mode):
+                raise SpecialFileError("`%s` is a named pipe" % fn)
+
+    with open(src, 'rb') as fsrc:
+        with open(dst, 'wb') as fdst:
+            copyfileobj(fsrc, fdst)
+
+def copymode(src, dst):
+    """Copy mode bits from src to dst"""
+    if hasattr(os, 'chmod'):
+        st = os.stat(src)
+        mode = stat.S_IMODE(st.st_mode)
+        os.chmod(dst, mode)
+
+def copystat(src, dst):
+    """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
+    st = os.stat(src)
+    mode = stat.S_IMODE(st.st_mode)
+    if hasattr(os, 'utime'):
+        os.utime(dst, (st.st_atime, st.st_mtime))
+    if hasattr(os, 'chmod'):
+        os.chmod(dst, mode)
+    if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
+        try:
+            os.chflags(dst, st.st_flags)
+        except OSError as why:
+            if (not hasattr(errno, 'EOPNOTSUPP') or
+                why.errno != errno.EOPNOTSUPP):
+                raise
+
+def copy(src, dst):
+    """Copy data and mode bits ("cp src dst").
+
+    The destination may be a directory.
+
+    """
+    if os.path.isdir(dst):
+        dst = os.path.join(dst, os.path.basename(src))
+    copyfile(src, dst)
+    copymode(src, dst)
+
+def copy2(src, dst):
+    """Copy data and all stat info ("cp -p src dst").
+
+    The destination may be a directory.
+
+    """
+    if os.path.isdir(dst):
+        dst = os.path.join(dst, os.path.basename(src))
+    copyfile(src, dst)
+    copystat(src, dst)
+
+def ignore_patterns(*patterns):
+    """Function that can be used as copytree() ignore parameter.
+
+    Patterns is a sequence of glob-style patterns
+    that are used to exclude files"""
+    def _ignore_patterns(path, names):
+        ignored_names = []
+        for pattern in patterns:
+            ignored_names.extend(fnmatch.filter(names, pattern))
+        return set(ignored_names)
+    return _ignore_patterns
+
+def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
+             ignore_dangling_symlinks=False):
+    """Recursively copy a directory tree.
+
+    The destination directory must not already exist.
+    If exception(s) occur, an Error is raised with a list of reasons.
+
+    If the optional symlinks flag is true, symbolic links in the
+    source tree result in symbolic links in the destination tree; if
+    it is false, the contents of the files pointed to by symbolic
+    links are copied. If the file pointed by the symlink doesn't
+    exist, an exception will be added in the list of errors raised in
+    an Error exception at the end of the copy process.
+
+    You can set the optional ignore_dangling_symlinks flag to true if you
+    want to silence this exception. Notice that this has no effect on
+    platforms that don't support os.symlink.
+
+    The optional ignore argument is a callable. If given, it
+    is called with the `src` parameter, which is the directory
+    being visited by copytree(), and `names` which is the list of
+    `src` contents, as returned by os.listdir():
+
+        callable(src, names) -> ignored_names
+
+    Since copytree() is called recursively, the callable will be
+    called once for each directory that is copied. It returns a
+    list of names relative to the `src` directory that should
+    not be copied.
+
+    The optional copy_function argument is a callable that will be used
+    to copy each file. It will be called with the source path and the
+    destination path as arguments. By default, copy2() is used, but any
+    function that supports the same signature (like copy()) can be used.
+
+    """
+    names = os.listdir(src)
+    if ignore is not None:
+        ignored_names = ignore(src, names)
+    else:
+        ignored_names = set()
+
+    os.makedirs(dst)
+    errors = []
+    for name in names:
+        if name in ignored_names:
+            continue
+        srcname = os.path.join(src, name)
+        dstname = os.path.join(dst, name)
+        try:
+            if os.path.islink(srcname):
+                linkto = os.readlink(srcname)
+                if symlinks:
+                    os.symlink(linkto, dstname)
+                else:
+                    # ignore dangling symlink if the flag is on
+                    if not os.path.exists(linkto) and ignore_dangling_symlinks:
+                        continue
+                    # otherwise let the copy occurs. copy2 will raise an error
+                    copy_function(srcname, dstname)
+            elif os.path.isdir(srcname):
+                copytree(srcname, dstname, symlinks, ignore, copy_function)
+            else:
+                # Will raise a SpecialFileError for unsupported file types
+                copy_function(srcname, dstname)
+        # catch the Error from the recursive copytree so that we can
+        # continue with other files
+        except Error as err:
+            errors.extend(err.args[0])
+        except EnvironmentError as why:
+            errors.append((srcname, dstname, str(why)))
+    try:
+        copystat(src, dst)
+    except OSError as why:
+        if WindowsError is not None and isinstance(why, WindowsError):
+            # Copying file access times may fail on Windows
+            pass
+        else:
+            errors.extend((src, dst, str(why)))
+    if errors:
+        raise Error(errors)
+
+def rmtree(path, ignore_errors=False, onerror=None):
+    """Recursively delete a directory tree.
+
+    If ignore_errors is set, errors are ignored; otherwise, if onerror
+    is set, it is called to handle the error with arguments (func,
+    path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
+    path is the argument to that function that caused it to fail; and
+    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
+    is false and onerror is None, an exception is raised.
+
+    """
+    if ignore_errors:
+        def onerror(*args):
+            pass
+    elif onerror is None:
+        def onerror(*args):
+            raise
+    try:
+        if os.path.islink(path):
+            # symlinks to directories are forbidden, see bug #1669
+            raise OSError("Cannot call rmtree on a symbolic link")
+    except OSError:
+        onerror(os.path.islink, path, sys.exc_info())
+        # can't continue even if onerror hook returns
+        return
+    names = []
+    try:
+        names = os.listdir(path)
+    except os.error:
+        onerror(os.listdir, path, sys.exc_info())
+    for name in names:
+        fullname = os.path.join(path, name)
+        try:
+            mode = os.lstat(fullname).st_mode
+        except os.error:
+            mode = 0
+        if stat.S_ISDIR(mode):
+            rmtree(fullname, ignore_errors, onerror)
+        else:
+            try:
+                os.remove(fullname)
+            except os.error:
+                onerror(os.remove, fullname, sys.exc_info())
+    try:
+        os.rmdir(path)
+    except os.error:
+        onerror(os.rmdir, path, sys.exc_info())
+
+
+def _basename(path):
+    # A basename() variant which first strips the trailing slash, if present.
+    # Thus we always get the last component of the path, even for directories.
+    return os.path.basename(path.rstrip(os.path.sep))
+
+def move(src, dst):
+    """Recursively move a file or directory to another location. This is
+    similar to the Unix "mv" command.
+
+    If the destination is a directory or a symlink to a directory, the source
+    is moved inside the directory. The destination path must not already
+    exist.
+
+    If the destination already exists but is not a directory, it may be
+    overwritten depending on os.rename() semantics.
+
+    If the destination is on our current filesystem, then rename() is used.
+    Otherwise, src is copied to the destination and then removed.
+    A lot more could be done here...  A look at a mv.c shows a lot of
+    the issues this implementation glosses over.
+
+    """
+    real_dst = dst
+    if os.path.isdir(dst):
+        if _samefile(src, dst):
+            # We might be on a case insensitive filesystem,
+            # perform the rename anyway.
+            os.rename(src, dst)
+            return
+
+        real_dst = os.path.join(dst, _basename(src))
+        if os.path.exists(real_dst):
+            raise Error("Destination path '%s' already exists" % real_dst)
+    try:
+        os.rename(src, real_dst)
+    except OSError:
+        if os.path.isdir(src):
+            if _destinsrc(src, dst):
+                raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
+            copytree(src, real_dst, symlinks=True)
+            rmtree(src)
+        else:
+            copy2(src, real_dst)
+            os.unlink(src)
+
+def _destinsrc(src, dst):
+    src = abspath(src)
+    dst = abspath(dst)
+    if not src.endswith(os.path.sep):
+        src += os.path.sep
+    if not dst.endswith(os.path.sep):
+        dst += os.path.sep
+    return dst.startswith(src)
+
+def _get_gid(name):
+    """Returns a gid, given a group name."""
+    if getgrnam is None or name is None:
+        return None
+    try:
+        result = getgrnam(name)
+    except KeyError:
+        result = None
+    if result is not None:
+        return result[2]
+    return None
+
+def _get_uid(name):
+    """Returns an uid, given a user name."""
+    if getpwnam is None or name is None:
+        return None
+    try:
+        result = getpwnam(name)
+    except KeyError:
+        result = None
+    if result is not None:
+        return result[2]
+    return None
+
+def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
+                  owner=None, group=None, logger=None):
+    """Create a (possibly compressed) tar file from all the files under
+    'base_dir'.
+
+    'compress' must be "gzip" (the default), "bzip2", or None.
+
+    'owner' and 'group' can be used to define an owner and a group for the
+    archive that is being built. If not provided, the current owner and group
+    will be used.
+
+    The output tar file will be named 'base_name' +  ".tar", possibly plus
+    the appropriate compression extension (".gz", or ".bz2").
+
+    Returns the output filename.
+    """
+    tar_compression = {'gzip': 'gz', None: ''}
+    compress_ext = {'gzip': '.gz'}
+
+    if _BZ2_SUPPORTED:
+        tar_compression['bzip2'] = 'bz2'
+        compress_ext['bzip2'] = '.bz2'
+
+    # flags for compression program, each element of list will be an argument
+    if compress is not None and compress not in compress_ext:
+        raise ValueError("bad value for 'compress', or compression format not "
+                         "supported : {0}".format(compress))
+
+    archive_name = base_name + '.tar' + compress_ext.get(compress, '')
+    archive_dir = os.path.dirname(archive_name)
+
+    if not os.path.exists(archive_dir):
+        if logger is not None:
+            logger.info("creating %s", archive_dir)
+        if not dry_run:
+            os.makedirs(archive_dir)
+
+    # creating the tarball
+    if logger is not None:
+        logger.info('Creating tar archive')
+
+    uid = _get_uid(owner)
+    gid = _get_gid(group)
+
+    def _set_uid_gid(tarinfo):
+        if gid is not None:
+            tarinfo.gid = gid
+            tarinfo.gname = group
+        if uid is not None:
+            tarinfo.uid = uid
+            tarinfo.uname = owner
+        return tarinfo
+
+    if not dry_run:
+        tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
+        try:
+            tar.add(base_dir, filter=_set_uid_gid)
+        finally:
+            tar.close()
+
+    return archive_name
+
+def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False):
+    # XXX see if we want to keep an external call here
+    if verbose:
+        zipoptions = "-r"
+    else:
+        zipoptions = "-rq"
+    from distutils.errors import DistutilsExecError
+    from distutils.spawn import spawn
+    try:
+        spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
+    except DistutilsExecError:
+        # XXX really should distinguish between "couldn't find
+        # external 'zip' command" and "zip failed".
+        raise ExecError("unable to create zip file '%s': "
+            "could neither import the 'zipfile' module nor "
+            "find a standalone zip utility") % zip_filename
+
+def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None):
+    """Create a zip file from all the files under 'base_dir'.
+
+    The output zip file will be named 'base_name' + ".zip".  Uses either the
+    "zipfile" Python module (if available) or the InfoZIP "zip" utility
+    (if installed and found on the default search path).  If neither tool is
+    available, raises ExecError.  Returns the name of the output zip
+    file.
+    """
+    zip_filename = base_name + ".zip"
+    archive_dir = os.path.dirname(base_name)
+
+    if not os.path.exists(archive_dir):
+        if logger is not None:
+            logger.info("creating %s", archive_dir)
+        if not dry_run:
+            os.makedirs(archive_dir)
+
+    # If zipfile module is not available, try spawning an external 'zip'
+    # command.
+    try:
+        import zipfile
+    except ImportError:
+        zipfile = None
+
+    if zipfile is None:
+        _call_external_zip(base_dir, zip_filename, verbose, dry_run)
+    else:
+        if logger is not None:
+            logger.info("creating '%s' and adding '%s' to it",
+                        zip_filename, base_dir)
+
+        if not dry_run:
+            zip = zipfile.ZipFile(zip_filename, "w",
+                                  compression=zipfile.ZIP_DEFLATED)
+
+            for dirpath, dirnames, filenames in os.walk(base_dir):
+                for name in filenames:
+                    path = os.path.normpath(os.path.join(dirpath, name))
+                    if os.path.isfile(path):
+                        zip.write(path, path)
+                        if logger is not None:
+                            logger.info("adding '%s'", path)
+            zip.close()
+
+    return zip_filename
+
+_ARCHIVE_FORMATS = {
+    'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
+    'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"),
+    'tar':   (_make_tarball, [('compress', None)], "uncompressed tar file"),
+    'zip':   (_make_zipfile, [], "ZIP file"),
+    }
+
+if _BZ2_SUPPORTED:
+    _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')],
+                                "bzip2'ed tar-file")
+
+def get_archive_formats():
+    """Returns a list of supported formats for archiving and unarchiving.
+
+    Each element of the returned sequence is a tuple (name, description)
+    """
+    formats = [(name, registry[2]) for name, registry in
+               _ARCHIVE_FORMATS.items()]
+    formats.sort()
+    return formats
+
+def register_archive_format(name, function, extra_args=None, description=''):
+    """Registers an archive format.
+
+    name is the name of the format. function is the callable that will be
+    used to create archives. If provided, extra_args is a sequence of
+    (name, value) tuples that will be passed as arguments to the callable.
+    description can be provided to describe the format, and will be returned
+    by the get_archive_formats() function.
+    """
+    if extra_args is None:
+        extra_args = []
+    if not isinstance(function, collections.Callable):
+        raise TypeError('The %s object is not callable' % function)
+    if not isinstance(extra_args, (tuple, list)):
+        raise TypeError('extra_args needs to be a sequence')
+    for element in extra_args:
+        if not isinstance(element, (tuple, list)) or len(element) !=2:
+            raise TypeError('extra_args elements are : (arg_name, value)')
+
+    _ARCHIVE_FORMATS[name] = (function, extra_args, description)
+
+def unregister_archive_format(name):
+    del _ARCHIVE_FORMATS[name]
+
+def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
+                 dry_run=0, owner=None, group=None, logger=None):
+    """Create an archive file (eg. zip or tar).
+
+    'base_name' is the name of the file to create, minus any format-specific
+    extension; 'format' is the archive format: one of "zip", "tar", "bztar"
+    or "gztar".
+
+    'root_dir' is a directory that will be the root directory of the
+    archive; ie. we typically chdir into 'root_dir' before creating the
+    archive.  'base_dir' is the directory where we start archiving from;
+    ie. 'base_dir' will be the common prefix of all files and
+    directories in the archive.  'root_dir' and 'base_dir' both default
+    to the current directory.  Returns the name of the archive file.
+
+    'owner' and 'group' are used when creating a tar archive. By default,
+    uses the current owner and group.
+    """
+    save_cwd = os.getcwd()
+    if root_dir is not None:
+        if logger is not None:
+            logger.debug("changing into '%s'", root_dir)
+        base_name = os.path.abspath(base_name)
+        if not dry_run:
+            os.chdir(root_dir)
+
+    if base_dir is None:
+        base_dir = os.curdir
+
+    kwargs = {'dry_run': dry_run, 'logger': logger}
+
+    try:
+        format_info = _ARCHIVE_FORMATS[format]
+    except KeyError:
+        raise ValueError("unknown archive format '%s'" % format)
+
+    func = format_info[0]
+    for arg, val in format_info[1]:
+        kwargs[arg] = val
+
+    if format != 'zip':
+        kwargs['owner'] = owner
+        kwargs['group'] = group
+
+    try:
+        filename = func(base_name, base_dir, **kwargs)
+    finally:
+        if root_dir is not None:
+            if logger is not None:
+                logger.debug("changing back to '%s'", save_cwd)
+            os.chdir(save_cwd)
+
+    return filename
+
+
+def get_unpack_formats():
+    """Returns a list of supported formats for unpacking.
+
+    Each element of the returned sequence is a tuple
+    (name, extensions, description)
+    """
+    formats = [(name, info[0], info[3]) for name, info in
+               _UNPACK_FORMATS.items()]
+    formats.sort()
+    return formats
+
+def _check_unpack_options(extensions, function, extra_args):
+    """Checks what gets registered as an unpacker."""
+    # first make sure no other unpacker is registered for this extension
+    existing_extensions = {}
+    for name, info in _UNPACK_FORMATS.items():
+        for ext in info[0]:
+            existing_extensions[ext] = name
+
+    for extension in extensions:
+        if extension in existing_extensions:
+            msg = '%s is already registered for "%s"'
+            raise RegistryError(msg % (extension,
+                                       existing_extensions[extension]))
+
+    if not isinstance(function, collections.Callable):
+        raise TypeError('The registered function must be a callable')
+
+
+def register_unpack_format(name, extensions, function, extra_args=None,
+                           description=''):
+    """Registers an unpack format.
+
+    `name` is the name of the format. `extensions` is a list of extensions
+    corresponding to the format.
+
+    `function` is the callable that will be
+    used to unpack archives. The callable will receive archives to unpack.
+    If it's unable to handle an archive, it needs to raise a ReadError
+    exception.
+
+    If provided, `extra_args` is a sequence of
+    (name, value) tuples that will be passed as arguments to the callable.
+    description can be provided to describe the format, and will be returned
+    by the get_unpack_formats() function.
+    """
+    if extra_args is None:
+        extra_args = []
+    _check_unpack_options(extensions, function, extra_args)
+    _UNPACK_FORMATS[name] = extensions, function, extra_args, description
+
+def unregister_unpack_format(name):
+    """Removes the pack format from the registry."""
+    del _UNPACK_FORMATS[name]
+
+def _ensure_directory(path):
+    """Ensure that the parent directory of `path` exists"""
+    dirname = os.path.dirname(path)
+    if not os.path.isdir(dirname):
+        os.makedirs(dirname)
+
+def _unpack_zipfile(filename, extract_dir):
+    """Unpack zip `filename` to `extract_dir`
+    """
+    try:
+        import zipfile
+    except ImportError:
+        raise ReadError('zlib not supported, cannot unpack this archive.')
+
+    if not zipfile.is_zipfile(filename):
+        raise ReadError("%s is not a zip file" % filename)
+
+    zip = zipfile.ZipFile(filename)
+    try:
+        for info in zip.infolist():
+            name = info.filename
+
+            # don't extract absolute paths or ones with .. in them
+            if name.startswith('/') or '..' in name:
+                continue
+
+            target = os.path.join(extract_dir, *name.split('/'))
+            if not target:
+                continue
+
+            _ensure_directory(target)
+            if not name.endswith('/'):
+                # file
+                data = zip.read(info.filename)
+                f = open(target, 'wb')
+                try:
+                    f.write(data)
+                finally:
+                    f.close()
+                    del data
+    finally:
+        zip.close()
+
+def _unpack_tarfile(filename, extract_dir):
+    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
+    """
+    try:
+        tarobj = tarfile.open(filename)
+    except tarfile.TarError:
+        raise ReadError(
+            "%s is not a compressed or uncompressed tar file" % filename)
+    try:
+        tarobj.extractall(extract_dir)
+    finally:
+        tarobj.close()
+
+_UNPACK_FORMATS = {
+    'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"),
+    'tar':   (['.tar'], _unpack_tarfile, [], "uncompressed tar file"),
+    'zip':   (['.zip'], _unpack_zipfile, [], "ZIP file")
+    }
+
+if _BZ2_SUPPORTED:
+    _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [],
+                                "bzip2'ed tar-file")
+
+def _find_unpack_format(filename):
+    for name, info in _UNPACK_FORMATS.items():
+        for extension in info[0]:
+            if filename.endswith(extension):
+                return name
+    return None
+
+def unpack_archive(filename, extract_dir=None, format=None):
+    """Unpack an archive.
+
+    `filename` is the name of the archive.
+
+    `extract_dir` is the name of the target directory, where the archive
+    is unpacked. If not provided, the current working directory is used.
+
+    `format` is the archive format: one of "zip", "tar", or "gztar". Or any
+    other registered format. If not provided, unpack_archive will use the
+    filename extension and see if an unpacker was registered for that
+    extension.
+
+    In case none is found, a ValueError is raised.
+    """
+    if extract_dir is None:
+        extract_dir = os.getcwd()
+
+    if format is not None:
+        try:
+            format_info = _UNPACK_FORMATS[format]
+        except KeyError:
+            raise ValueError("Unknown unpack format '{0}'".format(format))
+
+        func = format_info[1]
+        func(filename, extract_dir, **dict(format_info[2]))
+    else:
+        # we need to look at the registered unpackers supported extensions
+        format = _find_unpack_format(filename)
+        if format is None:
+            raise ReadError("Unknown archive format '{0}'".format(filename))
+
+        func = _UNPACK_FORMATS[format][1]
+        kwargs = dict(_UNPACK_FORMATS[format][2])
+        func(filename, extract_dir, **kwargs)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1d2173fb1d1ba7f3744ce0e4e1f1ce62c0e4ce94
GIT binary patch
literal 28381
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
U$;-?r$tcDs$;<|F9}_1#0DY>F6951J

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
new file mode 100644
index 00000000..1746bd01
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
@@ -0,0 +1,84 @@
+[posix_prefix]
+# Configuration directories.  Some of these come straight out of the
+# configure script.  They are for implementing the other variables, not to
+# be used directly in [resource_locations].
+confdir = /etc
+datadir = /usr/share
+libdir = /usr/lib
+statedir = /var
+# User resource directory
+local = ~/.local/{distribution.name}
+
+stdlib = {base}/lib/python{py_version_short}
+platstdlib = {platbase}/lib/python{py_version_short}
+purelib = {base}/lib/python{py_version_short}/site-packages
+platlib = {platbase}/lib/python{py_version_short}/site-packages
+include = {base}/include/python{py_version_short}{abiflags}
+platinclude = {platbase}/include/python{py_version_short}{abiflags}
+data = {base}
+
+[posix_home]
+stdlib = {base}/lib/python
+platstdlib = {base}/lib/python
+purelib = {base}/lib/python
+platlib = {base}/lib/python
+include = {base}/include/python
+platinclude = {base}/include/python
+scripts = {base}/bin
+data = {base}
+
+[nt]
+stdlib = {base}/Lib
+platstdlib = {base}/Lib
+purelib = {base}/Lib/site-packages
+platlib = {base}/Lib/site-packages
+include = {base}/Include
+platinclude = {base}/Include
+scripts = {base}/Scripts
+data = {base}
+
+[os2]
+stdlib = {base}/Lib
+platstdlib = {base}/Lib
+purelib = {base}/Lib/site-packages
+platlib = {base}/Lib/site-packages
+include = {base}/Include
+platinclude = {base}/Include
+scripts = {base}/Scripts
+data = {base}
+
+[os2_home]
+stdlib = {userbase}/lib/python{py_version_short}
+platstdlib = {userbase}/lib/python{py_version_short}
+purelib = {userbase}/lib/python{py_version_short}/site-packages
+platlib = {userbase}/lib/python{py_version_short}/site-packages
+include = {userbase}/include/python{py_version_short}
+scripts = {userbase}/bin
+data = {userbase}
+
+[nt_user]
+stdlib = {userbase}/Python{py_version_nodot}
+platstdlib = {userbase}/Python{py_version_nodot}
+purelib = {userbase}/Python{py_version_nodot}/site-packages
+platlib = {userbase}/Python{py_version_nodot}/site-packages
+include = {userbase}/Python{py_version_nodot}/Include
+scripts = {userbase}/Scripts
+data = {userbase}
+
+[posix_user]
+stdlib = {userbase}/lib/python{py_version_short}
+platstdlib = {userbase}/lib/python{py_version_short}
+purelib = {userbase}/lib/python{py_version_short}/site-packages
+platlib = {userbase}/lib/python{py_version_short}/site-packages
+include = {userbase}/include/python{py_version_short}
+scripts = {userbase}/bin
+data = {userbase}
+
+[osx_framework_user]
+stdlib = {userbase}/lib/python
+platstdlib = {userbase}/lib/python
+purelib = {userbase}/lib/python/site-packages
+platlib = {userbase}/lib/python/site-packages
+include = {userbase}/include
+scripts = {userbase}/bin
+data = {userbase}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
new file mode 100644
index 00000000..1df3aba1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
@@ -0,0 +1,788 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Access to Python's configuration information."""
+
+import codecs
+import os
+import re
+import sys
+from os.path import pardir, realpath
+try:
+    import configparser
+except ImportError:
+    import ConfigParser as configparser
+
+
+__all__ = [
+    'get_config_h_filename',
+    'get_config_var',
+    'get_config_vars',
+    'get_makefile_filename',
+    'get_path',
+    'get_path_names',
+    'get_paths',
+    'get_platform',
+    'get_python_version',
+    'get_scheme_names',
+    'parse_config_h',
+]
+
+
+def _safe_realpath(path):
+    try:
+        return realpath(path)
+    except OSError:
+        return path
+
+
+if sys.executable:
+    _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable))
+else:
+    # sys.executable can be empty if argv[0] has been changed and Python is
+    # unable to retrieve the real program name
+    _PROJECT_BASE = _safe_realpath(os.getcwd())
+
+if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower():
+    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir))
+# PC/VS7.1
+if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower():
+    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
+# PC/AMD64
+if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower():
+    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
+
+
+def is_python_build():
+    for fn in ("Setup.dist", "Setup.local"):
+        if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)):
+            return True
+    return False
+
+_PYTHON_BUILD = is_python_build()
+
+_cfg_read = False
+
+def _ensure_cfg_read():
+    global _cfg_read
+    if not _cfg_read:
+        from ..resources import finder
+        backport_package = __name__.rsplit('.', 1)[0]
+        _finder = finder(backport_package)
+        _cfgfile = _finder.find('sysconfig.cfg')
+        assert _cfgfile, 'sysconfig.cfg exists'
+        with _cfgfile.as_stream() as s:
+            _SCHEMES.readfp(s)
+        if _PYTHON_BUILD:
+            for scheme in ('posix_prefix', 'posix_home'):
+                _SCHEMES.set(scheme, 'include', '{srcdir}/Include')
+                _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.')
+
+        _cfg_read = True
+
+
+_SCHEMES = configparser.RawConfigParser()
+_VAR_REPL = re.compile(r'\{([^{]*?)\}')
+
+def _expand_globals(config):
+    _ensure_cfg_read()
+    if config.has_section('globals'):
+        globals = config.items('globals')
+    else:
+        globals = tuple()
+
+    sections = config.sections()
+    for section in sections:
+        if section == 'globals':
+            continue
+        for option, value in globals:
+            if config.has_option(section, option):
+                continue
+            config.set(section, option, value)
+    config.remove_section('globals')
+
+    # now expanding local variables defined in the cfg file
+    #
+    for section in config.sections():
+        variables = dict(config.items(section))
+
+        def _replacer(matchobj):
+            name = matchobj.group(1)
+            if name in variables:
+                return variables[name]
+            return matchobj.group(0)
+
+        for option, value in config.items(section):
+            config.set(section, option, _VAR_REPL.sub(_replacer, value))
+
+#_expand_globals(_SCHEMES)
+
+ # FIXME don't rely on sys.version here, its format is an implementation detail
+ # of CPython, use sys.version_info or sys.hexversion
+_PY_VERSION = sys.version.split()[0]
+_PY_VERSION_SHORT = sys.version[:3]
+_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2]
+_PREFIX = os.path.normpath(sys.prefix)
+_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+_CONFIG_VARS = None
+_USER_BASE = None
+
+
+def _subst_vars(path, local_vars):
+    """In the string `path`, replace tokens like {some.thing} with the
+    corresponding value from the map `local_vars`.
+
+    If there is no corresponding value, leave the token unchanged.
+    """
+    def _replacer(matchobj):
+        name = matchobj.group(1)
+        if name in local_vars:
+            return local_vars[name]
+        elif name in os.environ:
+            return os.environ[name]
+        return matchobj.group(0)
+    return _VAR_REPL.sub(_replacer, path)
+
+
+def _extend_dict(target_dict, other_dict):
+    target_keys = target_dict.keys()
+    for key, value in other_dict.items():
+        if key in target_keys:
+            continue
+        target_dict[key] = value
+
+
+def _expand_vars(scheme, vars):
+    res = {}
+    if vars is None:
+        vars = {}
+    _extend_dict(vars, get_config_vars())
+
+    for key, value in _SCHEMES.items(scheme):
+        if os.name in ('posix', 'nt'):
+            value = os.path.expanduser(value)
+        res[key] = os.path.normpath(_subst_vars(value, vars))
+    return res
+
+
+def format_value(value, vars):
+    def _replacer(matchobj):
+        name = matchobj.group(1)
+        if name in vars:
+            return vars[name]
+        return matchobj.group(0)
+    return _VAR_REPL.sub(_replacer, value)
+
+
+def _get_default_scheme():
+    if os.name == 'posix':
+        # the default scheme for posix is posix_prefix
+        return 'posix_prefix'
+    return os.name
+
+
+def _getuserbase():
+    env_base = os.environ.get("PYTHONUSERBASE", None)
+
+    def joinuser(*args):
+        return os.path.expanduser(os.path.join(*args))
+
+    # what about 'os2emx', 'riscos' ?
+    if os.name == "nt":
+        base = os.environ.get("APPDATA") or "~"
+        if env_base:
+            return env_base
+        else:
+            return joinuser(base, "Python")
+
+    if sys.platform == "darwin":
+        framework = get_config_var("PYTHONFRAMEWORK")
+        if framework:
+            if env_base:
+                return env_base
+            else:
+                return joinuser("~", "Library", framework, "%d.%d" %
+                                sys.version_info[:2])
+
+    if env_base:
+        return env_base
+    else:
+        return joinuser("~", ".local")
+
+
+def _parse_makefile(filename, vars=None):
+    """Parse a Makefile-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+    """
+    # Regexes needed for parsing Makefile (and similar syntaxes,
+    # like old-style Setup files).
+    _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
+    _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
+    _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
+
+    if vars is None:
+        vars = {}
+    done = {}
+    notdone = {}
+
+    with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f:
+        lines = f.readlines()
+
+    for line in lines:
+        if line.startswith('#') or line.strip() == '':
+            continue
+        m = _variable_rx.match(line)
+        if m:
+            n, v = m.group(1, 2)
+            v = v.strip()
+            # `$$' is a literal `$' in make
+            tmpv = v.replace('$$', '')
+
+            if "$" in tmpv:
+                notdone[n] = v
+            else:
+                try:
+                    v = int(v)
+                except ValueError:
+                    # insert literal `$'
+                    done[n] = v.replace('$$', '$')
+                else:
+                    done[n] = v
+
+    # do variable interpolation here
+    variables = list(notdone.keys())
+
+    # Variables with a 'PY_' prefix in the makefile. These need to
+    # be made available without that prefix through sysconfig.
+    # Special care is needed to ensure that variable expansion works, even
+    # if the expansion uses the name without a prefix.
+    renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')
+
+    while len(variables) > 0:
+        for name in tuple(variables):
+            value = notdone[name]
+            m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
+            if m is not None:
+                n = m.group(1)
+                found = True
+                if n in done:
+                    item = str(done[n])
+                elif n in notdone:
+                    # get it on a subsequent round
+                    found = False
+                elif n in os.environ:
+                    # do it like make: fall back to environment
+                    item = os.environ[n]
+
+                elif n in renamed_variables:
+                    if (name.startswith('PY_') and
+                        name[3:] in renamed_variables):
+                        item = ""
+
+                    elif 'PY_' + n in notdone:
+                        found = False
+
+                    else:
+                        item = str(done['PY_' + n])
+
+                else:
+                    done[n] = item = ""
+
+                if found:
+                    after = value[m.end():]
+                    value = value[:m.start()] + item + after
+                    if "$" in after:
+                        notdone[name] = value
+                    else:
+                        try:
+                            value = int(value)
+                        except ValueError:
+                            done[name] = value.strip()
+                        else:
+                            done[name] = value
+                        variables.remove(name)
+
+                        if (name.startswith('PY_') and
+                            name[3:] in renamed_variables):
+
+                            name = name[3:]
+                            if name not in done:
+                                done[name] = value
+
+            else:
+                # bogus variable reference (e.g. "prefix=$/opt/python");
+                # just drop it since we can't deal
+                done[name] = value
+                variables.remove(name)
+
+    # strip spurious spaces
+    for k, v in done.items():
+        if isinstance(v, str):
+            done[k] = v.strip()
+
+    # save the results in the global dictionary
+    vars.update(done)
+    return vars
+
+
+def get_makefile_filename():
+    """Return the path of the Makefile."""
+    if _PYTHON_BUILD:
+        return os.path.join(_PROJECT_BASE, "Makefile")
+    if hasattr(sys, 'abiflags'):
+        config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags)
+    else:
+        config_dir_name = 'config'
+    return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile')
+
+
+def _init_posix(vars):
+    """Initialize the module as appropriate for POSIX systems."""
+    # load the installed Makefile:
+    makefile = get_makefile_filename()
+    try:
+        _parse_makefile(makefile, vars)
+    except IOError as e:
+        msg = "invalid Python installation: unable to open %s" % makefile
+        if hasattr(e, "strerror"):
+            msg = msg + " (%s)" % e.strerror
+        raise IOError(msg)
+    # load the installed pyconfig.h:
+    config_h = get_config_h_filename()
+    try:
+        with open(config_h) as f:
+            parse_config_h(f, vars)
+    except IOError as e:
+        msg = "invalid Python installation: unable to open %s" % config_h
+        if hasattr(e, "strerror"):
+            msg = msg + " (%s)" % e.strerror
+        raise IOError(msg)
+    # On AIX, there are wrong paths to the linker scripts in the Makefile
+    # -- these paths are relative to the Python source, but when installed
+    # the scripts are in another directory.
+    if _PYTHON_BUILD:
+        vars['LDSHARED'] = vars['BLDSHARED']
+
+
+def _init_non_posix(vars):
+    """Initialize the module as appropriate for NT"""
+    # set basic install directories
+    vars['LIBDEST'] = get_path('stdlib')
+    vars['BINLIBDEST'] = get_path('platstdlib')
+    vars['INCLUDEPY'] = get_path('include')
+    vars['SO'] = '.pyd'
+    vars['EXE'] = '.exe'
+    vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
+    vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable))
+
+#
+# public APIs
+#
+
+
+def parse_config_h(fp, vars=None):
+    """Parse a config.h-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+    """
+    if vars is None:
+        vars = {}
+    define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
+    undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
+
+    while True:
+        line = fp.readline()
+        if not line:
+            break
+        m = define_rx.match(line)
+        if m:
+            n, v = m.group(1, 2)
+            try:
+                v = int(v)
+            except ValueError:
+                pass
+            vars[n] = v
+        else:
+            m = undef_rx.match(line)
+            if m:
+                vars[m.group(1)] = 0
+    return vars
+
+
+def get_config_h_filename():
+    """Return the path of pyconfig.h."""
+    if _PYTHON_BUILD:
+        if os.name == "nt":
+            inc_dir = os.path.join(_PROJECT_BASE, "PC")
+        else:
+            inc_dir = _PROJECT_BASE
+    else:
+        inc_dir = get_path('platinclude')
+    return os.path.join(inc_dir, 'pyconfig.h')
+
+
+def get_scheme_names():
+    """Return a tuple containing the schemes names."""
+    return tuple(sorted(_SCHEMES.sections()))
+
+
+def get_path_names():
+    """Return a tuple containing the paths names."""
+    # xxx see if we want a static list
+    return _SCHEMES.options('posix_prefix')
+
+
+def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
+    """Return a mapping containing an install scheme.
+
+    ``scheme`` is the install scheme name. If not provided, it will
+    return the default scheme for the current platform.
+    """
+    _ensure_cfg_read()
+    if expand:
+        return _expand_vars(scheme, vars)
+    else:
+        return dict(_SCHEMES.items(scheme))
+
+
+def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
+    """Return a path corresponding to the scheme.
+
+    ``scheme`` is the install scheme name.
+    """
+    return get_paths(scheme, vars, expand)[name]
+
+
+def get_config_vars(*args):
+    """With no arguments, return a dictionary of all configuration
+    variables relevant for the current platform.
+
+    On Unix, this means every variable defined in Python's installed Makefile;
+    On Windows and Mac OS it's a much smaller set.
+
+    With arguments, return a list of values that result from looking up
+    each argument in the configuration variable dictionary.
+    """
+    global _CONFIG_VARS
+    if _CONFIG_VARS is None:
+        _CONFIG_VARS = {}
+        # Normalized versions of prefix and exec_prefix are handy to have;
+        # in fact, these are the standard versions used most places in the
+        # distutils2 module.
+        _CONFIG_VARS['prefix'] = _PREFIX
+        _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX
+        _CONFIG_VARS['py_version'] = _PY_VERSION
+        _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
+        _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2]
+        _CONFIG_VARS['base'] = _PREFIX
+        _CONFIG_VARS['platbase'] = _EXEC_PREFIX
+        _CONFIG_VARS['projectbase'] = _PROJECT_BASE
+        try:
+            _CONFIG_VARS['abiflags'] = sys.abiflags
+        except AttributeError:
+            # sys.abiflags may not be defined on all platforms.
+            _CONFIG_VARS['abiflags'] = ''
+
+        if os.name in ('nt', 'os2'):
+            _init_non_posix(_CONFIG_VARS)
+        if os.name == 'posix':
+            _init_posix(_CONFIG_VARS)
+        # Setting 'userbase' is done below the call to the
+        # init function to enable using 'get_config_var' in
+        # the init-function.
+        if sys.version >= '2.6':
+            _CONFIG_VARS['userbase'] = _getuserbase()
+
+        if 'srcdir' not in _CONFIG_VARS:
+            _CONFIG_VARS['srcdir'] = _PROJECT_BASE
+        else:
+            _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir'])
+
+        # Convert srcdir into an absolute path if it appears necessary.
+        # Normally it is relative to the build directory.  However, during
+        # testing, for example, we might be running a non-installed python
+        # from a different directory.
+        if _PYTHON_BUILD and os.name == "posix":
+            base = _PROJECT_BASE
+            try:
+                cwd = os.getcwd()
+            except OSError:
+                cwd = None
+            if (not os.path.isabs(_CONFIG_VARS['srcdir']) and
+                base != cwd):
+                # srcdir is relative and we are not in the same directory
+                # as the executable. Assume executable is in the build
+                # directory and make srcdir absolute.
+                srcdir = os.path.join(base, _CONFIG_VARS['srcdir'])
+                _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir)
+
+        if sys.platform == 'darwin':
+            kernel_version = os.uname()[2]  # Kernel version (8.4.3)
+            major_version = int(kernel_version.split('.')[0])
+
+            if major_version < 8:
+                # On Mac OS X before 10.4, check if -arch and -isysroot
+                # are in CFLAGS or LDFLAGS and remove them if they are.
+                # This is needed when building extensions on a 10.3 system
+                # using a universal build of python.
+                for key in ('LDFLAGS', 'BASECFLAGS',
+                        # a number of derived variables. These need to be
+                        # patched up as well.
+                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+                    flags = _CONFIG_VARS[key]
+                    flags = re.sub(r'-arch\s+\w+\s', ' ', flags)
+                    flags = re.sub('-isysroot [^ \t]*', ' ', flags)
+                    _CONFIG_VARS[key] = flags
+            else:
+                # Allow the user to override the architecture flags using
+                # an environment variable.
+                # NOTE: This name was introduced by Apple in OSX 10.5 and
+                # is used by several scripting languages distributed with
+                # that OS release.
+                if 'ARCHFLAGS' in os.environ:
+                    arch = os.environ['ARCHFLAGS']
+                    for key in ('LDFLAGS', 'BASECFLAGS',
+                        # a number of derived variables. These need to be
+                        # patched up as well.
+                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+
+                        flags = _CONFIG_VARS[key]
+                        flags = re.sub(r'-arch\s+\w+\s', ' ', flags)
+                        flags = flags + ' ' + arch
+                        _CONFIG_VARS[key] = flags
+
+                # If we're on OSX 10.5 or later and the user tries to
+                # compiles an extension using an SDK that is not present
+                # on the current machine it is better to not use an SDK
+                # than to fail.
+                #
+                # The major usecase for this is users using a Python.org
+                # binary installer  on OSX 10.6: that installer uses
+                # the 10.4u SDK, but that SDK is not installed by default
+                # when you install Xcode.
+                #
+                CFLAGS = _CONFIG_VARS.get('CFLAGS', '')
+                m = re.search(r'-isysroot\s+(\S+)', CFLAGS)
+                if m is not None:
+                    sdk = m.group(1)
+                    if not os.path.exists(sdk):
+                        for key in ('LDFLAGS', 'BASECFLAGS',
+                             # a number of derived variables. These need to be
+                             # patched up as well.
+                            'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+
+                            flags = _CONFIG_VARS[key]
+                            flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags)
+                            _CONFIG_VARS[key] = flags
+
+    if args:
+        vals = []
+        for name in args:
+            vals.append(_CONFIG_VARS.get(name))
+        return vals
+    else:
+        return _CONFIG_VARS
+
+
+def get_config_var(name):
+    """Return the value of a single variable using the dictionary returned by
+    'get_config_vars()'.
+
+    Equivalent to get_config_vars().get(name)
+    """
+    return get_config_vars().get(name)
+
+
+def get_platform():
+    """Return a string that identifies the current platform.
+
+    This is used mainly to distinguish platform-specific build directories and
+    platform-specific built distributions.  Typically includes the OS name
+    and version and the architecture (as supplied by 'os.uname()'),
+    although the exact information included depends on the OS; eg. for IRIX
+    the architecture isn't particularly important (IRIX only runs on SGI
+    hardware), but for Linux the kernel version isn't particularly
+    important.
+
+    Examples of returned values:
+       linux-i586
+       linux-alpha (?)
+       solaris-2.6-sun4u
+       irix-5.3
+       irix64-6.2
+
+    Windows will return one of:
+       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
+       win-ia64 (64bit Windows on Itanium)
+       win32 (all others - specifically, sys.platform is returned)
+
+    For other non-POSIX platforms, currently just returns 'sys.platform'.
+    """
+    if os.name == 'nt':
+        # sniff sys.version for architecture.
+        prefix = " bit ("
+        i = sys.version.find(prefix)
+        if i == -1:
+            return sys.platform
+        j = sys.version.find(")", i)
+        look = sys.version[i+len(prefix):j].lower()
+        if look == 'amd64':
+            return 'win-amd64'
+        if look == 'itanium':
+            return 'win-ia64'
+        return sys.platform
+
+    if os.name != "posix" or not hasattr(os, 'uname'):
+        # XXX what about the architecture? NT is Intel or Alpha,
+        # Mac OS is M68k or PPC, etc.
+        return sys.platform
+
+    # Try to distinguish various flavours of Unix
+    osname, host, release, version, machine = os.uname()
+
+    # Convert the OS name to lowercase, remove '/' characters
+    # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh")
+    osname = osname.lower().replace('/', '')
+    machine = machine.replace(' ', '_')
+    machine = machine.replace('/', '-')
+
+    if osname[:5] == "linux":
+        # At least on Linux/Intel, 'machine' is the processor --
+        # i386, etc.
+        # XXX what about Alpha, SPARC, etc?
+        return  "%s-%s" % (osname, machine)
+    elif osname[:5] == "sunos":
+        if release[0] >= "5":           # SunOS 5 == Solaris 2
+            osname = "solaris"
+            release = "%d.%s" % (int(release[0]) - 3, release[2:])
+        # fall through to standard osname-release-machine representation
+    elif osname[:4] == "irix":              # could be "irix64"!
+        return "%s-%s" % (osname, release)
+    elif osname[:3] == "aix":
+        return "%s-%s.%s" % (osname, version, release)
+    elif osname[:6] == "cygwin":
+        osname = "cygwin"
+        rel_re = re.compile(r'[\d.]+')
+        m = rel_re.match(release)
+        if m:
+            release = m.group()
+    elif osname[:6] == "darwin":
+        #
+        # For our purposes, we'll assume that the system version from
+        # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
+        # to. This makes the compatibility story a bit more sane because the
+        # machine is going to compile and link as if it were
+        # MACOSX_DEPLOYMENT_TARGET.
+        cfgvars = get_config_vars()
+        macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')
+
+        if True:
+            # Always calculate the release of the running machine,
+            # needed to determine if we can build fat binaries or not.
+
+            macrelease = macver
+            # Get the system version. Reading this plist is a documented
+            # way to get the system version (see the documentation for
+            # the Gestalt Manager)
+            try:
+                f = open('/System/Library/CoreServices/SystemVersion.plist')
+            except IOError:
+                # We're on a plain darwin box, fall back to the default
+                # behaviour.
+                pass
+            else:
+                try:
+                    m = re.search(r'<key>ProductUserVisibleVersion</key>\s*'
+                                  r'<string>(.*?)</string>', f.read())
+                finally:
+                    f.close()
+                if m is not None:
+                    macrelease = '.'.join(m.group(1).split('.')[:2])
+                # else: fall back to the default behaviour
+
+        if not macver:
+            macver = macrelease
+
+        if macver:
+            release = macver
+            osname = "macosx"
+
+            if ((macrelease + '.') >= '10.4.' and
+                '-arch' in get_config_vars().get('CFLAGS', '').strip()):
+                # The universal build will build fat binaries, but not on
+                # systems before 10.4
+                #
+                # Try to detect 4-way universal builds, those have machine-type
+                # 'universal' instead of 'fat'.
+
+                machine = 'fat'
+                cflags = get_config_vars().get('CFLAGS')
+
+                archs = re.findall(r'-arch\s+(\S+)', cflags)
+                archs = tuple(sorted(set(archs)))
+
+                if len(archs) == 1:
+                    machine = archs[0]
+                elif archs == ('i386', 'ppc'):
+                    machine = 'fat'
+                elif archs == ('i386', 'x86_64'):
+                    machine = 'intel'
+                elif archs == ('i386', 'ppc', 'x86_64'):
+                    machine = 'fat3'
+                elif archs == ('ppc64', 'x86_64'):
+                    machine = 'fat64'
+                elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
+                    machine = 'universal'
+                else:
+                    raise ValueError(
+                       "Don't know machine value for archs=%r" % (archs,))
+
+            elif machine == 'i386':
+                # On OSX the machine type returned by uname is always the
+                # 32-bit variant, even if the executable architecture is
+                # the 64-bit variant
+                if sys.maxsize >= 2**32:
+                    machine = 'x86_64'
+
+            elif machine in ('PowerPC', 'Power_Macintosh'):
+                # Pick a sane name for the PPC architecture.
+                # See 'i386' case
+                if sys.maxsize >= 2**32:
+                    machine = 'ppc64'
+                else:
+                    machine = 'ppc'
+
+    return "%s-%s-%s" % (osname, release, machine)
+
+
+def get_python_version():
+    return _PY_VERSION_SHORT
+
+
+def _print_dict(title, data):
+    for index, (key, value) in enumerate(sorted(data.items())):
+        if index == 0:
+            print('%s: ' % (title))
+        print('\t%s = "%s"' % (key, value))
+
+
+def _main():
+    """Display all information sysconfig detains."""
+    print('Platform: "%s"' % get_platform())
+    print('Python version: "%s"' % get_python_version())
+    print('Current installation scheme: "%s"' % _get_default_scheme())
+    print()
+    _print_dict('Paths', get_paths())
+    print()
+    _print_dict('Variables', get_config_vars())
+
+
+if __name__ == '__main__':
+    _main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5cc3cc346e07a88c0acb43bb7efe71383d6a3ae9
GIT binary patch
literal 22259
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
Wa<Yl?igIu^b8>Pn0-MXt!w3K?jN6?6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py
new file mode 100644
index 00000000..d66d8566
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py
@@ -0,0 +1,2607 @@
+#-------------------------------------------------------------------
+# tarfile.py
+#-------------------------------------------------------------------
+# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de>
+# All rights reserved.
+#
+# Permission  is  hereby granted,  free  of charge,  to  any person
+# obtaining a  copy of  this software  and associated documentation
+# files  (the  "Software"),  to   deal  in  the  Software   without
+# restriction,  including  without limitation  the  rights to  use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies  of  the  Software,  and to  permit  persons  to  whom the
+# Software  is  furnished  to  do  so,  subject  to  the  following
+# conditions:
+#
+# The above copyright  notice and this  permission notice shall  be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS  IS", WITHOUT WARRANTY OF ANY  KIND,
+# EXPRESS OR IMPLIED, INCLUDING  BUT NOT LIMITED TO  THE WARRANTIES
+# OF  MERCHANTABILITY,  FITNESS   FOR  A  PARTICULAR   PURPOSE  AND
+# NONINFRINGEMENT.  IN  NO  EVENT SHALL  THE  AUTHORS  OR COPYRIGHT
+# HOLDERS  BE LIABLE  FOR ANY  CLAIM, DAMAGES  OR OTHER  LIABILITY,
+# WHETHER  IN AN  ACTION OF  CONTRACT, TORT  OR OTHERWISE,  ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+"""Read from and write to tar format archives.
+"""
+
+__version__ = "$Revision$"
+
+version     = "0.9.0"
+__author__  = "Lars Gust\u00e4bel (lars@gustaebel.de)"
+__date__    = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $"
+__cvsid__   = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $"
+__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend."
+
+#---------
+# Imports
+#---------
+import sys
+import os
+import stat
+import errno
+import time
+import struct
+import copy
+import re
+
+try:
+    import grp, pwd
+except ImportError:
+    grp = pwd = None
+
+# os.symlink on Windows prior to 6.0 raises NotImplementedError
+symlink_exception = (AttributeError, NotImplementedError)
+try:
+    # WindowsError (1314) will be raised if the caller does not hold the
+    # SeCreateSymbolicLinkPrivilege privilege
+    symlink_exception += (WindowsError,)
+except NameError:
+    pass
+
+# from tarfile import *
+__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"]
+
+if sys.version_info[0] < 3:
+    import __builtin__ as builtins
+else:
+    import builtins
+
+_open = builtins.open   # Since 'open' is TarFile.open
+
+#---------------------------------------------------------
+# tar constants
+#---------------------------------------------------------
+NUL = b"\0"                     # the null character
+BLOCKSIZE = 512                 # length of processing blocks
+RECORDSIZE = BLOCKSIZE * 20     # length of records
+GNU_MAGIC = b"ustar  \0"        # magic gnu tar string
+POSIX_MAGIC = b"ustar\x0000"    # magic posix tar string
+
+LENGTH_NAME = 100               # maximum length of a filename
+LENGTH_LINK = 100               # maximum length of a linkname
+LENGTH_PREFIX = 155             # maximum length of the prefix field
+
+REGTYPE = b"0"                  # regular file
+AREGTYPE = b"\0"                # regular file
+LNKTYPE = b"1"                  # link (inside tarfile)
+SYMTYPE = b"2"                  # symbolic link
+CHRTYPE = b"3"                  # character special device
+BLKTYPE = b"4"                  # block special device
+DIRTYPE = b"5"                  # directory
+FIFOTYPE = b"6"                 # fifo special device
+CONTTYPE = b"7"                 # contiguous file
+
+GNUTYPE_LONGNAME = b"L"         # GNU tar longname
+GNUTYPE_LONGLINK = b"K"         # GNU tar longlink
+GNUTYPE_SPARSE = b"S"           # GNU tar sparse file
+
+XHDTYPE = b"x"                  # POSIX.1-2001 extended header
+XGLTYPE = b"g"                  # POSIX.1-2001 global header
+SOLARIS_XHDTYPE = b"X"          # Solaris extended header
+
+USTAR_FORMAT = 0                # POSIX.1-1988 (ustar) format
+GNU_FORMAT = 1                  # GNU tar format
+PAX_FORMAT = 2                  # POSIX.1-2001 (pax) format
+DEFAULT_FORMAT = GNU_FORMAT
+
+#---------------------------------------------------------
+# tarfile constants
+#---------------------------------------------------------
+# File types that tarfile supports:
+SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE,
+                   SYMTYPE, DIRTYPE, FIFOTYPE,
+                   CONTTYPE, CHRTYPE, BLKTYPE,
+                   GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
+                   GNUTYPE_SPARSE)
+
+# File types that will be treated as a regular file.
+REGULAR_TYPES = (REGTYPE, AREGTYPE,
+                 CONTTYPE, GNUTYPE_SPARSE)
+
+# File types that are part of the GNU tar format.
+GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
+             GNUTYPE_SPARSE)
+
+# Fields from a pax header that override a TarInfo attribute.
+PAX_FIELDS = ("path", "linkpath", "size", "mtime",
+              "uid", "gid", "uname", "gname")
+
+# Fields from a pax header that are affected by hdrcharset.
+PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname"))
+
+# Fields in a pax header that are numbers, all other fields
+# are treated as strings.
+PAX_NUMBER_FIELDS = {
+    "atime": float,
+    "ctime": float,
+    "mtime": float,
+    "uid": int,
+    "gid": int,
+    "size": int
+}
+
+#---------------------------------------------------------
+# Bits used in the mode field, values in octal.
+#---------------------------------------------------------
+S_IFLNK = 0o120000        # symbolic link
+S_IFREG = 0o100000        # regular file
+S_IFBLK = 0o060000        # block device
+S_IFDIR = 0o040000        # directory
+S_IFCHR = 0o020000        # character device
+S_IFIFO = 0o010000        # fifo
+
+TSUID   = 0o4000          # set UID on execution
+TSGID   = 0o2000          # set GID on execution
+TSVTX   = 0o1000          # reserved
+
+TUREAD  = 0o400           # read by owner
+TUWRITE = 0o200           # write by owner
+TUEXEC  = 0o100           # execute/search by owner
+TGREAD  = 0o040           # read by group
+TGWRITE = 0o020           # write by group
+TGEXEC  = 0o010           # execute/search by group
+TOREAD  = 0o004           # read by other
+TOWRITE = 0o002           # write by other
+TOEXEC  = 0o001           # execute/search by other
+
+#---------------------------------------------------------
+# initialization
+#---------------------------------------------------------
+if os.name in ("nt", "ce"):
+    ENCODING = "utf-8"
+else:
+    ENCODING = sys.getfilesystemencoding()
+
+#---------------------------------------------------------
+# Some useful functions
+#---------------------------------------------------------
+
+def stn(s, length, encoding, errors):
+    """Convert a string to a null-terminated bytes object.
+    """
+    s = s.encode(encoding, errors)
+    return s[:length] + (length - len(s)) * NUL
+
+def nts(s, encoding, errors):
+    """Convert a null-terminated bytes object to a string.
+    """
+    p = s.find(b"\0")
+    if p != -1:
+        s = s[:p]
+    return s.decode(encoding, errors)
+
+def nti(s):
+    """Convert a number field to a python number.
+    """
+    # There are two possible encodings for a number field, see
+    # itn() below.
+    if s[0] != chr(0o200):
+        try:
+            n = int(nts(s, "ascii", "strict") or "0", 8)
+        except ValueError:
+            raise InvalidHeaderError("invalid header")
+    else:
+        n = 0
+        for i in range(len(s) - 1):
+            n <<= 8
+            n += ord(s[i + 1])
+    return n
+
+def itn(n, digits=8, format=DEFAULT_FORMAT):
+    """Convert a python number to a number field.
+    """
+    # POSIX 1003.1-1988 requires numbers to be encoded as a string of
+    # octal digits followed by a null-byte, this allows values up to
+    # (8**(digits-1))-1. GNU tar allows storing numbers greater than
+    # that if necessary. A leading 0o200 byte indicates this particular
+    # encoding, the following digits-1 bytes are a big-endian
+    # representation. This allows values up to (256**(digits-1))-1.
+    if 0 <= n < 8 ** (digits - 1):
+        s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL
+    else:
+        if format != GNU_FORMAT or n >= 256 ** (digits - 1):
+            raise ValueError("overflow in number field")
+
+        if n < 0:
+            # XXX We mimic GNU tar's behaviour with negative numbers,
+            # this could raise OverflowError.
+            n = struct.unpack("L", struct.pack("l", n))[0]
+
+        s = bytearray()
+        for i in range(digits - 1):
+            s.insert(0, n & 0o377)
+            n >>= 8
+        s.insert(0, 0o200)
+    return s
+
+def calc_chksums(buf):
+    """Calculate the checksum for a member's header by summing up all
+       characters except for the chksum field which is treated as if
+       it was filled with spaces. According to the GNU tar sources,
+       some tars (Sun and NeXT) calculate chksum with signed char,
+       which will be different if there are chars in the buffer with
+       the high bit set. So we calculate two checksums, unsigned and
+       signed.
+    """
+    unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512]))
+    signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512]))
+    return unsigned_chksum, signed_chksum
+
+def copyfileobj(src, dst, length=None):
+    """Copy length bytes from fileobj src to fileobj dst.
+       If length is None, copy the entire content.
+    """
+    if length == 0:
+        return
+    if length is None:
+        while True:
+            buf = src.read(16*1024)
+            if not buf:
+                break
+            dst.write(buf)
+        return
+
+    BUFSIZE = 16 * 1024
+    blocks, remainder = divmod(length, BUFSIZE)
+    for b in range(blocks):
+        buf = src.read(BUFSIZE)
+        if len(buf) < BUFSIZE:
+            raise IOError("end of file reached")
+        dst.write(buf)
+
+    if remainder != 0:
+        buf = src.read(remainder)
+        if len(buf) < remainder:
+            raise IOError("end of file reached")
+        dst.write(buf)
+    return
+
+filemode_table = (
+    ((S_IFLNK,      "l"),
+     (S_IFREG,      "-"),
+     (S_IFBLK,      "b"),
+     (S_IFDIR,      "d"),
+     (S_IFCHR,      "c"),
+     (S_IFIFO,      "p")),
+
+    ((TUREAD,       "r"),),
+    ((TUWRITE,      "w"),),
+    ((TUEXEC|TSUID, "s"),
+     (TSUID,        "S"),
+     (TUEXEC,       "x")),
+
+    ((TGREAD,       "r"),),
+    ((TGWRITE,      "w"),),
+    ((TGEXEC|TSGID, "s"),
+     (TSGID,        "S"),
+     (TGEXEC,       "x")),
+
+    ((TOREAD,       "r"),),
+    ((TOWRITE,      "w"),),
+    ((TOEXEC|TSVTX, "t"),
+     (TSVTX,        "T"),
+     (TOEXEC,       "x"))
+)
+
+def filemode(mode):
+    """Convert a file's mode to a string of the form
+       -rwxrwxrwx.
+       Used by TarFile.list()
+    """
+    perm = []
+    for table in filemode_table:
+        for bit, char in table:
+            if mode & bit == bit:
+                perm.append(char)
+                break
+        else:
+            perm.append("-")
+    return "".join(perm)
+
+class TarError(Exception):
+    """Base exception."""
+    pass
+class ExtractError(TarError):
+    """General exception for extract errors."""
+    pass
+class ReadError(TarError):
+    """Exception for unreadable tar archives."""
+    pass
+class CompressionError(TarError):
+    """Exception for unavailable compression methods."""
+    pass
+class StreamError(TarError):
+    """Exception for unsupported operations on stream-like TarFiles."""
+    pass
+class HeaderError(TarError):
+    """Base exception for header errors."""
+    pass
+class EmptyHeaderError(HeaderError):
+    """Exception for empty headers."""
+    pass
+class TruncatedHeaderError(HeaderError):
+    """Exception for truncated headers."""
+    pass
+class EOFHeaderError(HeaderError):
+    """Exception for end of file headers."""
+    pass
+class InvalidHeaderError(HeaderError):
+    """Exception for invalid headers."""
+    pass
+class SubsequentHeaderError(HeaderError):
+    """Exception for missing and invalid extended headers."""
+    pass
+
+#---------------------------
+# internal stream interface
+#---------------------------
+class _LowLevelFile(object):
+    """Low-level file object. Supports reading and writing.
+       It is used instead of a regular file object for streaming
+       access.
+    """
+
+    def __init__(self, name, mode):
+        mode = {
+            "r": os.O_RDONLY,
+            "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC,
+        }[mode]
+        if hasattr(os, "O_BINARY"):
+            mode |= os.O_BINARY
+        self.fd = os.open(name, mode, 0o666)
+
+    def close(self):
+        os.close(self.fd)
+
+    def read(self, size):
+        return os.read(self.fd, size)
+
+    def write(self, s):
+        os.write(self.fd, s)
+
+class _Stream(object):
+    """Class that serves as an adapter between TarFile and
+       a stream-like object.  The stream-like object only
+       needs to have a read() or write() method and is accessed
+       blockwise.  Use of gzip or bzip2 compression is possible.
+       A stream-like object could be for example: sys.stdin,
+       sys.stdout, a socket, a tape device etc.
+
+       _Stream is intended to be used only internally.
+    """
+
+    def __init__(self, name, mode, comptype, fileobj, bufsize):
+        """Construct a _Stream object.
+        """
+        self._extfileobj = True
+        if fileobj is None:
+            fileobj = _LowLevelFile(name, mode)
+            self._extfileobj = False
+
+        if comptype == '*':
+            # Enable transparent compression detection for the
+            # stream interface
+            fileobj = _StreamProxy(fileobj)
+            comptype = fileobj.getcomptype()
+
+        self.name     = name or ""
+        self.mode     = mode
+        self.comptype = comptype
+        self.fileobj  = fileobj
+        self.bufsize  = bufsize
+        self.buf      = b""
+        self.pos      = 0
+        self.closed   = False
+
+        try:
+            if comptype == "gz":
+                try:
+                    import zlib
+                except ImportError:
+                    raise CompressionError("zlib module is not available")
+                self.zlib = zlib
+                self.crc = zlib.crc32(b"")
+                if mode == "r":
+                    self._init_read_gz()
+                else:
+                    self._init_write_gz()
+
+            if comptype == "bz2":
+                try:
+                    import bz2
+                except ImportError:
+                    raise CompressionError("bz2 module is not available")
+                if mode == "r":
+                    self.dbuf = b""
+                    self.cmp = bz2.BZ2Decompressor()
+                else:
+                    self.cmp = bz2.BZ2Compressor()
+        except:
+            if not self._extfileobj:
+                self.fileobj.close()
+            self.closed = True
+            raise
+
+    def __del__(self):
+        if hasattr(self, "closed") and not self.closed:
+            self.close()
+
+    def _init_write_gz(self):
+        """Initialize for writing with gzip compression.
+        """
+        self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED,
+                                            -self.zlib.MAX_WBITS,
+                                            self.zlib.DEF_MEM_LEVEL,
+                                            0)
+        timestamp = struct.pack("<L", int(time.time()))
+        self.__write(b"\037\213\010\010" + timestamp + b"\002\377")
+        if self.name.endswith(".gz"):
+            self.name = self.name[:-3]
+        # RFC1952 says we must use ISO-8859-1 for the FNAME field.
+        self.__write(self.name.encode("iso-8859-1", "replace") + NUL)
+
+    def write(self, s):
+        """Write string s to the stream.
+        """
+        if self.comptype == "gz":
+            self.crc = self.zlib.crc32(s, self.crc)
+        self.pos += len(s)
+        if self.comptype != "tar":
+            s = self.cmp.compress(s)
+        self.__write(s)
+
+    def __write(self, s):
+        """Write string s to the stream if a whole new block
+           is ready to be written.
+        """
+        self.buf += s
+        while len(self.buf) > self.bufsize:
+            self.fileobj.write(self.buf[:self.bufsize])
+            self.buf = self.buf[self.bufsize:]
+
+    def close(self):
+        """Close the _Stream object. No operation should be
+           done on it afterwards.
+        """
+        if self.closed:
+            return
+
+        if self.mode == "w" and self.comptype != "tar":
+            self.buf += self.cmp.flush()
+
+        if self.mode == "w" and self.buf:
+            self.fileobj.write(self.buf)
+            self.buf = b""
+            if self.comptype == "gz":
+                # The native zlib crc is an unsigned 32-bit integer, but
+                # the Python wrapper implicitly casts that to a signed C
+                # long.  So, on a 32-bit box self.crc may "look negative",
+                # while the same crc on a 64-bit box may "look positive".
+                # To avoid irksome warnings from the `struct` module, force
+                # it to look positive on all boxes.
+                self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff))
+                self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF))
+
+        if not self._extfileobj:
+            self.fileobj.close()
+
+        self.closed = True
+
+    def _init_read_gz(self):
+        """Initialize for reading a gzip compressed fileobj.
+        """
+        self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS)
+        self.dbuf = b""
+
+        # taken from gzip.GzipFile with some alterations
+        if self.__read(2) != b"\037\213":
+            raise ReadError("not a gzip file")
+        if self.__read(1) != b"\010":
+            raise CompressionError("unsupported compression method")
+
+        flag = ord(self.__read(1))
+        self.__read(6)
+
+        if flag & 4:
+            xlen = ord(self.__read(1)) + 256 * ord(self.__read(1))
+            self.read(xlen)
+        if flag & 8:
+            while True:
+                s = self.__read(1)
+                if not s or s == NUL:
+                    break
+        if flag & 16:
+            while True:
+                s = self.__read(1)
+                if not s or s == NUL:
+                    break
+        if flag & 2:
+            self.__read(2)
+
+    def tell(self):
+        """Return the stream's file pointer position.
+        """
+        return self.pos
+
+    def seek(self, pos=0):
+        """Set the stream's file pointer to pos. Negative seeking
+           is forbidden.
+        """
+        if pos - self.pos >= 0:
+            blocks, remainder = divmod(pos - self.pos, self.bufsize)
+            for i in range(blocks):
+                self.read(self.bufsize)
+            self.read(remainder)
+        else:
+            raise StreamError("seeking backwards is not allowed")
+        return self.pos
+
+    def read(self, size=None):
+        """Return the next size number of bytes from the stream.
+           If size is not defined, return all bytes of the stream
+           up to EOF.
+        """
+        if size is None:
+            t = []
+            while True:
+                buf = self._read(self.bufsize)
+                if not buf:
+                    break
+                t.append(buf)
+            buf = "".join(t)
+        else:
+            buf = self._read(size)
+        self.pos += len(buf)
+        return buf
+
+    def _read(self, size):
+        """Return size bytes from the stream.
+        """
+        if self.comptype == "tar":
+            return self.__read(size)
+
+        c = len(self.dbuf)
+        while c < size:
+            buf = self.__read(self.bufsize)
+            if not buf:
+                break
+            try:
+                buf = self.cmp.decompress(buf)
+            except IOError:
+                raise ReadError("invalid compressed data")
+            self.dbuf += buf
+            c += len(buf)
+        buf = self.dbuf[:size]
+        self.dbuf = self.dbuf[size:]
+        return buf
+
+    def __read(self, size):
+        """Return size bytes from stream. If internal buffer is empty,
+           read another block from the stream.
+        """
+        c = len(self.buf)
+        while c < size:
+            buf = self.fileobj.read(self.bufsize)
+            if not buf:
+                break
+            self.buf += buf
+            c += len(buf)
+        buf = self.buf[:size]
+        self.buf = self.buf[size:]
+        return buf
+# class _Stream
+
+class _StreamProxy(object):
+    """Small proxy class that enables transparent compression
+       detection for the Stream interface (mode 'r|*').
+    """
+
+    def __init__(self, fileobj):
+        self.fileobj = fileobj
+        self.buf = self.fileobj.read(BLOCKSIZE)
+
+    def read(self, size):
+        self.read = self.fileobj.read
+        return self.buf
+
+    def getcomptype(self):
+        if self.buf.startswith(b"\037\213\010"):
+            return "gz"
+        if self.buf.startswith(b"BZh91"):
+            return "bz2"
+        return "tar"
+
+    def close(self):
+        self.fileobj.close()
+# class StreamProxy
+
+class _BZ2Proxy(object):
+    """Small proxy class that enables external file object
+       support for "r:bz2" and "w:bz2" modes. This is actually
+       a workaround for a limitation in bz2 module's BZ2File
+       class which (unlike gzip.GzipFile) has no support for
+       a file object argument.
+    """
+
+    blocksize = 16 * 1024
+
+    def __init__(self, fileobj, mode):
+        self.fileobj = fileobj
+        self.mode = mode
+        self.name = getattr(self.fileobj, "name", None)
+        self.init()
+
+    def init(self):
+        import bz2
+        self.pos = 0
+        if self.mode == "r":
+            self.bz2obj = bz2.BZ2Decompressor()
+            self.fileobj.seek(0)
+            self.buf = b""
+        else:
+            self.bz2obj = bz2.BZ2Compressor()
+
+    def read(self, size):
+        x = len(self.buf)
+        while x < size:
+            raw = self.fileobj.read(self.blocksize)
+            if not raw:
+                break
+            data = self.bz2obj.decompress(raw)
+            self.buf += data
+            x += len(data)
+
+        buf = self.buf[:size]
+        self.buf = self.buf[size:]
+        self.pos += len(buf)
+        return buf
+
+    def seek(self, pos):
+        if pos < self.pos:
+            self.init()
+        self.read(pos - self.pos)
+
+    def tell(self):
+        return self.pos
+
+    def write(self, data):
+        self.pos += len(data)
+        raw = self.bz2obj.compress(data)
+        self.fileobj.write(raw)
+
+    def close(self):
+        if self.mode == "w":
+            raw = self.bz2obj.flush()
+            self.fileobj.write(raw)
+# class _BZ2Proxy
+
+#------------------------
+# Extraction file object
+#------------------------
+class _FileInFile(object):
+    """A thin wrapper around an existing file object that
+       provides a part of its data as an individual file
+       object.
+    """
+
+    def __init__(self, fileobj, offset, size, blockinfo=None):
+        self.fileobj = fileobj
+        self.offset = offset
+        self.size = size
+        self.position = 0
+
+        if blockinfo is None:
+            blockinfo = [(0, size)]
+
+        # Construct a map with data and zero blocks.
+        self.map_index = 0
+        self.map = []
+        lastpos = 0
+        realpos = self.offset
+        for offset, size in blockinfo:
+            if offset > lastpos:
+                self.map.append((False, lastpos, offset, None))
+            self.map.append((True, offset, offset + size, realpos))
+            realpos += size
+            lastpos = offset + size
+        if lastpos < self.size:
+            self.map.append((False, lastpos, self.size, None))
+
+    def seekable(self):
+        if not hasattr(self.fileobj, "seekable"):
+            # XXX gzip.GzipFile and bz2.BZ2File
+            return True
+        return self.fileobj.seekable()
+
+    def tell(self):
+        """Return the current file position.
+        """
+        return self.position
+
+    def seek(self, position):
+        """Seek to a position in the file.
+        """
+        self.position = position
+
+    def read(self, size=None):
+        """Read data from the file.
+        """
+        if size is None:
+            size = self.size - self.position
+        else:
+            size = min(size, self.size - self.position)
+
+        buf = b""
+        while size > 0:
+            while True:
+                data, start, stop, offset = self.map[self.map_index]
+                if start <= self.position < stop:
+                    break
+                else:
+                    self.map_index += 1
+                    if self.map_index == len(self.map):
+                        self.map_index = 0
+            length = min(size, stop - self.position)
+            if data:
+                self.fileobj.seek(offset + (self.position - start))
+                buf += self.fileobj.read(length)
+            else:
+                buf += NUL * length
+            size -= length
+            self.position += length
+        return buf
+#class _FileInFile
+
+
+class ExFileObject(object):
+    """File-like object for reading an archive member.
+       Is returned by TarFile.extractfile().
+    """
+    blocksize = 1024
+
+    def __init__(self, tarfile, tarinfo):
+        self.fileobj = _FileInFile(tarfile.fileobj,
+                                   tarinfo.offset_data,
+                                   tarinfo.size,
+                                   tarinfo.sparse)
+        self.name = tarinfo.name
+        self.mode = "r"
+        self.closed = False
+        self.size = tarinfo.size
+
+        self.position = 0
+        self.buffer = b""
+
+    def readable(self):
+        return True
+
+    def writable(self):
+        return False
+
+    def seekable(self):
+        return self.fileobj.seekable()
+
+    def read(self, size=None):
+        """Read at most size bytes from the file. If size is not
+           present or None, read all data until EOF is reached.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        buf = b""
+        if self.buffer:
+            if size is None:
+                buf = self.buffer
+                self.buffer = b""
+            else:
+                buf = self.buffer[:size]
+                self.buffer = self.buffer[size:]
+
+        if size is None:
+            buf += self.fileobj.read()
+        else:
+            buf += self.fileobj.read(size - len(buf))
+
+        self.position += len(buf)
+        return buf
+
+    # XXX TextIOWrapper uses the read1() method.
+    read1 = read
+
+    def readline(self, size=-1):
+        """Read one entire line from the file. If size is present
+           and non-negative, return a string with at most that
+           size, which may be an incomplete line.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        pos = self.buffer.find(b"\n") + 1
+        if pos == 0:
+            # no newline found.
+            while True:
+                buf = self.fileobj.read(self.blocksize)
+                self.buffer += buf
+                if not buf or b"\n" in buf:
+                    pos = self.buffer.find(b"\n") + 1
+                    if pos == 0:
+                        # no newline found.
+                        pos = len(self.buffer)
+                    break
+
+        if size != -1:
+            pos = min(size, pos)
+
+        buf = self.buffer[:pos]
+        self.buffer = self.buffer[pos:]
+        self.position += len(buf)
+        return buf
+
+    def readlines(self):
+        """Return a list with all remaining lines.
+        """
+        result = []
+        while True:
+            line = self.readline()
+            if not line: break
+            result.append(line)
+        return result
+
+    def tell(self):
+        """Return the current file position.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        return self.position
+
+    def seek(self, pos, whence=os.SEEK_SET):
+        """Seek to a position in the file.
+        """
+        if self.closed:
+            raise ValueError("I/O operation on closed file")
+
+        if whence == os.SEEK_SET:
+            self.position = min(max(pos, 0), self.size)
+        elif whence == os.SEEK_CUR:
+            if pos < 0:
+                self.position = max(self.position + pos, 0)
+            else:
+                self.position = min(self.position + pos, self.size)
+        elif whence == os.SEEK_END:
+            self.position = max(min(self.size + pos, self.size), 0)
+        else:
+            raise ValueError("Invalid argument")
+
+        self.buffer = b""
+        self.fileobj.seek(self.position)
+
+    def close(self):
+        """Close the file object.
+        """
+        self.closed = True
+
+    def __iter__(self):
+        """Get an iterator over the file's lines.
+        """
+        while True:
+            line = self.readline()
+            if not line:
+                break
+            yield line
+#class ExFileObject
+
+#------------------
+# Exported Classes
+#------------------
+class TarInfo(object):
+    """Informational class which holds the details about an
+       archive member given by a tar header block.
+       TarInfo objects are returned by TarFile.getmember(),
+       TarFile.getmembers() and TarFile.gettarinfo() and are
+       usually created internally.
+    """
+
+    __slots__ = ("name", "mode", "uid", "gid", "size", "mtime",
+                 "chksum", "type", "linkname", "uname", "gname",
+                 "devmajor", "devminor",
+                 "offset", "offset_data", "pax_headers", "sparse",
+                 "tarfile", "_sparse_structs", "_link_target")
+
+    def __init__(self, name=""):
+        """Construct a TarInfo object. name is the optional name
+           of the member.
+        """
+        self.name = name        # member name
+        self.mode = 0o644       # file permissions
+        self.uid = 0            # user id
+        self.gid = 0            # group id
+        self.size = 0           # file size
+        self.mtime = 0          # modification time
+        self.chksum = 0         # header checksum
+        self.type = REGTYPE     # member type
+        self.linkname = ""      # link name
+        self.uname = ""         # user name
+        self.gname = ""         # group name
+        self.devmajor = 0       # device major number
+        self.devminor = 0       # device minor number
+
+        self.offset = 0         # the tar header starts here
+        self.offset_data = 0    # the file's data starts here
+
+        self.sparse = None      # sparse member information
+        self.pax_headers = {}   # pax header information
+
+    # In pax headers the "name" and "linkname" field are called
+    # "path" and "linkpath".
+    def _getpath(self):
+        return self.name
+    def _setpath(self, name):
+        self.name = name
+    path = property(_getpath, _setpath)
+
+    def _getlinkpath(self):
+        return self.linkname
+    def _setlinkpath(self, linkname):
+        self.linkname = linkname
+    linkpath = property(_getlinkpath, _setlinkpath)
+
+    def __repr__(self):
+        return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self))
+
+    def get_info(self):
+        """Return the TarInfo's attributes as a dictionary.
+        """
+        info = {
+            "name":     self.name,
+            "mode":     self.mode & 0o7777,
+            "uid":      self.uid,
+            "gid":      self.gid,
+            "size":     self.size,
+            "mtime":    self.mtime,
+            "chksum":   self.chksum,
+            "type":     self.type,
+            "linkname": self.linkname,
+            "uname":    self.uname,
+            "gname":    self.gname,
+            "devmajor": self.devmajor,
+            "devminor": self.devminor
+        }
+
+        if info["type"] == DIRTYPE and not info["name"].endswith("/"):
+            info["name"] += "/"
+
+        return info
+
+    def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"):
+        """Return a tar header as a string of 512 byte blocks.
+        """
+        info = self.get_info()
+
+        if format == USTAR_FORMAT:
+            return self.create_ustar_header(info, encoding, errors)
+        elif format == GNU_FORMAT:
+            return self.create_gnu_header(info, encoding, errors)
+        elif format == PAX_FORMAT:
+            return self.create_pax_header(info, encoding)
+        else:
+            raise ValueError("invalid format")
+
+    def create_ustar_header(self, info, encoding, errors):
+        """Return the object as a ustar header block.
+        """
+        info["magic"] = POSIX_MAGIC
+
+        if len(info["linkname"]) > LENGTH_LINK:
+            raise ValueError("linkname is too long")
+
+        if len(info["name"]) > LENGTH_NAME:
+            info["prefix"], info["name"] = self._posix_split_name(info["name"])
+
+        return self._create_header(info, USTAR_FORMAT, encoding, errors)
+
+    def create_gnu_header(self, info, encoding, errors):
+        """Return the object as a GNU header block sequence.
+        """
+        info["magic"] = GNU_MAGIC
+
+        buf = b""
+        if len(info["linkname"]) > LENGTH_LINK:
+            buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors)
+
+        if len(info["name"]) > LENGTH_NAME:
+            buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors)
+
+        return buf + self._create_header(info, GNU_FORMAT, encoding, errors)
+
+    def create_pax_header(self, info, encoding):
+        """Return the object as a ustar header block. If it cannot be
+           represented this way, prepend a pax extended header sequence
+           with supplement information.
+        """
+        info["magic"] = POSIX_MAGIC
+        pax_headers = self.pax_headers.copy()
+
+        # Test string fields for values that exceed the field length or cannot
+        # be represented in ASCII encoding.
+        for name, hname, length in (
+                ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK),
+                ("uname", "uname", 32), ("gname", "gname", 32)):
+
+            if hname in pax_headers:
+                # The pax header has priority.
+                continue
+
+            # Try to encode the string as ASCII.
+            try:
+                info[name].encode("ascii", "strict")
+            except UnicodeEncodeError:
+                pax_headers[hname] = info[name]
+                continue
+
+            if len(info[name]) > length:
+                pax_headers[hname] = info[name]
+
+        # Test number fields for values that exceed the field limit or values
+        # that like to be stored as float.
+        for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)):
+            if name in pax_headers:
+                # The pax header has priority. Avoid overflow.
+                info[name] = 0
+                continue
+
+            val = info[name]
+            if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float):
+                pax_headers[name] = str(val)
+                info[name] = 0
+
+        # Create a pax extended header if necessary.
+        if pax_headers:
+            buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding)
+        else:
+            buf = b""
+
+        return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace")
+
+    @classmethod
+    def create_pax_global_header(cls, pax_headers):
+        """Return the object as a pax global header block sequence.
+        """
+        return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8")
+
+    def _posix_split_name(self, name):
+        """Split a name longer than 100 chars into a prefix
+           and a name part.
+        """
+        prefix = name[:LENGTH_PREFIX + 1]
+        while prefix and prefix[-1] != "/":
+            prefix = prefix[:-1]
+
+        name = name[len(prefix):]
+        prefix = prefix[:-1]
+
+        if not prefix or len(name) > LENGTH_NAME:
+            raise ValueError("name is too long")
+        return prefix, name
+
+    @staticmethod
+    def _create_header(info, format, encoding, errors):
+        """Return a header block. info is a dictionary with file
+           information, format must be one of the *_FORMAT constants.
+        """
+        parts = [
+            stn(info.get("name", ""), 100, encoding, errors),
+            itn(info.get("mode", 0) & 0o7777, 8, format),
+            itn(info.get("uid", 0), 8, format),
+            itn(info.get("gid", 0), 8, format),
+            itn(info.get("size", 0), 12, format),
+            itn(info.get("mtime", 0), 12, format),
+            b"        ", # checksum field
+            info.get("type", REGTYPE),
+            stn(info.get("linkname", ""), 100, encoding, errors),
+            info.get("magic", POSIX_MAGIC),
+            stn(info.get("uname", ""), 32, encoding, errors),
+            stn(info.get("gname", ""), 32, encoding, errors),
+            itn(info.get("devmajor", 0), 8, format),
+            itn(info.get("devminor", 0), 8, format),
+            stn(info.get("prefix", ""), 155, encoding, errors)
+        ]
+
+        buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts))
+        chksum = calc_chksums(buf[-BLOCKSIZE:])[0]
+        buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:]
+        return buf
+
+    @staticmethod
+    def _create_payload(payload):
+        """Return the string payload filled with zero bytes
+           up to the next 512 byte border.
+        """
+        blocks, remainder = divmod(len(payload), BLOCKSIZE)
+        if remainder > 0:
+            payload += (BLOCKSIZE - remainder) * NUL
+        return payload
+
+    @classmethod
+    def _create_gnu_long_header(cls, name, type, encoding, errors):
+        """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence
+           for name.
+        """
+        name = name.encode(encoding, errors) + NUL
+
+        info = {}
+        info["name"] = "././@LongLink"
+        info["type"] = type
+        info["size"] = len(name)
+        info["magic"] = GNU_MAGIC
+
+        # create extended header + name blocks.
+        return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \
+                cls._create_payload(name)
+
+    @classmethod
+    def _create_pax_generic_header(cls, pax_headers, type, encoding):
+        """Return a POSIX.1-2008 extended or global header sequence
+           that contains a list of keyword, value pairs. The values
+           must be strings.
+        """
+        # Check if one of the fields contains surrogate characters and thereby
+        # forces hdrcharset=BINARY, see _proc_pax() for more information.
+        binary = False
+        for keyword, value in pax_headers.items():
+            try:
+                value.encode("utf8", "strict")
+            except UnicodeEncodeError:
+                binary = True
+                break
+
+        records = b""
+        if binary:
+            # Put the hdrcharset field at the beginning of the header.
+            records += b"21 hdrcharset=BINARY\n"
+
+        for keyword, value in pax_headers.items():
+            keyword = keyword.encode("utf8")
+            if binary:
+                # Try to restore the original byte representation of `value'.
+                # Needless to say, that the encoding must match the string.
+                value = value.encode(encoding, "surrogateescape")
+            else:
+                value = value.encode("utf8")
+
+            l = len(keyword) + len(value) + 3   # ' ' + '=' + '\n'
+            n = p = 0
+            while True:
+                n = l + len(str(p))
+                if n == p:
+                    break
+                p = n
+            records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n"
+
+        # We use a hardcoded "././@PaxHeader" name like star does
+        # instead of the one that POSIX recommends.
+        info = {}
+        info["name"] = "././@PaxHeader"
+        info["type"] = type
+        info["size"] = len(records)
+        info["magic"] = POSIX_MAGIC
+
+        # Create pax header + record blocks.
+        return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \
+                cls._create_payload(records)
+
+    @classmethod
+    def frombuf(cls, buf, encoding, errors):
+        """Construct a TarInfo object from a 512 byte bytes object.
+        """
+        if len(buf) == 0:
+            raise EmptyHeaderError("empty header")
+        if len(buf) != BLOCKSIZE:
+            raise TruncatedHeaderError("truncated header")
+        if buf.count(NUL) == BLOCKSIZE:
+            raise EOFHeaderError("end of file header")
+
+        chksum = nti(buf[148:156])
+        if chksum not in calc_chksums(buf):
+            raise InvalidHeaderError("bad checksum")
+
+        obj = cls()
+        obj.name = nts(buf[0:100], encoding, errors)
+        obj.mode = nti(buf[100:108])
+        obj.uid = nti(buf[108:116])
+        obj.gid = nti(buf[116:124])
+        obj.size = nti(buf[124:136])
+        obj.mtime = nti(buf[136:148])
+        obj.chksum = chksum
+        obj.type = buf[156:157]
+        obj.linkname = nts(buf[157:257], encoding, errors)
+        obj.uname = nts(buf[265:297], encoding, errors)
+        obj.gname = nts(buf[297:329], encoding, errors)
+        obj.devmajor = nti(buf[329:337])
+        obj.devminor = nti(buf[337:345])
+        prefix = nts(buf[345:500], encoding, errors)
+
+        # Old V7 tar format represents a directory as a regular
+        # file with a trailing slash.
+        if obj.type == AREGTYPE and obj.name.endswith("/"):
+            obj.type = DIRTYPE
+
+        # The old GNU sparse format occupies some of the unused
+        # space in the buffer for up to 4 sparse structures.
+        # Save the them for later processing in _proc_sparse().
+        if obj.type == GNUTYPE_SPARSE:
+            pos = 386
+            structs = []
+            for i in range(4):
+                try:
+                    offset = nti(buf[pos:pos + 12])
+                    numbytes = nti(buf[pos + 12:pos + 24])
+                except ValueError:
+                    break
+                structs.append((offset, numbytes))
+                pos += 24
+            isextended = bool(buf[482])
+            origsize = nti(buf[483:495])
+            obj._sparse_structs = (structs, isextended, origsize)
+
+        # Remove redundant slashes from directories.
+        if obj.isdir():
+            obj.name = obj.name.rstrip("/")
+
+        # Reconstruct a ustar longname.
+        if prefix and obj.type not in GNU_TYPES:
+            obj.name = prefix + "/" + obj.name
+        return obj
+
+    @classmethod
+    def fromtarfile(cls, tarfile):
+        """Return the next TarInfo object from TarFile object
+           tarfile.
+        """
+        buf = tarfile.fileobj.read(BLOCKSIZE)
+        obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors)
+        obj.offset = tarfile.fileobj.tell() - BLOCKSIZE
+        return obj._proc_member(tarfile)
+
+    #--------------------------------------------------------------------------
+    # The following are methods that are called depending on the type of a
+    # member. The entry point is _proc_member() which can be overridden in a
+    # subclass to add custom _proc_*() methods. A _proc_*() method MUST
+    # implement the following
+    # operations:
+    # 1. Set self.offset_data to the position where the data blocks begin,
+    #    if there is data that follows.
+    # 2. Set tarfile.offset to the position where the next member's header will
+    #    begin.
+    # 3. Return self or another valid TarInfo object.
+    def _proc_member(self, tarfile):
+        """Choose the right processing method depending on
+           the type and call it.
+        """
+        if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK):
+            return self._proc_gnulong(tarfile)
+        elif self.type == GNUTYPE_SPARSE:
+            return self._proc_sparse(tarfile)
+        elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE):
+            return self._proc_pax(tarfile)
+        else:
+            return self._proc_builtin(tarfile)
+
+    def _proc_builtin(self, tarfile):
+        """Process a builtin type or an unknown type which
+           will be treated as a regular file.
+        """
+        self.offset_data = tarfile.fileobj.tell()
+        offset = self.offset_data
+        if self.isreg() or self.type not in SUPPORTED_TYPES:
+            # Skip the following data blocks.
+            offset += self._block(self.size)
+        tarfile.offset = offset
+
+        # Patch the TarInfo object with saved global
+        # header information.
+        self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors)
+
+        return self
+
+    def _proc_gnulong(self, tarfile):
+        """Process the blocks that hold a GNU longname
+           or longlink member.
+        """
+        buf = tarfile.fileobj.read(self._block(self.size))
+
+        # Fetch the next header and process it.
+        try:
+            next = self.fromtarfile(tarfile)
+        except HeaderError:
+            raise SubsequentHeaderError("missing or bad subsequent header")
+
+        # Patch the TarInfo object from the next header with
+        # the longname information.
+        next.offset = self.offset
+        if self.type == GNUTYPE_LONGNAME:
+            next.name = nts(buf, tarfile.encoding, tarfile.errors)
+        elif self.type == GNUTYPE_LONGLINK:
+            next.linkname = nts(buf, tarfile.encoding, tarfile.errors)
+
+        return next
+
+    def _proc_sparse(self, tarfile):
+        """Process a GNU sparse header plus extra headers.
+        """
+        # We already collected some sparse structures in frombuf().
+        structs, isextended, origsize = self._sparse_structs
+        del self._sparse_structs
+
+        # Collect sparse structures from extended header blocks.
+        while isextended:
+            buf = tarfile.fileobj.read(BLOCKSIZE)
+            pos = 0
+            for i in range(21):
+                try:
+                    offset = nti(buf[pos:pos + 12])
+                    numbytes = nti(buf[pos + 12:pos + 24])
+                except ValueError:
+                    break
+                if offset and numbytes:
+                    structs.append((offset, numbytes))
+                pos += 24
+            isextended = bool(buf[504])
+        self.sparse = structs
+
+        self.offset_data = tarfile.fileobj.tell()
+        tarfile.offset = self.offset_data + self._block(self.size)
+        self.size = origsize
+        return self
+
+    def _proc_pax(self, tarfile):
+        """Process an extended or global header as described in
+           POSIX.1-2008.
+        """
+        # Read the header information.
+        buf = tarfile.fileobj.read(self._block(self.size))
+
+        # A pax header stores supplemental information for either
+        # the following file (extended) or all following files
+        # (global).
+        if self.type == XGLTYPE:
+            pax_headers = tarfile.pax_headers
+        else:
+            pax_headers = tarfile.pax_headers.copy()
+
+        # Check if the pax header contains a hdrcharset field. This tells us
+        # the encoding of the path, linkpath, uname and gname fields. Normally,
+        # these fields are UTF-8 encoded but since POSIX.1-2008 tar
+        # implementations are allowed to store them as raw binary strings if
+        # the translation to UTF-8 fails.
+        match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf)
+        if match is not None:
+            pax_headers["hdrcharset"] = match.group(1).decode("utf8")
+
+        # For the time being, we don't care about anything other than "BINARY".
+        # The only other value that is currently allowed by the standard is
+        # "ISO-IR 10646 2000 UTF-8" in other words UTF-8.
+        hdrcharset = pax_headers.get("hdrcharset")
+        if hdrcharset == "BINARY":
+            encoding = tarfile.encoding
+        else:
+            encoding = "utf8"
+
+        # Parse pax header information. A record looks like that:
+        # "%d %s=%s\n" % (length, keyword, value). length is the size
+        # of the complete record including the length field itself and
+        # the newline. keyword and value are both UTF-8 encoded strings.
+        regex = re.compile(br"(\d+) ([^=]+)=")
+        pos = 0
+        while True:
+            match = regex.match(buf, pos)
+            if not match:
+                break
+
+            length, keyword = match.groups()
+            length = int(length)
+            value = buf[match.end(2) + 1:match.start(1) + length - 1]
+
+            # Normally, we could just use "utf8" as the encoding and "strict"
+            # as the error handler, but we better not take the risk. For
+            # example, GNU tar <= 1.23 is known to store filenames it cannot
+            # translate to UTF-8 as raw strings (unfortunately without a
+            # hdrcharset=BINARY header).
+            # We first try the strict standard encoding, and if that fails we
+            # fall back on the user's encoding and error handler.
+            keyword = self._decode_pax_field(keyword, "utf8", "utf8",
+                    tarfile.errors)
+            if keyword in PAX_NAME_FIELDS:
+                value = self._decode_pax_field(value, encoding, tarfile.encoding,
+                        tarfile.errors)
+            else:
+                value = self._decode_pax_field(value, "utf8", "utf8",
+                        tarfile.errors)
+
+            pax_headers[keyword] = value
+            pos += length
+
+        # Fetch the next header.
+        try:
+            next = self.fromtarfile(tarfile)
+        except HeaderError:
+            raise SubsequentHeaderError("missing or bad subsequent header")
+
+        # Process GNU sparse information.
+        if "GNU.sparse.map" in pax_headers:
+            # GNU extended sparse format version 0.1.
+            self._proc_gnusparse_01(next, pax_headers)
+
+        elif "GNU.sparse.size" in pax_headers:
+            # GNU extended sparse format version 0.0.
+            self._proc_gnusparse_00(next, pax_headers, buf)
+
+        elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0":
+            # GNU extended sparse format version 1.0.
+            self._proc_gnusparse_10(next, pax_headers, tarfile)
+
+        if self.type in (XHDTYPE, SOLARIS_XHDTYPE):
+            # Patch the TarInfo object with the extended header info.
+            next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors)
+            next.offset = self.offset
+
+            if "size" in pax_headers:
+                # If the extended header replaces the size field,
+                # we need to recalculate the offset where the next
+                # header starts.
+                offset = next.offset_data
+                if next.isreg() or next.type not in SUPPORTED_TYPES:
+                    offset += next._block(next.size)
+                tarfile.offset = offset
+
+        return next
+
+    def _proc_gnusparse_00(self, next, pax_headers, buf):
+        """Process a GNU tar extended sparse header, version 0.0.
+        """
+        offsets = []
+        for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf):
+            offsets.append(int(match.group(1)))
+        numbytes = []
+        for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf):
+            numbytes.append(int(match.group(1)))
+        next.sparse = list(zip(offsets, numbytes))
+
+    def _proc_gnusparse_01(self, next, pax_headers):
+        """Process a GNU tar extended sparse header, version 0.1.
+        """
+        sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")]
+        next.sparse = list(zip(sparse[::2], sparse[1::2]))
+
+    def _proc_gnusparse_10(self, next, pax_headers, tarfile):
+        """Process a GNU tar extended sparse header, version 1.0.
+        """
+        fields = None
+        sparse = []
+        buf = tarfile.fileobj.read(BLOCKSIZE)
+        fields, buf = buf.split(b"\n", 1)
+        fields = int(fields)
+        while len(sparse) < fields * 2:
+            if b"\n" not in buf:
+                buf += tarfile.fileobj.read(BLOCKSIZE)
+            number, buf = buf.split(b"\n", 1)
+            sparse.append(int(number))
+        next.offset_data = tarfile.fileobj.tell()
+        next.sparse = list(zip(sparse[::2], sparse[1::2]))
+
+    def _apply_pax_info(self, pax_headers, encoding, errors):
+        """Replace fields with supplemental information from a previous
+           pax extended or global header.
+        """
+        for keyword, value in pax_headers.items():
+            if keyword == "GNU.sparse.name":
+                setattr(self, "path", value)
+            elif keyword == "GNU.sparse.size":
+                setattr(self, "size", int(value))
+            elif keyword == "GNU.sparse.realsize":
+                setattr(self, "size", int(value))
+            elif keyword in PAX_FIELDS:
+                if keyword in PAX_NUMBER_FIELDS:
+                    try:
+                        value = PAX_NUMBER_FIELDS[keyword](value)
+                    except ValueError:
+                        value = 0
+                if keyword == "path":
+                    value = value.rstrip("/")
+                setattr(self, keyword, value)
+
+        self.pax_headers = pax_headers.copy()
+
+    def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors):
+        """Decode a single field from a pax record.
+        """
+        try:
+            return value.decode(encoding, "strict")
+        except UnicodeDecodeError:
+            return value.decode(fallback_encoding, fallback_errors)
+
+    def _block(self, count):
+        """Round up a byte count by BLOCKSIZE and return it,
+           e.g. _block(834) => 1024.
+        """
+        blocks, remainder = divmod(count, BLOCKSIZE)
+        if remainder:
+            blocks += 1
+        return blocks * BLOCKSIZE
+
+    def isreg(self):
+        return self.type in REGULAR_TYPES
+    def isfile(self):
+        return self.isreg()
+    def isdir(self):
+        return self.type == DIRTYPE
+    def issym(self):
+        return self.type == SYMTYPE
+    def islnk(self):
+        return self.type == LNKTYPE
+    def ischr(self):
+        return self.type == CHRTYPE
+    def isblk(self):
+        return self.type == BLKTYPE
+    def isfifo(self):
+        return self.type == FIFOTYPE
+    def issparse(self):
+        return self.sparse is not None
+    def isdev(self):
+        return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE)
+# class TarInfo
+
+class TarFile(object):
+    """The TarFile Class provides an interface to tar archives.
+    """
+
+    debug = 0                   # May be set from 0 (no msgs) to 3 (all msgs)
+
+    dereference = False         # If true, add content of linked file to the
+                                # tar file, else the link.
+
+    ignore_zeros = False        # If true, skips empty or invalid blocks and
+                                # continues processing.
+
+    errorlevel = 1              # If 0, fatal errors only appear in debug
+                                # messages (if debug >= 0). If > 0, errors
+                                # are passed to the caller as exceptions.
+
+    format = DEFAULT_FORMAT     # The format to use when creating an archive.
+
+    encoding = ENCODING         # Encoding for 8-bit character strings.
+
+    errors = None               # Error handler for unicode conversion.
+
+    tarinfo = TarInfo           # The default TarInfo class to use.
+
+    fileobject = ExFileObject   # The default ExFileObject class to use.
+
+    def __init__(self, name=None, mode="r", fileobj=None, format=None,
+            tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
+            errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None):
+        """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
+           read from an existing archive, 'a' to append data to an existing
+           file or 'w' to create a new file overwriting an existing one. `mode'
+           defaults to 'r'.
+           If `fileobj' is given, it is used for reading or writing data. If it
+           can be determined, `mode' is overridden by `fileobj's mode.
+           `fileobj' is not closed, when TarFile is closed.
+        """
+        if len(mode) > 1 or mode not in "raw":
+            raise ValueError("mode must be 'r', 'a' or 'w'")
+        self.mode = mode
+        self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode]
+
+        if not fileobj:
+            if self.mode == "a" and not os.path.exists(name):
+                # Create nonexistent files in append mode.
+                self.mode = "w"
+                self._mode = "wb"
+            fileobj = bltn_open(name, self._mode)
+            self._extfileobj = False
+        else:
+            if name is None and hasattr(fileobj, "name"):
+                name = fileobj.name
+            if hasattr(fileobj, "mode"):
+                self._mode = fileobj.mode
+            self._extfileobj = True
+        self.name = os.path.abspath(name) if name else None
+        self.fileobj = fileobj
+
+        # Init attributes.
+        if format is not None:
+            self.format = format
+        if tarinfo is not None:
+            self.tarinfo = tarinfo
+        if dereference is not None:
+            self.dereference = dereference
+        if ignore_zeros is not None:
+            self.ignore_zeros = ignore_zeros
+        if encoding is not None:
+            self.encoding = encoding
+        self.errors = errors
+
+        if pax_headers is not None and self.format == PAX_FORMAT:
+            self.pax_headers = pax_headers
+        else:
+            self.pax_headers = {}
+
+        if debug is not None:
+            self.debug = debug
+        if errorlevel is not None:
+            self.errorlevel = errorlevel
+
+        # Init datastructures.
+        self.closed = False
+        self.members = []       # list of members as TarInfo objects
+        self._loaded = False    # flag if all members have been read
+        self.offset = self.fileobj.tell()
+                                # current position in the archive file
+        self.inodes = {}        # dictionary caching the inodes of
+                                # archive members already added
+
+        try:
+            if self.mode == "r":
+                self.firstmember = None
+                self.firstmember = self.next()
+
+            if self.mode == "a":
+                # Move to the end of the archive,
+                # before the first empty block.
+                while True:
+                    self.fileobj.seek(self.offset)
+                    try:
+                        tarinfo = self.tarinfo.fromtarfile(self)
+                        self.members.append(tarinfo)
+                    except EOFHeaderError:
+                        self.fileobj.seek(self.offset)
+                        break
+                    except HeaderError as e:
+                        raise ReadError(str(e))
+
+            if self.mode in "aw":
+                self._loaded = True
+
+                if self.pax_headers:
+                    buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
+                    self.fileobj.write(buf)
+                    self.offset += len(buf)
+        except:
+            if not self._extfileobj:
+                self.fileobj.close()
+            self.closed = True
+            raise
+
+    #--------------------------------------------------------------------------
+    # Below are the classmethods which act as alternate constructors to the
+    # TarFile class. The open() method is the only one that is needed for
+    # public use; it is the "super"-constructor and is able to select an
+    # adequate "sub"-constructor for a particular compression using the mapping
+    # from OPEN_METH.
+    #
+    # This concept allows one to subclass TarFile without losing the comfort of
+    # the super-constructor. A sub-constructor is registered and made available
+    # by adding it to the mapping in OPEN_METH.
+
+    @classmethod
+    def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
+        """Open a tar archive for reading, writing or appending. Return
+           an appropriate TarFile class.
+
+           mode:
+           'r' or 'r:*' open for reading with transparent compression
+           'r:'         open for reading exclusively uncompressed
+           'r:gz'       open for reading with gzip compression
+           'r:bz2'      open for reading with bzip2 compression
+           'a' or 'a:'  open for appending, creating the file if necessary
+           'w' or 'w:'  open for writing without compression
+           'w:gz'       open for writing with gzip compression
+           'w:bz2'      open for writing with bzip2 compression
+
+           'r|*'        open a stream of tar blocks with transparent compression
+           'r|'         open an uncompressed stream of tar blocks for reading
+           'r|gz'       open a gzip compressed stream of tar blocks
+           'r|bz2'      open a bzip2 compressed stream of tar blocks
+           'w|'         open an uncompressed stream for writing
+           'w|gz'       open a gzip compressed stream for writing
+           'w|bz2'      open a bzip2 compressed stream for writing
+        """
+
+        if not name and not fileobj:
+            raise ValueError("nothing to open")
+
+        if mode in ("r", "r:*"):
+            # Find out which *open() is appropriate for opening the file.
+            for comptype in cls.OPEN_METH:
+                func = getattr(cls, cls.OPEN_METH[comptype])
+                if fileobj is not None:
+                    saved_pos = fileobj.tell()
+                try:
+                    return func(name, "r", fileobj, **kwargs)
+                except (ReadError, CompressionError) as e:
+                    if fileobj is not None:
+                        fileobj.seek(saved_pos)
+                    continue
+            raise ReadError("file could not be opened successfully")
+
+        elif ":" in mode:
+            filemode, comptype = mode.split(":", 1)
+            filemode = filemode or "r"
+            comptype = comptype or "tar"
+
+            # Select the *open() function according to
+            # given compression.
+            if comptype in cls.OPEN_METH:
+                func = getattr(cls, cls.OPEN_METH[comptype])
+            else:
+                raise CompressionError("unknown compression type %r" % comptype)
+            return func(name, filemode, fileobj, **kwargs)
+
+        elif "|" in mode:
+            filemode, comptype = mode.split("|", 1)
+            filemode = filemode or "r"
+            comptype = comptype or "tar"
+
+            if filemode not in "rw":
+                raise ValueError("mode must be 'r' or 'w'")
+
+            stream = _Stream(name, filemode, comptype, fileobj, bufsize)
+            try:
+                t = cls(name, filemode, stream, **kwargs)
+            except:
+                stream.close()
+                raise
+            t._extfileobj = False
+            return t
+
+        elif mode in "aw":
+            return cls.taropen(name, mode, fileobj, **kwargs)
+
+        raise ValueError("undiscernible mode")
+
+    @classmethod
+    def taropen(cls, name, mode="r", fileobj=None, **kwargs):
+        """Open uncompressed tar archive name for reading or writing.
+        """
+        if len(mode) > 1 or mode not in "raw":
+            raise ValueError("mode must be 'r', 'a' or 'w'")
+        return cls(name, mode, fileobj, **kwargs)
+
+    @classmethod
+    def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
+        """Open gzip compressed tar archive name for reading or writing.
+           Appending is not allowed.
+        """
+        if len(mode) > 1 or mode not in "rw":
+            raise ValueError("mode must be 'r' or 'w'")
+
+        try:
+            import gzip
+            gzip.GzipFile
+        except (ImportError, AttributeError):
+            raise CompressionError("gzip module is not available")
+
+        extfileobj = fileobj is not None
+        try:
+            fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
+            t = cls.taropen(name, mode, fileobj, **kwargs)
+        except IOError:
+            if not extfileobj and fileobj is not None:
+                fileobj.close()
+            if fileobj is None:
+                raise
+            raise ReadError("not a gzip file")
+        except:
+            if not extfileobj and fileobj is not None:
+                fileobj.close()
+            raise
+        t._extfileobj = extfileobj
+        return t
+
+    @classmethod
+    def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
+        """Open bzip2 compressed tar archive name for reading or writing.
+           Appending is not allowed.
+        """
+        if len(mode) > 1 or mode not in "rw":
+            raise ValueError("mode must be 'r' or 'w'.")
+
+        try:
+            import bz2
+        except ImportError:
+            raise CompressionError("bz2 module is not available")
+
+        if fileobj is not None:
+            fileobj = _BZ2Proxy(fileobj, mode)
+        else:
+            fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)
+
+        try:
+            t = cls.taropen(name, mode, fileobj, **kwargs)
+        except (IOError, EOFError):
+            fileobj.close()
+            raise ReadError("not a bzip2 file")
+        t._extfileobj = False
+        return t
+
+    # All *open() methods are registered here.
+    OPEN_METH = {
+        "tar": "taropen",   # uncompressed tar
+        "gz":  "gzopen",    # gzip compressed tar
+        "bz2": "bz2open"    # bzip2 compressed tar
+    }
+
+    #--------------------------------------------------------------------------
+    # The public methods which TarFile provides:
+
+    def close(self):
+        """Close the TarFile. In write-mode, two finishing zero blocks are
+           appended to the archive.
+        """
+        if self.closed:
+            return
+
+        if self.mode in "aw":
+            self.fileobj.write(NUL * (BLOCKSIZE * 2))
+            self.offset += (BLOCKSIZE * 2)
+            # fill up the end with zero-blocks
+            # (like option -b20 for tar does)
+            blocks, remainder = divmod(self.offset, RECORDSIZE)
+            if remainder > 0:
+                self.fileobj.write(NUL * (RECORDSIZE - remainder))
+
+        if not self._extfileobj:
+            self.fileobj.close()
+        self.closed = True
+
+    def getmember(self, name):
+        """Return a TarInfo object for member `name'. If `name' can not be
+           found in the archive, KeyError is raised. If a member occurs more
+           than once in the archive, its last occurrence is assumed to be the
+           most up-to-date version.
+        """
+        tarinfo = self._getmember(name)
+        if tarinfo is None:
+            raise KeyError("filename %r not found" % name)
+        return tarinfo
+
+    def getmembers(self):
+        """Return the members of the archive as a list of TarInfo objects. The
+           list has the same order as the members in the archive.
+        """
+        self._check()
+        if not self._loaded:    # if we want to obtain a list of
+            self._load()        # all members, we first have to
+                                # scan the whole archive.
+        return self.members
+
+    def getnames(self):
+        """Return the members of the archive as a list of their names. It has
+           the same order as the list returned by getmembers().
+        """
+        return [tarinfo.name for tarinfo in self.getmembers()]
+
+    def gettarinfo(self, name=None, arcname=None, fileobj=None):
+        """Create a TarInfo object for either the file `name' or the file
+           object `fileobj' (using os.fstat on its file descriptor). You can
+           modify some of the TarInfo's attributes before you add it using
+           addfile(). If given, `arcname' specifies an alternative name for the
+           file in the archive.
+        """
+        self._check("aw")
+
+        # When fileobj is given, replace name by
+        # fileobj's real name.
+        if fileobj is not None:
+            name = fileobj.name
+
+        # Building the name of the member in the archive.
+        # Backward slashes are converted to forward slashes,
+        # Absolute paths are turned to relative paths.
+        if arcname is None:
+            arcname = name
+        drv, arcname = os.path.splitdrive(arcname)
+        arcname = arcname.replace(os.sep, "/")
+        arcname = arcname.lstrip("/")
+
+        # Now, fill the TarInfo object with
+        # information specific for the file.
+        tarinfo = self.tarinfo()
+        tarinfo.tarfile = self
+
+        # Use os.stat or os.lstat, depending on platform
+        # and if symlinks shall be resolved.
+        if fileobj is None:
+            if hasattr(os, "lstat") and not self.dereference:
+                statres = os.lstat(name)
+            else:
+                statres = os.stat(name)
+        else:
+            statres = os.fstat(fileobj.fileno())
+        linkname = ""
+
+        stmd = statres.st_mode
+        if stat.S_ISREG(stmd):
+            inode = (statres.st_ino, statres.st_dev)
+            if not self.dereference and statres.st_nlink > 1 and \
+                    inode in self.inodes and arcname != self.inodes[inode]:
+                # Is it a hardlink to an already
+                # archived file?
+                type = LNKTYPE
+                linkname = self.inodes[inode]
+            else:
+                # The inode is added only if its valid.
+                # For win32 it is always 0.
+                type = REGTYPE
+                if inode[0]:
+                    self.inodes[inode] = arcname
+        elif stat.S_ISDIR(stmd):
+            type = DIRTYPE
+        elif stat.S_ISFIFO(stmd):
+            type = FIFOTYPE
+        elif stat.S_ISLNK(stmd):
+            type = SYMTYPE
+            linkname = os.readlink(name)
+        elif stat.S_ISCHR(stmd):
+            type = CHRTYPE
+        elif stat.S_ISBLK(stmd):
+            type = BLKTYPE
+        else:
+            return None
+
+        # Fill the TarInfo object with all
+        # information we can get.
+        tarinfo.name = arcname
+        tarinfo.mode = stmd
+        tarinfo.uid = statres.st_uid
+        tarinfo.gid = statres.st_gid
+        if type == REGTYPE:
+            tarinfo.size = statres.st_size
+        else:
+            tarinfo.size = 0
+        tarinfo.mtime = statres.st_mtime
+        tarinfo.type = type
+        tarinfo.linkname = linkname
+        if pwd:
+            try:
+                tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0]
+            except KeyError:
+                pass
+        if grp:
+            try:
+                tarinfo.gname = grp.getgrgid(tarinfo.gid)[0]
+            except KeyError:
+                pass
+
+        if type in (CHRTYPE, BLKTYPE):
+            if hasattr(os, "major") and hasattr(os, "minor"):
+                tarinfo.devmajor = os.major(statres.st_rdev)
+                tarinfo.devminor = os.minor(statres.st_rdev)
+        return tarinfo
+
+    def list(self, verbose=True):
+        """Print a table of contents to sys.stdout. If `verbose' is False, only
+           the names of the members are printed. If it is True, an `ls -l'-like
+           output is produced.
+        """
+        self._check()
+
+        for tarinfo in self:
+            if verbose:
+                print(filemode(tarinfo.mode), end=' ')
+                print("%s/%s" % (tarinfo.uname or tarinfo.uid,
+                                 tarinfo.gname or tarinfo.gid), end=' ')
+                if tarinfo.ischr() or tarinfo.isblk():
+                    print("%10s" % ("%d,%d" \
+                                    % (tarinfo.devmajor, tarinfo.devminor)), end=' ')
+                else:
+                    print("%10d" % tarinfo.size, end=' ')
+                print("%d-%02d-%02d %02d:%02d:%02d" \
+                      % time.localtime(tarinfo.mtime)[:6], end=' ')
+
+            print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ')
+
+            if verbose:
+                if tarinfo.issym():
+                    print("->", tarinfo.linkname, end=' ')
+                if tarinfo.islnk():
+                    print("link to", tarinfo.linkname, end=' ')
+            print()
+
+    def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
+        """Add the file `name' to the archive. `name' may be any type of file
+           (directory, fifo, symbolic link, etc.). If given, `arcname'
+           specifies an alternative name for the file in the archive.
+           Directories are added recursively by default. This can be avoided by
+           setting `recursive' to False. `exclude' is a function that should
+           return True for each filename to be excluded. `filter' is a function
+           that expects a TarInfo object argument and returns the changed
+           TarInfo object, if it returns None the TarInfo object will be
+           excluded from the archive.
+        """
+        self._check("aw")
+
+        if arcname is None:
+            arcname = name
+
+        # Exclude pathnames.
+        if exclude is not None:
+            import warnings
+            warnings.warn("use the filter argument instead",
+                    DeprecationWarning, 2)
+            if exclude(name):
+                self._dbg(2, "tarfile: Excluded %r" % name)
+                return
+
+        # Skip if somebody tries to archive the archive...
+        if self.name is not None and os.path.abspath(name) == self.name:
+            self._dbg(2, "tarfile: Skipped %r" % name)
+            return
+
+        self._dbg(1, name)
+
+        # Create a TarInfo object from the file.
+        tarinfo = self.gettarinfo(name, arcname)
+
+        if tarinfo is None:
+            self._dbg(1, "tarfile: Unsupported type %r" % name)
+            return
+
+        # Change or exclude the TarInfo object.
+        if filter is not None:
+            tarinfo = filter(tarinfo)
+            if tarinfo is None:
+                self._dbg(2, "tarfile: Excluded %r" % name)
+                return
+
+        # Append the tar header and data to the archive.
+        if tarinfo.isreg():
+            f = bltn_open(name, "rb")
+            self.addfile(tarinfo, f)
+            f.close()
+
+        elif tarinfo.isdir():
+            self.addfile(tarinfo)
+            if recursive:
+                for f in os.listdir(name):
+                    self.add(os.path.join(name, f), os.path.join(arcname, f),
+                            recursive, exclude, filter=filter)
+
+        else:
+            self.addfile(tarinfo)
+
+    def addfile(self, tarinfo, fileobj=None):
+        """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
+           given, tarinfo.size bytes are read from it and added to the archive.
+           You can create TarInfo objects using gettarinfo().
+           On Windows platforms, `fileobj' should always be opened with mode
+           'rb' to avoid irritation about the file size.
+        """
+        self._check("aw")
+
+        tarinfo = copy.copy(tarinfo)
+
+        buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
+        self.fileobj.write(buf)
+        self.offset += len(buf)
+
+        # If there's data to follow, append it.
+        if fileobj is not None:
+            copyfileobj(fileobj, self.fileobj, tarinfo.size)
+            blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
+            if remainder > 0:
+                self.fileobj.write(NUL * (BLOCKSIZE - remainder))
+                blocks += 1
+            self.offset += blocks * BLOCKSIZE
+
+        self.members.append(tarinfo)
+
+    def extractall(self, path=".", members=None):
+        """Extract all members from the archive to the current working
+           directory and set owner, modification time and permissions on
+           directories afterwards. `path' specifies a different directory
+           to extract to. `members' is optional and must be a subset of the
+           list returned by getmembers().
+        """
+        directories = []
+
+        if members is None:
+            members = self
+
+        for tarinfo in members:
+            if tarinfo.isdir():
+                # Extract directories with a safe mode.
+                directories.append(tarinfo)
+                tarinfo = copy.copy(tarinfo)
+                tarinfo.mode = 0o700
+            # Do not set_attrs directories, as we will do that further down
+            self.extract(tarinfo, path, set_attrs=not tarinfo.isdir())
+
+        # Reverse sort directories.
+        directories.sort(key=lambda a: a.name)
+        directories.reverse()
+
+        # Set correct owner, mtime and filemode on directories.
+        for tarinfo in directories:
+            dirpath = os.path.join(path, tarinfo.name)
+            try:
+                self.chown(tarinfo, dirpath)
+                self.utime(tarinfo, dirpath)
+                self.chmod(tarinfo, dirpath)
+            except ExtractError as e:
+                if self.errorlevel > 1:
+                    raise
+                else:
+                    self._dbg(1, "tarfile: %s" % e)
+
+    def extract(self, member, path="", set_attrs=True):
+        """Extract a member from the archive to the current working directory,
+           using its full name. Its file information is extracted as accurately
+           as possible. `member' may be a filename or a TarInfo object. You can
+           specify a different directory using `path'. File attributes (owner,
+           mtime, mode) are set unless `set_attrs' is False.
+        """
+        self._check("r")
+
+        if isinstance(member, str):
+            tarinfo = self.getmember(member)
+        else:
+            tarinfo = member
+
+        # Prepare the link target for makelink().
+        if tarinfo.islnk():
+            tarinfo._link_target = os.path.join(path, tarinfo.linkname)
+
+        try:
+            self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
+                                 set_attrs=set_attrs)
+        except EnvironmentError as e:
+            if self.errorlevel > 0:
+                raise
+            else:
+                if e.filename is None:
+                    self._dbg(1, "tarfile: %s" % e.strerror)
+                else:
+                    self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename))
+        except ExtractError as e:
+            if self.errorlevel > 1:
+                raise
+            else:
+                self._dbg(1, "tarfile: %s" % e)
+
+    def extractfile(self, member):
+        """Extract a member from the archive as a file object. `member' may be
+           a filename or a TarInfo object. If `member' is a regular file, a
+           file-like object is returned. If `member' is a link, a file-like
+           object is constructed from the link's target. If `member' is none of
+           the above, None is returned.
+           The file-like object is read-only and provides the following
+           methods: read(), readline(), readlines(), seek() and tell()
+        """
+        self._check("r")
+
+        if isinstance(member, str):
+            tarinfo = self.getmember(member)
+        else:
+            tarinfo = member
+
+        if tarinfo.isreg():
+            return self.fileobject(self, tarinfo)
+
+        elif tarinfo.type not in SUPPORTED_TYPES:
+            # If a member's type is unknown, it is treated as a
+            # regular file.
+            return self.fileobject(self, tarinfo)
+
+        elif tarinfo.islnk() or tarinfo.issym():
+            if isinstance(self.fileobj, _Stream):
+                # A small but ugly workaround for the case that someone tries
+                # to extract a (sym)link as a file-object from a non-seekable
+                # stream of tar blocks.
+                raise StreamError("cannot extract (sym)link as file object")
+            else:
+                # A (sym)link's file object is its target's file object.
+                return self.extractfile(self._find_link_target(tarinfo))
+        else:
+            # If there's no data associated with the member (directory, chrdev,
+            # blkdev, etc.), return None instead of a file object.
+            return None
+
+    def _extract_member(self, tarinfo, targetpath, set_attrs=True):
+        """Extract the TarInfo object tarinfo to a physical
+           file called targetpath.
+        """
+        # Fetch the TarInfo object for the given name
+        # and build the destination pathname, replacing
+        # forward slashes to platform specific separators.
+        targetpath = targetpath.rstrip("/")
+        targetpath = targetpath.replace("/", os.sep)
+
+        # Create all upper directories.
+        upperdirs = os.path.dirname(targetpath)
+        if upperdirs and not os.path.exists(upperdirs):
+            # Create directories that are not part of the archive with
+            # default permissions.
+            os.makedirs(upperdirs)
+
+        if tarinfo.islnk() or tarinfo.issym():
+            self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname))
+        else:
+            self._dbg(1, tarinfo.name)
+
+        if tarinfo.isreg():
+            self.makefile(tarinfo, targetpath)
+        elif tarinfo.isdir():
+            self.makedir(tarinfo, targetpath)
+        elif tarinfo.isfifo():
+            self.makefifo(tarinfo, targetpath)
+        elif tarinfo.ischr() or tarinfo.isblk():
+            self.makedev(tarinfo, targetpath)
+        elif tarinfo.islnk() or tarinfo.issym():
+            self.makelink(tarinfo, targetpath)
+        elif tarinfo.type not in SUPPORTED_TYPES:
+            self.makeunknown(tarinfo, targetpath)
+        else:
+            self.makefile(tarinfo, targetpath)
+
+        if set_attrs:
+            self.chown(tarinfo, targetpath)
+            if not tarinfo.issym():
+                self.chmod(tarinfo, targetpath)
+                self.utime(tarinfo, targetpath)
+
+    #--------------------------------------------------------------------------
+    # Below are the different file methods. They are called via
+    # _extract_member() when extract() is called. They can be replaced in a
+    # subclass to implement other functionality.
+
+    def makedir(self, tarinfo, targetpath):
+        """Make a directory called targetpath.
+        """
+        try:
+            # Use a safe mode for the directory, the real mode is set
+            # later in _extract_member().
+            os.mkdir(targetpath, 0o700)
+        except EnvironmentError as e:
+            if e.errno != errno.EEXIST:
+                raise
+
+    def makefile(self, tarinfo, targetpath):
+        """Make a file called targetpath.
+        """
+        source = self.fileobj
+        source.seek(tarinfo.offset_data)
+        target = bltn_open(targetpath, "wb")
+        if tarinfo.sparse is not None:
+            for offset, size in tarinfo.sparse:
+                target.seek(offset)
+                copyfileobj(source, target, size)
+        else:
+            copyfileobj(source, target, tarinfo.size)
+        target.seek(tarinfo.size)
+        target.truncate()
+        target.close()
+
+    def makeunknown(self, tarinfo, targetpath):
+        """Make a file from a TarInfo object with an unknown type
+           at targetpath.
+        """
+        self.makefile(tarinfo, targetpath)
+        self._dbg(1, "tarfile: Unknown file type %r, " \
+                     "extracted as regular file." % tarinfo.type)
+
+    def makefifo(self, tarinfo, targetpath):
+        """Make a fifo called targetpath.
+        """
+        if hasattr(os, "mkfifo"):
+            os.mkfifo(targetpath)
+        else:
+            raise ExtractError("fifo not supported by system")
+
+    def makedev(self, tarinfo, targetpath):
+        """Make a character or block device called targetpath.
+        """
+        if not hasattr(os, "mknod") or not hasattr(os, "makedev"):
+            raise ExtractError("special devices not supported by system")
+
+        mode = tarinfo.mode
+        if tarinfo.isblk():
+            mode |= stat.S_IFBLK
+        else:
+            mode |= stat.S_IFCHR
+
+        os.mknod(targetpath, mode,
+                 os.makedev(tarinfo.devmajor, tarinfo.devminor))
+
+    def makelink(self, tarinfo, targetpath):
+        """Make a (symbolic) link called targetpath. If it cannot be created
+          (platform limitation), we try to make a copy of the referenced file
+          instead of a link.
+        """
+        try:
+            # For systems that support symbolic and hard links.
+            if tarinfo.issym():
+                os.symlink(tarinfo.linkname, targetpath)
+            else:
+                # See extract().
+                if os.path.exists(tarinfo._link_target):
+                    os.link(tarinfo._link_target, targetpath)
+                else:
+                    self._extract_member(self._find_link_target(tarinfo),
+                                         targetpath)
+        except symlink_exception:
+            if tarinfo.issym():
+                linkpath = os.path.join(os.path.dirname(tarinfo.name),
+                                        tarinfo.linkname)
+            else:
+                linkpath = tarinfo.linkname
+        else:
+            try:
+                self._extract_member(self._find_link_target(tarinfo),
+                                     targetpath)
+            except KeyError:
+                raise ExtractError("unable to resolve link inside archive")
+
+    def chown(self, tarinfo, targetpath):
+        """Set owner of targetpath according to tarinfo.
+        """
+        if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
+            # We have to be root to do so.
+            try:
+                g = grp.getgrnam(tarinfo.gname)[2]
+            except KeyError:
+                g = tarinfo.gid
+            try:
+                u = pwd.getpwnam(tarinfo.uname)[2]
+            except KeyError:
+                u = tarinfo.uid
+            try:
+                if tarinfo.issym() and hasattr(os, "lchown"):
+                    os.lchown(targetpath, u, g)
+                else:
+                    if sys.platform != "os2emx":
+                        os.chown(targetpath, u, g)
+            except EnvironmentError as e:
+                raise ExtractError("could not change owner")
+
+    def chmod(self, tarinfo, targetpath):
+        """Set file permissions of targetpath according to tarinfo.
+        """
+        if hasattr(os, 'chmod'):
+            try:
+                os.chmod(targetpath, tarinfo.mode)
+            except EnvironmentError as e:
+                raise ExtractError("could not change mode")
+
+    def utime(self, tarinfo, targetpath):
+        """Set modification time of targetpath according to tarinfo.
+        """
+        if not hasattr(os, 'utime'):
+            return
+        try:
+            os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
+        except EnvironmentError as e:
+            raise ExtractError("could not change modification time")
+
+    #--------------------------------------------------------------------------
+    def next(self):
+        """Return the next member of the archive as a TarInfo object, when
+           TarFile is opened for reading. Return None if there is no more
+           available.
+        """
+        self._check("ra")
+        if self.firstmember is not None:
+            m = self.firstmember
+            self.firstmember = None
+            return m
+
+        # Read the next block.
+        self.fileobj.seek(self.offset)
+        tarinfo = None
+        while True:
+            try:
+                tarinfo = self.tarinfo.fromtarfile(self)
+            except EOFHeaderError as e:
+                if self.ignore_zeros:
+                    self._dbg(2, "0x%X: %s" % (self.offset, e))
+                    self.offset += BLOCKSIZE
+                    continue
+            except InvalidHeaderError as e:
+                if self.ignore_zeros:
+                    self._dbg(2, "0x%X: %s" % (self.offset, e))
+                    self.offset += BLOCKSIZE
+                    continue
+                elif self.offset == 0:
+                    raise ReadError(str(e))
+            except EmptyHeaderError:
+                if self.offset == 0:
+                    raise ReadError("empty file")
+            except TruncatedHeaderError as e:
+                if self.offset == 0:
+                    raise ReadError(str(e))
+            except SubsequentHeaderError as e:
+                raise ReadError(str(e))
+            break
+
+        if tarinfo is not None:
+            self.members.append(tarinfo)
+        else:
+            self._loaded = True
+
+        return tarinfo
+
+    #--------------------------------------------------------------------------
+    # Little helper methods:
+
+    def _getmember(self, name, tarinfo=None, normalize=False):
+        """Find an archive member by name from bottom to top.
+           If tarinfo is given, it is used as the starting point.
+        """
+        # Ensure that all members have been loaded.
+        members = self.getmembers()
+
+        # Limit the member search list up to tarinfo.
+        if tarinfo is not None:
+            members = members[:members.index(tarinfo)]
+
+        if normalize:
+            name = os.path.normpath(name)
+
+        for member in reversed(members):
+            if normalize:
+                member_name = os.path.normpath(member.name)
+            else:
+                member_name = member.name
+
+            if name == member_name:
+                return member
+
+    def _load(self):
+        """Read through the entire archive file and look for readable
+           members.
+        """
+        while True:
+            tarinfo = self.next()
+            if tarinfo is None:
+                break
+        self._loaded = True
+
+    def _check(self, mode=None):
+        """Check if TarFile is still open, and if the operation's mode
+           corresponds to TarFile's mode.
+        """
+        if self.closed:
+            raise IOError("%s is closed" % self.__class__.__name__)
+        if mode is not None and self.mode not in mode:
+            raise IOError("bad operation for mode %r" % self.mode)
+
+    def _find_link_target(self, tarinfo):
+        """Find the target member of a symlink or hardlink member in the
+           archive.
+        """
+        if tarinfo.issym():
+            # Always search the entire archive.
+            linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname
+            limit = None
+        else:
+            # Search the archive before the link, because a hard link is
+            # just a reference to an already archived file.
+            linkname = tarinfo.linkname
+            limit = tarinfo
+
+        member = self._getmember(linkname, tarinfo=limit, normalize=True)
+        if member is None:
+            raise KeyError("linkname %r not found" % linkname)
+        return member
+
+    def __iter__(self):
+        """Provide an iterator object.
+        """
+        if self._loaded:
+            return iter(self.members)
+        else:
+            return TarIter(self)
+
+    def _dbg(self, level, msg):
+        """Write debugging output to sys.stderr.
+        """
+        if level <= self.debug:
+            print(msg, file=sys.stderr)
+
+    def __enter__(self):
+        self._check()
+        return self
+
+    def __exit__(self, type, value, traceback):
+        if type is None:
+            self.close()
+        else:
+            # An exception occurred. We must not call close() because
+            # it would try to write end-of-archive blocks and padding.
+            if not self._extfileobj:
+                self.fileobj.close()
+            self.closed = True
+# class TarFile
+
+class TarIter(object):
+    """Iterator Class.
+
+       for tarinfo in TarFile(...):
+           suite...
+    """
+
+    def __init__(self, tarfile):
+        """Construct a TarIter object.
+        """
+        self.tarfile = tarfile
+        self.index = 0
+    def __iter__(self):
+        """Return iterator object.
+        """
+        return self
+
+    def __next__(self):
+        """Return the next item using TarFile's next() method.
+           When all members have been read, set TarFile as _loaded.
+        """
+        # Fix for SF #1100429: Under rare circumstances it can
+        # happen that getmembers() is called during iteration,
+        # which will cause TarIter to stop prematurely.
+        if not self.tarfile._loaded:
+            tarinfo = self.tarfile.next()
+            if not tarinfo:
+                self.tarfile._loaded = True
+                raise StopIteration
+        else:
+            try:
+                tarinfo = self.tarfile.members[self.index]
+            except IndexError:
+                raise StopIteration
+        self.index += 1
+        return tarinfo
+
+    next = __next__ # for Python 2.x
+
+#--------------------
+# exported functions
+#--------------------
+def is_tarfile(name):
+    """Return True if name points to a tar archive that we
+       are able to handle, else return False.
+    """
+    try:
+        t = open(name)
+        t.close()
+        return True
+    except TarError:
+        return False
+
+bltn_open = open
+open = TarFile.open
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0bf7a7d675567d2b7ca8b1717d3146a980c59214
GIT binary patch
literal 86781
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
D=-i`Y

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py
new file mode 100644
index 00000000..ff328c8e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py
@@ -0,0 +1,1120 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2017 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from __future__ import absolute_import
+
+import os
+import re
+import sys
+
+try:
+    import ssl
+except ImportError:  # pragma: no cover
+    ssl = None
+
+if sys.version_info[0] < 3:  # pragma: no cover
+    from StringIO import StringIO
+    string_types = basestring,
+    text_type = unicode
+    from types import FileType as file_type
+    import __builtin__ as builtins
+    import ConfigParser as configparser
+    from ._backport import shutil
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
+    from urllib import (urlretrieve, quote as _quote, unquote, url2pathname,
+                        pathname2url, ContentTooShortError, splittype)
+
+    def quote(s):
+        if isinstance(s, unicode):
+            s = s.encode('utf-8')
+        return _quote(s)
+
+    import urllib2
+    from urllib2 import (Request, urlopen, URLError, HTTPError,
+                         HTTPBasicAuthHandler, HTTPPasswordMgr,
+                         HTTPHandler, HTTPRedirectHandler,
+                         build_opener)
+    if ssl:
+        from urllib2 import HTTPSHandler
+    import httplib
+    import xmlrpclib
+    import Queue as queue
+    from HTMLParser import HTMLParser
+    import htmlentitydefs
+    raw_input = raw_input
+    from itertools import ifilter as filter
+    from itertools import ifilterfalse as filterfalse
+
+    _userprog = None
+    def splituser(host):
+        """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
+        global _userprog
+        if _userprog is None:
+            import re
+            _userprog = re.compile('^(.*)@(.*)$')
+
+        match = _userprog.match(host)
+        if match: return match.group(1, 2)
+        return None, host
+
+else:  # pragma: no cover
+    from io import StringIO
+    string_types = str,
+    text_type = str
+    from io import TextIOWrapper as file_type
+    import builtins
+    import configparser
+    import shutil
+    from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote,
+                              unquote, urlsplit, urlunsplit, splittype)
+    from urllib.request import (urlopen, urlretrieve, Request, url2pathname,
+                                pathname2url,
+                                HTTPBasicAuthHandler, HTTPPasswordMgr,
+                                HTTPHandler, HTTPRedirectHandler,
+                                build_opener)
+    if ssl:
+        from urllib.request import HTTPSHandler
+    from urllib.error import HTTPError, URLError, ContentTooShortError
+    import http.client as httplib
+    import urllib.request as urllib2
+    import xmlrpc.client as xmlrpclib
+    import queue
+    from html.parser import HTMLParser
+    import html.entities as htmlentitydefs
+    raw_input = input
+    from itertools import filterfalse
+    filter = filter
+
+try:
+    from ssl import match_hostname, CertificateError
+except ImportError: # pragma: no cover
+    class CertificateError(ValueError):
+        pass
+
+
+    def _dnsname_match(dn, hostname, max_wildcards=1):
+        """Matching according to RFC 6125, section 6.4.3
+
+        http://tools.ietf.org/html/rfc6125#section-6.4.3
+        """
+        pats = []
+        if not dn:
+            return False
+
+        parts = dn.split('.')
+        leftmost, remainder = parts[0], parts[1:]
+
+        wildcards = leftmost.count('*')
+        if wildcards > max_wildcards:
+            # Issue #17980: avoid denials of service by refusing more
+            # than one wildcard per fragment.  A survey of established
+            # policy among SSL implementations showed it to be a
+            # reasonable choice.
+            raise CertificateError(
+                "too many wildcards in certificate DNS name: " + repr(dn))
+
+        # speed up common case w/o wildcards
+        if not wildcards:
+            return dn.lower() == hostname.lower()
+
+        # RFC 6125, section 6.4.3, subitem 1.
+        # The client SHOULD NOT attempt to match a presented identifier in which
+        # the wildcard character comprises a label other than the left-most label.
+        if leftmost == '*':
+            # When '*' is a fragment by itself, it matches a non-empty dotless
+            # fragment.
+            pats.append('[^.]+')
+        elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
+            # RFC 6125, section 6.4.3, subitem 3.
+            # The client SHOULD NOT attempt to match a presented identifier
+            # where the wildcard character is embedded within an A-label or
+            # U-label of an internationalized domain name.
+            pats.append(re.escape(leftmost))
+        else:
+            # Otherwise, '*' matches any dotless string, e.g. www*
+            pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
+
+        # add the remaining fragments, ignore any wildcards
+        for frag in remainder:
+            pats.append(re.escape(frag))
+
+        pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+        return pat.match(hostname)
+
+
+    def match_hostname(cert, hostname):
+        """Verify that *cert* (in decoded format as returned by
+        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
+        rules are followed, but IP addresses are not accepted for *hostname*.
+
+        CertificateError is raised on failure. On success, the function
+        returns nothing.
+        """
+        if not cert:
+            raise ValueError("empty or no certificate, match_hostname needs a "
+                             "SSL socket or SSL context with either "
+                             "CERT_OPTIONAL or CERT_REQUIRED")
+        dnsnames = []
+        san = cert.get('subjectAltName', ())
+        for key, value in san:
+            if key == 'DNS':
+                if _dnsname_match(value, hostname):
+                    return
+                dnsnames.append(value)
+        if not dnsnames:
+            # The subject is only checked when there is no dNSName entry
+            # in subjectAltName
+            for sub in cert.get('subject', ()):
+                for key, value in sub:
+                    # XXX according to RFC 2818, the most specific Common Name
+                    # must be used.
+                    if key == 'commonName':
+                        if _dnsname_match(value, hostname):
+                            return
+                        dnsnames.append(value)
+        if len(dnsnames) > 1:
+            raise CertificateError("hostname %r "
+                "doesn't match either of %s"
+                % (hostname, ', '.join(map(repr, dnsnames))))
+        elif len(dnsnames) == 1:
+            raise CertificateError("hostname %r "
+                "doesn't match %r"
+                % (hostname, dnsnames[0]))
+        else:
+            raise CertificateError("no appropriate commonName or "
+                "subjectAltName fields were found")
+
+
+try:
+    from types import SimpleNamespace as Container
+except ImportError:  # pragma: no cover
+    class Container(object):
+        """
+        A generic container for when multiple values need to be returned
+        """
+        def __init__(self, **kwargs):
+            self.__dict__.update(kwargs)
+
+
+try:
+    from shutil import which
+except ImportError:  # pragma: no cover
+    # Implementation from Python 3.3
+    def which(cmd, mode=os.F_OK | os.X_OK, path=None):
+        """Given a command, mode, and a PATH string, return the path which
+        conforms to the given mode on the PATH, or None if there is no such
+        file.
+
+        `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
+        of os.environ.get("PATH"), or can be overridden with a custom search
+        path.
+
+        """
+        # Check that a given file can be accessed with the correct mode.
+        # Additionally check that `file` is not a directory, as on Windows
+        # directories pass the os.access check.
+        def _access_check(fn, mode):
+            return (os.path.exists(fn) and os.access(fn, mode)
+                    and not os.path.isdir(fn))
+
+        # If we're given a path with a directory part, look it up directly rather
+        # than referring to PATH directories. This includes checking relative to the
+        # current directory, e.g. ./script
+        if os.path.dirname(cmd):
+            if _access_check(cmd, mode):
+                return cmd
+            return None
+
+        if path is None:
+            path = os.environ.get("PATH", os.defpath)
+        if not path:
+            return None
+        path = path.split(os.pathsep)
+
+        if sys.platform == "win32":
+            # The current directory takes precedence on Windows.
+            if not os.curdir in path:
+                path.insert(0, os.curdir)
+
+            # PATHEXT is necessary to check on Windows.
+            pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
+            # See if the given file matches any of the expected path extensions.
+            # This will allow us to short circuit when given "python.exe".
+            # If it does match, only test that one, otherwise we have to try
+            # others.
+            if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
+                files = [cmd]
+            else:
+                files = [cmd + ext for ext in pathext]
+        else:
+            # On other platforms you don't have things like PATHEXT to tell you
+            # what file suffixes are executable, so just pass on cmd as-is.
+            files = [cmd]
+
+        seen = set()
+        for dir in path:
+            normdir = os.path.normcase(dir)
+            if not normdir in seen:
+                seen.add(normdir)
+                for thefile in files:
+                    name = os.path.join(dir, thefile)
+                    if _access_check(name, mode):
+                        return name
+        return None
+
+
+# ZipFile is a context manager in 2.7, but not in 2.6
+
+from zipfile import ZipFile as BaseZipFile
+
+if hasattr(BaseZipFile, '__enter__'):  # pragma: no cover
+    ZipFile = BaseZipFile
+else:  # pragma: no cover
+    from zipfile import ZipExtFile as BaseZipExtFile
+
+    class ZipExtFile(BaseZipExtFile):
+        def __init__(self, base):
+            self.__dict__.update(base.__dict__)
+
+        def __enter__(self):
+            return self
+
+        def __exit__(self, *exc_info):
+            self.close()
+            # return None, so if an exception occurred, it will propagate
+
+    class ZipFile(BaseZipFile):
+        def __enter__(self):
+            return self
+
+        def __exit__(self, *exc_info):
+            self.close()
+            # return None, so if an exception occurred, it will propagate
+
+        def open(self, *args, **kwargs):
+            base = BaseZipFile.open(self, *args, **kwargs)
+            return ZipExtFile(base)
+
+try:
+    from platform import python_implementation
+except ImportError: # pragma: no cover
+    def python_implementation():
+        """Return a string identifying the Python implementation."""
+        if 'PyPy' in sys.version:
+            return 'PyPy'
+        if os.name == 'java':
+            return 'Jython'
+        if sys.version.startswith('IronPython'):
+            return 'IronPython'
+        return 'CPython'
+
+try:
+    import sysconfig
+except ImportError: # pragma: no cover
+    from ._backport import sysconfig
+
+try:
+    callable = callable
+except NameError:   # pragma: no cover
+    from collections import Callable
+
+    def callable(obj):
+        return isinstance(obj, Callable)
+
+
+try:
+    fsencode = os.fsencode
+    fsdecode = os.fsdecode
+except AttributeError:  # pragma: no cover
+    # Issue #99: on some systems (e.g. containerised),
+    # sys.getfilesystemencoding() returns None, and we need a real value,
+    # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and
+    # sys.getfilesystemencoding(): the return value is "the user’s preference
+    # according to the result of nl_langinfo(CODESET), or None if the
+    # nl_langinfo(CODESET) failed."
+    _fsencoding = sys.getfilesystemencoding() or 'utf-8'
+    if _fsencoding == 'mbcs':
+        _fserrors = 'strict'
+    else:
+        _fserrors = 'surrogateescape'
+
+    def fsencode(filename):
+        if isinstance(filename, bytes):
+            return filename
+        elif isinstance(filename, text_type):
+            return filename.encode(_fsencoding, _fserrors)
+        else:
+            raise TypeError("expect bytes or str, not %s" %
+                            type(filename).__name__)
+
+    def fsdecode(filename):
+        if isinstance(filename, text_type):
+            return filename
+        elif isinstance(filename, bytes):
+            return filename.decode(_fsencoding, _fserrors)
+        else:
+            raise TypeError("expect bytes or str, not %s" %
+                            type(filename).__name__)
+
+try:
+    from tokenize import detect_encoding
+except ImportError: # pragma: no cover
+    from codecs import BOM_UTF8, lookup
+    import re
+
+    cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)")
+
+    def _get_normal_name(orig_enc):
+        """Imitates get_normal_name in tokenizer.c."""
+        # Only care about the first 12 characters.
+        enc = orig_enc[:12].lower().replace("_", "-")
+        if enc == "utf-8" or enc.startswith("utf-8-"):
+            return "utf-8"
+        if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \
+           enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")):
+            return "iso-8859-1"
+        return orig_enc
+
+    def detect_encoding(readline):
+        """
+        The detect_encoding() function is used to detect the encoding that should
+        be used to decode a Python source file.  It requires one argument, readline,
+        in the same way as the tokenize() generator.
+
+        It will call readline a maximum of twice, and return the encoding used
+        (as a string) and a list of any lines (left as bytes) it has read in.
+
+        It detects the encoding from the presence of a utf-8 bom or an encoding
+        cookie as specified in pep-0263.  If both a bom and a cookie are present,
+        but disagree, a SyntaxError will be raised.  If the encoding cookie is an
+        invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
+        'utf-8-sig' is returned.
+
+        If no encoding is specified, then the default of 'utf-8' will be returned.
+        """
+        try:
+            filename = readline.__self__.name
+        except AttributeError:
+            filename = None
+        bom_found = False
+        encoding = None
+        default = 'utf-8'
+        def read_or_stop():
+            try:
+                return readline()
+            except StopIteration:
+                return b''
+
+        def find_cookie(line):
+            try:
+                # Decode as UTF-8. Either the line is an encoding declaration,
+                # in which case it should be pure ASCII, or it must be UTF-8
+                # per default encoding.
+                line_string = line.decode('utf-8')
+            except UnicodeDecodeError:
+                msg = "invalid or missing encoding declaration"
+                if filename is not None:
+                    msg = '{} for {!r}'.format(msg, filename)
+                raise SyntaxError(msg)
+
+            matches = cookie_re.findall(line_string)
+            if not matches:
+                return None
+            encoding = _get_normal_name(matches[0])
+            try:
+                codec = lookup(encoding)
+            except LookupError:
+                # This behaviour mimics the Python interpreter
+                if filename is None:
+                    msg = "unknown encoding: " + encoding
+                else:
+                    msg = "unknown encoding for {!r}: {}".format(filename,
+                            encoding)
+                raise SyntaxError(msg)
+
+            if bom_found:
+                if codec.name != 'utf-8':
+                    # This behaviour mimics the Python interpreter
+                    if filename is None:
+                        msg = 'encoding problem: utf-8'
+                    else:
+                        msg = 'encoding problem for {!r}: utf-8'.format(filename)
+                    raise SyntaxError(msg)
+                encoding += '-sig'
+            return encoding
+
+        first = read_or_stop()
+        if first.startswith(BOM_UTF8):
+            bom_found = True
+            first = first[3:]
+            default = 'utf-8-sig'
+        if not first:
+            return default, []
+
+        encoding = find_cookie(first)
+        if encoding:
+            return encoding, [first]
+
+        second = read_or_stop()
+        if not second:
+            return default, [first]
+
+        encoding = find_cookie(second)
+        if encoding:
+            return encoding, [first, second]
+
+        return default, [first, second]
+
+# For converting & <-> &amp; etc.
+try:
+    from html import escape
+except ImportError:
+    from cgi import escape
+if sys.version_info[:2] < (3, 4):
+    unescape = HTMLParser().unescape
+else:
+    from html import unescape
+
+try:
+    from collections import ChainMap
+except ImportError: # pragma: no cover
+    from collections import MutableMapping
+
+    try:
+        from reprlib import recursive_repr as _recursive_repr
+    except ImportError:
+        def _recursive_repr(fillvalue='...'):
+            '''
+            Decorator to make a repr function return fillvalue for a recursive
+            call
+            '''
+
+            def decorating_function(user_function):
+                repr_running = set()
+
+                def wrapper(self):
+                    key = id(self), get_ident()
+                    if key in repr_running:
+                        return fillvalue
+                    repr_running.add(key)
+                    try:
+                        result = user_function(self)
+                    finally:
+                        repr_running.discard(key)
+                    return result
+
+                # Can't use functools.wraps() here because of bootstrap issues
+                wrapper.__module__ = getattr(user_function, '__module__')
+                wrapper.__doc__ = getattr(user_function, '__doc__')
+                wrapper.__name__ = getattr(user_function, '__name__')
+                wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
+                return wrapper
+
+            return decorating_function
+
+    class ChainMap(MutableMapping):
+        ''' A ChainMap groups multiple dicts (or other mappings) together
+        to create a single, updateable view.
+
+        The underlying mappings are stored in a list.  That list is public and can
+        accessed or updated using the *maps* attribute.  There is no other state.
+
+        Lookups search the underlying mappings successively until a key is found.
+        In contrast, writes, updates, and deletions only operate on the first
+        mapping.
+
+        '''
+
+        def __init__(self, *maps):
+            '''Initialize a ChainMap by setting *maps* to the given mappings.
+            If no mappings are provided, a single empty dictionary is used.
+
+            '''
+            self.maps = list(maps) or [{}]          # always at least one map
+
+        def __missing__(self, key):
+            raise KeyError(key)
+
+        def __getitem__(self, key):
+            for mapping in self.maps:
+                try:
+                    return mapping[key]             # can't use 'key in mapping' with defaultdict
+                except KeyError:
+                    pass
+            return self.__missing__(key)            # support subclasses that define __missing__
+
+        def get(self, key, default=None):
+            return self[key] if key in self else default
+
+        def __len__(self):
+            return len(set().union(*self.maps))     # reuses stored hash values if possible
+
+        def __iter__(self):
+            return iter(set().union(*self.maps))
+
+        def __contains__(self, key):
+            return any(key in m for m in self.maps)
+
+        def __bool__(self):
+            return any(self.maps)
+
+        @_recursive_repr()
+        def __repr__(self):
+            return '{0.__class__.__name__}({1})'.format(
+                self, ', '.join(map(repr, self.maps)))
+
+        @classmethod
+        def fromkeys(cls, iterable, *args):
+            'Create a ChainMap with a single dict created from the iterable.'
+            return cls(dict.fromkeys(iterable, *args))
+
+        def copy(self):
+            'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]'
+            return self.__class__(self.maps[0].copy(), *self.maps[1:])
+
+        __copy__ = copy
+
+        def new_child(self):                        # like Django's Context.push()
+            'New ChainMap with a new dict followed by all previous maps.'
+            return self.__class__({}, *self.maps)
+
+        @property
+        def parents(self):                          # like Django's Context.pop()
+            'New ChainMap from maps[1:].'
+            return self.__class__(*self.maps[1:])
+
+        def __setitem__(self, key, value):
+            self.maps[0][key] = value
+
+        def __delitem__(self, key):
+            try:
+                del self.maps[0][key]
+            except KeyError:
+                raise KeyError('Key not found in the first mapping: {!r}'.format(key))
+
+        def popitem(self):
+            'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.'
+            try:
+                return self.maps[0].popitem()
+            except KeyError:
+                raise KeyError('No keys found in the first mapping.')
+
+        def pop(self, key, *args):
+            'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].'
+            try:
+                return self.maps[0].pop(key, *args)
+            except KeyError:
+                raise KeyError('Key not found in the first mapping: {!r}'.format(key))
+
+        def clear(self):
+            'Clear maps[0], leaving maps[1:] intact.'
+            self.maps[0].clear()
+
+try:
+    from importlib.util import cache_from_source  # Python >= 3.4
+except ImportError:  # pragma: no cover
+    try:
+        from imp import cache_from_source
+    except ImportError:  # pragma: no cover
+        def cache_from_source(path, debug_override=None):
+            assert path.endswith('.py')
+            if debug_override is None:
+                debug_override = __debug__
+            if debug_override:
+                suffix = 'c'
+            else:
+                suffix = 'o'
+            return path + suffix
+
+try:
+    from collections import OrderedDict
+except ImportError: # pragma: no cover
+## {{{ http://code.activestate.com/recipes/576693/ (r9)
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
+# Passes Python2.7's test suite and incorporates all the latest updates.
+    try:
+        from thread import get_ident as _get_ident
+    except ImportError:
+        from dummy_thread import get_ident as _get_ident
+
+    try:
+        from _abcoll import KeysView, ValuesView, ItemsView
+    except ImportError:
+        pass
+
+
+    class OrderedDict(dict):
+        'Dictionary that remembers insertion order'
+        # An inherited dict maps keys to values.
+        # The inherited dict provides __getitem__, __len__, __contains__, and get.
+        # The remaining methods are order-aware.
+        # Big-O running times for all methods are the same as for regular dictionaries.
+
+        # The internal self.__map dictionary maps keys to links in a doubly linked list.
+        # The circular doubly linked list starts and ends with a sentinel element.
+        # The sentinel element never gets deleted (this simplifies the algorithm).
+        # Each link is stored as a list of length three:  [PREV, NEXT, KEY].
+
+        def __init__(self, *args, **kwds):
+            '''Initialize an ordered dictionary.  Signature is the same as for
+            regular dictionaries, but keyword arguments are not recommended
+            because their insertion order is arbitrary.
+
+            '''
+            if len(args) > 1:
+                raise TypeError('expected at most 1 arguments, got %d' % len(args))
+            try:
+                self.__root
+            except AttributeError:
+                self.__root = root = []                     # sentinel node
+                root[:] = [root, root, None]
+                self.__map = {}
+            self.__update(*args, **kwds)
+
+        def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
+            'od.__setitem__(i, y) <==> od[i]=y'
+            # Setting a new item creates a new link which goes at the end of the linked
+            # list, and the inherited dictionary is updated with the new key/value pair.
+            if key not in self:
+                root = self.__root
+                last = root[0]
+                last[1] = root[0] = self.__map[key] = [last, root, key]
+            dict_setitem(self, key, value)
+
+        def __delitem__(self, key, dict_delitem=dict.__delitem__):
+            'od.__delitem__(y) <==> del od[y]'
+            # Deleting an existing item uses self.__map to find the link which is
+            # then removed by updating the links in the predecessor and successor nodes.
+            dict_delitem(self, key)
+            link_prev, link_next, key = self.__map.pop(key)
+            link_prev[1] = link_next
+            link_next[0] = link_prev
+
+        def __iter__(self):
+            'od.__iter__() <==> iter(od)'
+            root = self.__root
+            curr = root[1]
+            while curr is not root:
+                yield curr[2]
+                curr = curr[1]
+
+        def __reversed__(self):
+            'od.__reversed__() <==> reversed(od)'
+            root = self.__root
+            curr = root[0]
+            while curr is not root:
+                yield curr[2]
+                curr = curr[0]
+
+        def clear(self):
+            'od.clear() -> None.  Remove all items from od.'
+            try:
+                for node in self.__map.itervalues():
+                    del node[:]
+                root = self.__root
+                root[:] = [root, root, None]
+                self.__map.clear()
+            except AttributeError:
+                pass
+            dict.clear(self)
+
+        def popitem(self, last=True):
+            '''od.popitem() -> (k, v), return and remove a (key, value) pair.
+            Pairs are returned in LIFO order if last is true or FIFO order if false.
+
+            '''
+            if not self:
+                raise KeyError('dictionary is empty')
+            root = self.__root
+            if last:
+                link = root[0]
+                link_prev = link[0]
+                link_prev[1] = root
+                root[0] = link_prev
+            else:
+                link = root[1]
+                link_next = link[1]
+                root[1] = link_next
+                link_next[0] = root
+            key = link[2]
+            del self.__map[key]
+            value = dict.pop(self, key)
+            return key, value
+
+        # -- the following methods do not depend on the internal structure --
+
+        def keys(self):
+            'od.keys() -> list of keys in od'
+            return list(self)
+
+        def values(self):
+            'od.values() -> list of values in od'
+            return [self[key] for key in self]
+
+        def items(self):
+            'od.items() -> list of (key, value) pairs in od'
+            return [(key, self[key]) for key in self]
+
+        def iterkeys(self):
+            'od.iterkeys() -> an iterator over the keys in od'
+            return iter(self)
+
+        def itervalues(self):
+            'od.itervalues -> an iterator over the values in od'
+            for k in self:
+                yield self[k]
+
+        def iteritems(self):
+            'od.iteritems -> an iterator over the (key, value) items in od'
+            for k in self:
+                yield (k, self[k])
+
+        def update(*args, **kwds):
+            '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.
+
+            If E is a dict instance, does:           for k in E: od[k] = E[k]
+            If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
+            Or if E is an iterable of items, does:   for k, v in E: od[k] = v
+            In either case, this is followed by:     for k, v in F.items(): od[k] = v
+
+            '''
+            if len(args) > 2:
+                raise TypeError('update() takes at most 2 positional '
+                                'arguments (%d given)' % (len(args),))
+            elif not args:
+                raise TypeError('update() takes at least 1 argument (0 given)')
+            self = args[0]
+            # Make progressively weaker assumptions about "other"
+            other = ()
+            if len(args) == 2:
+                other = args[1]
+            if isinstance(other, dict):
+                for key in other:
+                    self[key] = other[key]
+            elif hasattr(other, 'keys'):
+                for key in other.keys():
+                    self[key] = other[key]
+            else:
+                for key, value in other:
+                    self[key] = value
+            for key, value in kwds.items():
+                self[key] = value
+
+        __update = update  # let subclasses override update without breaking __init__
+
+        __marker = object()
+
+        def pop(self, key, default=__marker):
+            '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+            If key is not found, d is returned if given, otherwise KeyError is raised.
+
+            '''
+            if key in self:
+                result = self[key]
+                del self[key]
+                return result
+            if default is self.__marker:
+                raise KeyError(key)
+            return default
+
+        def setdefault(self, key, default=None):
+            'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
+            if key in self:
+                return self[key]
+            self[key] = default
+            return default
+
+        def __repr__(self, _repr_running=None):
+            'od.__repr__() <==> repr(od)'
+            if not _repr_running: _repr_running = {}
+            call_key = id(self), _get_ident()
+            if call_key in _repr_running:
+                return '...'
+            _repr_running[call_key] = 1
+            try:
+                if not self:
+                    return '%s()' % (self.__class__.__name__,)
+                return '%s(%r)' % (self.__class__.__name__, self.items())
+            finally:
+                del _repr_running[call_key]
+
+        def __reduce__(self):
+            'Return state information for pickling'
+            items = [[k, self[k]] for k in self]
+            inst_dict = vars(self).copy()
+            for k in vars(OrderedDict()):
+                inst_dict.pop(k, None)
+            if inst_dict:
+                return (self.__class__, (items,), inst_dict)
+            return self.__class__, (items,)
+
+        def copy(self):
+            'od.copy() -> a shallow copy of od'
+            return self.__class__(self)
+
+        @classmethod
+        def fromkeys(cls, iterable, value=None):
+            '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
+            and values equal to v (which defaults to None).
+
+            '''
+            d = cls()
+            for key in iterable:
+                d[key] = value
+            return d
+
+        def __eq__(self, other):
+            '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
+            while comparison to a regular mapping is order-insensitive.
+
+            '''
+            if isinstance(other, OrderedDict):
+                return len(self)==len(other) and self.items() == other.items()
+            return dict.__eq__(self, other)
+
+        def __ne__(self, other):
+            return not self == other
+
+        # -- the following methods are only used in Python 2.7 --
+
+        def viewkeys(self):
+            "od.viewkeys() -> a set-like object providing a view on od's keys"
+            return KeysView(self)
+
+        def viewvalues(self):
+            "od.viewvalues() -> an object providing a view on od's values"
+            return ValuesView(self)
+
+        def viewitems(self):
+            "od.viewitems() -> a set-like object providing a view on od's items"
+            return ItemsView(self)
+
+try:
+    from logging.config import BaseConfigurator, valid_ident
+except ImportError: # pragma: no cover
+    IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)
+
+
+    def valid_ident(s):
+        m = IDENTIFIER.match(s)
+        if not m:
+            raise ValueError('Not a valid Python identifier: %r' % s)
+        return True
+
+
+    # The ConvertingXXX classes are wrappers around standard Python containers,
+    # and they serve to convert any suitable values in the container. The
+    # conversion converts base dicts, lists and tuples to their wrapped
+    # equivalents, whereas strings which match a conversion format are converted
+    # appropriately.
+    #
+    # Each wrapper should have a configurator attribute holding the actual
+    # configurator to use for conversion.
+
+    class ConvertingDict(dict):
+        """A converting dictionary wrapper."""
+
+        def __getitem__(self, key):
+            value = dict.__getitem__(self, key)
+            result = self.configurator.convert(value)
+            #If the converted value is different, save for next time
+            if value is not result:
+                self[key] = result
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+        def get(self, key, default=None):
+            value = dict.get(self, key, default)
+            result = self.configurator.convert(value)
+            #If the converted value is different, save for next time
+            if value is not result:
+                self[key] = result
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+    def pop(self, key, default=None):
+        value = dict.pop(self, key, default)
+        result = self.configurator.convert(value)
+        if value is not result:
+            if type(result) in (ConvertingDict, ConvertingList,
+                                ConvertingTuple):
+                result.parent = self
+                result.key = key
+        return result
+
+    class ConvertingList(list):
+        """A converting list wrapper."""
+        def __getitem__(self, key):
+            value = list.__getitem__(self, key)
+            result = self.configurator.convert(value)
+            #If the converted value is different, save for next time
+            if value is not result:
+                self[key] = result
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+        def pop(self, idx=-1):
+            value = list.pop(self, idx)
+            result = self.configurator.convert(value)
+            if value is not result:
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+            return result
+
+    class ConvertingTuple(tuple):
+        """A converting tuple wrapper."""
+        def __getitem__(self, key):
+            value = tuple.__getitem__(self, key)
+            result = self.configurator.convert(value)
+            if value is not result:
+                if type(result) in (ConvertingDict, ConvertingList,
+                                    ConvertingTuple):
+                    result.parent = self
+                    result.key = key
+            return result
+
+    class BaseConfigurator(object):
+        """
+        The configurator base class which defines some useful defaults.
+        """
+
+        CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')
+
+        WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
+        DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
+        INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
+        DIGIT_PATTERN = re.compile(r'^\d+$')
+
+        value_converters = {
+            'ext' : 'ext_convert',
+            'cfg' : 'cfg_convert',
+        }
+
+        # We might want to use a different one, e.g. importlib
+        importer = staticmethod(__import__)
+
+        def __init__(self, config):
+            self.config = ConvertingDict(config)
+            self.config.configurator = self
+
+        def resolve(self, s):
+            """
+            Resolve strings to objects using standard import and attribute
+            syntax.
+            """
+            name = s.split('.')
+            used = name.pop(0)
+            try:
+                found = self.importer(used)
+                for frag in name:
+                    used += '.' + frag
+                    try:
+                        found = getattr(found, frag)
+                    except AttributeError:
+                        self.importer(used)
+                        found = getattr(found, frag)
+                return found
+            except ImportError:
+                e, tb = sys.exc_info()[1:]
+                v = ValueError('Cannot resolve %r: %s' % (s, e))
+                v.__cause__, v.__traceback__ = e, tb
+                raise v
+
+        def ext_convert(self, value):
+            """Default converter for the ext:// protocol."""
+            return self.resolve(value)
+
+        def cfg_convert(self, value):
+            """Default converter for the cfg:// protocol."""
+            rest = value
+            m = self.WORD_PATTERN.match(rest)
+            if m is None:
+                raise ValueError("Unable to convert %r" % value)
+            else:
+                rest = rest[m.end():]
+                d = self.config[m.groups()[0]]
+                #print d, rest
+                while rest:
+                    m = self.DOT_PATTERN.match(rest)
+                    if m:
+                        d = d[m.groups()[0]]
+                    else:
+                        m = self.INDEX_PATTERN.match(rest)
+                        if m:
+                            idx = m.groups()[0]
+                            if not self.DIGIT_PATTERN.match(idx):
+                                d = d[idx]
+                            else:
+                                try:
+                                    n = int(idx) # try as number first (most likely)
+                                    d = d[n]
+                                except TypeError:
+                                    d = d[idx]
+                    if m:
+                        rest = rest[m.end():]
+                    else:
+                        raise ValueError('Unable to convert '
+                                         '%r at %r' % (value, rest))
+            #rest should be empty
+            return d
+
+        def convert(self, value):
+            """
+            Convert values to an appropriate type. dicts, lists and tuples are
+            replaced by their converting alternatives. Strings are checked to
+            see if they have a conversion format and are converted if they do.
+            """
+            if not isinstance(value, ConvertingDict) and isinstance(value, dict):
+                value = ConvertingDict(value)
+                value.configurator = self
+            elif not isinstance(value, ConvertingList) and isinstance(value, list):
+                value = ConvertingList(value)
+                value.configurator = self
+            elif not isinstance(value, ConvertingTuple) and\
+                     isinstance(value, tuple):
+                value = ConvertingTuple(value)
+                value.configurator = self
+            elif isinstance(value, string_types):
+                m = self.CONVERT_PATTERN.match(value)
+                if m:
+                    d = m.groupdict()
+                    prefix = d['prefix']
+                    converter = self.value_converters.get(prefix, None)
+                    if converter:
+                        suffix = d['suffix']
+                        converter = getattr(self, converter)
+                        value = converter(suffix)
+            return value
+
+        def configure_custom(self, config):
+            """Configure an object with a user-supplied factory."""
+            c = config.pop('()')
+            if not callable(c):
+                c = self.resolve(c)
+            props = config.pop('.', None)
+            # Check for valid identifiers
+            kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
+            result = c(**kwargs)
+            if props:
+                for name, value in props.items():
+                    setattr(result, name, value)
+            return result
+
+        def as_tuple(self, value):
+            """Utility function which converts lists to tuples."""
+            if isinstance(value, list):
+                value = tuple(value)
+            return value
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..da135e26559f52a66428e390ffa658c530b23a67
GIT binary patch
literal 44256
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py
new file mode 100644
index 00000000..b13cdac9
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py
@@ -0,0 +1,1339 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2017 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""PEP 376 implementation."""
+
+from __future__ import unicode_literals
+
+import base64
+import codecs
+import contextlib
+import hashlib
+import logging
+import os
+import posixpath
+import sys
+import zipimport
+
+from . import DistlibException, resources
+from .compat import StringIO
+from .version import get_scheme, UnsupportedVersionError
+from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME,
+                       LEGACY_METADATA_FILENAME)
+from .util import (parse_requirement, cached_property, parse_name_and_version,
+                   read_exports, write_exports, CSVReader, CSVWriter)
+
+
+__all__ = ['Distribution', 'BaseInstalledDistribution',
+           'InstalledDistribution', 'EggInfoDistribution',
+           'DistributionPath']
+
+
+logger = logging.getLogger(__name__)
+
+EXPORTS_FILENAME = 'pydist-exports.json'
+COMMANDS_FILENAME = 'pydist-commands.json'
+
+DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED',
+              'RESOURCES', EXPORTS_FILENAME, 'SHARED')
+
+DISTINFO_EXT = '.dist-info'
+
+
+class _Cache(object):
+    """
+    A simple cache mapping names and .dist-info paths to distributions
+    """
+    def __init__(self):
+        """
+        Initialise an instance. There is normally one for each DistributionPath.
+        """
+        self.name = {}
+        self.path = {}
+        self.generated = False
+
+    def clear(self):
+        """
+        Clear the cache, setting it to its initial state.
+        """
+        self.name.clear()
+        self.path.clear()
+        self.generated = False
+
+    def add(self, dist):
+        """
+        Add a distribution to the cache.
+        :param dist: The distribution to add.
+        """
+        if dist.path not in self.path:
+            self.path[dist.path] = dist
+            self.name.setdefault(dist.key, []).append(dist)
+
+
+class DistributionPath(object):
+    """
+    Represents a set of distributions installed on a path (typically sys.path).
+    """
+    def __init__(self, path=None, include_egg=False):
+        """
+        Create an instance from a path, optionally including legacy (distutils/
+        setuptools/distribute) distributions.
+        :param path: The path to use, as a list of directories. If not specified,
+                     sys.path is used.
+        :param include_egg: If True, this instance will look for and return legacy
+                            distributions as well as those based on PEP 376.
+        """
+        if path is None:
+            path = sys.path
+        self.path = path
+        self._include_dist = True
+        self._include_egg = include_egg
+
+        self._cache = _Cache()
+        self._cache_egg = _Cache()
+        self._cache_enabled = True
+        self._scheme = get_scheme('default')
+
+    def _get_cache_enabled(self):
+        return self._cache_enabled
+
+    def _set_cache_enabled(self, value):
+        self._cache_enabled = value
+
+    cache_enabled = property(_get_cache_enabled, _set_cache_enabled)
+
+    def clear_cache(self):
+        """
+        Clears the internal cache.
+        """
+        self._cache.clear()
+        self._cache_egg.clear()
+
+
+    def _yield_distributions(self):
+        """
+        Yield .dist-info and/or .egg(-info) distributions.
+        """
+        # We need to check if we've seen some resources already, because on
+        # some Linux systems (e.g. some Debian/Ubuntu variants) there are
+        # symlinks which alias other files in the environment.
+        seen = set()
+        for path in self.path:
+            finder = resources.finder_for_path(path)
+            if finder is None:
+                continue
+            r = finder.find('')
+            if not r or not r.is_container:
+                continue
+            rset = sorted(r.resources)
+            for entry in rset:
+                r = finder.find(entry)
+                if not r or r.path in seen:
+                    continue
+                if self._include_dist and entry.endswith(DISTINFO_EXT):
+                    possible_filenames = [METADATA_FILENAME,
+                                          WHEEL_METADATA_FILENAME,
+                                          LEGACY_METADATA_FILENAME]
+                    for metadata_filename in possible_filenames:
+                        metadata_path = posixpath.join(entry, metadata_filename)
+                        pydist = finder.find(metadata_path)
+                        if pydist:
+                            break
+                    else:
+                        continue
+
+                    with contextlib.closing(pydist.as_stream()) as stream:
+                        metadata = Metadata(fileobj=stream, scheme='legacy')
+                    logger.debug('Found %s', r.path)
+                    seen.add(r.path)
+                    yield new_dist_class(r.path, metadata=metadata,
+                                         env=self)
+                elif self._include_egg and entry.endswith(('.egg-info',
+                                                          '.egg')):
+                    logger.debug('Found %s', r.path)
+                    seen.add(r.path)
+                    yield old_dist_class(r.path, self)
+
+    def _generate_cache(self):
+        """
+        Scan the path for distributions and populate the cache with
+        those that are found.
+        """
+        gen_dist = not self._cache.generated
+        gen_egg = self._include_egg and not self._cache_egg.generated
+        if gen_dist or gen_egg:
+            for dist in self._yield_distributions():
+                if isinstance(dist, InstalledDistribution):
+                    self._cache.add(dist)
+                else:
+                    self._cache_egg.add(dist)
+
+            if gen_dist:
+                self._cache.generated = True
+            if gen_egg:
+                self._cache_egg.generated = True
+
+    @classmethod
+    def distinfo_dirname(cls, name, version):
+        """
+        The *name* and *version* parameters are converted into their
+        filename-escaped form, i.e. any ``'-'`` characters are replaced
+        with ``'_'`` other than the one in ``'dist-info'`` and the one
+        separating the name from the version number.
+
+        :parameter name: is converted to a standard distribution name by replacing
+                         any runs of non- alphanumeric characters with a single
+                         ``'-'``.
+        :type name: string
+        :parameter version: is converted to a standard version string. Spaces
+                            become dots, and all other non-alphanumeric characters
+                            (except dots) become dashes, with runs of multiple
+                            dashes condensed to a single dash.
+        :type version: string
+        :returns: directory name
+        :rtype: string"""
+        name = name.replace('-', '_')
+        return '-'.join([name, version]) + DISTINFO_EXT
+
+    def get_distributions(self):
+        """
+        Provides an iterator that looks for distributions and returns
+        :class:`InstalledDistribution` or
+        :class:`EggInfoDistribution` instances for each one of them.
+
+        :rtype: iterator of :class:`InstalledDistribution` and
+                :class:`EggInfoDistribution` instances
+        """
+        if not self._cache_enabled:
+            for dist in self._yield_distributions():
+                yield dist
+        else:
+            self._generate_cache()
+
+            for dist in self._cache.path.values():
+                yield dist
+
+            if self._include_egg:
+                for dist in self._cache_egg.path.values():
+                    yield dist
+
+    def get_distribution(self, name):
+        """
+        Looks for a named distribution on the path.
+
+        This function only returns the first result found, as no more than one
+        value is expected. If nothing is found, ``None`` is returned.
+
+        :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution`
+                or ``None``
+        """
+        result = None
+        name = name.lower()
+        if not self._cache_enabled:
+            for dist in self._yield_distributions():
+                if dist.key == name:
+                    result = dist
+                    break
+        else:
+            self._generate_cache()
+
+            if name in self._cache.name:
+                result = self._cache.name[name][0]
+            elif self._include_egg and name in self._cache_egg.name:
+                result = self._cache_egg.name[name][0]
+        return result
+
+    def provides_distribution(self, name, version=None):
+        """
+        Iterates over all distributions to find which distributions provide *name*.
+        If a *version* is provided, it will be used to filter the results.
+
+        This function only returns the first result found, since no more than
+        one values are expected. If the directory is not found, returns ``None``.
+
+        :parameter version: a version specifier that indicates the version
+                            required, conforming to the format in ``PEP-345``
+
+        :type name: string
+        :type version: string
+        """
+        matcher = None
+        if version is not None:
+            try:
+                matcher = self._scheme.matcher('%s (%s)' % (name, version))
+            except ValueError:
+                raise DistlibException('invalid name or version: %r, %r' %
+                                      (name, version))
+
+        for dist in self.get_distributions():
+            # We hit a problem on Travis where enum34 was installed and doesn't
+            # have a provides attribute ...
+            if not hasattr(dist, 'provides'):
+                logger.debug('No "provides": %s', dist)
+            else:
+                provided = dist.provides
+
+                for p in provided:
+                    p_name, p_ver = parse_name_and_version(p)
+                    if matcher is None:
+                        if p_name == name:
+                            yield dist
+                            break
+                    else:
+                        if p_name == name and matcher.match(p_ver):
+                            yield dist
+                            break
+
+    def get_file_path(self, name, relative_path):
+        """
+        Return the path to a resource file.
+        """
+        dist = self.get_distribution(name)
+        if dist is None:
+            raise LookupError('no distribution named %r found' % name)
+        return dist.get_resource_path(relative_path)
+
+    def get_exported_entries(self, category, name=None):
+        """
+        Return all of the exported entries in a particular category.
+
+        :param category: The category to search for entries.
+        :param name: If specified, only entries with that name are returned.
+        """
+        for dist in self.get_distributions():
+            r = dist.exports
+            if category in r:
+                d = r[category]
+                if name is not None:
+                    if name in d:
+                        yield d[name]
+                else:
+                    for v in d.values():
+                        yield v
+
+
+class Distribution(object):
+    """
+    A base class for distributions, whether installed or from indexes.
+    Either way, it must have some metadata, so that's all that's needed
+    for construction.
+    """
+
+    build_time_dependency = False
+    """
+    Set to True if it's known to be only a build-time dependency (i.e.
+    not needed after installation).
+    """
+
+    requested = False
+    """A boolean that indicates whether the ``REQUESTED`` metadata file is
+    present (in other words, whether the package was installed by user
+    request or it was installed as a dependency)."""
+
+    def __init__(self, metadata):
+        """
+        Initialise an instance.
+        :param metadata: The instance of :class:`Metadata` describing this
+        distribution.
+        """
+        self.metadata = metadata
+        self.name = metadata.name
+        self.key = self.name.lower()    # for case-insensitive comparisons
+        self.version = metadata.version
+        self.locator = None
+        self.digest = None
+        self.extras = None      # additional features requested
+        self.context = None     # environment marker overrides
+        self.download_urls = set()
+        self.digests = {}
+
+    @property
+    def source_url(self):
+        """
+        The source archive download URL for this distribution.
+        """
+        return self.metadata.source_url
+
+    download_url = source_url   # Backward compatibility
+
+    @property
+    def name_and_version(self):
+        """
+        A utility property which displays the name and version in parentheses.
+        """
+        return '%s (%s)' % (self.name, self.version)
+
+    @property
+    def provides(self):
+        """
+        A set of distribution names and versions provided by this distribution.
+        :return: A set of "name (version)" strings.
+        """
+        plist = self.metadata.provides
+        s = '%s (%s)' % (self.name, self.version)
+        if s not in plist:
+            plist.append(s)
+        return plist
+
+    def _get_requirements(self, req_attr):
+        md = self.metadata
+        logger.debug('Getting requirements from metadata %r', md.todict())
+        reqts = getattr(md, req_attr)
+        return set(md.get_requirements(reqts, extras=self.extras,
+                                       env=self.context))
+
+    @property
+    def run_requires(self):
+        return self._get_requirements('run_requires')
+
+    @property
+    def meta_requires(self):
+        return self._get_requirements('meta_requires')
+
+    @property
+    def build_requires(self):
+        return self._get_requirements('build_requires')
+
+    @property
+    def test_requires(self):
+        return self._get_requirements('test_requires')
+
+    @property
+    def dev_requires(self):
+        return self._get_requirements('dev_requires')
+
+    def matches_requirement(self, req):
+        """
+        Say if this instance matches (fulfills) a requirement.
+        :param req: The requirement to match.
+        :rtype req: str
+        :return: True if it matches, else False.
+        """
+        # Requirement may contain extras - parse to lose those
+        # from what's passed to the matcher
+        r = parse_requirement(req)
+        scheme = get_scheme(self.metadata.scheme)
+        try:
+            matcher = scheme.matcher(r.requirement)
+        except UnsupportedVersionError:
+            # XXX compat-mode if cannot read the version
+            logger.warning('could not read version %r - using name only',
+                           req)
+            name = req.split()[0]
+            matcher = scheme.matcher(name)
+
+        name = matcher.key   # case-insensitive
+
+        result = False
+        for p in self.provides:
+            p_name, p_ver = parse_name_and_version(p)
+            if p_name != name:
+                continue
+            try:
+                result = matcher.match(p_ver)
+                break
+            except UnsupportedVersionError:
+                pass
+        return result
+
+    def __repr__(self):
+        """
+        Return a textual representation of this instance,
+        """
+        if self.source_url:
+            suffix = ' [%s]' % self.source_url
+        else:
+            suffix = ''
+        return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix)
+
+    def __eq__(self, other):
+        """
+        See if this distribution is the same as another.
+        :param other: The distribution to compare with. To be equal to one
+                      another. distributions must have the same type, name,
+                      version and source_url.
+        :return: True if it is the same, else False.
+        """
+        if type(other) is not type(self):
+            result = False
+        else:
+            result = (self.name == other.name and
+                      self.version == other.version and
+                      self.source_url == other.source_url)
+        return result
+
+    def __hash__(self):
+        """
+        Compute hash in a way which matches the equality test.
+        """
+        return hash(self.name) + hash(self.version) + hash(self.source_url)
+
+
+class BaseInstalledDistribution(Distribution):
+    """
+    This is the base class for installed distributions (whether PEP 376 or
+    legacy).
+    """
+
+    hasher = None
+
+    def __init__(self, metadata, path, env=None):
+        """
+        Initialise an instance.
+        :param metadata: An instance of :class:`Metadata` which describes the
+                         distribution. This will normally have been initialised
+                         from a metadata file in the ``path``.
+        :param path:     The path of the ``.dist-info`` or ``.egg-info``
+                         directory for the distribution.
+        :param env:      This is normally the :class:`DistributionPath`
+                         instance where this distribution was found.
+        """
+        super(BaseInstalledDistribution, self).__init__(metadata)
+        self.path = path
+        self.dist_path = env
+
+    def get_hash(self, data, hasher=None):
+        """
+        Get the hash of some data, using a particular hash algorithm, if
+        specified.
+
+        :param data: The data to be hashed.
+        :type data: bytes
+        :param hasher: The name of a hash implementation, supported by hashlib,
+                       or ``None``. Examples of valid values are ``'sha1'``,
+                       ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and
+                       ``'sha512'``. If no hasher is specified, the ``hasher``
+                       attribute of the :class:`InstalledDistribution` instance
+                       is used. If the hasher is determined to be ``None``, MD5
+                       is used as the hashing algorithm.
+        :returns: The hash of the data. If a hasher was explicitly specified,
+                  the returned hash will be prefixed with the specified hasher
+                  followed by '='.
+        :rtype: str
+        """
+        if hasher is None:
+            hasher = self.hasher
+        if hasher is None:
+            hasher = hashlib.md5
+            prefix = ''
+        else:
+            hasher = getattr(hashlib, hasher)
+            prefix = '%s=' % self.hasher
+        digest = hasher(data).digest()
+        digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii')
+        return '%s%s' % (prefix, digest)
+
+
+class InstalledDistribution(BaseInstalledDistribution):
+    """
+    Created with the *path* of the ``.dist-info`` directory provided to the
+    constructor. It reads the metadata contained in ``pydist.json`` when it is
+    instantiated., or uses a passed in Metadata instance (useful for when
+    dry-run mode is being used).
+    """
+
+    hasher = 'sha256'
+
+    def __init__(self, path, metadata=None, env=None):
+        self.modules = []
+        self.finder = finder = resources.finder_for_path(path)
+        if finder is None:
+            raise ValueError('finder unavailable for %s' % path)
+        if env and env._cache_enabled and path in env._cache.path:
+            metadata = env._cache.path[path].metadata
+        elif metadata is None:
+            r = finder.find(METADATA_FILENAME)
+            # Temporary - for Wheel 0.23 support
+            if r is None:
+                r = finder.find(WHEEL_METADATA_FILENAME)
+            # Temporary - for legacy support
+            if r is None:
+                r = finder.find('METADATA')
+            if r is None:
+                raise ValueError('no %s found in %s' % (METADATA_FILENAME,
+                                                        path))
+            with contextlib.closing(r.as_stream()) as stream:
+                metadata = Metadata(fileobj=stream, scheme='legacy')
+
+        super(InstalledDistribution, self).__init__(metadata, path, env)
+
+        if env and env._cache_enabled:
+            env._cache.add(self)
+
+        r = finder.find('REQUESTED')
+        self.requested = r is not None
+        p  = os.path.join(path, 'top_level.txt')
+        if os.path.exists(p):
+            with open(p, 'rb') as f:
+                data = f.read()
+            self.modules = data.splitlines()
+
+    def __repr__(self):
+        return '<InstalledDistribution %r %s at %r>' % (
+            self.name, self.version, self.path)
+
+    def __str__(self):
+        return "%s %s" % (self.name, self.version)
+
+    def _get_records(self):
+        """
+        Get the list of installed files for the distribution
+        :return: A list of tuples of path, hash and size. Note that hash and
+                 size might be ``None`` for some entries. The path is exactly
+                 as stored in the file (which is as in PEP 376).
+        """
+        results = []
+        r = self.get_distinfo_resource('RECORD')
+        with contextlib.closing(r.as_stream()) as stream:
+            with CSVReader(stream=stream) as record_reader:
+                # Base location is parent dir of .dist-info dir
+                #base_location = os.path.dirname(self.path)
+                #base_location = os.path.abspath(base_location)
+                for row in record_reader:
+                    missing = [None for i in range(len(row), 3)]
+                    path, checksum, size = row + missing
+                    #if not os.path.isabs(path):
+                    #    path = path.replace('/', os.sep)
+                    #    path = os.path.join(base_location, path)
+                    results.append((path, checksum, size))
+        return results
+
+    @cached_property
+    def exports(self):
+        """
+        Return the information exported by this distribution.
+        :return: A dictionary of exports, mapping an export category to a dict
+                 of :class:`ExportEntry` instances describing the individual
+                 export entries, and keyed by name.
+        """
+        result = {}
+        r = self.get_distinfo_resource(EXPORTS_FILENAME)
+        if r:
+            result = self.read_exports()
+        return result
+
+    def read_exports(self):
+        """
+        Read exports data from a file in .ini format.
+
+        :return: A dictionary of exports, mapping an export category to a list
+                 of :class:`ExportEntry` instances describing the individual
+                 export entries.
+        """
+        result = {}
+        r = self.get_distinfo_resource(EXPORTS_FILENAME)
+        if r:
+            with contextlib.closing(r.as_stream()) as stream:
+                result = read_exports(stream)
+        return result
+
+    def write_exports(self, exports):
+        """
+        Write a dictionary of exports to a file in .ini format.
+        :param exports: A dictionary of exports, mapping an export category to
+                        a list of :class:`ExportEntry` instances describing the
+                        individual export entries.
+        """
+        rf = self.get_distinfo_file(EXPORTS_FILENAME)
+        with open(rf, 'w') as f:
+            write_exports(exports, f)
+
+    def get_resource_path(self, relative_path):
+        """
+        NOTE: This API may change in the future.
+
+        Return the absolute path to a resource file with the given relative
+        path.
+
+        :param relative_path: The path, relative to .dist-info, of the resource
+                              of interest.
+        :return: The absolute path where the resource is to be found.
+        """
+        r = self.get_distinfo_resource('RESOURCES')
+        with contextlib.closing(r.as_stream()) as stream:
+            with CSVReader(stream=stream) as resources_reader:
+                for relative, destination in resources_reader:
+                    if relative == relative_path:
+                        return destination
+        raise KeyError('no resource file with relative path %r '
+                       'is installed' % relative_path)
+
+    def list_installed_files(self):
+        """
+        Iterates over the ``RECORD`` entries and returns a tuple
+        ``(path, hash, size)`` for each line.
+
+        :returns: iterator of (path, hash, size)
+        """
+        for result in self._get_records():
+            yield result
+
+    def write_installed_files(self, paths, prefix, dry_run=False):
+        """
+        Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any
+        existing ``RECORD`` file is silently overwritten.
+
+        prefix is used to determine when to write absolute paths.
+        """
+        prefix = os.path.join(prefix, '')
+        base = os.path.dirname(self.path)
+        base_under_prefix = base.startswith(prefix)
+        base = os.path.join(base, '')
+        record_path = self.get_distinfo_file('RECORD')
+        logger.info('creating %s', record_path)
+        if dry_run:
+            return None
+        with CSVWriter(record_path) as writer:
+            for path in paths:
+                if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')):
+                    # do not put size and hash, as in PEP-376
+                    hash_value = size = ''
+                else:
+                    size = '%d' % os.path.getsize(path)
+                    with open(path, 'rb') as fp:
+                        hash_value = self.get_hash(fp.read())
+                if path.startswith(base) or (base_under_prefix and
+                                             path.startswith(prefix)):
+                    path = os.path.relpath(path, base)
+                writer.writerow((path, hash_value, size))
+
+            # add the RECORD file itself
+            if record_path.startswith(base):
+                record_path = os.path.relpath(record_path, base)
+            writer.writerow((record_path, '', ''))
+        return record_path
+
+    def check_installed_files(self):
+        """
+        Checks that the hashes and sizes of the files in ``RECORD`` are
+        matched by the files themselves. Returns a (possibly empty) list of
+        mismatches. Each entry in the mismatch list will be a tuple consisting
+        of the path, 'exists', 'size' or 'hash' according to what didn't match
+        (existence is checked first, then size, then hash), the expected
+        value and the actual value.
+        """
+        mismatches = []
+        base = os.path.dirname(self.path)
+        record_path = self.get_distinfo_file('RECORD')
+        for path, hash_value, size in self.list_installed_files():
+            if not os.path.isabs(path):
+                path = os.path.join(base, path)
+            if path == record_path:
+                continue
+            if not os.path.exists(path):
+                mismatches.append((path, 'exists', True, False))
+            elif os.path.isfile(path):
+                actual_size = str(os.path.getsize(path))
+                if size and actual_size != size:
+                    mismatches.append((path, 'size', size, actual_size))
+                elif hash_value:
+                    if '=' in hash_value:
+                        hasher = hash_value.split('=', 1)[0]
+                    else:
+                        hasher = None
+
+                    with open(path, 'rb') as f:
+                        actual_hash = self.get_hash(f.read(), hasher)
+                        if actual_hash != hash_value:
+                            mismatches.append((path, 'hash', hash_value, actual_hash))
+        return mismatches
+
+    @cached_property
+    def shared_locations(self):
+        """
+        A dictionary of shared locations whose keys are in the set 'prefix',
+        'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'.
+        The corresponding value is the absolute path of that category for
+        this distribution, and takes into account any paths selected by the
+        user at installation time (e.g. via command-line arguments). In the
+        case of the 'namespace' key, this would be a list of absolute paths
+        for the roots of namespace packages in this distribution.
+
+        The first time this property is accessed, the relevant information is
+        read from the SHARED file in the .dist-info directory.
+        """
+        result = {}
+        shared_path = os.path.join(self.path, 'SHARED')
+        if os.path.isfile(shared_path):
+            with codecs.open(shared_path, 'r', encoding='utf-8') as f:
+                lines = f.read().splitlines()
+            for line in lines:
+                key, value = line.split('=', 1)
+                if key == 'namespace':
+                    result.setdefault(key, []).append(value)
+                else:
+                    result[key] = value
+        return result
+
+    def write_shared_locations(self, paths, dry_run=False):
+        """
+        Write shared location information to the SHARED file in .dist-info.
+        :param paths: A dictionary as described in the documentation for
+        :meth:`shared_locations`.
+        :param dry_run: If True, the action is logged but no file is actually
+                        written.
+        :return: The path of the file written to.
+        """
+        shared_path = os.path.join(self.path, 'SHARED')
+        logger.info('creating %s', shared_path)
+        if dry_run:
+            return None
+        lines = []
+        for key in ('prefix', 'lib', 'headers', 'scripts', 'data'):
+            path = paths[key]
+            if os.path.isdir(paths[key]):
+                lines.append('%s=%s' % (key,  path))
+        for ns in paths.get('namespace', ()):
+            lines.append('namespace=%s' % ns)
+
+        with codecs.open(shared_path, 'w', encoding='utf-8') as f:
+            f.write('\n'.join(lines))
+        return shared_path
+
+    def get_distinfo_resource(self, path):
+        if path not in DIST_FILES:
+            raise DistlibException('invalid path for a dist-info file: '
+                                   '%r at %r' % (path, self.path))
+        finder = resources.finder_for_path(self.path)
+        if finder is None:
+            raise DistlibException('Unable to get a finder for %s' % self.path)
+        return finder.find(path)
+
+    def get_distinfo_file(self, path):
+        """
+        Returns a path located under the ``.dist-info`` directory. Returns a
+        string representing the path.
+
+        :parameter path: a ``'/'``-separated path relative to the
+                         ``.dist-info`` directory or an absolute path;
+                         If *path* is an absolute path and doesn't start
+                         with the ``.dist-info`` directory path,
+                         a :class:`DistlibException` is raised
+        :type path: str
+        :rtype: str
+        """
+        # Check if it is an absolute path  # XXX use relpath, add tests
+        if path.find(os.sep) >= 0:
+            # it's an absolute path?
+            distinfo_dirname, path = path.split(os.sep)[-2:]
+            if distinfo_dirname != self.path.split(os.sep)[-1]:
+                raise DistlibException(
+                    'dist-info file %r does not belong to the %r %s '
+                    'distribution' % (path, self.name, self.version))
+
+        # The file must be relative
+        if path not in DIST_FILES:
+            raise DistlibException('invalid path for a dist-info file: '
+                                   '%r at %r' % (path, self.path))
+
+        return os.path.join(self.path, path)
+
+    def list_distinfo_files(self):
+        """
+        Iterates over the ``RECORD`` entries and returns paths for each line if
+        the path is pointing to a file located in the ``.dist-info`` directory
+        or one of its subdirectories.
+
+        :returns: iterator of paths
+        """
+        base = os.path.dirname(self.path)
+        for path, checksum, size in self._get_records():
+            # XXX add separator or use real relpath algo
+            if not os.path.isabs(path):
+                path = os.path.join(base, path)
+            if path.startswith(self.path):
+                yield path
+
+    def __eq__(self, other):
+        return (isinstance(other, InstalledDistribution) and
+                self.path == other.path)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    __hash__ = object.__hash__
+
+
+class EggInfoDistribution(BaseInstalledDistribution):
+    """Created with the *path* of the ``.egg-info`` directory or file provided
+    to the constructor. It reads the metadata contained in the file itself, or
+    if the given path happens to be a directory, the metadata is read from the
+    file ``PKG-INFO`` under that directory."""
+
+    requested = True    # as we have no way of knowing, assume it was
+    shared_locations = {}
+
+    def __init__(self, path, env=None):
+        def set_name_and_version(s, n, v):
+            s.name = n
+            s.key = n.lower()   # for case-insensitive comparisons
+            s.version = v
+
+        self.path = path
+        self.dist_path = env
+        if env and env._cache_enabled and path in env._cache_egg.path:
+            metadata = env._cache_egg.path[path].metadata
+            set_name_and_version(self, metadata.name, metadata.version)
+        else:
+            metadata = self._get_metadata(path)
+
+            # Need to be set before caching
+            set_name_and_version(self, metadata.name, metadata.version)
+
+            if env and env._cache_enabled:
+                env._cache_egg.add(self)
+        super(EggInfoDistribution, self).__init__(metadata, path, env)
+
+    def _get_metadata(self, path):
+        requires = None
+
+        def parse_requires_data(data):
+            """Create a list of dependencies from a requires.txt file.
+
+            *data*: the contents of a setuptools-produced requires.txt file.
+            """
+            reqs = []
+            lines = data.splitlines()
+            for line in lines:
+                line = line.strip()
+                if line.startswith('['):
+                    logger.warning('Unexpected line: quitting requirement scan: %r',
+                                   line)
+                    break
+                r = parse_requirement(line)
+                if not r:
+                    logger.warning('Not recognised as a requirement: %r', line)
+                    continue
+                if r.extras:
+                    logger.warning('extra requirements in requires.txt are '
+                                   'not supported')
+                if not r.constraints:
+                    reqs.append(r.name)
+                else:
+                    cons = ', '.join('%s%s' % c for c in r.constraints)
+                    reqs.append('%s (%s)' % (r.name, cons))
+            return reqs
+
+        def parse_requires_path(req_path):
+            """Create a list of dependencies from a requires.txt file.
+
+            *req_path*: the path to a setuptools-produced requires.txt file.
+            """
+
+            reqs = []
+            try:
+                with codecs.open(req_path, 'r', 'utf-8') as fp:
+                    reqs = parse_requires_data(fp.read())
+            except IOError:
+                pass
+            return reqs
+
+        tl_path = tl_data = None
+        if path.endswith('.egg'):
+            if os.path.isdir(path):
+                p = os.path.join(path, 'EGG-INFO')
+                meta_path = os.path.join(p, 'PKG-INFO')
+                metadata = Metadata(path=meta_path, scheme='legacy')
+                req_path = os.path.join(p, 'requires.txt')
+                tl_path = os.path.join(p, 'top_level.txt')
+                requires = parse_requires_path(req_path)
+            else:
+                # FIXME handle the case where zipfile is not available
+                zipf = zipimport.zipimporter(path)
+                fileobj = StringIO(
+                    zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8'))
+                metadata = Metadata(fileobj=fileobj, scheme='legacy')
+                try:
+                    data = zipf.get_data('EGG-INFO/requires.txt')
+                    tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8')
+                    requires = parse_requires_data(data.decode('utf-8'))
+                except IOError:
+                    requires = None
+        elif path.endswith('.egg-info'):
+            if os.path.isdir(path):
+                req_path = os.path.join(path, 'requires.txt')
+                requires = parse_requires_path(req_path)
+                path = os.path.join(path, 'PKG-INFO')
+                tl_path = os.path.join(path, 'top_level.txt')
+            metadata = Metadata(path=path, scheme='legacy')
+        else:
+            raise DistlibException('path must end with .egg-info or .egg, '
+                                   'got %r' % path)
+
+        if requires:
+            metadata.add_requirements(requires)
+        # look for top-level modules in top_level.txt, if present
+        if tl_data is None:
+            if tl_path is not None and os.path.exists(tl_path):
+                with open(tl_path, 'rb') as f:
+                    tl_data = f.read().decode('utf-8')
+        if not tl_data:
+            tl_data = []
+        else:
+            tl_data = tl_data.splitlines()
+        self.modules = tl_data
+        return metadata
+
+    def __repr__(self):
+        return '<EggInfoDistribution %r %s at %r>' % (
+            self.name, self.version, self.path)
+
+    def __str__(self):
+        return "%s %s" % (self.name, self.version)
+
+    def check_installed_files(self):
+        """
+        Checks that the hashes and sizes of the files in ``RECORD`` are
+        matched by the files themselves. Returns a (possibly empty) list of
+        mismatches. Each entry in the mismatch list will be a tuple consisting
+        of the path, 'exists', 'size' or 'hash' according to what didn't match
+        (existence is checked first, then size, then hash), the expected
+        value and the actual value.
+        """
+        mismatches = []
+        record_path = os.path.join(self.path, 'installed-files.txt')
+        if os.path.exists(record_path):
+            for path, _, _ in self.list_installed_files():
+                if path == record_path:
+                    continue
+                if not os.path.exists(path):
+                    mismatches.append((path, 'exists', True, False))
+        return mismatches
+
+    def list_installed_files(self):
+        """
+        Iterates over the ``installed-files.txt`` entries and returns a tuple
+        ``(path, hash, size)`` for each line.
+
+        :returns: a list of (path, hash, size)
+        """
+
+        def _md5(path):
+            f = open(path, 'rb')
+            try:
+                content = f.read()
+            finally:
+                f.close()
+            return hashlib.md5(content).hexdigest()
+
+        def _size(path):
+            return os.stat(path).st_size
+
+        record_path = os.path.join(self.path, 'installed-files.txt')
+        result = []
+        if os.path.exists(record_path):
+            with codecs.open(record_path, 'r', encoding='utf-8') as f:
+                for line in f:
+                    line = line.strip()
+                    p = os.path.normpath(os.path.join(self.path, line))
+                    # "./" is present as a marker between installed files
+                    # and installation metadata files
+                    if not os.path.exists(p):
+                        logger.warning('Non-existent file: %s', p)
+                        if p.endswith(('.pyc', '.pyo')):
+                            continue
+                        #otherwise fall through and fail
+                    if not os.path.isdir(p):
+                        result.append((p, _md5(p), _size(p)))
+            result.append((record_path, None, None))
+        return result
+
+    def list_distinfo_files(self, absolute=False):
+        """
+        Iterates over the ``installed-files.txt`` entries and returns paths for
+        each line if the path is pointing to a file located in the
+        ``.egg-info`` directory or one of its subdirectories.
+
+        :parameter absolute: If *absolute* is ``True``, each returned path is
+                          transformed into a local absolute path. Otherwise the
+                          raw value from ``installed-files.txt`` is returned.
+        :type absolute: boolean
+        :returns: iterator of paths
+        """
+        record_path = os.path.join(self.path, 'installed-files.txt')
+        if os.path.exists(record_path):
+            skip = True
+            with codecs.open(record_path, 'r', encoding='utf-8') as f:
+                for line in f:
+                    line = line.strip()
+                    if line == './':
+                        skip = False
+                        continue
+                    if not skip:
+                        p = os.path.normpath(os.path.join(self.path, line))
+                        if p.startswith(self.path):
+                            if absolute:
+                                yield p
+                            else:
+                                yield line
+
+    def __eq__(self, other):
+        return (isinstance(other, EggInfoDistribution) and
+                self.path == other.path)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    __hash__ = object.__hash__
+
+new_dist_class = InstalledDistribution
+old_dist_class = EggInfoDistribution
+
+
+class DependencyGraph(object):
+    """
+    Represents a dependency graph between distributions.
+
+    The dependency relationships are stored in an ``adjacency_list`` that maps
+    distributions to a list of ``(other, label)`` tuples where  ``other``
+    is a distribution and the edge is labeled with ``label`` (i.e. the version
+    specifier, if such was provided). Also, for more efficient traversal, for
+    every distribution ``x``, a list of predecessors is kept in
+    ``reverse_list[x]``. An edge from distribution ``a`` to
+    distribution ``b`` means that ``a`` depends on ``b``. If any missing
+    dependencies are found, they are stored in ``missing``, which is a
+    dictionary that maps distributions to a list of requirements that were not
+    provided by any other distributions.
+    """
+
+    def __init__(self):
+        self.adjacency_list = {}
+        self.reverse_list = {}
+        self.missing = {}
+
+    def add_distribution(self, distribution):
+        """Add the *distribution* to the graph.
+
+        :type distribution: :class:`distutils2.database.InstalledDistribution`
+                            or :class:`distutils2.database.EggInfoDistribution`
+        """
+        self.adjacency_list[distribution] = []
+        self.reverse_list[distribution] = []
+        #self.missing[distribution] = []
+
+    def add_edge(self, x, y, label=None):
+        """Add an edge from distribution *x* to distribution *y* with the given
+        *label*.
+
+        :type x: :class:`distutils2.database.InstalledDistribution` or
+                 :class:`distutils2.database.EggInfoDistribution`
+        :type y: :class:`distutils2.database.InstalledDistribution` or
+                 :class:`distutils2.database.EggInfoDistribution`
+        :type label: ``str`` or ``None``
+        """
+        self.adjacency_list[x].append((y, label))
+        # multiple edges are allowed, so be careful
+        if x not in self.reverse_list[y]:
+            self.reverse_list[y].append(x)
+
+    def add_missing(self, distribution, requirement):
+        """
+        Add a missing *requirement* for the given *distribution*.
+
+        :type distribution: :class:`distutils2.database.InstalledDistribution`
+                            or :class:`distutils2.database.EggInfoDistribution`
+        :type requirement: ``str``
+        """
+        logger.debug('%s missing %r', distribution, requirement)
+        self.missing.setdefault(distribution, []).append(requirement)
+
+    def _repr_dist(self, dist):
+        return '%s %s' % (dist.name, dist.version)
+
+    def repr_node(self, dist, level=1):
+        """Prints only a subgraph"""
+        output = [self._repr_dist(dist)]
+        for other, label in self.adjacency_list[dist]:
+            dist = self._repr_dist(other)
+            if label is not None:
+                dist = '%s [%s]' % (dist, label)
+            output.append('    ' * level + str(dist))
+            suboutput = self.repr_node(other, level + 1)
+            subs = suboutput.split('\n')
+            output.extend(subs[1:])
+        return '\n'.join(output)
+
+    def to_dot(self, f, skip_disconnected=True):
+        """Writes a DOT output for the graph to the provided file *f*.
+
+        If *skip_disconnected* is set to ``True``, then all distributions
+        that are not dependent on any other distribution are skipped.
+
+        :type f: has to support ``file``-like operations
+        :type skip_disconnected: ``bool``
+        """
+        disconnected = []
+
+        f.write("digraph dependencies {\n")
+        for dist, adjs in self.adjacency_list.items():
+            if len(adjs) == 0 and not skip_disconnected:
+                disconnected.append(dist)
+            for other, label in adjs:
+                if not label is None:
+                    f.write('"%s" -> "%s" [label="%s"]\n' %
+                            (dist.name, other.name, label))
+                else:
+                    f.write('"%s" -> "%s"\n' % (dist.name, other.name))
+        if not skip_disconnected and len(disconnected) > 0:
+            f.write('subgraph disconnected {\n')
+            f.write('label = "Disconnected"\n')
+            f.write('bgcolor = red\n')
+
+            for dist in disconnected:
+                f.write('"%s"' % dist.name)
+                f.write('\n')
+            f.write('}\n')
+        f.write('}\n')
+
+    def topological_sort(self):
+        """
+        Perform a topological sort of the graph.
+        :return: A tuple, the first element of which is a topologically sorted
+                 list of distributions, and the second element of which is a
+                 list of distributions that cannot be sorted because they have
+                 circular dependencies and so form a cycle.
+        """
+        result = []
+        # Make a shallow copy of the adjacency list
+        alist = {}
+        for k, v in self.adjacency_list.items():
+            alist[k] = v[:]
+        while True:
+            # See what we can remove in this run
+            to_remove = []
+            for k, v in list(alist.items())[:]:
+                if not v:
+                    to_remove.append(k)
+                    del alist[k]
+            if not to_remove:
+                # What's left in alist (if anything) is a cycle.
+                break
+            # Remove from the adjacency list of others
+            for k, v in alist.items():
+                alist[k] = [(d, r) for d, r in v if d not in to_remove]
+            logger.debug('Moving to result: %s',
+                         ['%s (%s)' % (d.name, d.version) for d in to_remove])
+            result.extend(to_remove)
+        return result, list(alist.keys())
+
+    def __repr__(self):
+        """Representation of the graph"""
+        output = []
+        for dist, adjs in self.adjacency_list.items():
+            output.append(self.repr_node(dist))
+        return '\n'.join(output)
+
+
+def make_graph(dists, scheme='default'):
+    """Makes a dependency graph from the given distributions.
+
+    :parameter dists: a list of distributions
+    :type dists: list of :class:`distutils2.database.InstalledDistribution` and
+                 :class:`distutils2.database.EggInfoDistribution` instances
+    :rtype: a :class:`DependencyGraph` instance
+    """
+    scheme = get_scheme(scheme)
+    graph = DependencyGraph()
+    provided = {}  # maps names to lists of (version, dist) tuples
+
+    # first, build the graph and find out what's provided
+    for dist in dists:
+        graph.add_distribution(dist)
+
+        for p in dist.provides:
+            name, version = parse_name_and_version(p)
+            logger.debug('Add to provided: %s, %s, %s', name, version, dist)
+            provided.setdefault(name, []).append((version, dist))
+
+    # now make the edges
+    for dist in dists:
+        requires = (dist.run_requires | dist.meta_requires |
+                    dist.build_requires | dist.dev_requires)
+        for req in requires:
+            try:
+                matcher = scheme.matcher(req)
+            except UnsupportedVersionError:
+                # XXX compat-mode if cannot read the version
+                logger.warning('could not read version %r - using name only',
+                               req)
+                name = req.split()[0]
+                matcher = scheme.matcher(name)
+
+            name = matcher.key   # case-insensitive
+
+            matched = False
+            if name in provided:
+                for version, provider in provided[name]:
+                    try:
+                        match = matcher.match(version)
+                    except UnsupportedVersionError:
+                        match = False
+
+                    if match:
+                        graph.add_edge(dist, provider, req)
+                        matched = True
+                        break
+            if not matched:
+                graph.add_missing(dist, req)
+    return graph
+
+
+def get_dependent_dists(dists, dist):
+    """Recursively generate a list of distributions from *dists* that are
+    dependent on *dist*.
+
+    :param dists: a list of distributions
+    :param dist: a distribution, member of *dists* for which we are interested
+    """
+    if dist not in dists:
+        raise DistlibException('given distribution %r is not a member '
+                               'of the list' % dist.name)
+    graph = make_graph(dists)
+
+    dep = [dist]  # dependent distributions
+    todo = graph.reverse_list[dist]  # list of nodes we should inspect
+
+    while todo:
+        d = todo.pop()
+        dep.append(d)
+        for succ in graph.reverse_list[d]:
+            if succ not in dep:
+                todo.append(succ)
+
+    dep.pop(0)  # remove dist from dep, was there to prevent infinite loops
+    return dep
+
+
+def get_required_dists(dists, dist):
+    """Recursively generate a list of distributions from *dists* that are
+    required by *dist*.
+
+    :param dists: a list of distributions
+    :param dist: a distribution, member of *dists* for which we are interested
+    """
+    if dist not in dists:
+        raise DistlibException('given distribution %r is not a member '
+                               'of the list' % dist.name)
+    graph = make_graph(dists)
+
+    req = []  # required distributions
+    todo = graph.adjacency_list[dist]  # list of nodes we should inspect
+
+    while todo:
+        d = todo.pop()[0]
+        req.append(d)
+        for pred in graph.adjacency_list[d]:
+            if pred not in req:
+                todo.append(pred)
+
+    return req
+
+
+def make_dist(name, version, **kwargs):
+    """
+    A convenience method for making a dist given just a name and version.
+    """
+    summary = kwargs.pop('summary', 'Placeholder for summary')
+    md = Metadata(**kwargs)
+    md.name = name
+    md.version = version
+    md.summary = summary or 'Placeholder for summary'
+    return Distribution(md)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..81aa4ce013871a887d4d67eb67aadfbcd8b342b0
GIT binary patch
literal 53896
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
A%m4rY

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py
new file mode 100644
index 00000000..2406be21
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py
@@ -0,0 +1,516 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+import hashlib
+import logging
+import os
+import shutil
+import subprocess
+import tempfile
+try:
+    from threading import Thread
+except ImportError:
+    from dummy_threading import Thread
+
+from . import DistlibException
+from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr,
+                     urlparse, build_opener, string_types)
+from .util import cached_property, zip_dir, ServerProxy
+
+logger = logging.getLogger(__name__)
+
+DEFAULT_INDEX = 'https://pypi.python.org/pypi'
+DEFAULT_REALM = 'pypi'
+
+class PackageIndex(object):
+    """
+    This class represents a package index compatible with PyPI, the Python
+    Package Index.
+    """
+
+    boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$'
+
+    def __init__(self, url=None):
+        """
+        Initialise an instance.
+
+        :param url: The URL of the index. If not specified, the URL for PyPI is
+                    used.
+        """
+        self.url = url or DEFAULT_INDEX
+        self.read_configuration()
+        scheme, netloc, path, params, query, frag = urlparse(self.url)
+        if params or query or frag or scheme not in ('http', 'https'):
+            raise DistlibException('invalid repository: %s' % self.url)
+        self.password_handler = None
+        self.ssl_verifier = None
+        self.gpg = None
+        self.gpg_home = None
+        with open(os.devnull, 'w') as sink:
+            # Use gpg by default rather than gpg2, as gpg2 insists on
+            # prompting for passwords
+            for s in ('gpg', 'gpg2'):
+                try:
+                    rc = subprocess.check_call([s, '--version'], stdout=sink,
+                                               stderr=sink)
+                    if rc == 0:
+                        self.gpg = s
+                        break
+                except OSError:
+                    pass
+
+    def _get_pypirc_command(self):
+        """
+        Get the distutils command for interacting with PyPI configurations.
+        :return: the command.
+        """
+        from distutils.core import Distribution
+        from distutils.config import PyPIRCCommand
+        d = Distribution()
+        return PyPIRCCommand(d)
+
+    def read_configuration(self):
+        """
+        Read the PyPI access configuration as supported by distutils, getting
+        PyPI to do the actual work. This populates ``username``, ``password``,
+        ``realm`` and ``url`` attributes from the configuration.
+        """
+        # get distutils to do the work
+        c = self._get_pypirc_command()
+        c.repository = self.url
+        cfg = c._read_pypirc()
+        self.username = cfg.get('username')
+        self.password = cfg.get('password')
+        self.realm = cfg.get('realm', 'pypi')
+        self.url = cfg.get('repository', self.url)
+
+    def save_configuration(self):
+        """
+        Save the PyPI access configuration. You must have set ``username`` and
+        ``password`` attributes before calling this method.
+
+        Again, distutils is used to do the actual work.
+        """
+        self.check_credentials()
+        # get distutils to do the work
+        c = self._get_pypirc_command()
+        c._store_pypirc(self.username, self.password)
+
+    def check_credentials(self):
+        """
+        Check that ``username`` and ``password`` have been set, and raise an
+        exception if not.
+        """
+        if self.username is None or self.password is None:
+            raise DistlibException('username and password must be set')
+        pm = HTTPPasswordMgr()
+        _, netloc, _, _, _, _ = urlparse(self.url)
+        pm.add_password(self.realm, netloc, self.username, self.password)
+        self.password_handler = HTTPBasicAuthHandler(pm)
+
+    def register(self, metadata):
+        """
+        Register a distribution on PyPI, using the provided metadata.
+
+        :param metadata: A :class:`Metadata` instance defining at least a name
+                         and version number for the distribution to be
+                         registered.
+        :return: The HTTP response received from PyPI upon submission of the
+                request.
+        """
+        self.check_credentials()
+        metadata.validate()
+        d = metadata.todict()
+        d[':action'] = 'verify'
+        request = self.encode_request(d.items(), [])
+        response = self.send_request(request)
+        d[':action'] = 'submit'
+        request = self.encode_request(d.items(), [])
+        return self.send_request(request)
+
+    def _reader(self, name, stream, outbuf):
+        """
+        Thread runner for reading lines of from a subprocess into a buffer.
+
+        :param name: The logical name of the stream (used for logging only).
+        :param stream: The stream to read from. This will typically a pipe
+                       connected to the output stream of a subprocess.
+        :param outbuf: The list to append the read lines to.
+        """
+        while True:
+            s = stream.readline()
+            if not s:
+                break
+            s = s.decode('utf-8').rstrip()
+            outbuf.append(s)
+            logger.debug('%s: %s' % (name, s))
+        stream.close()
+
+    def get_sign_command(self, filename, signer, sign_password,
+                         keystore=None):
+        """
+        Return a suitable command for signing a file.
+
+        :param filename: The pathname to the file to be signed.
+        :param signer: The identifier of the signer of the file.
+        :param sign_password: The passphrase for the signer's
+                              private key used for signing.
+        :param keystore: The path to a directory which contains the keys
+                         used in verification. If not specified, the
+                         instance's ``gpg_home`` attribute is used instead.
+        :return: The signing command as a list suitable to be
+                 passed to :class:`subprocess.Popen`.
+        """
+        cmd = [self.gpg, '--status-fd', '2', '--no-tty']
+        if keystore is None:
+            keystore = self.gpg_home
+        if keystore:
+            cmd.extend(['--homedir', keystore])
+        if sign_password is not None:
+            cmd.extend(['--batch', '--passphrase-fd', '0'])
+        td = tempfile.mkdtemp()
+        sf = os.path.join(td, os.path.basename(filename) + '.asc')
+        cmd.extend(['--detach-sign', '--armor', '--local-user',
+                    signer, '--output', sf, filename])
+        logger.debug('invoking: %s', ' '.join(cmd))
+        return cmd, sf
+
+    def run_command(self, cmd, input_data=None):
+        """
+        Run a command in a child process , passing it any input data specified.
+
+        :param cmd: The command to run.
+        :param input_data: If specified, this must be a byte string containing
+                           data to be sent to the child process.
+        :return: A tuple consisting of the subprocess' exit code, a list of
+                 lines read from the subprocess' ``stdout``, and a list of
+                 lines read from the subprocess' ``stderr``.
+        """
+        kwargs = {
+            'stdout': subprocess.PIPE,
+            'stderr': subprocess.PIPE,
+        }
+        if input_data is not None:
+            kwargs['stdin'] = subprocess.PIPE
+        stdout = []
+        stderr = []
+        p = subprocess.Popen(cmd, **kwargs)
+        # We don't use communicate() here because we may need to
+        # get clever with interacting with the command
+        t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout))
+        t1.start()
+        t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr))
+        t2.start()
+        if input_data is not None:
+            p.stdin.write(input_data)
+            p.stdin.close()
+
+        p.wait()
+        t1.join()
+        t2.join()
+        return p.returncode, stdout, stderr
+
+    def sign_file(self, filename, signer, sign_password, keystore=None):
+        """
+        Sign a file.
+
+        :param filename: The pathname to the file to be signed.
+        :param signer: The identifier of the signer of the file.
+        :param sign_password: The passphrase for the signer's
+                              private key used for signing.
+        :param keystore: The path to a directory which contains the keys
+                         used in signing. If not specified, the instance's
+                         ``gpg_home`` attribute is used instead.
+        :return: The absolute pathname of the file where the signature is
+                 stored.
+        """
+        cmd, sig_file = self.get_sign_command(filename, signer, sign_password,
+                                              keystore)
+        rc, stdout, stderr = self.run_command(cmd,
+                                              sign_password.encode('utf-8'))
+        if rc != 0:
+            raise DistlibException('sign command failed with error '
+                                   'code %s' % rc)
+        return sig_file
+
+    def upload_file(self, metadata, filename, signer=None, sign_password=None,
+                    filetype='sdist', pyversion='source', keystore=None):
+        """
+        Upload a release file to the index.
+
+        :param metadata: A :class:`Metadata` instance defining at least a name
+                         and version number for the file to be uploaded.
+        :param filename: The pathname of the file to be uploaded.
+        :param signer: The identifier of the signer of the file.
+        :param sign_password: The passphrase for the signer's
+                              private key used for signing.
+        :param filetype: The type of the file being uploaded. This is the
+                        distutils command which produced that file, e.g.
+                        ``sdist`` or ``bdist_wheel``.
+        :param pyversion: The version of Python which the release relates
+                          to. For code compatible with any Python, this would
+                          be ``source``, otherwise it would be e.g. ``3.2``.
+        :param keystore: The path to a directory which contains the keys
+                         used in signing. If not specified, the instance's
+                         ``gpg_home`` attribute is used instead.
+        :return: The HTTP response received from PyPI upon submission of the
+                request.
+        """
+        self.check_credentials()
+        if not os.path.exists(filename):
+            raise DistlibException('not found: %s' % filename)
+        metadata.validate()
+        d = metadata.todict()
+        sig_file = None
+        if signer:
+            if not self.gpg:
+                logger.warning('no signing program available - not signed')
+            else:
+                sig_file = self.sign_file(filename, signer, sign_password,
+                                          keystore)
+        with open(filename, 'rb') as f:
+            file_data = f.read()
+        md5_digest = hashlib.md5(file_data).hexdigest()
+        sha256_digest = hashlib.sha256(file_data).hexdigest()
+        d.update({
+            ':action': 'file_upload',
+            'protocol_version': '1',
+            'filetype': filetype,
+            'pyversion': pyversion,
+            'md5_digest': md5_digest,
+            'sha256_digest': sha256_digest,
+        })
+        files = [('content', os.path.basename(filename), file_data)]
+        if sig_file:
+            with open(sig_file, 'rb') as f:
+                sig_data = f.read()
+            files.append(('gpg_signature', os.path.basename(sig_file),
+                         sig_data))
+            shutil.rmtree(os.path.dirname(sig_file))
+        request = self.encode_request(d.items(), files)
+        return self.send_request(request)
+
+    def upload_documentation(self, metadata, doc_dir):
+        """
+        Upload documentation to the index.
+
+        :param metadata: A :class:`Metadata` instance defining at least a name
+                         and version number for the documentation to be
+                         uploaded.
+        :param doc_dir: The pathname of the directory which contains the
+                        documentation. This should be the directory that
+                        contains the ``index.html`` for the documentation.
+        :return: The HTTP response received from PyPI upon submission of the
+                request.
+        """
+        self.check_credentials()
+        if not os.path.isdir(doc_dir):
+            raise DistlibException('not a directory: %r' % doc_dir)
+        fn = os.path.join(doc_dir, 'index.html')
+        if not os.path.exists(fn):
+            raise DistlibException('not found: %r' % fn)
+        metadata.validate()
+        name, version = metadata.name, metadata.version
+        zip_data = zip_dir(doc_dir).getvalue()
+        fields = [(':action', 'doc_upload'),
+                  ('name', name), ('version', version)]
+        files = [('content', name, zip_data)]
+        request = self.encode_request(fields, files)
+        return self.send_request(request)
+
+    def get_verify_command(self, signature_filename, data_filename,
+                           keystore=None):
+        """
+        Return a suitable command for verifying a file.
+
+        :param signature_filename: The pathname to the file containing the
+                                   signature.
+        :param data_filename: The pathname to the file containing the
+                              signed data.
+        :param keystore: The path to a directory which contains the keys
+                         used in verification. If not specified, the
+                         instance's ``gpg_home`` attribute is used instead.
+        :return: The verifying command as a list suitable to be
+                 passed to :class:`subprocess.Popen`.
+        """
+        cmd = [self.gpg, '--status-fd', '2', '--no-tty']
+        if keystore is None:
+            keystore = self.gpg_home
+        if keystore:
+            cmd.extend(['--homedir', keystore])
+        cmd.extend(['--verify', signature_filename, data_filename])
+        logger.debug('invoking: %s', ' '.join(cmd))
+        return cmd
+
+    def verify_signature(self, signature_filename, data_filename,
+                         keystore=None):
+        """
+        Verify a signature for a file.
+
+        :param signature_filename: The pathname to the file containing the
+                                   signature.
+        :param data_filename: The pathname to the file containing the
+                              signed data.
+        :param keystore: The path to a directory which contains the keys
+                         used in verification. If not specified, the
+                         instance's ``gpg_home`` attribute is used instead.
+        :return: True if the signature was verified, else False.
+        """
+        if not self.gpg:
+            raise DistlibException('verification unavailable because gpg '
+                                   'unavailable')
+        cmd = self.get_verify_command(signature_filename, data_filename,
+                                      keystore)
+        rc, stdout, stderr = self.run_command(cmd)
+        if rc not in (0, 1):
+            raise DistlibException('verify command failed with error '
+                             'code %s' % rc)
+        return rc == 0
+
+    def download_file(self, url, destfile, digest=None, reporthook=None):
+        """
+        This is a convenience method for downloading a file from an URL.
+        Normally, this will be a file from the index, though currently
+        no check is made for this (i.e. a file can be downloaded from
+        anywhere).
+
+        The method is just like the :func:`urlretrieve` function in the
+        standard library, except that it allows digest computation to be
+        done during download and checking that the downloaded data
+        matched any expected value.
+
+        :param url: The URL of the file to be downloaded (assumed to be
+                    available via an HTTP GET request).
+        :param destfile: The pathname where the downloaded file is to be
+                         saved.
+        :param digest: If specified, this must be a (hasher, value)
+                       tuple, where hasher is the algorithm used (e.g.
+                       ``'md5'``) and ``value`` is the expected value.
+        :param reporthook: The same as for :func:`urlretrieve` in the
+                           standard library.
+        """
+        if digest is None:
+            digester = None
+            logger.debug('No digest specified')
+        else:
+            if isinstance(digest, (list, tuple)):
+                hasher, digest = digest
+            else:
+                hasher = 'md5'
+            digester = getattr(hashlib, hasher)()
+            logger.debug('Digest specified: %s' % digest)
+        # The following code is equivalent to urlretrieve.
+        # We need to do it this way so that we can compute the
+        # digest of the file as we go.
+        with open(destfile, 'wb') as dfp:
+            # addinfourl is not a context manager on 2.x
+            # so we have to use try/finally
+            sfp = self.send_request(Request(url))
+            try:
+                headers = sfp.info()
+                blocksize = 8192
+                size = -1
+                read = 0
+                blocknum = 0
+                if "content-length" in headers:
+                    size = int(headers["Content-Length"])
+                if reporthook:
+                    reporthook(blocknum, blocksize, size)
+                while True:
+                    block = sfp.read(blocksize)
+                    if not block:
+                        break
+                    read += len(block)
+                    dfp.write(block)
+                    if digester:
+                        digester.update(block)
+                    blocknum += 1
+                    if reporthook:
+                        reporthook(blocknum, blocksize, size)
+            finally:
+                sfp.close()
+
+        # check that we got the whole file, if we can
+        if size >= 0 and read < size:
+            raise DistlibException(
+                'retrieval incomplete: got only %d out of %d bytes'
+                % (read, size))
+        # if we have a digest, it must match.
+        if digester:
+            actual = digester.hexdigest()
+            if digest != actual:
+                raise DistlibException('%s digest mismatch for %s: expected '
+                                       '%s, got %s' % (hasher, destfile,
+                                                       digest, actual))
+            logger.debug('Digest verified: %s', digest)
+
+    def send_request(self, req):
+        """
+        Send a standard library :class:`Request` to PyPI and return its
+        response.
+
+        :param req: The request to send.
+        :return: The HTTP response from PyPI (a standard library HTTPResponse).
+        """
+        handlers = []
+        if self.password_handler:
+            handlers.append(self.password_handler)
+        if self.ssl_verifier:
+            handlers.append(self.ssl_verifier)
+        opener = build_opener(*handlers)
+        return opener.open(req)
+
+    def encode_request(self, fields, files):
+        """
+        Encode fields and files for posting to an HTTP server.
+
+        :param fields: The fields to send as a list of (fieldname, value)
+                       tuples.
+        :param files: The files to send as a list of (fieldname, filename,
+                      file_bytes) tuple.
+        """
+        # Adapted from packaging, which in turn was adapted from
+        # http://code.activestate.com/recipes/146306
+
+        parts = []
+        boundary = self.boundary
+        for k, values in fields:
+            if not isinstance(values, (list, tuple)):
+                values = [values]
+
+            for v in values:
+                parts.extend((
+                    b'--' + boundary,
+                    ('Content-Disposition: form-data; name="%s"' %
+                     k).encode('utf-8'),
+                    b'',
+                    v.encode('utf-8')))
+        for key, filename, value in files:
+            parts.extend((
+                b'--' + boundary,
+                ('Content-Disposition: form-data; name="%s"; filename="%s"' %
+                 (key, filename)).encode('utf-8'),
+                b'',
+                value))
+
+        parts.extend((b'--' + boundary + b'--', b''))
+
+        body = b'\r\n'.join(parts)
+        ct = b'multipart/form-data; boundary=' + boundary
+        headers = {
+            'Content-type': ct,
+            'Content-length': str(len(body))
+        }
+        return Request(self.url, body, headers)
+
+    def search(self, terms, operator=None):
+        if isinstance(terms, string_types):
+            terms = {'name': terms}
+        rpc_proxy = ServerProxy(self.url, timeout=3.0)
+        try:
+            return rpc_proxy.search(terms, operator or 'and')
+        finally:
+            rpc_proxy('close')()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..01bda5078064e922d7b0c026226112ef58751c6c
GIT binary patch
literal 20987
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py
new file mode 100644
index 00000000..5c655c3e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py
@@ -0,0 +1,1295 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2015 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+
+import gzip
+from io import BytesIO
+import json
+import logging
+import os
+import posixpath
+import re
+try:
+    import threading
+except ImportError:  # pragma: no cover
+    import dummy_threading as threading
+import zlib
+
+from . import DistlibException
+from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url,
+                     queue, quote, unescape, string_types, build_opener,
+                     HTTPRedirectHandler as BaseRedirectHandler, text_type,
+                     Request, HTTPError, URLError)
+from .database import Distribution, DistributionPath, make_dist
+from .metadata import Metadata, MetadataInvalidError
+from .util import (cached_property, parse_credentials, ensure_slash,
+                   split_filename, get_project_data, parse_requirement,
+                   parse_name_and_version, ServerProxy, normalize_name)
+from .version import get_scheme, UnsupportedVersionError
+from .wheel import Wheel, is_compatible
+
+logger = logging.getLogger(__name__)
+
+HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)')
+CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
+HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
+DEFAULT_INDEX = 'https://pypi.python.org/pypi'
+
+def get_all_distribution_names(url=None):
+    """
+    Return all distribution names known by an index.
+    :param url: The URL of the index.
+    :return: A list of all known distribution names.
+    """
+    if url is None:
+        url = DEFAULT_INDEX
+    client = ServerProxy(url, timeout=3.0)
+    try:
+        return client.list_packages()
+    finally:
+        client('close')()
+
+class RedirectHandler(BaseRedirectHandler):
+    """
+    A class to work around a bug in some Python 3.2.x releases.
+    """
+    # There's a bug in the base version for some 3.2.x
+    # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header
+    # returns e.g. /abc, it bails because it says the scheme ''
+    # is bogus, when actually it should use the request's
+    # URL for the scheme. See Python issue #13696.
+    def http_error_302(self, req, fp, code, msg, headers):
+        # Some servers (incorrectly) return multiple Location headers
+        # (so probably same goes for URI).  Use first header.
+        newurl = None
+        for key in ('location', 'uri'):
+            if key in headers:
+                newurl = headers[key]
+                break
+        if newurl is None:  # pragma: no cover
+            return
+        urlparts = urlparse(newurl)
+        if urlparts.scheme == '':
+            newurl = urljoin(req.get_full_url(), newurl)
+            if hasattr(headers, 'replace_header'):
+                headers.replace_header(key, newurl)
+            else:
+                headers[key] = newurl
+        return BaseRedirectHandler.http_error_302(self, req, fp, code, msg,
+                                                  headers)
+
+    http_error_301 = http_error_303 = http_error_307 = http_error_302
+
+class Locator(object):
+    """
+    A base class for locators - things that locate distributions.
+    """
+    source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz')
+    binary_extensions = ('.egg', '.exe', '.whl')
+    excluded_extensions = ('.pdf',)
+
+    # A list of tags indicating which wheels you want to match. The default
+    # value of None matches against the tags compatible with the running
+    # Python. If you want to match other values, set wheel_tags on a locator
+    # instance to a list of tuples (pyver, abi, arch) which you want to match.
+    wheel_tags = None
+
+    downloadable_extensions = source_extensions + ('.whl',)
+
+    def __init__(self, scheme='default'):
+        """
+        Initialise an instance.
+        :param scheme: Because locators look for most recent versions, they
+                       need to know the version scheme to use. This specifies
+                       the current PEP-recommended scheme - use ``'legacy'``
+                       if you need to support existing distributions on PyPI.
+        """
+        self._cache = {}
+        self.scheme = scheme
+        # Because of bugs in some of the handlers on some of the platforms,
+        # we use our own opener rather than just using urlopen.
+        self.opener = build_opener(RedirectHandler())
+        # If get_project() is called from locate(), the matcher instance
+        # is set from the requirement passed to locate(). See issue #18 for
+        # why this can be useful to know.
+        self.matcher = None
+        self.errors = queue.Queue()
+
+    def get_errors(self):
+        """
+        Return any errors which have occurred.
+        """
+        result = []
+        while not self.errors.empty():  # pragma: no cover
+            try:
+                e = self.errors.get(False)
+                result.append(e)
+            except self.errors.Empty:
+                continue
+            self.errors.task_done()
+        return result
+
+    def clear_errors(self):
+        """
+        Clear any errors which may have been logged.
+        """
+        # Just get the errors and throw them away
+        self.get_errors()
+
+    def clear_cache(self):
+        self._cache.clear()
+
+    def _get_scheme(self):
+        return self._scheme
+
+    def _set_scheme(self, value):
+        self._scheme = value
+
+    scheme = property(_get_scheme, _set_scheme)
+
+    def _get_project(self, name):
+        """
+        For a given project, get a dictionary mapping available versions to Distribution
+        instances.
+
+        This should be implemented in subclasses.
+
+        If called from a locate() request, self.matcher will be set to a
+        matcher for the requirement to satisfy, otherwise it will be None.
+        """
+        raise NotImplementedError('Please implement in the subclass')
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        raise NotImplementedError('Please implement in the subclass')
+
+    def get_project(self, name):
+        """
+        For a given project, get a dictionary mapping available versions to Distribution
+        instances.
+
+        This calls _get_project to do all the work, and just implements a caching layer on top.
+        """
+        if self._cache is None:  # pragma: no cover
+            result = self._get_project(name)
+        elif name in self._cache:
+            result = self._cache[name]
+        else:
+            self.clear_errors()
+            result = self._get_project(name)
+            self._cache[name] = result
+        return result
+
+    def score_url(self, url):
+        """
+        Give an url a score which can be used to choose preferred URLs
+        for a given project release.
+        """
+        t = urlparse(url)
+        basename = posixpath.basename(t.path)
+        compatible = True
+        is_wheel = basename.endswith('.whl')
+        is_downloadable = basename.endswith(self.downloadable_extensions)
+        if is_wheel:
+            compatible = is_compatible(Wheel(basename), self.wheel_tags)
+        return (t.scheme == 'https', 'pypi.python.org' in t.netloc,
+                is_downloadable, is_wheel, compatible, basename)
+
+    def prefer_url(self, url1, url2):
+        """
+        Choose one of two URLs where both are candidates for distribution
+        archives for the same version of a distribution (for example,
+        .tar.gz vs. zip).
+
+        The current implementation favours https:// URLs over http://, archives
+        from PyPI over those from other locations, wheel compatibility (if a
+        wheel) and then the archive name.
+        """
+        result = url2
+        if url1:
+            s1 = self.score_url(url1)
+            s2 = self.score_url(url2)
+            if s1 > s2:
+                result = url1
+            if result != url2:
+                logger.debug('Not replacing %r with %r', url1, url2)
+            else:
+                logger.debug('Replacing %r with %r', url1, url2)
+        return result
+
+    def split_filename(self, filename, project_name):
+        """
+        Attempt to split a filename in project name, version and Python version.
+        """
+        return split_filename(filename, project_name)
+
+    def convert_url_to_download_info(self, url, project_name):
+        """
+        See if a URL is a candidate for a download URL for a project (the URL
+        has typically been scraped from an HTML page).
+
+        If it is, a dictionary is returned with keys "name", "version",
+        "filename" and "url"; otherwise, None is returned.
+        """
+        def same_project(name1, name2):
+            return normalize_name(name1) == normalize_name(name2)
+
+        result = None
+        scheme, netloc, path, params, query, frag = urlparse(url)
+        if frag.lower().startswith('egg='):  # pragma: no cover
+            logger.debug('%s: version hint in fragment: %r',
+                         project_name, frag)
+        m = HASHER_HASH.match(frag)
+        if m:
+            algo, digest = m.groups()
+        else:
+            algo, digest = None, None
+        origpath = path
+        if path and path[-1] == '/':  # pragma: no cover
+            path = path[:-1]
+        if path.endswith('.whl'):
+            try:
+                wheel = Wheel(path)
+                if not is_compatible(wheel, self.wheel_tags):
+                    logger.debug('Wheel not compatible: %s', path)
+                else:
+                    if project_name is None:
+                        include = True
+                    else:
+                        include = same_project(wheel.name, project_name)
+                    if include:
+                        result = {
+                            'name': wheel.name,
+                            'version': wheel.version,
+                            'filename': wheel.filename,
+                            'url': urlunparse((scheme, netloc, origpath,
+                                               params, query, '')),
+                            'python-version': ', '.join(
+                                ['.'.join(list(v[2:])) for v in wheel.pyver]),
+                        }
+            except Exception as e:  # pragma: no cover
+                logger.warning('invalid path for wheel: %s', path)
+        elif not path.endswith(self.downloadable_extensions):  # pragma: no cover
+            logger.debug('Not downloadable: %s', path)
+        else:  # downloadable extension
+            path = filename = posixpath.basename(path)
+            for ext in self.downloadable_extensions:
+                if path.endswith(ext):
+                    path = path[:-len(ext)]
+                    t = self.split_filename(path, project_name)
+                    if not t:  # pragma: no cover
+                        logger.debug('No match for project/version: %s', path)
+                    else:
+                        name, version, pyver = t
+                        if not project_name or same_project(project_name, name):
+                            result = {
+                                'name': name,
+                                'version': version,
+                                'filename': filename,
+                                'url': urlunparse((scheme, netloc, origpath,
+                                                   params, query, '')),
+                                #'packagetype': 'sdist',
+                            }
+                            if pyver:  # pragma: no cover
+                                result['python-version'] = pyver
+                    break
+        if result and algo:
+            result['%s_digest' % algo] = digest
+        return result
+
+    def _get_digest(self, info):
+        """
+        Get a digest from a dictionary by looking at keys of the form
+        'algo_digest'.
+
+        Returns a 2-tuple (algo, digest) if found, else None. Currently
+        looks only for SHA256, then MD5.
+        """
+        result = None
+        for algo in ('sha256', 'md5'):
+            key = '%s_digest' % algo
+            if key in info:
+                result = (algo, info[key])
+                break
+        return result
+
+    def _update_version_data(self, result, info):
+        """
+        Update a result dictionary (the final result from _get_project) with a
+        dictionary for a specific version, which typically holds information
+        gleaned from a filename or URL for an archive for the distribution.
+        """
+        name = info.pop('name')
+        version = info.pop('version')
+        if version in result:
+            dist = result[version]
+            md = dist.metadata
+        else:
+            dist = make_dist(name, version, scheme=self.scheme)
+            md = dist.metadata
+        dist.digest = digest = self._get_digest(info)
+        url = info['url']
+        result['digests'][url] = digest
+        if md.source_url != info['url']:
+            md.source_url = self.prefer_url(md.source_url, url)
+            result['urls'].setdefault(version, set()).add(url)
+        dist.locator = self
+        result[version] = dist
+
+    def locate(self, requirement, prereleases=False):
+        """
+        Find the most recent distribution which matches the given
+        requirement.
+
+        :param requirement: A requirement of the form 'foo (1.0)' or perhaps
+                            'foo (>= 1.0, < 2.0, != 1.3)'
+        :param prereleases: If ``True``, allow pre-release versions
+                            to be located. Otherwise, pre-release versions
+                            are not returned.
+        :return: A :class:`Distribution` instance, or ``None`` if no such
+                 distribution could be located.
+        """
+        result = None
+        r = parse_requirement(requirement)
+        if r is None:  # pragma: no cover
+            raise DistlibException('Not a valid requirement: %r' % requirement)
+        scheme = get_scheme(self.scheme)
+        self.matcher = matcher = scheme.matcher(r.requirement)
+        logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__)
+        versions = self.get_project(r.name)
+        if len(versions) > 2:   # urls and digests keys are present
+            # sometimes, versions are invalid
+            slist = []
+            vcls = matcher.version_class
+            for k in versions:
+                if k in ('urls', 'digests'):
+                    continue
+                try:
+                    if not matcher.match(k):
+                        logger.debug('%s did not match %r', matcher, k)
+                    else:
+                        if prereleases or not vcls(k).is_prerelease:
+                            slist.append(k)
+                        else:
+                            logger.debug('skipping pre-release '
+                                         'version %s of %s', k, matcher.name)
+                except Exception:  # pragma: no cover
+                    logger.warning('error matching %s with %r', matcher, k)
+                    pass # slist.append(k)
+            if len(slist) > 1:
+                slist = sorted(slist, key=scheme.key)
+            if slist:
+                logger.debug('sorted list: %s', slist)
+                version = slist[-1]
+                result = versions[version]
+        if result:
+            if r.extras:
+                result.extras = r.extras
+            result.download_urls = versions.get('urls', {}).get(version, set())
+            d = {}
+            sd = versions.get('digests', {})
+            for url in result.download_urls:
+                if url in sd:  # pragma: no cover
+                    d[url] = sd[url]
+            result.digests = d
+        self.matcher = None
+        return result
+
+
+class PyPIRPCLocator(Locator):
+    """
+    This locator uses XML-RPC to locate distributions. It therefore
+    cannot be used with simple mirrors (that only mirror file content).
+    """
+    def __init__(self, url, **kwargs):
+        """
+        Initialise an instance.
+
+        :param url: The URL to use for XML-RPC.
+        :param kwargs: Passed to the superclass constructor.
+        """
+        super(PyPIRPCLocator, self).__init__(**kwargs)
+        self.base_url = url
+        self.client = ServerProxy(url, timeout=3.0)
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        return set(self.client.list_packages())
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        versions = self.client.package_releases(name, True)
+        for v in versions:
+            urls = self.client.release_urls(name, v)
+            data = self.client.release_data(name, v)
+            metadata = Metadata(scheme=self.scheme)
+            metadata.name = data['name']
+            metadata.version = data['version']
+            metadata.license = data.get('license')
+            metadata.keywords = data.get('keywords', [])
+            metadata.summary = data.get('summary')
+            dist = Distribution(metadata)
+            if urls:
+                info = urls[0]
+                metadata.source_url = info['url']
+                dist.digest = self._get_digest(info)
+                dist.locator = self
+                result[v] = dist
+                for info in urls:
+                    url = info['url']
+                    digest = self._get_digest(info)
+                    result['urls'].setdefault(v, set()).add(url)
+                    result['digests'][url] = digest
+        return result
+
+class PyPIJSONLocator(Locator):
+    """
+    This locator uses PyPI's JSON interface. It's very limited in functionality
+    and probably not worth using.
+    """
+    def __init__(self, url, **kwargs):
+        super(PyPIJSONLocator, self).__init__(**kwargs)
+        self.base_url = ensure_slash(url)
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        raise NotImplementedError('Not available from this locator')
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        url = urljoin(self.base_url, '%s/json' % quote(name))
+        try:
+            resp = self.opener.open(url)
+            data = resp.read().decode() # for now
+            d = json.loads(data)
+            md = Metadata(scheme=self.scheme)
+            data = d['info']
+            md.name = data['name']
+            md.version = data['version']
+            md.license = data.get('license')
+            md.keywords = data.get('keywords', [])
+            md.summary = data.get('summary')
+            dist = Distribution(md)
+            dist.locator = self
+            urls = d['urls']
+            result[md.version] = dist
+            for info in d['urls']:
+                url = info['url']
+                dist.download_urls.add(url)
+                dist.digests[url] = self._get_digest(info)
+                result['urls'].setdefault(md.version, set()).add(url)
+                result['digests'][url] = self._get_digest(info)
+            # Now get other releases
+            for version, infos in d['releases'].items():
+                if version == md.version:
+                    continue    # already done
+                omd = Metadata(scheme=self.scheme)
+                omd.name = md.name
+                omd.version = version
+                odist = Distribution(omd)
+                odist.locator = self
+                result[version] = odist
+                for info in infos:
+                    url = info['url']
+                    odist.download_urls.add(url)
+                    odist.digests[url] = self._get_digest(info)
+                    result['urls'].setdefault(version, set()).add(url)
+                    result['digests'][url] = self._get_digest(info)
+#            for info in urls:
+#                md.source_url = info['url']
+#                dist.digest = self._get_digest(info)
+#                dist.locator = self
+#                for info in urls:
+#                    url = info['url']
+#                    result['urls'].setdefault(md.version, set()).add(url)
+#                    result['digests'][url] = self._get_digest(info)
+        except Exception as e:
+            self.errors.put(text_type(e))
+            logger.exception('JSON fetch failed: %s', e)
+        return result
+
+
+class Page(object):
+    """
+    This class represents a scraped HTML page.
+    """
+    # The following slightly hairy-looking regex just looks for the contents of
+    # an anchor link, which has an attribute "href" either immediately preceded
+    # or immediately followed by a "rel" attribute. The attribute values can be
+    # declared with double quotes, single quotes or no quotes - which leads to
+    # the length of the expression.
+    _href = re.compile("""
+(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)?
+href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*))
+(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))?
+""", re.I | re.S | re.X)
+    _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S)
+
+    def __init__(self, data, url):
+        """
+        Initialise an instance with the Unicode page contents and the URL they
+        came from.
+        """
+        self.data = data
+        self.base_url = self.url = url
+        m = self._base.search(self.data)
+        if m:
+            self.base_url = m.group(1)
+
+    _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
+
+    @cached_property
+    def links(self):
+        """
+        Return the URLs of all the links on a page together with information
+        about their "rel" attribute, for determining which ones to treat as
+        downloads and which ones to queue for further scraping.
+        """
+        def clean(url):
+            "Tidy up an URL."
+            scheme, netloc, path, params, query, frag = urlparse(url)
+            return urlunparse((scheme, netloc, quote(path),
+                               params, query, frag))
+
+        result = set()
+        for match in self._href.finditer(self.data):
+            d = match.groupdict('')
+            rel = (d['rel1'] or d['rel2'] or d['rel3'] or
+                   d['rel4'] or d['rel5'] or d['rel6'])
+            url = d['url1'] or d['url2'] or d['url3']
+            url = urljoin(self.base_url, url)
+            url = unescape(url)
+            url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url)
+            result.add((url, rel))
+        # We sort the result, hoping to bring the most recent versions
+        # to the front
+        result = sorted(result, key=lambda t: t[0], reverse=True)
+        return result
+
+
+class SimpleScrapingLocator(Locator):
+    """
+    A locator which scrapes HTML pages to locate downloads for a distribution.
+    This runs multiple threads to do the I/O; performance is at least as good
+    as pip's PackageFinder, which works in an analogous fashion.
+    """
+
+    # These are used to deal with various Content-Encoding schemes.
+    decoders = {
+        'deflate': zlib.decompress,
+        'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(),
+        'none': lambda b: b,
+    }
+
+    def __init__(self, url, timeout=None, num_workers=10, **kwargs):
+        """
+        Initialise an instance.
+        :param url: The root URL to use for scraping.
+        :param timeout: The timeout, in seconds, to be applied to requests.
+                        This defaults to ``None`` (no timeout specified).
+        :param num_workers: The number of worker threads you want to do I/O,
+                            This defaults to 10.
+        :param kwargs: Passed to the superclass.
+        """
+        super(SimpleScrapingLocator, self).__init__(**kwargs)
+        self.base_url = ensure_slash(url)
+        self.timeout = timeout
+        self._page_cache = {}
+        self._seen = set()
+        self._to_fetch = queue.Queue()
+        self._bad_hosts = set()
+        self.skip_externals = False
+        self.num_workers = num_workers
+        self._lock = threading.RLock()
+        # See issue #45: we need to be resilient when the locator is used
+        # in a thread, e.g. with concurrent.futures. We can't use self._lock
+        # as it is for coordinating our internal threads - the ones created
+        # in _prepare_threads.
+        self._gplock = threading.RLock()
+        self.platform_check = False  # See issue #112
+
+    def _prepare_threads(self):
+        """
+        Threads are created only when get_project is called, and terminate
+        before it returns. They are there primarily to parallelise I/O (i.e.
+        fetching web pages).
+        """
+        self._threads = []
+        for i in range(self.num_workers):
+            t = threading.Thread(target=self._fetch)
+            t.setDaemon(True)
+            t.start()
+            self._threads.append(t)
+
+    def _wait_threads(self):
+        """
+        Tell all the threads to terminate (by sending a sentinel value) and
+        wait for them to do so.
+        """
+        # Note that you need two loops, since you can't say which
+        # thread will get each sentinel
+        for t in self._threads:
+            self._to_fetch.put(None)    # sentinel
+        for t in self._threads:
+            t.join()
+        self._threads = []
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        with self._gplock:
+            self.result = result
+            self.project_name = name
+            url = urljoin(self.base_url, '%s/' % quote(name))
+            self._seen.clear()
+            self._page_cache.clear()
+            self._prepare_threads()
+            try:
+                logger.debug('Queueing %s', url)
+                self._to_fetch.put(url)
+                self._to_fetch.join()
+            finally:
+                self._wait_threads()
+            del self.result
+        return result
+
+    platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|'
+                                    r'win(32|_amd64)|macosx_?\d+)\b', re.I)
+
+    def _is_platform_dependent(self, url):
+        """
+        Does an URL refer to a platform-specific download?
+        """
+        return self.platform_dependent.search(url)
+
+    def _process_download(self, url):
+        """
+        See if an URL is a suitable download for a project.
+
+        If it is, register information in the result dictionary (for
+        _get_project) about the specific version it's for.
+
+        Note that the return value isn't actually used other than as a boolean
+        value.
+        """
+        if self.platform_check and self._is_platform_dependent(url):
+            info = None
+        else:
+            info = self.convert_url_to_download_info(url, self.project_name)
+        logger.debug('process_download: %s -> %s', url, info)
+        if info:
+            with self._lock:    # needed because self.result is shared
+                self._update_version_data(self.result, info)
+        return info
+
+    def _should_queue(self, link, referrer, rel):
+        """
+        Determine whether a link URL from a referring page and with a
+        particular "rel" attribute should be queued for scraping.
+        """
+        scheme, netloc, path, _, _, _ = urlparse(link)
+        if path.endswith(self.source_extensions + self.binary_extensions +
+                         self.excluded_extensions):
+            result = False
+        elif self.skip_externals and not link.startswith(self.base_url):
+            result = False
+        elif not referrer.startswith(self.base_url):
+            result = False
+        elif rel not in ('homepage', 'download'):
+            result = False
+        elif scheme not in ('http', 'https', 'ftp'):
+            result = False
+        elif self._is_platform_dependent(link):
+            result = False
+        else:
+            host = netloc.split(':', 1)[0]
+            if host.lower() == 'localhost':
+                result = False
+            else:
+                result = True
+        logger.debug('should_queue: %s (%s) from %s -> %s', link, rel,
+                     referrer, result)
+        return result
+
+    def _fetch(self):
+        """
+        Get a URL to fetch from the work queue, get the HTML page, examine its
+        links for download candidates and candidates for further scraping.
+
+        This is a handy method to run in a thread.
+        """
+        while True:
+            url = self._to_fetch.get()
+            try:
+                if url:
+                    page = self.get_page(url)
+                    if page is None:    # e.g. after an error
+                        continue
+                    for link, rel in page.links:
+                        if link not in self._seen:
+                            try:
+                                self._seen.add(link)
+                                if (not self._process_download(link) and
+                                    self._should_queue(link, url, rel)):
+                                    logger.debug('Queueing %s from %s', link, url)
+                                    self._to_fetch.put(link)
+                            except MetadataInvalidError:  # e.g. invalid versions
+                                pass
+            except Exception as e:  # pragma: no cover
+                self.errors.put(text_type(e))
+            finally:
+                # always do this, to avoid hangs :-)
+                self._to_fetch.task_done()
+            if not url:
+                #logger.debug('Sentinel seen, quitting.')
+                break
+
+    def get_page(self, url):
+        """
+        Get the HTML for an URL, possibly from an in-memory cache.
+
+        XXX TODO Note: this cache is never actually cleared. It's assumed that
+        the data won't get stale over the lifetime of a locator instance (not
+        necessarily true for the default_locator).
+        """
+        # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api
+        scheme, netloc, path, _, _, _ = urlparse(url)
+        if scheme == 'file' and os.path.isdir(url2pathname(path)):
+            url = urljoin(ensure_slash(url), 'index.html')
+
+        if url in self._page_cache:
+            result = self._page_cache[url]
+            logger.debug('Returning %s from cache: %s', url, result)
+        else:
+            host = netloc.split(':', 1)[0]
+            result = None
+            if host in self._bad_hosts:
+                logger.debug('Skipping %s due to bad host %s', url, host)
+            else:
+                req = Request(url, headers={'Accept-encoding': 'identity'})
+                try:
+                    logger.debug('Fetching %s', url)
+                    resp = self.opener.open(req, timeout=self.timeout)
+                    logger.debug('Fetched %s', url)
+                    headers = resp.info()
+                    content_type = headers.get('Content-Type', '')
+                    if HTML_CONTENT_TYPE.match(content_type):
+                        final_url = resp.geturl()
+                        data = resp.read()
+                        encoding = headers.get('Content-Encoding')
+                        if encoding:
+                            decoder = self.decoders[encoding]   # fail if not found
+                            data = decoder(data)
+                        encoding = 'utf-8'
+                        m = CHARSET.search(content_type)
+                        if m:
+                            encoding = m.group(1)
+                        try:
+                            data = data.decode(encoding)
+                        except UnicodeError:  # pragma: no cover
+                            data = data.decode('latin-1')    # fallback
+                        result = Page(data, final_url)
+                        self._page_cache[final_url] = result
+                except HTTPError as e:
+                    if e.code != 404:
+                        logger.exception('Fetch failed: %s: %s', url, e)
+                except URLError as e:  # pragma: no cover
+                    logger.exception('Fetch failed: %s: %s', url, e)
+                    with self._lock:
+                        self._bad_hosts.add(host)
+                except Exception as e:  # pragma: no cover
+                    logger.exception('Fetch failed: %s: %s', url, e)
+                finally:
+                    self._page_cache[url] = result   # even if None (failure)
+        return result
+
+    _distname_re = re.compile('<a href=[^>]*>([^<]+)<')
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        result = set()
+        page = self.get_page(self.base_url)
+        if not page:
+            raise DistlibException('Unable to get %s' % self.base_url)
+        for match in self._distname_re.finditer(page.data):
+            result.add(match.group(1))
+        return result
+
+class DirectoryLocator(Locator):
+    """
+    This class locates distributions in a directory tree.
+    """
+
+    def __init__(self, path, **kwargs):
+        """
+        Initialise an instance.
+        :param path: The root of the directory tree to search.
+        :param kwargs: Passed to the superclass constructor,
+                       except for:
+                       * recursive - if True (the default), subdirectories are
+                         recursed into. If False, only the top-level directory
+                         is searched,
+        """
+        self.recursive = kwargs.pop('recursive', True)
+        super(DirectoryLocator, self).__init__(**kwargs)
+        path = os.path.abspath(path)
+        if not os.path.isdir(path):  # pragma: no cover
+            raise DistlibException('Not a directory: %r' % path)
+        self.base_dir = path
+
+    def should_include(self, filename, parent):
+        """
+        Should a filename be considered as a candidate for a distribution
+        archive? As well as the filename, the directory which contains it
+        is provided, though not used by the current implementation.
+        """
+        return filename.endswith(self.downloadable_extensions)
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        for root, dirs, files in os.walk(self.base_dir):
+            for fn in files:
+                if self.should_include(fn, root):
+                    fn = os.path.join(root, fn)
+                    url = urlunparse(('file', '',
+                                      pathname2url(os.path.abspath(fn)),
+                                      '', '', ''))
+                    info = self.convert_url_to_download_info(url, name)
+                    if info:
+                        self._update_version_data(result, info)
+            if not self.recursive:
+                break
+        return result
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        result = set()
+        for root, dirs, files in os.walk(self.base_dir):
+            for fn in files:
+                if self.should_include(fn, root):
+                    fn = os.path.join(root, fn)
+                    url = urlunparse(('file', '',
+                                      pathname2url(os.path.abspath(fn)),
+                                      '', '', ''))
+                    info = self.convert_url_to_download_info(url, None)
+                    if info:
+                        result.add(info['name'])
+            if not self.recursive:
+                break
+        return result
+
+class JSONLocator(Locator):
+    """
+    This locator uses special extended metadata (not available on PyPI) and is
+    the basis of performant dependency resolution in distlib. Other locators
+    require archive downloads before dependencies can be determined! As you
+    might imagine, that can be slow.
+    """
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        raise NotImplementedError('Not available from this locator')
+
+    def _get_project(self, name):
+        result = {'urls': {}, 'digests': {}}
+        data = get_project_data(name)
+        if data:
+            for info in data.get('files', []):
+                if info['ptype'] != 'sdist' or info['pyversion'] != 'source':
+                    continue
+                # We don't store summary in project metadata as it makes
+                # the data bigger for no benefit during dependency
+                # resolution
+                dist = make_dist(data['name'], info['version'],
+                                 summary=data.get('summary',
+                                                  'Placeholder for summary'),
+                                 scheme=self.scheme)
+                md = dist.metadata
+                md.source_url = info['url']
+                # TODO SHA256 digest
+                if 'digest' in info and info['digest']:
+                    dist.digest = ('md5', info['digest'])
+                md.dependencies = info.get('requirements', {})
+                dist.exports = info.get('exports', {})
+                result[dist.version] = dist
+                result['urls'].setdefault(dist.version, set()).add(info['url'])
+        return result
+
+class DistPathLocator(Locator):
+    """
+    This locator finds installed distributions in a path. It can be useful for
+    adding to an :class:`AggregatingLocator`.
+    """
+    def __init__(self, distpath, **kwargs):
+        """
+        Initialise an instance.
+
+        :param distpath: A :class:`DistributionPath` instance to search.
+        """
+        super(DistPathLocator, self).__init__(**kwargs)
+        assert isinstance(distpath, DistributionPath)
+        self.distpath = distpath
+
+    def _get_project(self, name):
+        dist = self.distpath.get_distribution(name)
+        if dist is None:
+            result = {'urls': {}, 'digests': {}}
+        else:
+            result = {
+                dist.version: dist,
+                'urls': {dist.version: set([dist.source_url])},
+                'digests': {dist.version: set([None])}
+            }
+        return result
+
+
+class AggregatingLocator(Locator):
+    """
+    This class allows you to chain and/or merge a list of locators.
+    """
+    def __init__(self, *locators, **kwargs):
+        """
+        Initialise an instance.
+
+        :param locators: The list of locators to search.
+        :param kwargs: Passed to the superclass constructor,
+                       except for:
+                       * merge - if False (the default), the first successful
+                         search from any of the locators is returned. If True,
+                         the results from all locators are merged (this can be
+                         slow).
+        """
+        self.merge = kwargs.pop('merge', False)
+        self.locators = locators
+        super(AggregatingLocator, self).__init__(**kwargs)
+
+    def clear_cache(self):
+        super(AggregatingLocator, self).clear_cache()
+        for locator in self.locators:
+            locator.clear_cache()
+
+    def _set_scheme(self, value):
+        self._scheme = value
+        for locator in self.locators:
+            locator.scheme = value
+
+    scheme = property(Locator.scheme.fget, _set_scheme)
+
+    def _get_project(self, name):
+        result = {}
+        for locator in self.locators:
+            d = locator.get_project(name)
+            if d:
+                if self.merge:
+                    files = result.get('urls', {})
+                    digests = result.get('digests', {})
+                    # next line could overwrite result['urls'], result['digests']
+                    result.update(d)
+                    df = result.get('urls')
+                    if files and df:
+                        for k, v in files.items():
+                            if k in df:
+                                df[k] |= v
+                            else:
+                                df[k] = v
+                    dd = result.get('digests')
+                    if digests and dd:
+                        dd.update(digests)
+                else:
+                    # See issue #18. If any dists are found and we're looking
+                    # for specific constraints, we only return something if
+                    # a match is found. For example, if a DirectoryLocator
+                    # returns just foo (1.0) while we're looking for
+                    # foo (>= 2.0), we'll pretend there was nothing there so
+                    # that subsequent locators can be queried. Otherwise we
+                    # would just return foo (1.0) which would then lead to a
+                    # failure to find foo (>= 2.0), because other locators
+                    # weren't searched. Note that this only matters when
+                    # merge=False.
+                    if self.matcher is None:
+                        found = True
+                    else:
+                        found = False
+                        for k in d:
+                            if self.matcher.match(k):
+                                found = True
+                                break
+                    if found:
+                        result = d
+                        break
+        return result
+
+    def get_distribution_names(self):
+        """
+        Return all the distribution names known to this locator.
+        """
+        result = set()
+        for locator in self.locators:
+            try:
+                result |= locator.get_distribution_names()
+            except NotImplementedError:
+                pass
+        return result
+
+
+# We use a legacy scheme simply because most of the dists on PyPI use legacy
+# versions which don't conform to PEP 426 / PEP 440.
+default_locator = AggregatingLocator(
+                    JSONLocator(),
+                    SimpleScrapingLocator('https://pypi.python.org/simple/',
+                                          timeout=3.0),
+                    scheme='legacy')
+
+locate = default_locator.locate
+
+NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*'
+                             r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$')
+
+class DependencyFinder(object):
+    """
+    Locate dependencies for distributions.
+    """
+
+    def __init__(self, locator=None):
+        """
+        Initialise an instance, using the specified locator
+        to locate distributions.
+        """
+        self.locator = locator or default_locator
+        self.scheme = get_scheme(self.locator.scheme)
+
+    def add_distribution(self, dist):
+        """
+        Add a distribution to the finder. This will update internal information
+        about who provides what.
+        :param dist: The distribution to add.
+        """
+        logger.debug('adding distribution %s', dist)
+        name = dist.key
+        self.dists_by_name[name] = dist
+        self.dists[(name, dist.version)] = dist
+        for p in dist.provides:
+            name, version = parse_name_and_version(p)
+            logger.debug('Add to provided: %s, %s, %s', name, version, dist)
+            self.provided.setdefault(name, set()).add((version, dist))
+
+    def remove_distribution(self, dist):
+        """
+        Remove a distribution from the finder. This will update internal
+        information about who provides what.
+        :param dist: The distribution to remove.
+        """
+        logger.debug('removing distribution %s', dist)
+        name = dist.key
+        del self.dists_by_name[name]
+        del self.dists[(name, dist.version)]
+        for p in dist.provides:
+            name, version = parse_name_and_version(p)
+            logger.debug('Remove from provided: %s, %s, %s', name, version, dist)
+            s = self.provided[name]
+            s.remove((version, dist))
+            if not s:
+                del self.provided[name]
+
+    def get_matcher(self, reqt):
+        """
+        Get a version matcher for a requirement.
+        :param reqt: The requirement
+        :type reqt: str
+        :return: A version matcher (an instance of
+                 :class:`distlib.version.Matcher`).
+        """
+        try:
+            matcher = self.scheme.matcher(reqt)
+        except UnsupportedVersionError:  # pragma: no cover
+            # XXX compat-mode if cannot read the version
+            name = reqt.split()[0]
+            matcher = self.scheme.matcher(name)
+        return matcher
+
+    def find_providers(self, reqt):
+        """
+        Find the distributions which can fulfill a requirement.
+
+        :param reqt: The requirement.
+         :type reqt: str
+        :return: A set of distribution which can fulfill the requirement.
+        """
+        matcher = self.get_matcher(reqt)
+        name = matcher.key   # case-insensitive
+        result = set()
+        provided = self.provided
+        if name in provided:
+            for version, provider in provided[name]:
+                try:
+                    match = matcher.match(version)
+                except UnsupportedVersionError:
+                    match = False
+
+                if match:
+                    result.add(provider)
+                    break
+        return result
+
+    def try_to_replace(self, provider, other, problems):
+        """
+        Attempt to replace one provider with another. This is typically used
+        when resolving dependencies from multiple sources, e.g. A requires
+        (B >= 1.0) while C requires (B >= 1.1).
+
+        For successful replacement, ``provider`` must meet all the requirements
+        which ``other`` fulfills.
+
+        :param provider: The provider we are trying to replace with.
+        :param other: The provider we're trying to replace.
+        :param problems: If False is returned, this will contain what
+                         problems prevented replacement. This is currently
+                         a tuple of the literal string 'cantreplace',
+                         ``provider``, ``other``  and the set of requirements
+                         that ``provider`` couldn't fulfill.
+        :return: True if we can replace ``other`` with ``provider``, else
+                 False.
+        """
+        rlist = self.reqts[other]
+        unmatched = set()
+        for s in rlist:
+            matcher = self.get_matcher(s)
+            if not matcher.match(provider.version):
+                unmatched.add(s)
+        if unmatched:
+            # can't replace other with provider
+            problems.add(('cantreplace', provider, other,
+                          frozenset(unmatched)))
+            result = False
+        else:
+            # can replace other with provider
+            self.remove_distribution(other)
+            del self.reqts[other]
+            for s in rlist:
+                self.reqts.setdefault(provider, set()).add(s)
+            self.add_distribution(provider)
+            result = True
+        return result
+
+    def find(self, requirement, meta_extras=None, prereleases=False):
+        """
+        Find a distribution and all distributions it depends on.
+
+        :param requirement: The requirement specifying the distribution to
+                            find, or a Distribution instance.
+        :param meta_extras: A list of meta extras such as :test:, :build: and
+                            so on.
+        :param prereleases: If ``True``, allow pre-release versions to be
+                            returned - otherwise, don't return prereleases
+                            unless they're all that's available.
+
+        Return a set of :class:`Distribution` instances and a set of
+        problems.
+
+        The distributions returned should be such that they have the
+        :attr:`required` attribute set to ``True`` if they were
+        from the ``requirement`` passed to ``find()``, and they have the
+        :attr:`build_time_dependency` attribute set to ``True`` unless they
+        are post-installation dependencies of the ``requirement``.
+
+        The problems should be a tuple consisting of the string
+        ``'unsatisfied'`` and the requirement which couldn't be satisfied
+        by any distribution known to the locator.
+        """
+
+        self.provided = {}
+        self.dists = {}
+        self.dists_by_name = {}
+        self.reqts = {}
+
+        meta_extras = set(meta_extras or [])
+        if ':*:' in meta_extras:
+            meta_extras.remove(':*:')
+            # :meta: and :run: are implicitly included
+            meta_extras |= set([':test:', ':build:', ':dev:'])
+
+        if isinstance(requirement, Distribution):
+            dist = odist = requirement
+            logger.debug('passed %s as requirement', odist)
+        else:
+            dist = odist = self.locator.locate(requirement,
+                                               prereleases=prereleases)
+            if dist is None:
+                raise DistlibException('Unable to locate %r' % requirement)
+            logger.debug('located %s', odist)
+        dist.requested = True
+        problems = set()
+        todo = set([dist])
+        install_dists = set([odist])
+        while todo:
+            dist = todo.pop()
+            name = dist.key     # case-insensitive
+            if name not in self.dists_by_name:
+                self.add_distribution(dist)
+            else:
+                #import pdb; pdb.set_trace()
+                other = self.dists_by_name[name]
+                if other != dist:
+                    self.try_to_replace(dist, other, problems)
+
+            ireqts = dist.run_requires | dist.meta_requires
+            sreqts = dist.build_requires
+            ereqts = set()
+            if meta_extras and dist in install_dists:
+                for key in ('test', 'build', 'dev'):
+                    e = ':%s:' % key
+                    if e in meta_extras:
+                        ereqts |= getattr(dist, '%s_requires' % key)
+            all_reqts = ireqts | sreqts | ereqts
+            for r in all_reqts:
+                providers = self.find_providers(r)
+                if not providers:
+                    logger.debug('No providers found for %r', r)
+                    provider = self.locator.locate(r, prereleases=prereleases)
+                    # If no provider is found and we didn't consider
+                    # prereleases, consider them now.
+                    if provider is None and not prereleases:
+                        provider = self.locator.locate(r, prereleases=True)
+                    if provider is None:
+                        logger.debug('Cannot satisfy %r', r)
+                        problems.add(('unsatisfied', r))
+                    else:
+                        n, v = provider.key, provider.version
+                        if (n, v) not in self.dists:
+                            todo.add(provider)
+                        providers.add(provider)
+                        if r in ireqts and dist in install_dists:
+                            install_dists.add(provider)
+                            logger.debug('Adding %s to install_dists',
+                                         provider.name_and_version)
+                for p in providers:
+                    name = p.key
+                    if name not in self.dists_by_name:
+                        self.reqts.setdefault(p, set()).add(r)
+                    else:
+                        other = self.dists_by_name[name]
+                        if other != p:
+                            # see if other can be replaced by p
+                            self.try_to_replace(p, other, problems)
+
+        dists = set(self.dists.values())
+        for dist in dists:
+            dist.build_time_dependency = dist not in install_dists
+            if dist.build_time_dependency:
+                logger.debug('%s is a build-time dependency only.',
+                             dist.name_and_version)
+        logger.debug('find done for %s', odist)
+        return dists, problems
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6310b421325c6fcf3877d298fab997132ae819e3
GIT binary patch
literal 49754
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
KIGH$^_?ZD*uy6zb

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py
new file mode 100644
index 00000000..ca0fe442
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py
@@ -0,0 +1,393 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2013 Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""
+Class representing the list of files in a distribution.
+
+Equivalent to distutils.filelist, but fixes some problems.
+"""
+import fnmatch
+import logging
+import os
+import re
+import sys
+
+from . import DistlibException
+from .compat import fsdecode
+from .util import convert_path
+
+
+__all__ = ['Manifest']
+
+logger = logging.getLogger(__name__)
+
+# a \ followed by some spaces + EOL
+_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M)
+_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S)
+
+#
+# Due to the different results returned by fnmatch.translate, we need
+# to do slightly different processing for Python 2.7 and 3.2 ... this needed
+# to be brought in for Python 3.6 onwards.
+#
+_PYTHON_VERSION = sys.version_info[:2]
+
+class Manifest(object):
+    """A list of files built by on exploring the filesystem and filtered by
+    applying various patterns to what we find there.
+    """
+
+    def __init__(self, base=None):
+        """
+        Initialise an instance.
+
+        :param base: The base directory to explore under.
+        """
+        self.base = os.path.abspath(os.path.normpath(base or os.getcwd()))
+        self.prefix = self.base + os.sep
+        self.allfiles = None
+        self.files = set()
+
+    #
+    # Public API
+    #
+
+    def findall(self):
+        """Find all files under the base and set ``allfiles`` to the absolute
+        pathnames of files found.
+        """
+        from stat import S_ISREG, S_ISDIR, S_ISLNK
+
+        self.allfiles = allfiles = []
+        root = self.base
+        stack = [root]
+        pop = stack.pop
+        push = stack.append
+
+        while stack:
+            root = pop()
+            names = os.listdir(root)
+
+            for name in names:
+                fullname = os.path.join(root, name)
+
+                # Avoid excess stat calls -- just one will do, thank you!
+                stat = os.stat(fullname)
+                mode = stat.st_mode
+                if S_ISREG(mode):
+                    allfiles.append(fsdecode(fullname))
+                elif S_ISDIR(mode) and not S_ISLNK(mode):
+                    push(fullname)
+
+    def add(self, item):
+        """
+        Add a file to the manifest.
+
+        :param item: The pathname to add. This can be relative to the base.
+        """
+        if not item.startswith(self.prefix):
+            item = os.path.join(self.base, item)
+        self.files.add(os.path.normpath(item))
+
+    def add_many(self, items):
+        """
+        Add a list of files to the manifest.
+
+        :param items: The pathnames to add. These can be relative to the base.
+        """
+        for item in items:
+            self.add(item)
+
+    def sorted(self, wantdirs=False):
+        """
+        Return sorted files in directory order
+        """
+
+        def add_dir(dirs, d):
+            dirs.add(d)
+            logger.debug('add_dir added %s', d)
+            if d != self.base:
+                parent, _ = os.path.split(d)
+                assert parent not in ('', '/')
+                add_dir(dirs, parent)
+
+        result = set(self.files)    # make a copy!
+        if wantdirs:
+            dirs = set()
+            for f in result:
+                add_dir(dirs, os.path.dirname(f))
+            result |= dirs
+        return [os.path.join(*path_tuple) for path_tuple in
+                sorted(os.path.split(path) for path in result)]
+
+    def clear(self):
+        """Clear all collected files."""
+        self.files = set()
+        self.allfiles = []
+
+    def process_directive(self, directive):
+        """
+        Process a directive which either adds some files from ``allfiles`` to
+        ``files``, or removes some files from ``files``.
+
+        :param directive: The directive to process. This should be in a format
+                     compatible with distutils ``MANIFEST.in`` files:
+
+                     http://docs.python.org/distutils/sourcedist.html#commands
+        """
+        # Parse the line: split it up, make sure the right number of words
+        # is there, and return the relevant words.  'action' is always
+        # defined: it's the first word of the line.  Which of the other
+        # three are defined depends on the action; it'll be either
+        # patterns, (dir and patterns), or (dirpattern).
+        action, patterns, thedir, dirpattern = self._parse_directive(directive)
+
+        # OK, now we know that the action is valid and we have the
+        # right number of words on the line for that action -- so we
+        # can proceed with minimal error-checking.
+        if action == 'include':
+            for pattern in patterns:
+                if not self._include_pattern(pattern, anchor=True):
+                    logger.warning('no files found matching %r', pattern)
+
+        elif action == 'exclude':
+            for pattern in patterns:
+                found = self._exclude_pattern(pattern, anchor=True)
+                #if not found:
+                #    logger.warning('no previously-included files '
+                #                   'found matching %r', pattern)
+
+        elif action == 'global-include':
+            for pattern in patterns:
+                if not self._include_pattern(pattern, anchor=False):
+                    logger.warning('no files found matching %r '
+                                   'anywhere in distribution', pattern)
+
+        elif action == 'global-exclude':
+            for pattern in patterns:
+                found = self._exclude_pattern(pattern, anchor=False)
+                #if not found:
+                #    logger.warning('no previously-included files '
+                #                   'matching %r found anywhere in '
+                #                   'distribution', pattern)
+
+        elif action == 'recursive-include':
+            for pattern in patterns:
+                if not self._include_pattern(pattern, prefix=thedir):
+                    logger.warning('no files found matching %r '
+                                   'under directory %r', pattern, thedir)
+
+        elif action == 'recursive-exclude':
+            for pattern in patterns:
+                found = self._exclude_pattern(pattern, prefix=thedir)
+                #if not found:
+                #    logger.warning('no previously-included files '
+                #                   'matching %r found under directory %r',
+                #                   pattern, thedir)
+
+        elif action == 'graft':
+            if not self._include_pattern(None, prefix=dirpattern):
+                logger.warning('no directories found matching %r',
+                               dirpattern)
+
+        elif action == 'prune':
+            if not self._exclude_pattern(None, prefix=dirpattern):
+                logger.warning('no previously-included directories found '
+                               'matching %r', dirpattern)
+        else:   # pragma: no cover
+            # This should never happen, as it should be caught in
+            # _parse_template_line
+            raise DistlibException(
+                'invalid action %r' % action)
+
+    #
+    # Private API
+    #
+
+    def _parse_directive(self, directive):
+        """
+        Validate a directive.
+        :param directive: The directive to validate.
+        :return: A tuple of action, patterns, thedir, dir_patterns
+        """
+        words = directive.split()
+        if len(words) == 1 and words[0] not in ('include', 'exclude',
+                                                'global-include',
+                                                'global-exclude',
+                                                'recursive-include',
+                                                'recursive-exclude',
+                                                'graft', 'prune'):
+            # no action given, let's use the default 'include'
+            words.insert(0, 'include')
+
+        action = words[0]
+        patterns = thedir = dir_pattern = None
+
+        if action in ('include', 'exclude',
+                      'global-include', 'global-exclude'):
+            if len(words) < 2:
+                raise DistlibException(
+                    '%r expects <pattern1> <pattern2> ...' % action)
+
+            patterns = [convert_path(word) for word in words[1:]]
+
+        elif action in ('recursive-include', 'recursive-exclude'):
+            if len(words) < 3:
+                raise DistlibException(
+                    '%r expects <dir> <pattern1> <pattern2> ...' % action)
+
+            thedir = convert_path(words[1])
+            patterns = [convert_path(word) for word in words[2:]]
+
+        elif action in ('graft', 'prune'):
+            if len(words) != 2:
+                raise DistlibException(
+                    '%r expects a single <dir_pattern>' % action)
+
+            dir_pattern = convert_path(words[1])
+
+        else:
+            raise DistlibException('unknown action %r' % action)
+
+        return action, patterns, thedir, dir_pattern
+
+    def _include_pattern(self, pattern, anchor=True, prefix=None,
+                         is_regex=False):
+        """Select strings (presumably filenames) from 'self.files' that
+        match 'pattern', a Unix-style wildcard (glob) pattern.
+
+        Patterns are not quite the same as implemented by the 'fnmatch'
+        module: '*' and '?'  match non-special characters, where "special"
+        is platform-dependent: slash on Unix; colon, slash, and backslash on
+        DOS/Windows; and colon on Mac OS.
+
+        If 'anchor' is true (the default), then the pattern match is more
+        stringent: "*.py" will match "foo.py" but not "foo/bar.py".  If
+        'anchor' is false, both of these will match.
+
+        If 'prefix' is supplied, then only filenames starting with 'prefix'
+        (itself a pattern) and ending with 'pattern', with anything in between
+        them, will match.  'anchor' is ignored in this case.
+
+        If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
+        'pattern' is assumed to be either a string containing a regex or a
+        regex object -- no translation is done, the regex is just compiled
+        and used as-is.
+
+        Selected strings will be added to self.files.
+
+        Return True if files are found.
+        """
+        # XXX docstring lying about what the special chars are?
+        found = False
+        pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
+
+        # delayed loading of allfiles list
+        if self.allfiles is None:
+            self.findall()
+
+        for name in self.allfiles:
+            if pattern_re.search(name):
+                self.files.add(name)
+                found = True
+        return found
+
+    def _exclude_pattern(self, pattern, anchor=True, prefix=None,
+                         is_regex=False):
+        """Remove strings (presumably filenames) from 'files' that match
+        'pattern'.
+
+        Other parameters are the same as for 'include_pattern()', above.
+        The list 'self.files' is modified in place. Return True if files are
+        found.
+
+        This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
+        packaging source distributions
+        """
+        found = False
+        pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
+        for f in list(self.files):
+            if pattern_re.search(f):
+                self.files.remove(f)
+                found = True
+        return found
+
+    def _translate_pattern(self, pattern, anchor=True, prefix=None,
+                           is_regex=False):
+        """Translate a shell-like wildcard pattern to a compiled regular
+        expression.
+
+        Return the compiled regex.  If 'is_regex' true,
+        then 'pattern' is directly compiled to a regex (if it's a string)
+        or just returned as-is (assumes it's a regex object).
+        """
+        if is_regex:
+            if isinstance(pattern, str):
+                return re.compile(pattern)
+            else:
+                return pattern
+
+        if _PYTHON_VERSION > (3, 2):
+            # ditch start and end characters
+            start, _, end = self._glob_to_re('_').partition('_')
+
+        if pattern:
+            pattern_re = self._glob_to_re(pattern)
+            if _PYTHON_VERSION > (3, 2):
+                assert pattern_re.startswith(start) and pattern_re.endswith(end)
+        else:
+            pattern_re = ''
+
+        base = re.escape(os.path.join(self.base, ''))
+        if prefix is not None:
+            # ditch end of pattern character
+            if _PYTHON_VERSION <= (3, 2):
+                empty_pattern = self._glob_to_re('')
+                prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)]
+            else:
+                prefix_re = self._glob_to_re(prefix)
+                assert prefix_re.startswith(start) and prefix_re.endswith(end)
+                prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
+            sep = os.sep
+            if os.sep == '\\':
+                sep = r'\\'
+            if _PYTHON_VERSION <= (3, 2):
+                pattern_re = '^' + base + sep.join((prefix_re,
+                                                    '.*' + pattern_re))
+            else:
+                pattern_re = pattern_re[len(start): len(pattern_re) - len(end)]
+                pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep,
+                                                  pattern_re, end)
+        else:  # no prefix -- respect anchor flag
+            if anchor:
+                if _PYTHON_VERSION <= (3, 2):
+                    pattern_re = '^' + base + pattern_re
+                else:
+                    pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):])
+
+        return re.compile(pattern_re)
+
+    def _glob_to_re(self, pattern):
+        """Translate a shell-like glob pattern to a regular expression.
+
+        Return a string containing the regex.  Differs from
+        'fnmatch.translate()' in that '*' does not match "special characters"
+        (which are platform-specific).
+        """
+        pattern_re = fnmatch.translate(pattern)
+
+        # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
+        # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
+        # and by extension they shouldn't match such "special characters" under
+        # any OS.  So change all non-escaped dots in the RE to match any
+        # character except the special characters (currently: just os.sep).
+        sep = os.sep
+        if os.sep == '\\':
+            # we're using a regex to manipulate a regex, so we need
+            # to escape the backslash twice
+            sep = r'\\\\'
+        escaped = r'\1[^%s]' % sep
+        pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re)
+        return pattern_re
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..82cfff356b3446eba1ea95c809fb5bf125517822
GIT binary patch
literal 12906
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py
new file mode 100644
index 00000000..ee1f3e23
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2017 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""
+Parser for the environment markers micro-language defined in PEP 508.
+"""
+
+# Note: In PEP 345, the micro-language was Python compatible, so the ast
+# module could be used to parse it. However, PEP 508 introduced operators such
+# as ~= and === which aren't in Python, necessitating a different approach.
+
+import os
+import sys
+import platform
+import re
+
+from .compat import python_implementation, urlparse, string_types
+from .util import in_venv, parse_marker
+
+__all__ = ['interpret']
+
+def _is_literal(o):
+    if not isinstance(o, string_types) or not o:
+        return False
+    return o[0] in '\'"'
+
+class Evaluator(object):
+    """
+    This class is used to evaluate marker expessions.
+    """
+
+    operations = {
+        '==': lambda x, y: x == y,
+        '===': lambda x, y: x == y,
+        '~=': lambda x, y: x == y or x > y,
+        '!=': lambda x, y: x != y,
+        '<':  lambda x, y: x < y,
+        '<=':  lambda x, y: x == y or x < y,
+        '>':  lambda x, y: x > y,
+        '>=':  lambda x, y: x == y or x > y,
+        'and': lambda x, y: x and y,
+        'or': lambda x, y: x or y,
+        'in': lambda x, y: x in y,
+        'not in': lambda x, y: x not in y,
+    }
+
+    def evaluate(self, expr, context):
+        """
+        Evaluate a marker expression returned by the :func:`parse_requirement`
+        function in the specified context.
+        """
+        if isinstance(expr, string_types):
+            if expr[0] in '\'"':
+                result = expr[1:-1]
+            else:
+                if expr not in context:
+                    raise SyntaxError('unknown variable: %s' % expr)
+                result = context[expr]
+        else:
+            assert isinstance(expr, dict)
+            op = expr['op']
+            if op not in self.operations:
+                raise NotImplementedError('op not implemented: %s' % op)
+            elhs = expr['lhs']
+            erhs = expr['rhs']
+            if _is_literal(expr['lhs']) and _is_literal(expr['rhs']):
+                raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs))
+
+            lhs = self.evaluate(elhs, context)
+            rhs = self.evaluate(erhs, context)
+            result = self.operations[op](lhs, rhs)
+        return result
+
+def default_context():
+    def format_full_version(info):
+        version = '%s.%s.%s' % (info.major, info.minor, info.micro)
+        kind = info.releaselevel
+        if kind != 'final':
+            version += kind[0] + str(info.serial)
+        return version
+
+    if hasattr(sys, 'implementation'):
+        implementation_version = format_full_version(sys.implementation.version)
+        implementation_name = sys.implementation.name
+    else:
+        implementation_version = '0'
+        implementation_name = ''
+
+    result = {
+        'implementation_name': implementation_name,
+        'implementation_version': implementation_version,
+        'os_name': os.name,
+        'platform_machine': platform.machine(),
+        'platform_python_implementation': platform.python_implementation(),
+        'platform_release': platform.release(),
+        'platform_system': platform.system(),
+        'platform_version': platform.version(),
+        'platform_in_venv': str(in_venv()),
+        'python_full_version': platform.python_version(),
+        'python_version': platform.python_version()[:3],
+        'sys_platform': sys.platform,
+    }
+    return result
+
+DEFAULT_CONTEXT = default_context()
+del default_context
+
+evaluator = Evaluator()
+
+def interpret(marker, execution_context=None):
+    """
+    Interpret a marker and return a result depending on environment.
+
+    :param marker: The marker to interpret.
+    :type marker: str
+    :param execution_context: The context used for name lookup.
+    :type execution_context: mapping
+    """
+    try:
+        expr, rest = parse_marker(marker)
+    except Exception as e:
+        raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e))
+    if rest and rest[0] != '#':
+        raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest))
+    context = dict(DEFAULT_CONTEXT)
+    if execution_context:
+        context.update(execution_context)
+    return evaluator.evaluate(expr, context)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7120e0298922aea55af86d63879b5dfd1da86be3
GIT binary patch
literal 7112
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
E0OlEcGXMYp

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py
new file mode 100644
index 00000000..77eed7f9
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py
@@ -0,0 +1,1094 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""Implementation of the Metadata for Python packages PEPs.
+
+Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental).
+"""
+from __future__ import unicode_literals
+
+import codecs
+from email import message_from_file
+import json
+import logging
+import re
+
+
+from . import DistlibException, __version__
+from .compat import StringIO, string_types, text_type
+from .markers import interpret
+from .util import extract_by_key, get_extras
+from .version import get_scheme, PEP440_VERSION_RE
+
+logger = logging.getLogger(__name__)
+
+
+class MetadataMissingError(DistlibException):
+    """A required metadata is missing"""
+
+
+class MetadataConflictError(DistlibException):
+    """Attempt to read or write metadata fields that are conflictual."""
+
+
+class MetadataUnrecognizedVersionError(DistlibException):
+    """Unknown metadata version number."""
+
+
+class MetadataInvalidError(DistlibException):
+    """A metadata value is invalid"""
+
+# public API of this module
+__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION']
+
+# Encoding used for the PKG-INFO files
+PKG_INFO_ENCODING = 'utf-8'
+
+# preferred version. Hopefully will be changed
+# to 1.2 once PEP 345 is supported everywhere
+PKG_INFO_PREFERRED_VERSION = '1.1'
+
+_LINE_PREFIX_1_2 = re.compile('\n       \\|')
+_LINE_PREFIX_PRE_1_2 = re.compile('\n        ')
+_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'License')
+
+_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Supported-Platform', 'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'License', 'Classifier', 'Download-URL', 'Obsoletes',
+               'Provides', 'Requires')
+
+_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier',
+                'Download-URL')
+
+_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Supported-Platform', 'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'Maintainer', 'Maintainer-email', 'License',
+               'Classifier', 'Download-URL', 'Obsoletes-Dist',
+               'Project-URL', 'Provides-Dist', 'Requires-Dist',
+               'Requires-Python', 'Requires-External')
+
+_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python',
+                'Obsoletes-Dist', 'Requires-External', 'Maintainer',
+                'Maintainer-email', 'Project-URL')
+
+_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
+               'Supported-Platform', 'Summary', 'Description',
+               'Keywords', 'Home-page', 'Author', 'Author-email',
+               'Maintainer', 'Maintainer-email', 'License',
+               'Classifier', 'Download-URL', 'Obsoletes-Dist',
+               'Project-URL', 'Provides-Dist', 'Requires-Dist',
+               'Requires-Python', 'Requires-External', 'Private-Version',
+               'Obsoleted-By', 'Setup-Requires-Dist', 'Extension',
+               'Provides-Extra')
+
+_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By',
+                'Setup-Requires-Dist', 'Extension')
+
+# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include
+# it in the tuple literal below to allow it (for now)
+_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires')
+
+_566_MARKERS = ('Description-Content-Type',)
+
+_ALL_FIELDS = set()
+_ALL_FIELDS.update(_241_FIELDS)
+_ALL_FIELDS.update(_314_FIELDS)
+_ALL_FIELDS.update(_345_FIELDS)
+_ALL_FIELDS.update(_426_FIELDS)
+_ALL_FIELDS.update(_566_FIELDS)
+
+EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''')
+
+
+def _version2fieldlist(version):
+    if version == '1.0':
+        return _241_FIELDS
+    elif version == '1.1':
+        return _314_FIELDS
+    elif version == '1.2':
+        return _345_FIELDS
+    elif version in ('1.3', '2.1'):
+        return _345_FIELDS + _566_FIELDS
+    elif version == '2.0':
+        return _426_FIELDS
+    raise MetadataUnrecognizedVersionError(version)
+
+
+def _best_version(fields):
+    """Detect the best version depending on the fields used."""
+    def _has_marker(keys, markers):
+        for marker in markers:
+            if marker in keys:
+                return True
+        return False
+
+    keys = []
+    for key, value in fields.items():
+        if value in ([], 'UNKNOWN', None):
+            continue
+        keys.append(key)
+
+    possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1']
+
+    # first let's try to see if a field is not part of one of the version
+    for key in keys:
+        if key not in _241_FIELDS and '1.0' in possible_versions:
+            possible_versions.remove('1.0')
+            logger.debug('Removed 1.0 due to %s', key)
+        if key not in _314_FIELDS and '1.1' in possible_versions:
+            possible_versions.remove('1.1')
+            logger.debug('Removed 1.1 due to %s', key)
+        if key not in _345_FIELDS and '1.2' in possible_versions:
+            possible_versions.remove('1.2')
+            logger.debug('Removed 1.2 due to %s', key)
+        if key not in _566_FIELDS and '1.3' in possible_versions:
+            possible_versions.remove('1.3')
+            logger.debug('Removed 1.3 due to %s', key)
+        if key not in _566_FIELDS and '2.1' in possible_versions:
+            if key != 'Description':  # In 2.1, description allowed after headers
+                possible_versions.remove('2.1')
+                logger.debug('Removed 2.1 due to %s', key)
+        if key not in _426_FIELDS and '2.0' in possible_versions:
+            possible_versions.remove('2.0')
+            logger.debug('Removed 2.0 due to %s', key)
+
+    # possible_version contains qualified versions
+    if len(possible_versions) == 1:
+        return possible_versions[0]   # found !
+    elif len(possible_versions) == 0:
+        logger.debug('Out of options - unknown metadata set: %s', fields)
+        raise MetadataConflictError('Unknown metadata set')
+
+    # let's see if one unique marker is found
+    is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS)
+    is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS)
+    is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS)
+    is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS)
+    if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1:
+        raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields')
+
+    # we have the choice, 1.0, or 1.2, or 2.0
+    #   - 1.0 has a broken Summary field but works with all tools
+    #   - 1.1 is to avoid
+    #   - 1.2 fixes Summary but has little adoption
+    #   - 2.0 adds more features and is very new
+    if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0:
+        # we couldn't find any specific marker
+        if PKG_INFO_PREFERRED_VERSION in possible_versions:
+            return PKG_INFO_PREFERRED_VERSION
+    if is_1_1:
+        return '1.1'
+    if is_1_2:
+        return '1.2'
+    if is_2_1:
+        return '2.1'
+
+    return '2.0'
+
+_ATTR2FIELD = {
+    'metadata_version': 'Metadata-Version',
+    'name': 'Name',
+    'version': 'Version',
+    'platform': 'Platform',
+    'supported_platform': 'Supported-Platform',
+    'summary': 'Summary',
+    'description': 'Description',
+    'keywords': 'Keywords',
+    'home_page': 'Home-page',
+    'author': 'Author',
+    'author_email': 'Author-email',
+    'maintainer': 'Maintainer',
+    'maintainer_email': 'Maintainer-email',
+    'license': 'License',
+    'classifier': 'Classifier',
+    'download_url': 'Download-URL',
+    'obsoletes_dist': 'Obsoletes-Dist',
+    'provides_dist': 'Provides-Dist',
+    'requires_dist': 'Requires-Dist',
+    'setup_requires_dist': 'Setup-Requires-Dist',
+    'requires_python': 'Requires-Python',
+    'requires_external': 'Requires-External',
+    'requires': 'Requires',
+    'provides': 'Provides',
+    'obsoletes': 'Obsoletes',
+    'project_url': 'Project-URL',
+    'private_version': 'Private-Version',
+    'obsoleted_by': 'Obsoleted-By',
+    'extension': 'Extension',
+    'provides_extra': 'Provides-Extra',
+}
+
+_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist')
+_VERSIONS_FIELDS = ('Requires-Python',)
+_VERSION_FIELDS = ('Version',)
+_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes',
+               'Requires', 'Provides', 'Obsoletes-Dist',
+               'Provides-Dist', 'Requires-Dist', 'Requires-External',
+               'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist',
+               'Provides-Extra', 'Extension')
+_LISTTUPLEFIELDS = ('Project-URL',)
+
+_ELEMENTSFIELD = ('Keywords',)
+
+_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description')
+
+_MISSING = object()
+
+_FILESAFE = re.compile('[^A-Za-z0-9.]+')
+
+
+def _get_name_and_version(name, version, for_filename=False):
+    """Return the distribution name with version.
+
+    If for_filename is true, return a filename-escaped form."""
+    if for_filename:
+        # For both name and version any runs of non-alphanumeric or '.'
+        # characters are replaced with a single '-'.  Additionally any
+        # spaces in the version string become '.'
+        name = _FILESAFE.sub('-', name)
+        version = _FILESAFE.sub('-', version.replace(' ', '.'))
+    return '%s-%s' % (name, version)
+
+
+class LegacyMetadata(object):
+    """The legacy metadata of a release.
+
+    Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can
+    instantiate the class with one of these arguments (or none):
+    - *path*, the path to a metadata file
+    - *fileobj* give a file-like object with metadata as content
+    - *mapping* is a dict-like object
+    - *scheme* is a version scheme name
+    """
+    # TODO document the mapping API and UNKNOWN default key
+
+    def __init__(self, path=None, fileobj=None, mapping=None,
+                 scheme='default'):
+        if [path, fileobj, mapping].count(None) < 2:
+            raise TypeError('path, fileobj and mapping are exclusive')
+        self._fields = {}
+        self.requires_files = []
+        self._dependencies = None
+        self.scheme = scheme
+        if path is not None:
+            self.read(path)
+        elif fileobj is not None:
+            self.read_file(fileobj)
+        elif mapping is not None:
+            self.update(mapping)
+            self.set_metadata_version()
+
+    def set_metadata_version(self):
+        self._fields['Metadata-Version'] = _best_version(self._fields)
+
+    def _write_field(self, fileobj, name, value):
+        fileobj.write('%s: %s\n' % (name, value))
+
+    def __getitem__(self, name):
+        return self.get(name)
+
+    def __setitem__(self, name, value):
+        return self.set(name, value)
+
+    def __delitem__(self, name):
+        field_name = self._convert_name(name)
+        try:
+            del self._fields[field_name]
+        except KeyError:
+            raise KeyError(name)
+
+    def __contains__(self, name):
+        return (name in self._fields or
+                self._convert_name(name) in self._fields)
+
+    def _convert_name(self, name):
+        if name in _ALL_FIELDS:
+            return name
+        name = name.replace('-', '_').lower()
+        return _ATTR2FIELD.get(name, name)
+
+    def _default_value(self, name):
+        if name in _LISTFIELDS or name in _ELEMENTSFIELD:
+            return []
+        return 'UNKNOWN'
+
+    def _remove_line_prefix(self, value):
+        if self.metadata_version in ('1.0', '1.1'):
+            return _LINE_PREFIX_PRE_1_2.sub('\n', value)
+        else:
+            return _LINE_PREFIX_1_2.sub('\n', value)
+
+    def __getattr__(self, name):
+        if name in _ATTR2FIELD:
+            return self[name]
+        raise AttributeError(name)
+
+    #
+    # Public API
+    #
+
+#    dependencies = property(_get_dependencies, _set_dependencies)
+
+    def get_fullname(self, filesafe=False):
+        """Return the distribution name with version.
+
+        If filesafe is true, return a filename-escaped form."""
+        return _get_name_and_version(self['Name'], self['Version'], filesafe)
+
+    def is_field(self, name):
+        """return True if name is a valid metadata key"""
+        name = self._convert_name(name)
+        return name in _ALL_FIELDS
+
+    def is_multi_field(self, name):
+        name = self._convert_name(name)
+        return name in _LISTFIELDS
+
+    def read(self, filepath):
+        """Read the metadata values from a file path."""
+        fp = codecs.open(filepath, 'r', encoding='utf-8')
+        try:
+            self.read_file(fp)
+        finally:
+            fp.close()
+
+    def read_file(self, fileob):
+        """Read the metadata values from a file object."""
+        msg = message_from_file(fileob)
+        self._fields['Metadata-Version'] = msg['metadata-version']
+
+        # When reading, get all the fields we can
+        for field in _ALL_FIELDS:
+            if field not in msg:
+                continue
+            if field in _LISTFIELDS:
+                # we can have multiple lines
+                values = msg.get_all(field)
+                if field in _LISTTUPLEFIELDS and values is not None:
+                    values = [tuple(value.split(',')) for value in values]
+                self.set(field, values)
+            else:
+                # single line
+                value = msg[field]
+                if value is not None and value != 'UNKNOWN':
+                    self.set(field, value)
+        # logger.debug('Attempting to set metadata for %s', self)
+        # self.set_metadata_version()
+
+    def write(self, filepath, skip_unknown=False):
+        """Write the metadata fields to filepath."""
+        fp = codecs.open(filepath, 'w', encoding='utf-8')
+        try:
+            self.write_file(fp, skip_unknown)
+        finally:
+            fp.close()
+
+    def write_file(self, fileobject, skip_unknown=False):
+        """Write the PKG-INFO format data to a file object."""
+        self.set_metadata_version()
+
+        for field in _version2fieldlist(self['Metadata-Version']):
+            values = self.get(field)
+            if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']):
+                continue
+            if field in _ELEMENTSFIELD:
+                self._write_field(fileobject, field, ','.join(values))
+                continue
+            if field not in _LISTFIELDS:
+                if field == 'Description':
+                    if self.metadata_version in ('1.0', '1.1'):
+                        values = values.replace('\n', '\n        ')
+                    else:
+                        values = values.replace('\n', '\n       |')
+                values = [values]
+
+            if field in _LISTTUPLEFIELDS:
+                values = [','.join(value) for value in values]
+
+            for value in values:
+                self._write_field(fileobject, field, value)
+
+    def update(self, other=None, **kwargs):
+        """Set metadata values from the given iterable `other` and kwargs.
+
+        Behavior is like `dict.update`: If `other` has a ``keys`` method,
+        they are looped over and ``self[key]`` is assigned ``other[key]``.
+        Else, ``other`` is an iterable of ``(key, value)`` iterables.
+
+        Keys that don't match a metadata field or that have an empty value are
+        dropped.
+        """
+        def _set(key, value):
+            if key in _ATTR2FIELD and value:
+                self.set(self._convert_name(key), value)
+
+        if not other:
+            # other is None or empty container
+            pass
+        elif hasattr(other, 'keys'):
+            for k in other.keys():
+                _set(k, other[k])
+        else:
+            for k, v in other:
+                _set(k, v)
+
+        if kwargs:
+            for k, v in kwargs.items():
+                _set(k, v)
+
+    def set(self, name, value):
+        """Control then set a metadata field."""
+        name = self._convert_name(name)
+
+        if ((name in _ELEMENTSFIELD or name == 'Platform') and
+            not isinstance(value, (list, tuple))):
+            if isinstance(value, string_types):
+                value = [v.strip() for v in value.split(',')]
+            else:
+                value = []
+        elif (name in _LISTFIELDS and
+              not isinstance(value, (list, tuple))):
+            if isinstance(value, string_types):
+                value = [value]
+            else:
+                value = []
+
+        if logger.isEnabledFor(logging.WARNING):
+            project_name = self['Name']
+
+            scheme = get_scheme(self.scheme)
+            if name in _PREDICATE_FIELDS and value is not None:
+                for v in value:
+                    # check that the values are valid
+                    if not scheme.is_valid_matcher(v.split(';')[0]):
+                        logger.warning(
+                            "'%s': '%s' is not valid (field '%s')",
+                            project_name, v, name)
+            # FIXME this rejects UNKNOWN, is that right?
+            elif name in _VERSIONS_FIELDS and value is not None:
+                if not scheme.is_valid_constraint_list(value):
+                    logger.warning("'%s': '%s' is not a valid version (field '%s')",
+                                   project_name, value, name)
+            elif name in _VERSION_FIELDS and value is not None:
+                if not scheme.is_valid_version(value):
+                    logger.warning("'%s': '%s' is not a valid version (field '%s')",
+                                   project_name, value, name)
+
+        if name in _UNICODEFIELDS:
+            if name == 'Description':
+                value = self._remove_line_prefix(value)
+
+        self._fields[name] = value
+
+    def get(self, name, default=_MISSING):
+        """Get a metadata field."""
+        name = self._convert_name(name)
+        if name not in self._fields:
+            if default is _MISSING:
+                default = self._default_value(name)
+            return default
+        if name in _UNICODEFIELDS:
+            value = self._fields[name]
+            return value
+        elif name in _LISTFIELDS:
+            value = self._fields[name]
+            if value is None:
+                return []
+            res = []
+            for val in value:
+                if name not in _LISTTUPLEFIELDS:
+                    res.append(val)
+                else:
+                    # That's for Project-URL
+                    res.append((val[0], val[1]))
+            return res
+
+        elif name in _ELEMENTSFIELD:
+            value = self._fields[name]
+            if isinstance(value, string_types):
+                return value.split(',')
+        return self._fields[name]
+
+    def check(self, strict=False):
+        """Check if the metadata is compliant. If strict is True then raise if
+        no Name or Version are provided"""
+        self.set_metadata_version()
+
+        # XXX should check the versions (if the file was loaded)
+        missing, warnings = [], []
+
+        for attr in ('Name', 'Version'):  # required by PEP 345
+            if attr not in self:
+                missing.append(attr)
+
+        if strict and missing != []:
+            msg = 'missing required metadata: %s' % ', '.join(missing)
+            raise MetadataMissingError(msg)
+
+        for attr in ('Home-page', 'Author'):
+            if attr not in self:
+                missing.append(attr)
+
+        # checking metadata 1.2 (XXX needs to check 1.1, 1.0)
+        if self['Metadata-Version'] != '1.2':
+            return missing, warnings
+
+        scheme = get_scheme(self.scheme)
+
+        def are_valid_constraints(value):
+            for v in value:
+                if not scheme.is_valid_matcher(v.split(';')[0]):
+                    return False
+            return True
+
+        for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints),
+                                   (_VERSIONS_FIELDS,
+                                    scheme.is_valid_constraint_list),
+                                   (_VERSION_FIELDS,
+                                    scheme.is_valid_version)):
+            for field in fields:
+                value = self.get(field, None)
+                if value is not None and not controller(value):
+                    warnings.append("Wrong value for '%s': %s" % (field, value))
+
+        return missing, warnings
+
+    def todict(self, skip_missing=False):
+        """Return fields as a dict.
+
+        Field names will be converted to use the underscore-lowercase style
+        instead of hyphen-mixed case (i.e. home_page instead of Home-page).
+        """
+        self.set_metadata_version()
+
+        mapping_1_0 = (
+            ('metadata_version', 'Metadata-Version'),
+            ('name', 'Name'),
+            ('version', 'Version'),
+            ('summary', 'Summary'),
+            ('home_page', 'Home-page'),
+            ('author', 'Author'),
+            ('author_email', 'Author-email'),
+            ('license', 'License'),
+            ('description', 'Description'),
+            ('keywords', 'Keywords'),
+            ('platform', 'Platform'),
+            ('classifiers', 'Classifier'),
+            ('download_url', 'Download-URL'),
+        )
+
+        data = {}
+        for key, field_name in mapping_1_0:
+            if not skip_missing or field_name in self._fields:
+                data[key] = self[field_name]
+
+        if self['Metadata-Version'] == '1.2':
+            mapping_1_2 = (
+                ('requires_dist', 'Requires-Dist'),
+                ('requires_python', 'Requires-Python'),
+                ('requires_external', 'Requires-External'),
+                ('provides_dist', 'Provides-Dist'),
+                ('obsoletes_dist', 'Obsoletes-Dist'),
+                ('project_url', 'Project-URL'),
+                ('maintainer', 'Maintainer'),
+                ('maintainer_email', 'Maintainer-email'),
+            )
+            for key, field_name in mapping_1_2:
+                if not skip_missing or field_name in self._fields:
+                    if key != 'project_url':
+                        data[key] = self[field_name]
+                    else:
+                        data[key] = [','.join(u) for u in self[field_name]]
+
+        elif self['Metadata-Version'] == '1.1':
+            mapping_1_1 = (
+                ('provides', 'Provides'),
+                ('requires', 'Requires'),
+                ('obsoletes', 'Obsoletes'),
+            )
+            for key, field_name in mapping_1_1:
+                if not skip_missing or field_name in self._fields:
+                    data[key] = self[field_name]
+
+        return data
+
+    def add_requirements(self, requirements):
+        if self['Metadata-Version'] == '1.1':
+            # we can't have 1.1 metadata *and* Setuptools requires
+            for field in ('Obsoletes', 'Requires', 'Provides'):
+                if field in self:
+                    del self[field]
+        self['Requires-Dist'] += requirements
+
+    # Mapping API
+    # TODO could add iter* variants
+
+    def keys(self):
+        return list(_version2fieldlist(self['Metadata-Version']))
+
+    def __iter__(self):
+        for key in self.keys():
+            yield key
+
+    def values(self):
+        return [self[key] for key in self.keys()]
+
+    def items(self):
+        return [(key, self[key]) for key in self.keys()]
+
+    def __repr__(self):
+        return '<%s %s %s>' % (self.__class__.__name__, self.name,
+                               self.version)
+
+
+METADATA_FILENAME = 'pydist.json'
+WHEEL_METADATA_FILENAME = 'metadata.json'
+LEGACY_METADATA_FILENAME = 'METADATA'
+
+
+class Metadata(object):
+    """
+    The metadata of a release. This implementation uses 2.0 (JSON)
+    metadata where possible. If not possible, it wraps a LegacyMetadata
+    instance which handles the key-value metadata format.
+    """
+
+    METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$')
+
+    NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I)
+
+    VERSION_MATCHER = PEP440_VERSION_RE
+
+    SUMMARY_MATCHER = re.compile('.{1,2047}')
+
+    METADATA_VERSION = '2.0'
+
+    GENERATOR = 'distlib (%s)' % __version__
+
+    MANDATORY_KEYS = {
+        'name': (),
+        'version': (),
+        'summary': ('legacy',),
+    }
+
+    INDEX_KEYS = ('name version license summary description author '
+                  'author_email keywords platform home_page classifiers '
+                  'download_url')
+
+    DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires '
+                       'dev_requires provides meta_requires obsoleted_by '
+                       'supports_environments')
+
+    SYNTAX_VALIDATORS = {
+        'metadata_version': (METADATA_VERSION_MATCHER, ()),
+        'name': (NAME_MATCHER, ('legacy',)),
+        'version': (VERSION_MATCHER, ('legacy',)),
+        'summary': (SUMMARY_MATCHER, ('legacy',)),
+    }
+
+    __slots__ = ('_legacy', '_data', 'scheme')
+
+    def __init__(self, path=None, fileobj=None, mapping=None,
+                 scheme='default'):
+        if [path, fileobj, mapping].count(None) < 2:
+            raise TypeError('path, fileobj and mapping are exclusive')
+        self._legacy = None
+        self._data = None
+        self.scheme = scheme
+        #import pdb; pdb.set_trace()
+        if mapping is not None:
+            try:
+                self._validate_mapping(mapping, scheme)
+                self._data = mapping
+            except MetadataUnrecognizedVersionError:
+                self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme)
+                self.validate()
+        else:
+            data = None
+            if path:
+                with open(path, 'rb') as f:
+                    data = f.read()
+            elif fileobj:
+                data = fileobj.read()
+            if data is None:
+                # Initialised with no args - to be added
+                self._data = {
+                    'metadata_version': self.METADATA_VERSION,
+                    'generator': self.GENERATOR,
+                }
+            else:
+                if not isinstance(data, text_type):
+                    data = data.decode('utf-8')
+                try:
+                    self._data = json.loads(data)
+                    self._validate_mapping(self._data, scheme)
+                except ValueError:
+                    # Note: MetadataUnrecognizedVersionError does not
+                    # inherit from ValueError (it's a DistlibException,
+                    # which should not inherit from ValueError).
+                    # The ValueError comes from the json.load - if that
+                    # succeeds and we get a validation error, we want
+                    # that to propagate
+                    self._legacy = LegacyMetadata(fileobj=StringIO(data),
+                                                  scheme=scheme)
+                    self.validate()
+
+    common_keys = set(('name', 'version', 'license', 'keywords', 'summary'))
+
+    none_list = (None, list)
+    none_dict = (None, dict)
+
+    mapped_keys = {
+        'run_requires': ('Requires-Dist', list),
+        'build_requires': ('Setup-Requires-Dist', list),
+        'dev_requires': none_list,
+        'test_requires': none_list,
+        'meta_requires': none_list,
+        'extras': ('Provides-Extra', list),
+        'modules': none_list,
+        'namespaces': none_list,
+        'exports': none_dict,
+        'commands': none_dict,
+        'classifiers': ('Classifier', list),
+        'source_url': ('Download-URL', None),
+        'metadata_version': ('Metadata-Version', None),
+    }
+
+    del none_list, none_dict
+
+    def __getattribute__(self, key):
+        common = object.__getattribute__(self, 'common_keys')
+        mapped = object.__getattribute__(self, 'mapped_keys')
+        if key in mapped:
+            lk, maker = mapped[key]
+            if self._legacy:
+                if lk is None:
+                    result = None if maker is None else maker()
+                else:
+                    result = self._legacy.get(lk)
+            else:
+                value = None if maker is None else maker()
+                if key not in ('commands', 'exports', 'modules', 'namespaces',
+                               'classifiers'):
+                    result = self._data.get(key, value)
+                else:
+                    # special cases for PEP 459
+                    sentinel = object()
+                    result = sentinel
+                    d = self._data.get('extensions')
+                    if d:
+                        if key == 'commands':
+                            result = d.get('python.commands', value)
+                        elif key == 'classifiers':
+                            d = d.get('python.details')
+                            if d:
+                                result = d.get(key, value)
+                        else:
+                            d = d.get('python.exports')
+                            if not d:
+                                d = self._data.get('python.exports')
+                            if d:
+                                result = d.get(key, value)
+                    if result is sentinel:
+                        result = value
+        elif key not in common:
+            result = object.__getattribute__(self, key)
+        elif self._legacy:
+            result = self._legacy.get(key)
+        else:
+            result = self._data.get(key)
+        return result
+
+    def _validate_value(self, key, value, scheme=None):
+        if key in self.SYNTAX_VALIDATORS:
+            pattern, exclusions = self.SYNTAX_VALIDATORS[key]
+            if (scheme or self.scheme) not in exclusions:
+                m = pattern.match(value)
+                if not m:
+                    raise MetadataInvalidError("'%s' is an invalid value for "
+                                               "the '%s' property" % (value,
+                                                                    key))
+
+    def __setattr__(self, key, value):
+        self._validate_value(key, value)
+        common = object.__getattribute__(self, 'common_keys')
+        mapped = object.__getattribute__(self, 'mapped_keys')
+        if key in mapped:
+            lk, _ = mapped[key]
+            if self._legacy:
+                if lk is None:
+                    raise NotImplementedError
+                self._legacy[lk] = value
+            elif key not in ('commands', 'exports', 'modules', 'namespaces',
+                             'classifiers'):
+                self._data[key] = value
+            else:
+                # special cases for PEP 459
+                d = self._data.setdefault('extensions', {})
+                if key == 'commands':
+                    d['python.commands'] = value
+                elif key == 'classifiers':
+                    d = d.setdefault('python.details', {})
+                    d[key] = value
+                else:
+                    d = d.setdefault('python.exports', {})
+                    d[key] = value
+        elif key not in common:
+            object.__setattr__(self, key, value)
+        else:
+            if key == 'keywords':
+                if isinstance(value, string_types):
+                    value = value.strip()
+                    if value:
+                        value = value.split()
+                    else:
+                        value = []
+            if self._legacy:
+                self._legacy[key] = value
+            else:
+                self._data[key] = value
+
+    @property
+    def name_and_version(self):
+        return _get_name_and_version(self.name, self.version, True)
+
+    @property
+    def provides(self):
+        if self._legacy:
+            result = self._legacy['Provides-Dist']
+        else:
+            result = self._data.setdefault('provides', [])
+        s = '%s (%s)' % (self.name, self.version)
+        if s not in result:
+            result.append(s)
+        return result
+
+    @provides.setter
+    def provides(self, value):
+        if self._legacy:
+            self._legacy['Provides-Dist'] = value
+        else:
+            self._data['provides'] = value
+
+    def get_requirements(self, reqts, extras=None, env=None):
+        """
+        Base method to get dependencies, given a set of extras
+        to satisfy and an optional environment context.
+        :param reqts: A list of sometimes-wanted dependencies,
+                      perhaps dependent on extras and environment.
+        :param extras: A list of optional components being requested.
+        :param env: An optional environment for marker evaluation.
+        """
+        if self._legacy:
+            result = reqts
+        else:
+            result = []
+            extras = get_extras(extras or [], self.extras)
+            for d in reqts:
+                if 'extra' not in d and 'environment' not in d:
+                    # unconditional
+                    include = True
+                else:
+                    if 'extra' not in d:
+                        # Not extra-dependent - only environment-dependent
+                        include = True
+                    else:
+                        include = d.get('extra') in extras
+                    if include:
+                        # Not excluded because of extras, check environment
+                        marker = d.get('environment')
+                        if marker:
+                            include = interpret(marker, env)
+                if include:
+                    result.extend(d['requires'])
+            for key in ('build', 'dev', 'test'):
+                e = ':%s:' % key
+                if e in extras:
+                    extras.remove(e)
+                    # A recursive call, but it should terminate since 'test'
+                    # has been removed from the extras
+                    reqts = self._data.get('%s_requires' % key, [])
+                    result.extend(self.get_requirements(reqts, extras=extras,
+                                                        env=env))
+        return result
+
+    @property
+    def dictionary(self):
+        if self._legacy:
+            return self._from_legacy()
+        return self._data
+
+    @property
+    def dependencies(self):
+        if self._legacy:
+            raise NotImplementedError
+        else:
+            return extract_by_key(self._data, self.DEPENDENCY_KEYS)
+
+    @dependencies.setter
+    def dependencies(self, value):
+        if self._legacy:
+            raise NotImplementedError
+        else:
+            self._data.update(value)
+
+    def _validate_mapping(self, mapping, scheme):
+        if mapping.get('metadata_version') != self.METADATA_VERSION:
+            raise MetadataUnrecognizedVersionError()
+        missing = []
+        for key, exclusions in self.MANDATORY_KEYS.items():
+            if key not in mapping:
+                if scheme not in exclusions:
+                    missing.append(key)
+        if missing:
+            msg = 'Missing metadata items: %s' % ', '.join(missing)
+            raise MetadataMissingError(msg)
+        for k, v in mapping.items():
+            self._validate_value(k, v, scheme)
+
+    def validate(self):
+        if self._legacy:
+            missing, warnings = self._legacy.check(True)
+            if missing or warnings:
+                logger.warning('Metadata: missing: %s, warnings: %s',
+                               missing, warnings)
+        else:
+            self._validate_mapping(self._data, self.scheme)
+
+    def todict(self):
+        if self._legacy:
+            return self._legacy.todict(True)
+        else:
+            result = extract_by_key(self._data, self.INDEX_KEYS)
+            return result
+
+    def _from_legacy(self):
+        assert self._legacy and not self._data
+        result = {
+            'metadata_version': self.METADATA_VERSION,
+            'generator': self.GENERATOR,
+        }
+        lmd = self._legacy.todict(True)     # skip missing ones
+        for k in ('name', 'version', 'license', 'summary', 'description',
+                  'classifier'):
+            if k in lmd:
+                if k == 'classifier':
+                    nk = 'classifiers'
+                else:
+                    nk = k
+                result[nk] = lmd[k]
+        kw = lmd.get('Keywords', [])
+        if kw == ['']:
+            kw = []
+        result['keywords'] = kw
+        keys = (('requires_dist', 'run_requires'),
+                ('setup_requires_dist', 'build_requires'))
+        for ok, nk in keys:
+            if ok in lmd and lmd[ok]:
+                result[nk] = [{'requires': lmd[ok]}]
+        result['provides'] = self.provides
+        author = {}
+        maintainer = {}
+        return result
+
+    LEGACY_MAPPING = {
+        'name': 'Name',
+        'version': 'Version',
+        'license': 'License',
+        'summary': 'Summary',
+        'description': 'Description',
+        'classifiers': 'Classifier',
+    }
+
+    def _to_legacy(self):
+        def process_entries(entries):
+            reqts = set()
+            for e in entries:
+                extra = e.get('extra')
+                env = e.get('environment')
+                rlist = e['requires']
+                for r in rlist:
+                    if not env and not extra:
+                        reqts.add(r)
+                    else:
+                        marker = ''
+                        if extra:
+                            marker = 'extra == "%s"' % extra
+                        if env:
+                            if marker:
+                                marker = '(%s) and %s' % (env, marker)
+                            else:
+                                marker = env
+                        reqts.add(';'.join((r, marker)))
+            return reqts
+
+        assert self._data and not self._legacy
+        result = LegacyMetadata()
+        nmd = self._data
+        for nk, ok in self.LEGACY_MAPPING.items():
+            if nk in nmd:
+                result[ok] = nmd[nk]
+        r1 = process_entries(self.run_requires + self.meta_requires)
+        r2 = process_entries(self.build_requires + self.dev_requires)
+        if self.extras:
+            result['Provides-Extra'] = sorted(self.extras)
+        result['Requires-Dist'] = sorted(r1)
+        result['Setup-Requires-Dist'] = sorted(r2)
+        # TODO: other fields such as contacts
+        return result
+
+    def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True):
+        if [path, fileobj].count(None) != 1:
+            raise ValueError('Exactly one of path and fileobj is needed')
+        self.validate()
+        if legacy:
+            if self._legacy:
+                legacy_md = self._legacy
+            else:
+                legacy_md = self._to_legacy()
+            if path:
+                legacy_md.write(path, skip_unknown=skip_unknown)
+            else:
+                legacy_md.write_file(fileobj, skip_unknown=skip_unknown)
+        else:
+            if self._legacy:
+                d = self._from_legacy()
+            else:
+                d = self._data
+            if fileobj:
+                json.dump(d, fileobj, ensure_ascii=True, indent=2,
+                          sort_keys=True)
+            else:
+                with codecs.open(path, 'w', 'utf-8') as f:
+                    json.dump(d, f, ensure_ascii=True, indent=2,
+                              sort_keys=True)
+
+    def add_requirements(self, requirements):
+        if self._legacy:
+            self._legacy.add_requirements(requirements)
+        else:
+            run_requires = self._data.setdefault('run_requires', [])
+            always = None
+            for entry in run_requires:
+                if 'environment' not in entry and 'extra' not in entry:
+                    always = entry
+                    break
+            if always is None:
+                always = { 'requires': requirements }
+                run_requires.insert(0, always)
+            else:
+                rset = set(always['requires']) | set(requirements)
+                always['requires'] = sorted(rset)
+
+    def __repr__(self):
+        name = self.name or '(no name)'
+        version = self.version or 'no version'
+        return '<%s %s %s (%s)>' % (self.__class__.__name__,
+                                    self.metadata_version, name, version)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bf54f45f207faa42c3d6738af6bf6c5493a7c501
GIT binary patch
literal 38836
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
V5ECa8KQj-n*nfr&P!E`m833nXnJ)kU

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py
new file mode 100644
index 00000000..18840167
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py
@@ -0,0 +1,355 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2017 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from __future__ import unicode_literals
+
+import bisect
+import io
+import logging
+import os
+import pkgutil
+import shutil
+import sys
+import types
+import zipimport
+
+from . import DistlibException
+from .util import cached_property, get_cache_base, path_to_cache_dir, Cache
+
+logger = logging.getLogger(__name__)
+
+
+cache = None    # created when needed
+
+
+class ResourceCache(Cache):
+    def __init__(self, base=None):
+        if base is None:
+            # Use native string to avoid issues on 2.x: see Python #20140.
+            base = os.path.join(get_cache_base(), str('resource-cache'))
+        super(ResourceCache, self).__init__(base)
+
+    def is_stale(self, resource, path):
+        """
+        Is the cache stale for the given resource?
+
+        :param resource: The :class:`Resource` being cached.
+        :param path: The path of the resource in the cache.
+        :return: True if the cache is stale.
+        """
+        # Cache invalidation is a hard problem :-)
+        return True
+
+    def get(self, resource):
+        """
+        Get a resource into the cache,
+
+        :param resource: A :class:`Resource` instance.
+        :return: The pathname of the resource in the cache.
+        """
+        prefix, path = resource.finder.get_cache_info(resource)
+        if prefix is None:
+            result = path
+        else:
+            result = os.path.join(self.base, self.prefix_to_dir(prefix), path)
+            dirname = os.path.dirname(result)
+            if not os.path.isdir(dirname):
+                os.makedirs(dirname)
+            if not os.path.exists(result):
+                stale = True
+            else:
+                stale = self.is_stale(resource, path)
+            if stale:
+                # write the bytes of the resource to the cache location
+                with open(result, 'wb') as f:
+                    f.write(resource.bytes)
+        return result
+
+
+class ResourceBase(object):
+    def __init__(self, finder, name):
+        self.finder = finder
+        self.name = name
+
+
+class Resource(ResourceBase):
+    """
+    A class representing an in-package resource, such as a data file. This is
+    not normally instantiated by user code, but rather by a
+    :class:`ResourceFinder` which manages the resource.
+    """
+    is_container = False        # Backwards compatibility
+
+    def as_stream(self):
+        """
+        Get the resource as a stream.
+
+        This is not a property to make it obvious that it returns a new stream
+        each time.
+        """
+        return self.finder.get_stream(self)
+
+    @cached_property
+    def file_path(self):
+        global cache
+        if cache is None:
+            cache = ResourceCache()
+        return cache.get(self)
+
+    @cached_property
+    def bytes(self):
+        return self.finder.get_bytes(self)
+
+    @cached_property
+    def size(self):
+        return self.finder.get_size(self)
+
+
+class ResourceContainer(ResourceBase):
+    is_container = True     # Backwards compatibility
+
+    @cached_property
+    def resources(self):
+        return self.finder.get_resources(self)
+
+
+class ResourceFinder(object):
+    """
+    Resource finder for file system resources.
+    """
+
+    if sys.platform.startswith('java'):
+        skipped_extensions = ('.pyc', '.pyo', '.class')
+    else:
+        skipped_extensions = ('.pyc', '.pyo')
+
+    def __init__(self, module):
+        self.module = module
+        self.loader = getattr(module, '__loader__', None)
+        self.base = os.path.dirname(getattr(module, '__file__', ''))
+
+    def _adjust_path(self, path):
+        return os.path.realpath(path)
+
+    def _make_path(self, resource_name):
+        # Issue #50: need to preserve type of path on Python 2.x
+        # like os.path._get_sep
+        if isinstance(resource_name, bytes):    # should only happen on 2.x
+            sep = b'/'
+        else:
+            sep = '/'
+        parts = resource_name.split(sep)
+        parts.insert(0, self.base)
+        result = os.path.join(*parts)
+        return self._adjust_path(result)
+
+    def _find(self, path):
+        return os.path.exists(path)
+
+    def get_cache_info(self, resource):
+        return None, resource.path
+
+    def find(self, resource_name):
+        path = self._make_path(resource_name)
+        if not self._find(path):
+            result = None
+        else:
+            if self._is_directory(path):
+                result = ResourceContainer(self, resource_name)
+            else:
+                result = Resource(self, resource_name)
+            result.path = path
+        return result
+
+    def get_stream(self, resource):
+        return open(resource.path, 'rb')
+
+    def get_bytes(self, resource):
+        with open(resource.path, 'rb') as f:
+            return f.read()
+
+    def get_size(self, resource):
+        return os.path.getsize(resource.path)
+
+    def get_resources(self, resource):
+        def allowed(f):
+            return (f != '__pycache__' and not
+                    f.endswith(self.skipped_extensions))
+        return set([f for f in os.listdir(resource.path) if allowed(f)])
+
+    def is_container(self, resource):
+        return self._is_directory(resource.path)
+
+    _is_directory = staticmethod(os.path.isdir)
+
+    def iterator(self, resource_name):
+        resource = self.find(resource_name)
+        if resource is not None:
+            todo = [resource]
+            while todo:
+                resource = todo.pop(0)
+                yield resource
+                if resource.is_container:
+                    rname = resource.name
+                    for name in resource.resources:
+                        if not rname:
+                            new_name = name
+                        else:
+                            new_name = '/'.join([rname, name])
+                        child = self.find(new_name)
+                        if child.is_container:
+                            todo.append(child)
+                        else:
+                            yield child
+
+
+class ZipResourceFinder(ResourceFinder):
+    """
+    Resource finder for resources in .zip files.
+    """
+    def __init__(self, module):
+        super(ZipResourceFinder, self).__init__(module)
+        archive = self.loader.archive
+        self.prefix_len = 1 + len(archive)
+        # PyPy doesn't have a _files attr on zipimporter, and you can't set one
+        if hasattr(self.loader, '_files'):
+            self._files = self.loader._files
+        else:
+            self._files = zipimport._zip_directory_cache[archive]
+        self.index = sorted(self._files)
+
+    def _adjust_path(self, path):
+        return path
+
+    def _find(self, path):
+        path = path[self.prefix_len:]
+        if path in self._files:
+            result = True
+        else:
+            if path and path[-1] != os.sep:
+                path = path + os.sep
+            i = bisect.bisect(self.index, path)
+            try:
+                result = self.index[i].startswith(path)
+            except IndexError:
+                result = False
+        if not result:
+            logger.debug('_find failed: %r %r', path, self.loader.prefix)
+        else:
+            logger.debug('_find worked: %r %r', path, self.loader.prefix)
+        return result
+
+    def get_cache_info(self, resource):
+        prefix = self.loader.archive
+        path = resource.path[1 + len(prefix):]
+        return prefix, path
+
+    def get_bytes(self, resource):
+        return self.loader.get_data(resource.path)
+
+    def get_stream(self, resource):
+        return io.BytesIO(self.get_bytes(resource))
+
+    def get_size(self, resource):
+        path = resource.path[self.prefix_len:]
+        return self._files[path][3]
+
+    def get_resources(self, resource):
+        path = resource.path[self.prefix_len:]
+        if path and path[-1] != os.sep:
+            path += os.sep
+        plen = len(path)
+        result = set()
+        i = bisect.bisect(self.index, path)
+        while i < len(self.index):
+            if not self.index[i].startswith(path):
+                break
+            s = self.index[i][plen:]
+            result.add(s.split(os.sep, 1)[0])   # only immediate children
+            i += 1
+        return result
+
+    def _is_directory(self, path):
+        path = path[self.prefix_len:]
+        if path and path[-1] != os.sep:
+            path += os.sep
+        i = bisect.bisect(self.index, path)
+        try:
+            result = self.index[i].startswith(path)
+        except IndexError:
+            result = False
+        return result
+
+_finder_registry = {
+    type(None): ResourceFinder,
+    zipimport.zipimporter: ZipResourceFinder
+}
+
+try:
+    # In Python 3.6, _frozen_importlib -> _frozen_importlib_external
+    try:
+        import _frozen_importlib_external as _fi
+    except ImportError:
+        import _frozen_importlib as _fi
+    _finder_registry[_fi.SourceFileLoader] = ResourceFinder
+    _finder_registry[_fi.FileFinder] = ResourceFinder
+    del _fi
+except (ImportError, AttributeError):
+    pass
+
+
+def register_finder(loader, finder_maker):
+    _finder_registry[type(loader)] = finder_maker
+
+_finder_cache = {}
+
+
+def finder(package):
+    """
+    Return a resource finder for a package.
+    :param package: The name of the package.
+    :return: A :class:`ResourceFinder` instance for the package.
+    """
+    if package in _finder_cache:
+        result = _finder_cache[package]
+    else:
+        if package not in sys.modules:
+            __import__(package)
+        module = sys.modules[package]
+        path = getattr(module, '__path__', None)
+        if path is None:
+            raise DistlibException('You cannot get a finder for a module, '
+                                   'only for a package')
+        loader = getattr(module, '__loader__', None)
+        finder_maker = _finder_registry.get(type(loader))
+        if finder_maker is None:
+            raise DistlibException('Unable to locate finder for %r' % package)
+        result = finder_maker(module)
+        _finder_cache[package] = result
+    return result
+
+
+_dummy_module = types.ModuleType(str('__dummy__'))
+
+
+def finder_for_path(path):
+    """
+    Return a resource finder for a path, which should represent a container.
+
+    :param path: The path.
+    :return: A :class:`ResourceFinder` instance for the path.
+    """
+    result = None
+    # calls any path hooks, gets importer into cache
+    pkgutil.get_importer(path)
+    loader = sys.path_importer_cache.get(path)
+    finder = _finder_registry.get(type(loader))
+    if finder:
+        module = _dummy_module
+        module.__file__ = os.path.join(path, '')
+        module.__loader__ = loader
+        result = finder(module)
+    return result
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2e8a015bf22b7a65263caea878a2ab79f0864016
GIT binary patch
literal 15896
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py
new file mode 100644
index 00000000..8e22cb91
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py
@@ -0,0 +1,417 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2015 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from io import BytesIO
+import logging
+import os
+import re
+import struct
+import sys
+
+from .compat import sysconfig, detect_encoding, ZipFile
+from .resources import finder
+from .util import (FileOperator, get_export_entry, convert_path,
+                   get_executable, in_venv)
+
+logger = logging.getLogger(__name__)
+
+_DEFAULT_MANIFEST = '''
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <assemblyIdentity version="1.0.0.0"
+ processorArchitecture="X86"
+ name="%s"
+ type="win32"/>
+
+ <!-- Identify the application security requirements. -->
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+</assembly>'''.strip()
+
+# check if Python is called on the first line with this expression
+FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$')
+SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*-
+if __name__ == '__main__':
+    import sys, re
+
+    def _resolve(module, func):
+        __import__(module)
+        mod = sys.modules[module]
+        parts = func.split('.')
+        result = getattr(mod, parts.pop(0))
+        for p in parts:
+            result = getattr(result, p)
+        return result
+
+    try:
+        sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+
+        func = _resolve('%(module)s', '%(func)s')
+        rc = func() # None interpreted as 0
+    except Exception as e:  # only supporting Python >= 2.6
+        sys.stderr.write('%%s\n' %% e)
+        rc = 1
+    sys.exit(rc)
+'''
+
+
+def _enquote_executable(executable):
+    if ' ' in executable:
+        # make sure we quote only the executable in case of env
+        # for example /usr/bin/env "/dir with spaces/bin/jython"
+        # instead of "/usr/bin/env /dir with spaces/bin/jython"
+        # otherwise whole
+        if executable.startswith('/usr/bin/env '):
+            env, _executable = executable.split(' ', 1)
+            if ' ' in _executable and not _executable.startswith('"'):
+                executable = '%s "%s"' % (env, _executable)
+        else:
+            if not executable.startswith('"'):
+                executable = '"%s"' % executable
+    return executable
+
+
+class ScriptMaker(object):
+    """
+    A class to copy or create scripts from source scripts or callable
+    specifications.
+    """
+    script_template = SCRIPT_TEMPLATE
+
+    executable = None  # for shebangs
+
+    def __init__(self, source_dir, target_dir, add_launchers=True,
+                 dry_run=False, fileop=None):
+        self.source_dir = source_dir
+        self.target_dir = target_dir
+        self.add_launchers = add_launchers
+        self.force = False
+        self.clobber = False
+        # It only makes sense to set mode bits on POSIX.
+        self.set_mode = (os.name == 'posix') or (os.name == 'java' and
+                                                 os._name == 'posix')
+        self.variants = set(('', 'X.Y'))
+        self._fileop = fileop or FileOperator(dry_run)
+
+        self._is_nt = os.name == 'nt' or (
+            os.name == 'java' and os._name == 'nt')
+
+    def _get_alternate_executable(self, executable, options):
+        if options.get('gui', False) and self._is_nt:  # pragma: no cover
+            dn, fn = os.path.split(executable)
+            fn = fn.replace('python', 'pythonw')
+            executable = os.path.join(dn, fn)
+        return executable
+
+    if sys.platform.startswith('java'):  # pragma: no cover
+        def _is_shell(self, executable):
+            """
+            Determine if the specified executable is a script
+            (contains a #! line)
+            """
+            try:
+                with open(executable) as fp:
+                    return fp.read(2) == '#!'
+            except (OSError, IOError):
+                logger.warning('Failed to open %s', executable)
+                return False
+
+        def _fix_jython_executable(self, executable):
+            if self._is_shell(executable):
+                # Workaround for Jython is not needed on Linux systems.
+                import java
+
+                if java.lang.System.getProperty('os.name') == 'Linux':
+                    return executable
+            elif executable.lower().endswith('jython.exe'):
+                # Use wrapper exe for Jython on Windows
+                return executable
+            return '/usr/bin/env %s' % executable
+
+    def _build_shebang(self, executable, post_interp):
+        """
+        Build a shebang line. In the simple case (on Windows, or a shebang line
+        which is not too long or contains spaces) use a simple formulation for
+        the shebang. Otherwise, use /bin/sh as the executable, with a contrived
+        shebang which allows the script to run either under Python or sh, using
+        suitable quoting. Thanks to Harald Nordgren for his input.
+
+        See also: http://www.in-ulm.de/~mascheck/various/shebang/#length
+                  https://hg.mozilla.org/mozilla-central/file/tip/mach
+        """
+        if os.name != 'posix':
+            simple_shebang = True
+        else:
+            # Add 3 for '#!' prefix and newline suffix.
+            shebang_length = len(executable) + len(post_interp) + 3
+            if sys.platform == 'darwin':
+                max_shebang_length = 512
+            else:
+                max_shebang_length = 127
+            simple_shebang = ((b' ' not in executable) and
+                              (shebang_length <= max_shebang_length))
+
+        if simple_shebang:
+            result = b'#!' + executable + post_interp + b'\n'
+        else:
+            result = b'#!/bin/sh\n'
+            result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n'
+            result += b"' '''"
+        return result
+
+    def _get_shebang(self, encoding, post_interp=b'', options=None):
+        enquote = True
+        if self.executable:
+            executable = self.executable
+            enquote = False     # assume this will be taken care of
+        elif not sysconfig.is_python_build():
+            executable = get_executable()
+        elif in_venv():  # pragma: no cover
+            executable = os.path.join(sysconfig.get_path('scripts'),
+                            'python%s' % sysconfig.get_config_var('EXE'))
+        else:  # pragma: no cover
+            executable = os.path.join(
+                sysconfig.get_config_var('BINDIR'),
+               'python%s%s' % (sysconfig.get_config_var('VERSION'),
+                               sysconfig.get_config_var('EXE')))
+        if options:
+            executable = self._get_alternate_executable(executable, options)
+
+        if sys.platform.startswith('java'):  # pragma: no cover
+            executable = self._fix_jython_executable(executable)
+        # Normalise case for Windows
+        executable = os.path.normcase(executable)
+        # If the user didn't specify an executable, it may be necessary to
+        # cater for executable paths with spaces (not uncommon on Windows)
+        if enquote:
+            executable = _enquote_executable(executable)
+        # Issue #51: don't use fsencode, since we later try to
+        # check that the shebang is decodable using utf-8.
+        executable = executable.encode('utf-8')
+        # in case of IronPython, play safe and enable frames support
+        if (sys.platform == 'cli' and '-X:Frames' not in post_interp
+            and '-X:FullFrames' not in post_interp):  # pragma: no cover
+            post_interp += b' -X:Frames'
+        shebang = self._build_shebang(executable, post_interp)
+        # Python parser starts to read a script using UTF-8 until
+        # it gets a #coding:xxx cookie. The shebang has to be the
+        # first line of a file, the #coding:xxx cookie cannot be
+        # written before. So the shebang has to be decodable from
+        # UTF-8.
+        try:
+            shebang.decode('utf-8')
+        except UnicodeDecodeError:  # pragma: no cover
+            raise ValueError(
+                'The shebang (%r) is not decodable from utf-8' % shebang)
+        # If the script is encoded to a custom encoding (use a
+        # #coding:xxx cookie), the shebang has to be decodable from
+        # the script encoding too.
+        if encoding != 'utf-8':
+            try:
+                shebang.decode(encoding)
+            except UnicodeDecodeError:  # pragma: no cover
+                raise ValueError(
+                    'The shebang (%r) is not decodable '
+                    'from the script encoding (%r)' % (shebang, encoding))
+        return shebang
+
+    def _get_script_text(self, entry):
+        return self.script_template % dict(module=entry.prefix,
+                                           func=entry.suffix)
+
+    manifest = _DEFAULT_MANIFEST
+
+    def get_manifest(self, exename):
+        base = os.path.basename(exename)
+        return self.manifest % base
+
+    def _write_script(self, names, shebang, script_bytes, filenames, ext):
+        use_launcher = self.add_launchers and self._is_nt
+        linesep = os.linesep.encode('utf-8')
+        if not shebang.endswith(linesep):
+            shebang += linesep
+        if not use_launcher:
+            script_bytes = shebang + script_bytes
+        else:  # pragma: no cover
+            if ext == 'py':
+                launcher = self._get_launcher('t')
+            else:
+                launcher = self._get_launcher('w')
+            stream = BytesIO()
+            with ZipFile(stream, 'w') as zf:
+                zf.writestr('__main__.py', script_bytes)
+            zip_data = stream.getvalue()
+            script_bytes = launcher + shebang + zip_data
+        for name in names:
+            outname = os.path.join(self.target_dir, name)
+            if use_launcher:  # pragma: no cover
+                n, e = os.path.splitext(outname)
+                if e.startswith('.py'):
+                    outname = n
+                outname = '%s.exe' % outname
+                try:
+                    self._fileop.write_binary_file(outname, script_bytes)
+                except Exception:
+                    # Failed writing an executable - it might be in use.
+                    logger.warning('Failed to write executable - trying to '
+                                   'use .deleteme logic')
+                    dfname = '%s.deleteme' % outname
+                    if os.path.exists(dfname):
+                        os.remove(dfname)       # Not allowed to fail here
+                    os.rename(outname, dfname)  # nor here
+                    self._fileop.write_binary_file(outname, script_bytes)
+                    logger.debug('Able to replace executable using '
+                                 '.deleteme logic')
+                    try:
+                        os.remove(dfname)
+                    except Exception:
+                        pass    # still in use - ignore error
+            else:
+                if self._is_nt and not outname.endswith('.' + ext):  # pragma: no cover
+                    outname = '%s.%s' % (outname, ext)
+                if os.path.exists(outname) and not self.clobber:
+                    logger.warning('Skipping existing file %s', outname)
+                    continue
+                self._fileop.write_binary_file(outname, script_bytes)
+                if self.set_mode:
+                    self._fileop.set_executable_mode([outname])
+            filenames.append(outname)
+
+    def _make_script(self, entry, filenames, options=None):
+        post_interp = b''
+        if options:
+            args = options.get('interpreter_args', [])
+            if args:
+                args = ' %s' % ' '.join(args)
+                post_interp = args.encode('utf-8')
+        shebang = self._get_shebang('utf-8', post_interp, options=options)
+        script = self._get_script_text(entry).encode('utf-8')
+        name = entry.name
+        scriptnames = set()
+        if '' in self.variants:
+            scriptnames.add(name)
+        if 'X' in self.variants:
+            scriptnames.add('%s%s' % (name, sys.version[0]))
+        if 'X.Y' in self.variants:
+            scriptnames.add('%s-%s' % (name, sys.version[:3]))
+        if options and options.get('gui', False):
+            ext = 'pyw'
+        else:
+            ext = 'py'
+        self._write_script(scriptnames, shebang, script, filenames, ext)
+
+    def _copy_script(self, script, filenames):
+        adjust = False
+        script = os.path.join(self.source_dir, convert_path(script))
+        outname = os.path.join(self.target_dir, os.path.basename(script))
+        if not self.force and not self._fileop.newer(script, outname):
+            logger.debug('not copying %s (up-to-date)', script)
+            return
+
+        # Always open the file, but ignore failures in dry-run mode --
+        # that way, we'll get accurate feedback if we can read the
+        # script.
+        try:
+            f = open(script, 'rb')
+        except IOError:  # pragma: no cover
+            if not self.dry_run:
+                raise
+            f = None
+        else:
+            first_line = f.readline()
+            if not first_line:  # pragma: no cover
+                logger.warning('%s: %s is an empty file (skipping)',
+                               self.get_command_name(),  script)
+                return
+
+            match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n'))
+            if match:
+                adjust = True
+                post_interp = match.group(1) or b''
+
+        if not adjust:
+            if f:
+                f.close()
+            self._fileop.copy_file(script, outname)
+            if self.set_mode:
+                self._fileop.set_executable_mode([outname])
+            filenames.append(outname)
+        else:
+            logger.info('copying and adjusting %s -> %s', script,
+                        self.target_dir)
+            if not self._fileop.dry_run:
+                encoding, lines = detect_encoding(f.readline)
+                f.seek(0)
+                shebang = self._get_shebang(encoding, post_interp)
+                if b'pythonw' in first_line:  # pragma: no cover
+                    ext = 'pyw'
+                else:
+                    ext = 'py'
+                n = os.path.basename(outname)
+                self._write_script([n], shebang, f.read(), filenames, ext)
+            if f:
+                f.close()
+
+    @property
+    def dry_run(self):
+        return self._fileop.dry_run
+
+    @dry_run.setter
+    def dry_run(self, value):
+        self._fileop.dry_run = value
+
+    if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'):  # pragma: no cover
+        # Executable launcher support.
+        # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/
+
+        def _get_launcher(self, kind):
+            if struct.calcsize('P') == 8:   # 64-bit
+                bits = '64'
+            else:
+                bits = '32'
+            name = '%s%s.exe' % (kind, bits)
+            # Issue 31: don't hardcode an absolute package name, but
+            # determine it relative to the current package
+            distlib_package = __name__.rsplit('.', 1)[0]
+            result = finder(distlib_package).find(name).bytes
+            return result
+
+    # Public API follows
+
+    def make(self, specification, options=None):
+        """
+        Make a script.
+
+        :param specification: The specification, which is either a valid export
+                              entry specification (to make a script from a
+                              callable) or a filename (to make a script by
+                              copying from a source location).
+        :param options: A dictionary of options controlling script generation.
+        :return: A list of all absolute pathnames written to.
+        """
+        filenames = []
+        entry = get_export_entry(specification)
+        if entry is None:
+            self._copy_script(specification, filenames)
+        else:
+            self._make_script(entry, filenames, options=options)
+        return filenames
+
+    def make_multiple(self, specifications, options=None):
+        """
+        Take a list of specifications and make scripts from them,
+        :param specifications: A list of specifications.
+        :return: A list of all absolute pathnames written to,
+        """
+        filenames = []
+        for specification in specifications:
+            filenames.extend(self.make(specification, options))
+        return filenames
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..27425de57456967d72eeb2ee380971bf1f05f291
GIT binary patch
literal 14496
zcmZSn%*&NH<x)&C0~9bbFfceUFfbH<W?*1QVPHsMWXNG)$Yo@RVq{<h@tGKMm>8m%
zz;a9sIm`@E%rG_!Llg^)&B_qP3S+Y|M6ofXFf*jEFyyc^<Z>`XaWLd^GDLAQ<Z>}Y
zaWOE0<X9PUxEXSJ7@~L}d^Uz0UWQyghA2LUTz-Zqeui8DhA07sTtS8?L55r*hA1Hh
z##APTEMbOJ5r$?)hA2^n6n2IzF@|OahA44{R2GIT35FC7u#_Z23MWI96hjIZLkj~#
zlr%#MH$$onLmDGP3J*x6nSmiPN|qsoi6K~nmw|yH^Z)<<|1}sH7#K>}85kIxDoav}
zJ^lSMK_VKU5GvsW1yN;ja(-S~W_k%fD6CRTQj<&KQ}dGZQ!?|?!5X773*0huQXwX>
zF)%QsW#*-%7HP18Oy*%=U;xSb7o-*?mgE<e2rw`(q^Fj|r&bi?7lBMFDXJ_1sY=ez
zD@!dZi7!Yj$tdB2t4d8SElEtuNd;S#nHOJ{npal*k&%Ic%f`MUH%Fl?wWv5VKhIXl
zP|rX~0p>7UrO*&JT?-|J;*!L?l*F9;yi{AI%G6>ddpj<h#Ny)A+@zdJg^Jvqykc9W
z(xN=8;^d6f+{9wt+|1;n{Nnty65ZtdT&u+5T)i?wC57C?yv(%J;*v0A%j~!m;6{0-
zq~?`mmQ<oRN6$ddK#5DCpeR2%wYWIH$gwCnBNG&UrA4W>N)Z-jN?ZzgiMgq^N~*<5
zTnZ(X1*x`5<(YZLMoRj2TwDq^in_WA5R=m?6-qKv6%q>yax#+>OEUBG6pB-mON&5O
z7Nr)JW)`L9rskCt>nZ5!g4|V7R9al(nU|JNq#uoyK)PT?g4iHaQ;SPdQv!-I%QACP
z(^HF4gk38@F_W2}=aX8Nnxl{dB5joti#_wo^0QNmloU!c9g{)+wpB_?%qdO<c}c-W
zABVB}$X4saU2n%_qYsNMyJ9&828K9gMLn&8%94!yymI?!16@nKSS^ic1<qJKElqos
z;u<Cf24w|ZEnNjj0<}^oElJb00EuvArYXe7gTgyLUcuH@K|MY`H!(9WK3?65OF=<F
zAu|`0AQg%$i**!=Qn|olDXD1+@kOb{`8j2&8oBu?r8%iO3TdTz$(j&7Abs)i5S{Vy
zP!*bBtstq~{1gRSkcoN_y~WWGIu@>?AhD>VSiu%-re1MDPG*UQx}G}1grd~q(wq_n
zTZQ!0lEjjdB9Ik23SeD&1^ERU2AT-9Y57G81qzvY5NU)1K`y~C2O^-OP=L^1lv+|+
zl&1iZf%w0qs1jjLab>YyVo`cov_Y(btwK?%UU6xXMv=OPZgFx^W<g1eUO{EKeNBvB
zYDKE1y^6Yyg1Wj6*z-_Lnh-NV&H)9Xf-NFw)m1?rE6qvOEC%UQ)c`5bEJhB9WN0X9
zXeuZx_~qxNDrDxBq!twvrIw_oC?pmu7=QycwIVsSphUqHOo6gVVzEN1m4bq@LVjLO
zr9yFO0VtL;^U@Upz==q~&Q`%l&kU>=<T8*ai%U{ci;DEhi!w`6HPlsAi(~TC6;xFf
zQjx+6<Qzk=E|8AYip&y?qGV03WKiJ=Dmy{g8B~0BfJ#k9h8hNjY&M3X77!zg0aOS#
zGcpvVg1L;K`X_~%p_z#xhKZq;k)f6eBvQi!*3!sO!^8m6!U8Jgd5RhtQdk*k7(t?G
zOblYR3=D;h425um!K#W|7*g0kW`m_$81fiEoL~)5Iqz2ja-%{qs0z?8EiTee%FNSG
z%_~y?7yMvJrDBjm)nWxu!Bot`z`y`vXfS~abS{vmN<hiBJhLRD1XRdF(k;lxB_P>U
zaLE8Jvq561d1WQs3=9nM2yqQiH4G+-^B5Qy^b3kI%Mwdc^~(~A^waWlQc{bG^|K50
zvx|+)%?%5)jLgdnEzFB^D$~p3O;Suu3=9km()08~^b0ZzbTjjcOA>Q(bjuShO9L}N
zLSPK4CsOi@^iwj6OL8)k^dV`qSg)Y6L>TOtyu#A_l2jx|Ie|O|s+|}Zd06=wB^YHG
z#hCaR1sK7u4+f`k-^A?HB6uqT6fj_2GK>risSKdTLka_^)sV^zZX<|*S_G-=45=Ip
zDI%a4ZD9sA2U3_owQ&>|Ln=2z77s%fFR0Z3N)1t<wgaf@<^x4Bh`|qvxfC|AdI3<)
z4>E^?p@j+5JV@aLiwiNN3Nu8Bz^Z*wP_+-zD+acdhoOZL)KW;{1uK?dNR?zr;RCTj
ztqCcHR4IlmX@(SjBoP^gELnyW0fuZQhT?Ca76gdP4B{3sF{a8eWXVBgi<lTw1VI|3
z<iYL~VMq}ITc-fFS{Te$WC#k@5Cw&8JOcv*ILA0DB<Ca+7b}$HD<tO^R4U{bDI^!A
zCYGcsKx0WEttdZNp*X*^C>bFJQk9sK14>t5Q;G{xlQYwxwPCRySS%UT`~YE4!UJc&
ztqcs{%)-DB&j89YH4F^#j0`o*p!^We#83iZu)r9s3?*y~S?r+5%4T9H2#0Z*K;F-X
za5<o|Afq@LO1MB-tr?ud<GC4XSQ!ec8A^B<YQPy0q=pw}2rI~tg4HlC#7qd60~F)g
zOkh{>fm)QXyb8)+1^LC96(yk5mX%nRSOUsC#UKwx=tY)*@?>5KIBN!hLm4We0cx#*
zvm+!J<5Mz=z}%9=B2e=S#08ZAi76@ZIf<ot$r-6d#o*lR2CA*WthD^1WJtR!IVV3U
zDYXb}TYfRvDWHlJtO{JEmT-V#IJG1`H$Nq{1muR|)Do~@Sz=LUVqQsc5XdLsMqGSa
zW=?8;K?x|H;xmim^GY;8Ot7iNsX1vu;tUK7K@uQB5>(=V%A%B_%J`zvJg^>!c5v|l
zCI+Gm0eLq*J~J<~BtAYG<aIGntT1shLLrkJqYxuMqbL(UV=^c-K%NKD;53;CN|TT>
zospr05mfFM#e$+fi;1Bq7L*jTSQxUvg?uw3xJqDVsAU1As4O;6%>k(@YQc#Xq>>$+
zo>@TV)G~r{Vhtlhum&i-_<^G$y)+XXaFAvbI1V7pat)9_AZk)ef}}t}t^y)tLE#QE
z0Mr-{0;LnMuA<a}oW$f*a7<<8XXb&M_(7^59ef}ipqR=p0JTnw!AT`04@{-yf#V5G
z3`AssQc*l8(I@7Vq!#5Rq7?htpxEOA#U7(HqXeT6qXc7+2m=E{GAL((q70Na!O;ea
z=Sm%h5^#ai%*fC$1*)h)l{2^kZ)OC=O*RulaCizcLtsRBo(2O;3Al(!V`9kWVkin@
zU}R)00Y_~L3#e3TW@2D0VPgo6NMU9O1_x$w4y=#_HAX<#CAB2AC^r+--bn-Z0ifkx
zYKj7)LRH8tR!D@Fp5THIq!WZSlJoOQ5;OBa(#nboIhlD#jTn%EOprH=L4>lRU$G#l
zx0aZhlbQl5obwA(^AuEz!L0^xoPz|wjH1-U6mW|04|Xjo$}a-5J^dkUP=Mv+r>Cbv
zgv%3)@-p+%!Kn+}twc&NAbZmazzG9P3`FYS1T_aTi{pzkQgd>OL8$@M8)aZ+X5?p-
zWfW!<V1y?HkaNLFAr6#-89=SF8b(m7tjHErC!{bi<bWG*pfth6kj2c9#R5tbpp*fr
zKf^$=9-Jo$qOw>)op?}=2G<lt5IIQOPAnK)B>I87=-|d!ez6|B#P!L{E3GI7rP(ZS
z8y3{!E(VqND9t%&#06P{vL`4-gJUiyF)tll7z9@qm!#%`+cxQ`B>_eG1*t_PmEaOR
zC%-(k2wZrl=A{&ant5pP2F@Vh2m=!X5o@6GHa;!0A|4V1NbR_KP!xiSBL+r(CLShf
zMs`L~CKgCB3@V^Nc^VvvYe7X8149-#_hvIQ6iG0YFfr6JGvoz;%3w&$f*J@+pePnk
zVPX&mmAR1o3yDuJP>ZdWl_8G}RDaj9f|>#~j11ZA4Ed>`^16nVA)66oWDPSzQ8TCk
zSHs94Uc<y7p2EQ(UdzUirv@6dsbyoRVFNYb;IiBd;^t6M9tJ22GHO#S!vt+cfwHet
zX=Y9eDC=jWCMD*jgEP3Ef@dD2q{z%I$VpX5PApDU(8$kI2+zz*$uBR~0X4W16^fCx
zz{`yCjLhT=P-&8vU!qWwpRbUUpO+3&4=+cG3lfu4i!~KWi&H`NLaa#3FUl>=fs9L}
z<rl$?1C3cg?a@>4FUd$PD$guV)d6b;_dAL+KwUSGGDKmfqX0^B3W*9JJBu>QQd8jO
zLCsQtI5ROPC%?QH;#F|-98_o(mF6j=W`e9zC<P5e!TNdmMGD0kAe%Gu(h=sBW`YNo
z6hNJU%)E3xg^-NIylimO)FZJdF(*aAFTW@yy(l$L0o1+D$ShXK%qu7@(L?lQgHux#
z5_5|4trRj!N(!v>^~=l4^)mBxOLKDdQd0HnauY#gOUc=w-c4qHX|X=k6Z*<Isd?!o
z8F0sd;uC^F1{GWB>u03v<>psq=Hw*m<rk&vL)p5?sd*(ui8=b9hLC<qW`TZgVlu**
zAW;7%6O_uq`8*}Ds5~<-lYxnWArq7}f<Wa4w7@S0^#r-VC5f^kG(NbBK?S0^x;iLA
z)D?=k85kH8lvE6q6qHmPl(>pPEg5wMb#--c2^9otDFlHAX27LONKq-I^_P>H2X0mr
zR~CZ{l7gJX5>O%m*Cj|50Lb)${Nj>$NM{~A?pF*>Q=sw~l%yd-khB^P39%9(1_p-Q
z#0r=am@uf~DFP3efQuzCF%V@FsPKtT0_9AY3%fyOk_@Pk!OhRe$t=al&&bKd#>m6S
z!^FlY%EZPf#>mA8ZoemkT3w)G3gj7ZG4+Cx0o3LIH2}edRgogNsmRDs%L*>9SQzp;
zLFH8z3#dLRwqz&)S1h1XsSwoFXl7t2DgX`fW^piNae`HHfodyItpskJWN||~pkmET
zAVc%4P*rn-3OSH!R<LGnP$AdM2xBvY3P;dD1Vl5apgRh7AP=Z7R0AH>0J(*Mp@f$q
zi;p3TA5;v2y1OsI$^<~ln!&!w1CK<5oGFM9tYKj&5@0M5LWqC{Ggv`G;*fD~P%wZ^
zPT>UguZn^hQ@B7qy=-;{5Stspu3-X=gqzngf!oLo3|S%|Lu;784QDonN<mO5oFxh!
zPiG9zQ)FN%5d$~fW-@}BZsH6nydX7V&5R69j0|~<3=uVqAmyOi;|U|&07%ur7+&~<
z5oW*xm;rns18Nu<z(EE!rtk@41jtWp48h=Dn;*C}1?>tKgIeg2*1BpjI7_)kxPmjb
zlc%4HXAn5^!sJzp!CJ#ygMvN%{lK*}IKP6&K*5@mb27pCTQ|bWttc@!wHQ1M1mczE
z<UmD01%v`f2%<oTfq@|;BNbj>Xs8xx!fJ?=)a3jWP>&qaV+Y$)Y)`xfP{9xJD178z
z0c5@gxcBD*YPo<i6S(ad1S+h+lMtE3@em(FGFcEPh=M?+7Nj)N1!>a<Rqh}OP`e-0
zivgD-AP!_UBfc!LD99M3(hWqog9uQ&F9<ZC11_@i@{4joRc8>WQ49`o@Z>^jkT1w+
zQ1%4-J{4RVh2~`@=clB)fWjjc(hLR#V_0HNDTIqC_`rsPjRLibJwO&4fJ_8s`c%lM
zR1nD1;HZSw72u)_ObkSM1_~E&{|V}vRiM($2UMCdvOzn%Jd8YyoQ$H3l1!Y8JdFH|
zVvL}2O^8v5Nr;(^k)N5LNt%&|k(W`3jhRu9k(ZH~QILfPM1tAOjN*_+HmHFO3R!T$
zrvPtcmw=mSHH-{dOrZ8Oh{4Rz%)lfT3~reEfnz5ZJUkDshCrjo;QlW-xj+(Fd`W69
zs1}0sUQ;rYOTfAcic-@uE5OX+(zLY93dm3js80)S3xlfKN^r=7iGc`y(3m77_`!{w
z_>$C$l1HE@096$XjG~aB16BB--~$I8s8%ik*A`h!puPsEd}RU`x6Gj8P%IccS?321
zBSfYFr_7|p;#6=?1C)7S^IqU!23OnQRGC@<Q37%RNIf`cz{Eg=4=8zpGB(VyFA!lP
z#0VY{1m$2*_5z2^R3`9XcoqXgK0i1}7#V8WKs70}zXtBm)v|-a2{Z=74yxaZ9YEX~
zb_Q7G!NyP=3>IQ$5C`=bDnK<!3V1}Xs1R%_crF+e?i>tx5PR65^=K^zsD5o`V5sF}
zDB)nJ;RK5_G4zWw)N(P@aDi%RP&W`<buxyhFfas0)NnFnae?ahT5g6K4v@{_HQZpU
zD-JW(FfzEr?q;mz0s8_xs9eJU8dt920atC{I;-dnV+j*O7B{F4uHglF3N+Wi$56}9
zP{R+dmDxaoMQV&Sd<?a`peizjouP)8L9CXSp;8>|Cjo{mL68unR%Z+^Y+zz35dv3`
zFTnMiFsM$2RLhJhoFJuQwE{3#i89m(fUTGSc8M62%LuCWnHaLfLCQfYm>3vA&PTJX
zL>N5P%>^<6RMUby12-bP@FgS6B~L&uDSXKoQP{u~kv9eGa7KnA8KxRu(4blhc#KxO
znUR5~NQNne2W%@VxH^XT8e}jxLzXB=0@O_LV*<HGl7Xklj|t=m5e85rfEN_9jD?p#
z;RKRLb1g_nilL|htXBXu#9qV8kPc2-Aph2|Fl5O<EdUt;isWDoP^s^SRAGa%b3r9|
zMy3QzmV;a4uz5?pf=ci(Fo*^fnySU%fdDI%F&ywD7V=1uu0lysWoBMFsILU-!|A1@
z=A@RS=B6s-<fmsQgKbbPhKm-1>L$meoK%o{==dM9aizr|v*5}hhJYQb2lk0-v7Tyi
zF=zxXI6JeT0HipzBD1&z!~peQK;uiG(kcj~BnUD12+FRY(W>Iqf}n6v9q9<FBS9mP
z;Gz&VWE}*mg@Qn3AGq)W`?k0QGI)`mT2cn8e}mu+0`Q<RSRr`IDz%~{2vm3kDTB-g
z6%t_m@kyC^iA9y*VQTOa2>4`TkOjykmLS!j00(=d7+iN0rRL_Br9zqD;uF+QN=Z#B
zO%DRK`-4E08F=QY7`*lYG<ObaH$leBL53w36r|>*Xn<S+DQH0kfJ`b5iUnB+awxPW
zO9HLb0J{tnf?ze^#$9SfNeM_<X>lriOh2dqq#0C}!-5R#$l{Ws)Wlry=xkLQI7F&4
z3*u7}OA;ZSIZ*KDmzIFc21jNdn1pyRB@HADF7Cm^K$Q95gaC;xNT9p{75WjN)W9eN
z9(w0xWMkxI;$akG;%DS!6k-%(<YDAv<Ykm#WMh;7^}iUo7(wk0UM5~9E=D0n0Y(8v
zVMbmiNc)7F2{iO4!zjSW#wg6l$tcDM?wEnPtDwjNS0sUq;Dtk=ju|sUkq>AP9yCqM
z#E{MaDjaHAL3Kir52$mM!U7s*s$m5cUSbdlP*VoXuVrB<^nn#4%%E|k8WvC&3tY%D
zf(C&YK;wvzJ_SM-JE&gIVr2l;CT!rEffLlL0~I{%;CbV<pqeF%15{l!Gctfm9Z-4B
z0Gizb%|zdYN~eHTlz{7(6ix<7Xukxko(o)fLX6{O1l2(tpxMP54hE=t9tH&@^`O3=
z9%BtNXk0Xfm!X6k6bwarj46DeiVZYI#t&kEoX7*Ry@rjU23*h9a4|Hqf)`!|Yk*oi
ze&DV!c&QL%TmUr5UlgBMlwJ%j@f1{xA;TD;JOb`?1c8bva2kyO&sVD!s}^U1QUh3h
zgkB`HFw#{m1`mw{X@ar^sN5*1EDr(=x`UTQ1%Wy{L7=_^q|gD4^9H4XGCgRBBS;a%
zQiADBOi2j>bsoS?BIq(CNKd7Ufq_8-lvcnwIVcsR4LtS&a%B*x$q#O(g8T!?+@LfC
zNym`v2ht1SgR)w2Py@(7kaq?w!-2|`_}s+o)Od)y6c`y8iovd7WMgDw6awcHQAP<y
z32=`9G;hw&sK^My65z28@H7~xh6DK(oPQjcAOjoBpgFKC@OU{WX|R9>Fd(TNG^7BY
zAw$Tr!4!kje=~UU43q;I7_vARc#3MkDHfcVK}#gSb7COT5^$?1g%Ol#K(j6>3=F}Q
z!k{4uPzN3|0>H`;o~OpZQo;vr&};`y)_~l@&rrOMp@{*MLsJ;Q<0JVD5jCu!rVywN
z2OhdDehy0QSwf(^4$>nG%8(#GFhf#xi3qqs!N!m!25Ri3u!3?1sBy>+$^k`cj3wgW
zQDSy*8wcDFD^OreVF%@I(9i%gLvbTx4J$*DJ&4Sb1Q`#?p&+|B8M356-U3ZHLz_<0
z3`K?DHWVkgnZbhG@?ZkZ?t|2V%7oouXUl<xFhIe@z>vkp(98^Je{q5ug~ggoCGwzh
zEK3knc7d9VoZvjn%8;c18oCA*Eg)AYf-^J+$X~VG;Gt|ba4GbLF@>9<mIpjS&I4kU
zfO~OS?4aRsPzdmXV@wIu7)obkr~$XmvXns{tYKmRHDFo6Wf#cvHcX&khkG6rhu~c6
zS1irIzyKPtPR=g?w{2956*Ni<bW8GeQxZ#3HNo{<QBpA|>#7!8DX12M1~3xy6jE~w
zN-7mVwWxwdF|>W62_78f<$?^3f)~YrizD#zGnfU5c_|8sDOshEhKy>lg07tcw8RP0
z24(kN5CJY%z-=1v)GD~0gJ_I^r@28DEx1_{ln&AX@(83k0xH__Qp;0|AdQYHkgN%a
zFb5H8ph5`L{Q|9o0@vT5DLGJsDG1y=0hOYlK2dUhZf;^;3S^ERRB5_-1_g)2`*`}f
z#s|5Ad$_rYCCM2<dLUCl11?~(^rHOI0x&B%C%-rq+|~ej9o!}Yw`GE=K^kgc&dAJ5
z%MSvzSHT5aacXLI5V-6Fm4rd2pwbJJ^&!RKM37EUaR_dSKteI74P+8%geMKWN+B(?
zsJJ8^?4Ma6<)AV%2s8l;b`(e)(kud(j6v-n3kJS;1cwl$cr*tUkKo2BBO9X}qY9$}
zqW~idD>JBx!N|$T#>mCQ10FmPU}RyE1{a|cOrV047uwtqVB%rqV&q{I1r3^j23MFs
zg{&$g8zXp$87QPc7+jEY!3RpRKokEUaX-i~2B={h1WGI5{ysSP!DTj>7=U&g*e%(h
zumPnN1}5;#Du@ZfV84J8F0?3O0Ik#kXL77Q0%-yJ2%IFqEq$=Jz{EiLEg#{xAkY*g
z*n^-N57g8Edl1x`fDFx~fV+dxK?6BZ)d3or29FYe765|Rf7CERdZx_aPBb&9U6{fS
zDr8eQ7$hOHk&v<+G*kf|iqB#L)loI948a<pAyLR`zkp0o4**;YnwfwpV<Yg$GN_#d
z>NN)CgBFB?!WrCZ0*_XLvuANhQE4({B~Nl<PI7T(RVui+fvuzkD=Gqar-DG`5jg*Y
z7J!3e1>94COca4f)Ich-GxJiws**BGiXqJ%(A+h2p<aAJVsdt3dTJ18d=VU#U}7NR
zvyg#-p&S&SprQ*j&IX#Y5nvW$lz>bogGy)+21lzmXu&!Is1k>-4*@kx!1Mpv91KN<
z;A##$7zb|HGce|ffrXes6=4lCxa|&VhcJQ~(2#M>;>)0A?vN=#1qIOBL(q&Xcn}b2
z{?V!+u_!TD0lF*%vN+sI0X$-lyh2U~I%%3&44WQJR47Z#$xKmzti;DM4GFUuM1#jc
zQ7uu>D9Kj<H3{Lag3JOW5-=(mx{6N|G_RZpu6;qRTr9>VRT44^THk}$3ns!=4CdrR
zLO~O<C=ld)XdposCs`>tDu70SGxI?meTDoq1*imM$~iwL2Q)kZDajSmQ}aMu7c%qn
zkc@+@l?IuUlUZB>G9fW1M<Fq(I6tSfBvk=4;Q;beu>z=%T9TTlP?C?(4eqQ!2VX&D
zL(nu(6}JRLOa|3tphN{J*+4ZmO2mS-27xM1aIXTKH^9UIWDsyB2E~6XD3gFX2n^id
zIZZ}kCNV5o1k`#-2WOEAbx?!VB~~81tPR{>1hpX<!C3*62|#U4#zJ0(@EXv<C{VFf
zd<c1AR7herX!QXs>`{WKSOL^H1Gx*jAgUOWEK4#{b9Lb937Q~Kbt1<nsth9XtjLIZ
zgtg#m8C+(jR+OaXr37t8jc`y=gK9HUjBf&|9nfYDC_REgHa@pBrzEo=Cv^rW>Opl2
z0~;G7FQY7@p9ZLr9kd$MoCCE>;z1)^r8%kb@!)Q9e0)lNa(p~^UMAQ%$TJ`$KE%~G
zz{fGfH3+mU5|R}_p%4UWj6%B8pahO}t`5Ak2{d5`o|A*LIKlNRXcR5p#nsI*)F&j~
z*U`_@%{4eAC<BzkK<oX2z|B%nUJC-{I&g(n09^qEZlZu=2(*GVwFojjA_vkc4<bOd
z0yx%!wxL7^$dL>KkPCx^K&}Ffeu0|sY%FYyY)ouS%#8f}oa{o3oIE@{obvn@oGffi
zoGhFsJmQ=t{47E&x-2|=Ji;0vZ-JWwnfc(xDmacnYxh7?lc4SjSh6TJXeG!J@L&h1
zz)H@~El4Z@PsoBB{g44zP;&#cR|d3dyBN_JC@sm%0Wbay0%;8bcX&W420UX6?pdU#
zmiU0z3xbmkxW5B#JrtJ|WflbO0wpDoE|9I6IjKQ2L2lUzB0$j$j;j2mtkmQZa8Q8b
t0YMBvjDVAqO)hvk(hlVCV$cY%0BE%b1T%rg6*ZXog?O0x#o3rS1pwvG^Y#D$

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe
new file mode 100644
index 0000000000000000000000000000000000000000..a09d926872d84ae22a617dfe9ebb560d420b37de
GIT binary patch
literal 92672
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe
new file mode 100644
index 0000000000000000000000000000000000000000..9da9b40de922fb203df6b9a1d0ad4139af536850
GIT binary patch
literal 102400
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
a;)=x$i#rxiSUh7fC}2kMXb23h5C8y3xyt<j

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py
new file mode 100644
index 00000000..9d4bfd3b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py
@@ -0,0 +1,1756 @@
+#
+# Copyright (C) 2012-2017 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+import codecs
+from collections import deque
+import contextlib
+import csv
+from glob import iglob as std_iglob
+import io
+import json
+import logging
+import os
+import py_compile
+import re
+import socket
+try:
+    import ssl
+except ImportError:  # pragma: no cover
+    ssl = None
+import subprocess
+import sys
+import tarfile
+import tempfile
+import textwrap
+
+try:
+    import threading
+except ImportError:  # pragma: no cover
+    import dummy_threading as threading
+import time
+
+from . import DistlibException
+from .compat import (string_types, text_type, shutil, raw_input, StringIO,
+                     cache_from_source, urlopen, urljoin, httplib, xmlrpclib,
+                     splittype, HTTPHandler, BaseConfigurator, valid_ident,
+                     Container, configparser, URLError, ZipFile, fsdecode,
+                     unquote, urlparse)
+
+logger = logging.getLogger(__name__)
+
+#
+# Requirement parsing code as per PEP 508
+#
+
+IDENTIFIER = re.compile(r'^([\w\.-]+)\s*')
+VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*')
+COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*')
+MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*')
+OR = re.compile(r'^or\b\s*')
+AND = re.compile(r'^and\b\s*')
+NON_SPACE = re.compile(r'(\S+)\s*')
+STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)')
+
+
+def parse_marker(marker_string):
+    """
+    Parse a marker string and return a dictionary containing a marker expression.
+
+    The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in
+    the expression grammar, or strings. A string contained in quotes is to be
+    interpreted as a literal string, and a string not contained in quotes is a
+    variable (such as os_name).
+    """
+    def marker_var(remaining):
+        # either identifier, or literal string
+        m = IDENTIFIER.match(remaining)
+        if m:
+            result = m.groups()[0]
+            remaining = remaining[m.end():]
+        elif not remaining:
+            raise SyntaxError('unexpected end of input')
+        else:
+            q = remaining[0]
+            if q not in '\'"':
+                raise SyntaxError('invalid expression: %s' % remaining)
+            oq = '\'"'.replace(q, '')
+            remaining = remaining[1:]
+            parts = [q]
+            while remaining:
+                # either a string chunk, or oq, or q to terminate
+                if remaining[0] == q:
+                    break
+                elif remaining[0] == oq:
+                    parts.append(oq)
+                    remaining = remaining[1:]
+                else:
+                    m = STRING_CHUNK.match(remaining)
+                    if not m:
+                        raise SyntaxError('error in string literal: %s' % remaining)
+                    parts.append(m.groups()[0])
+                    remaining = remaining[m.end():]
+            else:
+                s = ''.join(parts)
+                raise SyntaxError('unterminated string: %s' % s)
+            parts.append(q)
+            result = ''.join(parts)
+            remaining = remaining[1:].lstrip() # skip past closing quote
+        return result, remaining
+
+    def marker_expr(remaining):
+        if remaining and remaining[0] == '(':
+            result, remaining = marker(remaining[1:].lstrip())
+            if remaining[0] != ')':
+                raise SyntaxError('unterminated parenthesis: %s' % remaining)
+            remaining = remaining[1:].lstrip()
+        else:
+            lhs, remaining = marker_var(remaining)
+            while remaining:
+                m = MARKER_OP.match(remaining)
+                if not m:
+                    break
+                op = m.groups()[0]
+                remaining = remaining[m.end():]
+                rhs, remaining = marker_var(remaining)
+                lhs = {'op': op, 'lhs': lhs, 'rhs': rhs}
+            result = lhs
+        return result, remaining
+
+    def marker_and(remaining):
+        lhs, remaining = marker_expr(remaining)
+        while remaining:
+            m = AND.match(remaining)
+            if not m:
+                break
+            remaining = remaining[m.end():]
+            rhs, remaining = marker_expr(remaining)
+            lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs}
+        return lhs, remaining
+
+    def marker(remaining):
+        lhs, remaining = marker_and(remaining)
+        while remaining:
+            m = OR.match(remaining)
+            if not m:
+                break
+            remaining = remaining[m.end():]
+            rhs, remaining = marker_and(remaining)
+            lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs}
+        return lhs, remaining
+
+    return marker(marker_string)
+
+
+def parse_requirement(req):
+    """
+    Parse a requirement passed in as a string. Return a Container
+    whose attributes contain the various parts of the requirement.
+    """
+    remaining = req.strip()
+    if not remaining or remaining.startswith('#'):
+        return None
+    m = IDENTIFIER.match(remaining)
+    if not m:
+        raise SyntaxError('name expected: %s' % remaining)
+    distname = m.groups()[0]
+    remaining = remaining[m.end():]
+    extras = mark_expr = versions = uri = None
+    if remaining and remaining[0] == '[':
+        i = remaining.find(']', 1)
+        if i < 0:
+            raise SyntaxError('unterminated extra: %s' % remaining)
+        s = remaining[1:i]
+        remaining = remaining[i + 1:].lstrip()
+        extras = []
+        while s:
+            m = IDENTIFIER.match(s)
+            if not m:
+                raise SyntaxError('malformed extra: %s' % s)
+            extras.append(m.groups()[0])
+            s = s[m.end():]
+            if not s:
+                break
+            if s[0] != ',':
+                raise SyntaxError('comma expected in extras: %s' % s)
+            s = s[1:].lstrip()
+        if not extras:
+            extras = None
+    if remaining:
+        if remaining[0] == '@':
+            # it's a URI
+            remaining = remaining[1:].lstrip()
+            m = NON_SPACE.match(remaining)
+            if not m:
+                raise SyntaxError('invalid URI: %s' % remaining)
+            uri = m.groups()[0]
+            t = urlparse(uri)
+            # there are issues with Python and URL parsing, so this test
+            # is a bit crude. See bpo-20271, bpo-23505. Python doesn't
+            # always parse invalid URLs correctly - it should raise
+            # exceptions for malformed URLs
+            if not (t.scheme and t.netloc):
+                raise SyntaxError('Invalid URL: %s' % uri)
+            remaining = remaining[m.end():].lstrip()
+        else:
+
+            def get_versions(ver_remaining):
+                """
+                Return a list of operator, version tuples if any are
+                specified, else None.
+                """
+                m = COMPARE_OP.match(ver_remaining)
+                versions = None
+                if m:
+                    versions = []
+                    while True:
+                        op = m.groups()[0]
+                        ver_remaining = ver_remaining[m.end():]
+                        m = VERSION_IDENTIFIER.match(ver_remaining)
+                        if not m:
+                            raise SyntaxError('invalid version: %s' % ver_remaining)
+                        v = m.groups()[0]
+                        versions.append((op, v))
+                        ver_remaining = ver_remaining[m.end():]
+                        if not ver_remaining or ver_remaining[0] != ',':
+                            break
+                        ver_remaining = ver_remaining[1:].lstrip()
+                        m = COMPARE_OP.match(ver_remaining)
+                        if not m:
+                            raise SyntaxError('invalid constraint: %s' % ver_remaining)
+                    if not versions:
+                        versions = None
+                return versions, ver_remaining
+
+            if remaining[0] != '(':
+                versions, remaining = get_versions(remaining)
+            else:
+                i = remaining.find(')', 1)
+                if i < 0:
+                    raise SyntaxError('unterminated parenthesis: %s' % remaining)
+                s = remaining[1:i]
+                remaining = remaining[i + 1:].lstrip()
+                # As a special diversion from PEP 508, allow a version number
+                # a.b.c in parentheses as a synonym for ~= a.b.c (because this
+                # is allowed in earlier PEPs)
+                if COMPARE_OP.match(s):
+                    versions, _ = get_versions(s)
+                else:
+                    m = VERSION_IDENTIFIER.match(s)
+                    if not m:
+                        raise SyntaxError('invalid constraint: %s' % s)
+                    v = m.groups()[0]
+                    s = s[m.end():].lstrip()
+                    if s:
+                        raise SyntaxError('invalid constraint: %s' % s)
+                    versions = [('~=', v)]
+
+    if remaining:
+        if remaining[0] != ';':
+            raise SyntaxError('invalid requirement: %s' % remaining)
+        remaining = remaining[1:].lstrip()
+
+        mark_expr, remaining = parse_marker(remaining)
+
+    if remaining and remaining[0] != '#':
+        raise SyntaxError('unexpected trailing data: %s' % remaining)
+
+    if not versions:
+        rs = distname
+    else:
+        rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions]))
+    return Container(name=distname, extras=extras, constraints=versions,
+                     marker=mark_expr, url=uri, requirement=rs)
+
+
+def get_resources_dests(resources_root, rules):
+    """Find destinations for resources files"""
+
+    def get_rel_path(root, path):
+        # normalizes and returns a lstripped-/-separated path
+        root = root.replace(os.path.sep, '/')
+        path = path.replace(os.path.sep, '/')
+        assert path.startswith(root)
+        return path[len(root):].lstrip('/')
+
+    destinations = {}
+    for base, suffix, dest in rules:
+        prefix = os.path.join(resources_root, base)
+        for abs_base in iglob(prefix):
+            abs_glob = os.path.join(abs_base, suffix)
+            for abs_path in iglob(abs_glob):
+                resource_file = get_rel_path(resources_root, abs_path)
+                if dest is None:  # remove the entry if it was here
+                    destinations.pop(resource_file, None)
+                else:
+                    rel_path = get_rel_path(abs_base, abs_path)
+                    rel_dest = dest.replace(os.path.sep, '/').rstrip('/')
+                    destinations[resource_file] = rel_dest + '/' + rel_path
+    return destinations
+
+
+def in_venv():
+    if hasattr(sys, 'real_prefix'):
+        # virtualenv venvs
+        result = True
+    else:
+        # PEP 405 venvs
+        result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix)
+    return result
+
+
+def get_executable():
+# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as
+# changes to the stub launcher mean that sys.executable always points
+# to the stub on OS X
+#    if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__'
+#                                     in os.environ):
+#        result =  os.environ['__PYVENV_LAUNCHER__']
+#    else:
+#        result = sys.executable
+#    return result
+    result = os.path.normcase(sys.executable)
+    if not isinstance(result, text_type):
+        result = fsdecode(result)
+    return result
+
+
+def proceed(prompt, allowed_chars, error_prompt=None, default=None):
+    p = prompt
+    while True:
+        s = raw_input(p)
+        p = prompt
+        if not s and default:
+            s = default
+        if s:
+            c = s[0].lower()
+            if c in allowed_chars:
+                break
+            if error_prompt:
+                p = '%c: %s\n%s' % (c, error_prompt, prompt)
+    return c
+
+
+def extract_by_key(d, keys):
+    if isinstance(keys, string_types):
+        keys = keys.split()
+    result = {}
+    for key in keys:
+        if key in d:
+            result[key] = d[key]
+    return result
+
+def read_exports(stream):
+    if sys.version_info[0] >= 3:
+        # needs to be a text stream
+        stream = codecs.getreader('utf-8')(stream)
+    # Try to load as JSON, falling back on legacy format
+    data = stream.read()
+    stream = StringIO(data)
+    try:
+        jdata = json.load(stream)
+        result = jdata['extensions']['python.exports']['exports']
+        for group, entries in result.items():
+            for k, v in entries.items():
+                s = '%s = %s' % (k, v)
+                entry = get_export_entry(s)
+                assert entry is not None
+                entries[k] = entry
+        return result
+    except Exception:
+        stream.seek(0, 0)
+
+    def read_stream(cp, stream):
+        if hasattr(cp, 'read_file'):
+            cp.read_file(stream)
+        else:
+            cp.readfp(stream)
+
+    cp = configparser.ConfigParser()
+    try:
+        read_stream(cp, stream)
+    except configparser.MissingSectionHeaderError:
+        stream.close()
+        data = textwrap.dedent(data)
+        stream = StringIO(data)
+        read_stream(cp, stream)
+
+    result = {}
+    for key in cp.sections():
+        result[key] = entries = {}
+        for name, value in cp.items(key):
+            s = '%s = %s' % (name, value)
+            entry = get_export_entry(s)
+            assert entry is not None
+            #entry.dist = self
+            entries[name] = entry
+    return result
+
+
+def write_exports(exports, stream):
+    if sys.version_info[0] >= 3:
+        # needs to be a text stream
+        stream = codecs.getwriter('utf-8')(stream)
+    cp = configparser.ConfigParser()
+    for k, v in exports.items():
+        # TODO check k, v for valid values
+        cp.add_section(k)
+        for entry in v.values():
+            if entry.suffix is None:
+                s = entry.prefix
+            else:
+                s = '%s:%s' % (entry.prefix, entry.suffix)
+            if entry.flags:
+                s = '%s [%s]' % (s, ', '.join(entry.flags))
+            cp.set(k, entry.name, s)
+    cp.write(stream)
+
+
+@contextlib.contextmanager
+def tempdir():
+    td = tempfile.mkdtemp()
+    try:
+        yield td
+    finally:
+        shutil.rmtree(td)
+
+@contextlib.contextmanager
+def chdir(d):
+    cwd = os.getcwd()
+    try:
+        os.chdir(d)
+        yield
+    finally:
+        os.chdir(cwd)
+
+
+@contextlib.contextmanager
+def socket_timeout(seconds=15):
+    cto = socket.getdefaulttimeout()
+    try:
+        socket.setdefaulttimeout(seconds)
+        yield
+    finally:
+        socket.setdefaulttimeout(cto)
+
+
+class cached_property(object):
+    def __init__(self, func):
+        self.func = func
+        #for attr in ('__name__', '__module__', '__doc__'):
+        #    setattr(self, attr, getattr(func, attr, None))
+
+    def __get__(self, obj, cls=None):
+        if obj is None:
+            return self
+        value = self.func(obj)
+        object.__setattr__(obj, self.func.__name__, value)
+        #obj.__dict__[self.func.__name__] = value = self.func(obj)
+        return value
+
+def convert_path(pathname):
+    """Return 'pathname' as a name that will work on the native filesystem.
+
+    The path is split on '/' and put back together again using the current
+    directory separator.  Needed because filenames in the setup script are
+    always supplied in Unix style, and have to be converted to the local
+    convention before we can actually use them in the filesystem.  Raises
+    ValueError on non-Unix-ish systems if 'pathname' either starts or
+    ends with a slash.
+    """
+    if os.sep == '/':
+        return pathname
+    if not pathname:
+        return pathname
+    if pathname[0] == '/':
+        raise ValueError("path '%s' cannot be absolute" % pathname)
+    if pathname[-1] == '/':
+        raise ValueError("path '%s' cannot end with '/'" % pathname)
+
+    paths = pathname.split('/')
+    while os.curdir in paths:
+        paths.remove(os.curdir)
+    if not paths:
+        return os.curdir
+    return os.path.join(*paths)
+
+
+class FileOperator(object):
+    def __init__(self, dry_run=False):
+        self.dry_run = dry_run
+        self.ensured = set()
+        self._init_record()
+
+    def _init_record(self):
+        self.record = False
+        self.files_written = set()
+        self.dirs_created = set()
+
+    def record_as_written(self, path):
+        if self.record:
+            self.files_written.add(path)
+
+    def newer(self, source, target):
+        """Tell if the target is newer than the source.
+
+        Returns true if 'source' exists and is more recently modified than
+        'target', or if 'source' exists and 'target' doesn't.
+
+        Returns false if both exist and 'target' is the same age or younger
+        than 'source'. Raise PackagingFileError if 'source' does not exist.
+
+        Note that this test is not very accurate: files created in the same
+        second will have the same "age".
+        """
+        if not os.path.exists(source):
+            raise DistlibException("file '%r' does not exist" %
+                                   os.path.abspath(source))
+        if not os.path.exists(target):
+            return True
+
+        return os.stat(source).st_mtime > os.stat(target).st_mtime
+
+    def copy_file(self, infile, outfile, check=True):
+        """Copy a file respecting dry-run and force flags.
+        """
+        self.ensure_dir(os.path.dirname(outfile))
+        logger.info('Copying %s to %s', infile, outfile)
+        if not self.dry_run:
+            msg = None
+            if check:
+                if os.path.islink(outfile):
+                    msg = '%s is a symlink' % outfile
+                elif os.path.exists(outfile) and not os.path.isfile(outfile):
+                    msg = '%s is a non-regular file' % outfile
+            if msg:
+                raise ValueError(msg + ' which would be overwritten')
+            shutil.copyfile(infile, outfile)
+        self.record_as_written(outfile)
+
+    def copy_stream(self, instream, outfile, encoding=None):
+        assert not os.path.isdir(outfile)
+        self.ensure_dir(os.path.dirname(outfile))
+        logger.info('Copying stream %s to %s', instream, outfile)
+        if not self.dry_run:
+            if encoding is None:
+                outstream = open(outfile, 'wb')
+            else:
+                outstream = codecs.open(outfile, 'w', encoding=encoding)
+            try:
+                shutil.copyfileobj(instream, outstream)
+            finally:
+                outstream.close()
+        self.record_as_written(outfile)
+
+    def write_binary_file(self, path, data):
+        self.ensure_dir(os.path.dirname(path))
+        if not self.dry_run:
+            if os.path.exists(path):
+                os.remove(path)
+            with open(path, 'wb') as f:
+                f.write(data)
+        self.record_as_written(path)
+
+    def write_text_file(self, path, data, encoding):
+        self.write_binary_file(path, data.encode(encoding))
+
+    def set_mode(self, bits, mask, files):
+        if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'):
+            # Set the executable bits (owner, group, and world) on
+            # all the files specified.
+            for f in files:
+                if self.dry_run:
+                    logger.info("changing mode of %s", f)
+                else:
+                    mode = (os.stat(f).st_mode | bits) & mask
+                    logger.info("changing mode of %s to %o", f, mode)
+                    os.chmod(f, mode)
+
+    set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f)
+
+    def ensure_dir(self, path):
+        path = os.path.abspath(path)
+        if path not in self.ensured and not os.path.exists(path):
+            self.ensured.add(path)
+            d, f = os.path.split(path)
+            self.ensure_dir(d)
+            logger.info('Creating %s' % path)
+            if not self.dry_run:
+                os.mkdir(path)
+            if self.record:
+                self.dirs_created.add(path)
+
+    def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False):
+        dpath = cache_from_source(path, not optimize)
+        logger.info('Byte-compiling %s to %s', path, dpath)
+        if not self.dry_run:
+            if force or self.newer(path, dpath):
+                if not prefix:
+                    diagpath = None
+                else:
+                    assert path.startswith(prefix)
+                    diagpath = path[len(prefix):]
+            compile_kwargs = {}
+            if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'):
+                compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH
+            py_compile.compile(path, dpath, diagpath, True, **compile_kwargs)     # raise error
+        self.record_as_written(dpath)
+        return dpath
+
+    def ensure_removed(self, path):
+        if os.path.exists(path):
+            if os.path.isdir(path) and not os.path.islink(path):
+                logger.debug('Removing directory tree at %s', path)
+                if not self.dry_run:
+                    shutil.rmtree(path)
+                if self.record:
+                    if path in self.dirs_created:
+                        self.dirs_created.remove(path)
+            else:
+                if os.path.islink(path):
+                    s = 'link'
+                else:
+                    s = 'file'
+                logger.debug('Removing %s %s', s, path)
+                if not self.dry_run:
+                    os.remove(path)
+                if self.record:
+                    if path in self.files_written:
+                        self.files_written.remove(path)
+
+    def is_writable(self, path):
+        result = False
+        while not result:
+            if os.path.exists(path):
+                result = os.access(path, os.W_OK)
+                break
+            parent = os.path.dirname(path)
+            if parent == path:
+                break
+            path = parent
+        return result
+
+    def commit(self):
+        """
+        Commit recorded changes, turn off recording, return
+        changes.
+        """
+        assert self.record
+        result = self.files_written, self.dirs_created
+        self._init_record()
+        return result
+
+    def rollback(self):
+        if not self.dry_run:
+            for f in list(self.files_written):
+                if os.path.exists(f):
+                    os.remove(f)
+            # dirs should all be empty now, except perhaps for
+            # __pycache__ subdirs
+            # reverse so that subdirs appear before their parents
+            dirs = sorted(self.dirs_created, reverse=True)
+            for d in dirs:
+                flist = os.listdir(d)
+                if flist:
+                    assert flist == ['__pycache__']
+                    sd = os.path.join(d, flist[0])
+                    os.rmdir(sd)
+                os.rmdir(d)     # should fail if non-empty
+        self._init_record()
+
+def resolve(module_name, dotted_path):
+    if module_name in sys.modules:
+        mod = sys.modules[module_name]
+    else:
+        mod = __import__(module_name)
+    if dotted_path is None:
+        result = mod
+    else:
+        parts = dotted_path.split('.')
+        result = getattr(mod, parts.pop(0))
+        for p in parts:
+            result = getattr(result, p)
+    return result
+
+
+class ExportEntry(object):
+    def __init__(self, name, prefix, suffix, flags):
+        self.name = name
+        self.prefix = prefix
+        self.suffix = suffix
+        self.flags = flags
+
+    @cached_property
+    def value(self):
+        return resolve(self.prefix, self.suffix)
+
+    def __repr__(self):  # pragma: no cover
+        return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix,
+                                                self.suffix, self.flags)
+
+    def __eq__(self, other):
+        if not isinstance(other, ExportEntry):
+            result = False
+        else:
+            result = (self.name == other.name and
+                      self.prefix == other.prefix and
+                      self.suffix == other.suffix and
+                      self.flags == other.flags)
+        return result
+
+    __hash__ = object.__hash__
+
+
+ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+)
+                      \s*=\s*(?P<callable>(\w+)([:\.]\w+)*)
+                      \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])?
+                      ''', re.VERBOSE)
+
+def get_export_entry(specification):
+    m = ENTRY_RE.search(specification)
+    if not m:
+        result = None
+        if '[' in specification or ']' in specification:
+            raise DistlibException("Invalid specification "
+                                   "'%s'" % specification)
+    else:
+        d = m.groupdict()
+        name = d['name']
+        path = d['callable']
+        colons = path.count(':')
+        if colons == 0:
+            prefix, suffix = path, None
+        else:
+            if colons != 1:
+                raise DistlibException("Invalid specification "
+                                       "'%s'" % specification)
+            prefix, suffix = path.split(':')
+        flags = d['flags']
+        if flags is None:
+            if '[' in specification or ']' in specification:
+                raise DistlibException("Invalid specification "
+                                       "'%s'" % specification)
+            flags = []
+        else:
+            flags = [f.strip() for f in flags.split(',')]
+        result = ExportEntry(name, prefix, suffix, flags)
+    return result
+
+
+def get_cache_base(suffix=None):
+    """
+    Return the default base location for distlib caches. If the directory does
+    not exist, it is created. Use the suffix provided for the base directory,
+    and default to '.distlib' if it isn't provided.
+
+    On Windows, if LOCALAPPDATA is defined in the environment, then it is
+    assumed to be a directory, and will be the parent directory of the result.
+    On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home
+    directory - using os.expanduser('~') - will be the parent directory of
+    the result.
+
+    The result is just the directory '.distlib' in the parent directory as
+    determined above, or with the name specified with ``suffix``.
+    """
+    if suffix is None:
+        suffix = '.distlib'
+    if os.name == 'nt' and 'LOCALAPPDATA' in os.environ:
+        result = os.path.expandvars('$localappdata')
+    else:
+        # Assume posix, or old Windows
+        result = os.path.expanduser('~')
+    # we use 'isdir' instead of 'exists', because we want to
+    # fail if there's a file with that name
+    if os.path.isdir(result):
+        usable = os.access(result, os.W_OK)
+        if not usable:
+            logger.warning('Directory exists but is not writable: %s', result)
+    else:
+        try:
+            os.makedirs(result)
+            usable = True
+        except OSError:
+            logger.warning('Unable to create %s', result, exc_info=True)
+            usable = False
+    if not usable:
+        result = tempfile.mkdtemp()
+        logger.warning('Default location unusable, using %s', result)
+    return os.path.join(result, suffix)
+
+
+def path_to_cache_dir(path):
+    """
+    Convert an absolute path to a directory name for use in a cache.
+
+    The algorithm used is:
+
+    #. On Windows, any ``':'`` in the drive is replaced with ``'---'``.
+    #. Any occurrence of ``os.sep`` is replaced with ``'--'``.
+    #. ``'.cache'`` is appended.
+    """
+    d, p = os.path.splitdrive(os.path.abspath(path))
+    if d:
+        d = d.replace(':', '---')
+    p = p.replace(os.sep, '--')
+    return d + p + '.cache'
+
+
+def ensure_slash(s):
+    if not s.endswith('/'):
+        return s + '/'
+    return s
+
+
+def parse_credentials(netloc):
+    username = password = None
+    if '@' in netloc:
+        prefix, netloc = netloc.split('@', 1)
+        if ':' not in prefix:
+            username = prefix
+        else:
+            username, password = prefix.split(':', 1)
+    return username, password, netloc
+
+
+def get_process_umask():
+    result = os.umask(0o22)
+    os.umask(result)
+    return result
+
+def is_string_sequence(seq):
+    result = True
+    i = None
+    for i, s in enumerate(seq):
+        if not isinstance(s, string_types):
+            result = False
+            break
+    assert i is not None
+    return result
+
+PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-'
+                                      '([a-z0-9_.+-]+)', re.I)
+PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)')
+
+
+def split_filename(filename, project_name=None):
+    """
+    Extract name, version, python version from a filename (no extension)
+
+    Return name, version, pyver or None
+    """
+    result = None
+    pyver = None
+    filename = unquote(filename).replace(' ', '-')
+    m = PYTHON_VERSION.search(filename)
+    if m:
+        pyver = m.group(1)
+        filename = filename[:m.start()]
+    if project_name and len(filename) > len(project_name) + 1:
+        m = re.match(re.escape(project_name) + r'\b', filename)
+        if m:
+            n = m.end()
+            result = filename[:n], filename[n + 1:], pyver
+    if result is None:
+        m = PROJECT_NAME_AND_VERSION.match(filename)
+        if m:
+            result = m.group(1), m.group(3), pyver
+    return result
+
+# Allow spaces in name because of legacy dists like "Twisted Core"
+NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*'
+                             r'\(\s*(?P<ver>[^\s)]+)\)$')
+
+def parse_name_and_version(p):
+    """
+    A utility method used to get name and version from a string.
+
+    From e.g. a Provides-Dist value.
+
+    :param p: A value in a form 'foo (1.0)'
+    :return: The name and version as a tuple.
+    """
+    m = NAME_VERSION_RE.match(p)
+    if not m:
+        raise DistlibException('Ill-formed name/version string: \'%s\'' % p)
+    d = m.groupdict()
+    return d['name'].strip().lower(), d['ver']
+
+def get_extras(requested, available):
+    result = set()
+    requested = set(requested or [])
+    available = set(available or [])
+    if '*' in requested:
+        requested.remove('*')
+        result |= available
+    for r in requested:
+        if r == '-':
+            result.add(r)
+        elif r.startswith('-'):
+            unwanted = r[1:]
+            if unwanted not in available:
+                logger.warning('undeclared extra: %s' % unwanted)
+            if unwanted in result:
+                result.remove(unwanted)
+        else:
+            if r not in available:
+                logger.warning('undeclared extra: %s' % r)
+            result.add(r)
+    return result
+#
+# Extended metadata functionality
+#
+
+def _get_external_data(url):
+    result = {}
+    try:
+        # urlopen might fail if it runs into redirections,
+        # because of Python issue #13696. Fixed in locators
+        # using a custom redirect handler.
+        resp = urlopen(url)
+        headers = resp.info()
+        ct = headers.get('Content-Type')
+        if not ct.startswith('application/json'):
+            logger.debug('Unexpected response for JSON request: %s', ct)
+        else:
+            reader = codecs.getreader('utf-8')(resp)
+            #data = reader.read().decode('utf-8')
+            #result = json.loads(data)
+            result = json.load(reader)
+    except Exception as e:
+        logger.exception('Failed to get external data for %s: %s', url, e)
+    return result
+
+_external_data_base_url = 'https://www.red-dove.com/pypi/projects/'
+
+def get_project_data(name):
+    url = '%s/%s/project.json' % (name[0].upper(), name)
+    url = urljoin(_external_data_base_url, url)
+    result = _get_external_data(url)
+    return result
+
+def get_package_data(name, version):
+    url = '%s/%s/package-%s.json' % (name[0].upper(), name, version)
+    url = urljoin(_external_data_base_url, url)
+    return _get_external_data(url)
+
+
+class Cache(object):
+    """
+    A class implementing a cache for resources that need to live in the file system
+    e.g. shared libraries. This class was moved from resources to here because it
+    could be used by other modules, e.g. the wheel module.
+    """
+
+    def __init__(self, base):
+        """
+        Initialise an instance.
+
+        :param base: The base directory where the cache should be located.
+        """
+        # we use 'isdir' instead of 'exists', because we want to
+        # fail if there's a file with that name
+        if not os.path.isdir(base):  # pragma: no cover
+            os.makedirs(base)
+        if (os.stat(base).st_mode & 0o77) != 0:
+            logger.warning('Directory \'%s\' is not private', base)
+        self.base = os.path.abspath(os.path.normpath(base))
+
+    def prefix_to_dir(self, prefix):
+        """
+        Converts a resource prefix to a directory name in the cache.
+        """
+        return path_to_cache_dir(prefix)
+
+    def clear(self):
+        """
+        Clear the cache.
+        """
+        not_removed = []
+        for fn in os.listdir(self.base):
+            fn = os.path.join(self.base, fn)
+            try:
+                if os.path.islink(fn) or os.path.isfile(fn):
+                    os.remove(fn)
+                elif os.path.isdir(fn):
+                    shutil.rmtree(fn)
+            except Exception:
+                not_removed.append(fn)
+        return not_removed
+
+
+class EventMixin(object):
+    """
+    A very simple publish/subscribe system.
+    """
+    def __init__(self):
+        self._subscribers = {}
+
+    def add(self, event, subscriber, append=True):
+        """
+        Add a subscriber for an event.
+
+        :param event: The name of an event.
+        :param subscriber: The subscriber to be added (and called when the
+                           event is published).
+        :param append: Whether to append or prepend the subscriber to an
+                       existing subscriber list for the event.
+        """
+        subs = self._subscribers
+        if event not in subs:
+            subs[event] = deque([subscriber])
+        else:
+            sq = subs[event]
+            if append:
+                sq.append(subscriber)
+            else:
+                sq.appendleft(subscriber)
+
+    def remove(self, event, subscriber):
+        """
+        Remove a subscriber for an event.
+
+        :param event: The name of an event.
+        :param subscriber: The subscriber to be removed.
+        """
+        subs = self._subscribers
+        if event not in subs:
+            raise ValueError('No subscribers: %r' % event)
+        subs[event].remove(subscriber)
+
+    def get_subscribers(self, event):
+        """
+        Return an iterator for the subscribers for an event.
+        :param event: The event to return subscribers for.
+        """
+        return iter(self._subscribers.get(event, ()))
+
+    def publish(self, event, *args, **kwargs):
+        """
+        Publish a event and return a list of values returned by its
+        subscribers.
+
+        :param event: The event to publish.
+        :param args: The positional arguments to pass to the event's
+                     subscribers.
+        :param kwargs: The keyword arguments to pass to the event's
+                       subscribers.
+        """
+        result = []
+        for subscriber in self.get_subscribers(event):
+            try:
+                value = subscriber(event, *args, **kwargs)
+            except Exception:
+                logger.exception('Exception during event publication')
+                value = None
+            result.append(value)
+        logger.debug('publish %s: args = %s, kwargs = %s, result = %s',
+                     event, args, kwargs, result)
+        return result
+
+#
+# Simple sequencing
+#
+class Sequencer(object):
+    def __init__(self):
+        self._preds = {}
+        self._succs = {}
+        self._nodes = set()     # nodes with no preds/succs
+
+    def add_node(self, node):
+        self._nodes.add(node)
+
+    def remove_node(self, node, edges=False):
+        if node in self._nodes:
+            self._nodes.remove(node)
+        if edges:
+            for p in set(self._preds.get(node, ())):
+                self.remove(p, node)
+            for s in set(self._succs.get(node, ())):
+                self.remove(node, s)
+            # Remove empties
+            for k, v in list(self._preds.items()):
+                if not v:
+                    del self._preds[k]
+            for k, v in list(self._succs.items()):
+                if not v:
+                    del self._succs[k]
+
+    def add(self, pred, succ):
+        assert pred != succ
+        self._preds.setdefault(succ, set()).add(pred)
+        self._succs.setdefault(pred, set()).add(succ)
+
+    def remove(self, pred, succ):
+        assert pred != succ
+        try:
+            preds = self._preds[succ]
+            succs = self._succs[pred]
+        except KeyError:  # pragma: no cover
+            raise ValueError('%r not a successor of anything' % succ)
+        try:
+            preds.remove(pred)
+            succs.remove(succ)
+        except KeyError:  # pragma: no cover
+            raise ValueError('%r not a successor of %r' % (succ, pred))
+
+    def is_step(self, step):
+        return (step in self._preds or step in self._succs or
+                step in self._nodes)
+
+    def get_steps(self, final):
+        if not self.is_step(final):
+            raise ValueError('Unknown: %r' % final)
+        result = []
+        todo = []
+        seen = set()
+        todo.append(final)
+        while todo:
+            step = todo.pop(0)
+            if step in seen:
+                # if a step was already seen,
+                # move it to the end (so it will appear earlier
+                # when reversed on return) ... but not for the
+                # final step, as that would be confusing for
+                # users
+                if step != final:
+                    result.remove(step)
+                    result.append(step)
+            else:
+                seen.add(step)
+                result.append(step)
+                preds = self._preds.get(step, ())
+                todo.extend(preds)
+        return reversed(result)
+
+    @property
+    def strong_connections(self):
+        #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+        index_counter = [0]
+        stack = []
+        lowlinks = {}
+        index = {}
+        result = []
+
+        graph = self._succs
+
+        def strongconnect(node):
+            # set the depth index for this node to the smallest unused index
+            index[node] = index_counter[0]
+            lowlinks[node] = index_counter[0]
+            index_counter[0] += 1
+            stack.append(node)
+
+            # Consider successors
+            try:
+                successors = graph[node]
+            except Exception:
+                successors = []
+            for successor in successors:
+                if successor not in lowlinks:
+                    # Successor has not yet been visited
+                    strongconnect(successor)
+                    lowlinks[node] = min(lowlinks[node],lowlinks[successor])
+                elif successor in stack:
+                    # the successor is in the stack and hence in the current
+                    # strongly connected component (SCC)
+                    lowlinks[node] = min(lowlinks[node],index[successor])
+
+            # If `node` is a root node, pop the stack and generate an SCC
+            if lowlinks[node] == index[node]:
+                connected_component = []
+
+                while True:
+                    successor = stack.pop()
+                    connected_component.append(successor)
+                    if successor == node: break
+                component = tuple(connected_component)
+                # storing the result
+                result.append(component)
+
+        for node in graph:
+            if node not in lowlinks:
+                strongconnect(node)
+
+        return result
+
+    @property
+    def dot(self):
+        result = ['digraph G {']
+        for succ in self._preds:
+            preds = self._preds[succ]
+            for pred in preds:
+                result.append('  %s -> %s;' % (pred, succ))
+        for node in self._nodes:
+            result.append('  %s;' % node)
+        result.append('}')
+        return '\n'.join(result)
+
+#
+# Unarchiving functionality for zip, tar, tgz, tbz, whl
+#
+
+ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip',
+                      '.tgz', '.tbz', '.whl')
+
+def unarchive(archive_filename, dest_dir, format=None, check=True):
+
+    def check_path(path):
+        if not isinstance(path, text_type):
+            path = path.decode('utf-8')
+        p = os.path.abspath(os.path.join(dest_dir, path))
+        if not p.startswith(dest_dir) or p[plen] != os.sep:
+            raise ValueError('path outside destination: %r' % p)
+
+    dest_dir = os.path.abspath(dest_dir)
+    plen = len(dest_dir)
+    archive = None
+    if format is None:
+        if archive_filename.endswith(('.zip', '.whl')):
+            format = 'zip'
+        elif archive_filename.endswith(('.tar.gz', '.tgz')):
+            format = 'tgz'
+            mode = 'r:gz'
+        elif archive_filename.endswith(('.tar.bz2', '.tbz')):
+            format = 'tbz'
+            mode = 'r:bz2'
+        elif archive_filename.endswith('.tar'):
+            format = 'tar'
+            mode = 'r'
+        else:  # pragma: no cover
+            raise ValueError('Unknown format for %r' % archive_filename)
+    try:
+        if format == 'zip':
+            archive = ZipFile(archive_filename, 'r')
+            if check:
+                names = archive.namelist()
+                for name in names:
+                    check_path(name)
+        else:
+            archive = tarfile.open(archive_filename, mode)
+            if check:
+                names = archive.getnames()
+                for name in names:
+                    check_path(name)
+        if format != 'zip' and sys.version_info[0] < 3:
+            # See Python issue 17153. If the dest path contains Unicode,
+            # tarfile extraction fails on Python 2.x if a member path name
+            # contains non-ASCII characters - it leads to an implicit
+            # bytes -> unicode conversion using ASCII to decode.
+            for tarinfo in archive.getmembers():
+                if not isinstance(tarinfo.name, text_type):
+                    tarinfo.name = tarinfo.name.decode('utf-8')
+        archive.extractall(dest_dir)
+
+    finally:
+        if archive:
+            archive.close()
+
+
+def zip_dir(directory):
+    """zip a directory tree into a BytesIO object"""
+    result = io.BytesIO()
+    dlen = len(directory)
+    with ZipFile(result, "w") as zf:
+        for root, dirs, files in os.walk(directory):
+            for name in files:
+                full = os.path.join(root, name)
+                rel = root[dlen:]
+                dest = os.path.join(rel, name)
+                zf.write(full, dest)
+    return result
+
+#
+# Simple progress bar
+#
+
+UNITS = ('', 'K', 'M', 'G','T','P')
+
+
+class Progress(object):
+    unknown = 'UNKNOWN'
+
+    def __init__(self, minval=0, maxval=100):
+        assert maxval is None or maxval >= minval
+        self.min = self.cur = minval
+        self.max = maxval
+        self.started = None
+        self.elapsed = 0
+        self.done = False
+
+    def update(self, curval):
+        assert self.min <= curval
+        assert self.max is None or curval <= self.max
+        self.cur = curval
+        now = time.time()
+        if self.started is None:
+            self.started = now
+        else:
+            self.elapsed = now - self.started
+
+    def increment(self, incr):
+        assert incr >= 0
+        self.update(self.cur + incr)
+
+    def start(self):
+        self.update(self.min)
+        return self
+
+    def stop(self):
+        if self.max is not None:
+            self.update(self.max)
+        self.done = True
+
+    @property
+    def maximum(self):
+        return self.unknown if self.max is None else self.max
+
+    @property
+    def percentage(self):
+        if self.done:
+            result = '100 %'
+        elif self.max is None:
+            result = ' ?? %'
+        else:
+            v = 100.0 * (self.cur - self.min) / (self.max - self.min)
+            result = '%3d %%' % v
+        return result
+
+    def format_duration(self, duration):
+        if (duration <= 0) and self.max is None or self.cur == self.min:
+            result = '??:??:??'
+        #elif duration < 1:
+        #    result = '--:--:--'
+        else:
+            result = time.strftime('%H:%M:%S', time.gmtime(duration))
+        return result
+
+    @property
+    def ETA(self):
+        if self.done:
+            prefix = 'Done'
+            t = self.elapsed
+            #import pdb; pdb.set_trace()
+        else:
+            prefix = 'ETA '
+            if self.max is None:
+                t = -1
+            elif self.elapsed == 0 or (self.cur == self.min):
+                t = 0
+            else:
+                #import pdb; pdb.set_trace()
+                t = float(self.max - self.min)
+                t /= self.cur - self.min
+                t = (t - 1) * self.elapsed
+        return '%s: %s' % (prefix, self.format_duration(t))
+
+    @property
+    def speed(self):
+        if self.elapsed == 0:
+            result = 0.0
+        else:
+            result = (self.cur - self.min) / self.elapsed
+        for unit in UNITS:
+            if result < 1000:
+                break
+            result /= 1000.0
+        return '%d %sB/s' % (result, unit)
+
+#
+# Glob functionality
+#
+
+RICH_GLOB = re.compile(r'\{([^}]*)\}')
+_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]')
+_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$')
+
+
+def iglob(path_glob):
+    """Extended globbing function that supports ** and {opt1,opt2,opt3}."""
+    if _CHECK_RECURSIVE_GLOB.search(path_glob):
+        msg = """invalid glob %r: recursive glob "**" must be used alone"""
+        raise ValueError(msg % path_glob)
+    if _CHECK_MISMATCH_SET.search(path_glob):
+        msg = """invalid glob %r: mismatching set marker '{' or '}'"""
+        raise ValueError(msg % path_glob)
+    return _iglob(path_glob)
+
+
+def _iglob(path_glob):
+    rich_path_glob = RICH_GLOB.split(path_glob, 1)
+    if len(rich_path_glob) > 1:
+        assert len(rich_path_glob) == 3, rich_path_glob
+        prefix, set, suffix = rich_path_glob
+        for item in set.split(','):
+            for path in _iglob(''.join((prefix, item, suffix))):
+                yield path
+    else:
+        if '**' not in path_glob:
+            for item in std_iglob(path_glob):
+                yield item
+        else:
+            prefix, radical = path_glob.split('**', 1)
+            if prefix == '':
+                prefix = '.'
+            if radical == '':
+                radical = '*'
+            else:
+                # we support both
+                radical = radical.lstrip('/')
+                radical = radical.lstrip('\\')
+            for path, dir, files in os.walk(prefix):
+                path = os.path.normpath(path)
+                for fn in _iglob(os.path.join(path, radical)):
+                    yield fn
+
+if ssl:
+    from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname,
+                         CertificateError)
+
+
+#
+# HTTPSConnection which verifies certificates/matches domains
+#
+
+    class HTTPSConnection(httplib.HTTPSConnection):
+        ca_certs = None # set this to the path to the certs file (.pem)
+        check_domain = True # only used if ca_certs is not None
+
+        # noinspection PyPropertyAccess
+        def connect(self):
+            sock = socket.create_connection((self.host, self.port), self.timeout)
+            if getattr(self, '_tunnel_host', False):
+                self.sock = sock
+                self._tunnel()
+
+            if not hasattr(ssl, 'SSLContext'):
+                # For 2.x
+                if self.ca_certs:
+                    cert_reqs = ssl.CERT_REQUIRED
+                else:
+                    cert_reqs = ssl.CERT_NONE
+                self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
+                                            cert_reqs=cert_reqs,
+                                            ssl_version=ssl.PROTOCOL_SSLv23,
+                                            ca_certs=self.ca_certs)
+            else:  # pragma: no cover
+                context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+                context.options |= ssl.OP_NO_SSLv2
+                if self.cert_file:
+                    context.load_cert_chain(self.cert_file, self.key_file)
+                kwargs = {}
+                if self.ca_certs:
+                    context.verify_mode = ssl.CERT_REQUIRED
+                    context.load_verify_locations(cafile=self.ca_certs)
+                    if getattr(ssl, 'HAS_SNI', False):
+                        kwargs['server_hostname'] = self.host
+                self.sock = context.wrap_socket(sock, **kwargs)
+            if self.ca_certs and self.check_domain:
+                try:
+                    match_hostname(self.sock.getpeercert(), self.host)
+                    logger.debug('Host verified: %s', self.host)
+                except CertificateError:  # pragma: no cover
+                    self.sock.shutdown(socket.SHUT_RDWR)
+                    self.sock.close()
+                    raise
+
+    class HTTPSHandler(BaseHTTPSHandler):
+        def __init__(self, ca_certs, check_domain=True):
+            BaseHTTPSHandler.__init__(self)
+            self.ca_certs = ca_certs
+            self.check_domain = check_domain
+
+        def _conn_maker(self, *args, **kwargs):
+            """
+            This is called to create a connection instance. Normally you'd
+            pass a connection class to do_open, but it doesn't actually check for
+            a class, and just expects a callable. As long as we behave just as a
+            constructor would have, we should be OK. If it ever changes so that
+            we *must* pass a class, we'll create an UnsafeHTTPSConnection class
+            which just sets check_domain to False in the class definition, and
+            choose which one to pass to do_open.
+            """
+            result = HTTPSConnection(*args, **kwargs)
+            if self.ca_certs:
+                result.ca_certs = self.ca_certs
+                result.check_domain = self.check_domain
+            return result
+
+        def https_open(self, req):
+            try:
+                return self.do_open(self._conn_maker, req)
+            except URLError as e:
+                if 'certificate verify failed' in str(e.reason):
+                    raise CertificateError('Unable to verify server certificate '
+                                           'for %s' % req.host)
+                else:
+                    raise
+
+    #
+    # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The-
+    # Middle proxy using HTTP listens on port 443, or an index mistakenly serves
+    # HTML containing a http://xyz link when it should be https://xyz),
+    # you can use the following handler class, which does not allow HTTP traffic.
+    #
+    # It works by inheriting from HTTPHandler - so build_opener won't add a
+    # handler for HTTP itself.
+    #
+    class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler):
+        def http_open(self, req):
+            raise URLError('Unexpected HTTP request on what should be a secure '
+                           'connection: %s' % req)
+
+#
+# XML-RPC with timeouts
+#
+
+_ver_info = sys.version_info[:2]
+
+if _ver_info == (2, 6):
+    class HTTP(httplib.HTTP):
+        def __init__(self, host='', port=None, **kwargs):
+            if port == 0:   # 0 means use port 0, not the default port
+                port = None
+            self._setup(self._connection_class(host, port, **kwargs))
+
+
+    if ssl:
+        class HTTPS(httplib.HTTPS):
+            def __init__(self, host='', port=None, **kwargs):
+                if port == 0:   # 0 means use port 0, not the default port
+                    port = None
+                self._setup(self._connection_class(host, port, **kwargs))
+
+
+class Transport(xmlrpclib.Transport):
+    def __init__(self, timeout, use_datetime=0):
+        self.timeout = timeout
+        xmlrpclib.Transport.__init__(self, use_datetime)
+
+    def make_connection(self, host):
+        h, eh, x509 = self.get_host_info(host)
+        if _ver_info == (2, 6):
+            result = HTTP(h, timeout=self.timeout)
+        else:
+            if not self._connection or host != self._connection[0]:
+                self._extra_headers = eh
+                self._connection = host, httplib.HTTPConnection(h)
+            result = self._connection[1]
+        return result
+
+if ssl:
+    class SafeTransport(xmlrpclib.SafeTransport):
+        def __init__(self, timeout, use_datetime=0):
+            self.timeout = timeout
+            xmlrpclib.SafeTransport.__init__(self, use_datetime)
+
+        def make_connection(self, host):
+            h, eh, kwargs = self.get_host_info(host)
+            if not kwargs:
+                kwargs = {}
+            kwargs['timeout'] = self.timeout
+            if _ver_info == (2, 6):
+                result = HTTPS(host, None, **kwargs)
+            else:
+                if not self._connection or host != self._connection[0]:
+                    self._extra_headers = eh
+                    self._connection = host, httplib.HTTPSConnection(h, None,
+                                                                     **kwargs)
+                result = self._connection[1]
+            return result
+
+
+class ServerProxy(xmlrpclib.ServerProxy):
+    def __init__(self, uri, **kwargs):
+        self.timeout = timeout = kwargs.pop('timeout', None)
+        # The above classes only come into play if a timeout
+        # is specified
+        if timeout is not None:
+            scheme, _ = splittype(uri)
+            use_datetime = kwargs.get('use_datetime', 0)
+            if scheme == 'https':
+                tcls = SafeTransport
+            else:
+                tcls = Transport
+            kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime)
+            self.transport = t
+        xmlrpclib.ServerProxy.__init__(self, uri, **kwargs)
+
+#
+# CSV functionality. This is provided because on 2.x, the csv module can't
+# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files.
+#
+
+def _csv_open(fn, mode, **kwargs):
+    if sys.version_info[0] < 3:
+        mode += 'b'
+    else:
+        kwargs['newline'] = ''
+        # Python 3 determines encoding from locale. Force 'utf-8'
+        # file encoding to match other forced utf-8 encoding
+        kwargs['encoding'] = 'utf-8'
+    return open(fn, mode, **kwargs)
+
+
+class CSVBase(object):
+    defaults = {
+        'delimiter': str(','),      # The strs are used because we need native
+        'quotechar': str('"'),      # str in the csv API (2.x won't take
+        'lineterminator': str('\n') # Unicode)
+    }
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *exc_info):
+        self.stream.close()
+
+
+class CSVReader(CSVBase):
+    def __init__(self, **kwargs):
+        if 'stream' in kwargs:
+            stream = kwargs['stream']
+            if sys.version_info[0] >= 3:
+                # needs to be a text stream
+                stream = codecs.getreader('utf-8')(stream)
+            self.stream = stream
+        else:
+            self.stream = _csv_open(kwargs['path'], 'r')
+        self.reader = csv.reader(self.stream, **self.defaults)
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        result = next(self.reader)
+        if sys.version_info[0] < 3:
+            for i, item in enumerate(result):
+                if not isinstance(item, text_type):
+                    result[i] = item.decode('utf-8')
+        return result
+
+    __next__ = next
+
+class CSVWriter(CSVBase):
+    def __init__(self, fn, **kwargs):
+        self.stream = _csv_open(fn, 'w')
+        self.writer = csv.writer(self.stream, **self.defaults)
+
+    def writerow(self, row):
+        if sys.version_info[0] < 3:
+            r = []
+            for item in row:
+                if isinstance(item, text_type):
+                    item = item.encode('utf-8')
+                r.append(item)
+            row = r
+        self.writer.writerow(row)
+
+#
+#   Configurator functionality
+#
+
+class Configurator(BaseConfigurator):
+
+    value_converters = dict(BaseConfigurator.value_converters)
+    value_converters['inc'] = 'inc_convert'
+
+    def __init__(self, config, base=None):
+        super(Configurator, self).__init__(config)
+        self.base = base or os.getcwd()
+
+    def configure_custom(self, config):
+        def convert(o):
+            if isinstance(o, (list, tuple)):
+                result = type(o)([convert(i) for i in o])
+            elif isinstance(o, dict):
+                if '()' in o:
+                    result = self.configure_custom(o)
+                else:
+                    result = {}
+                    for k in o:
+                        result[k] = convert(o[k])
+            else:
+                result = self.convert(o)
+            return result
+
+        c = config.pop('()')
+        if not callable(c):
+            c = self.resolve(c)
+        props = config.pop('.', None)
+        # Check for valid identifiers
+        args = config.pop('[]', ())
+        if args:
+            args = tuple([convert(o) for o in args])
+        items = [(k, convert(config[k])) for k in config if valid_ident(k)]
+        kwargs = dict(items)
+        result = c(*args, **kwargs)
+        if props:
+            for n, v in props.items():
+                setattr(result, n, convert(v))
+        return result
+
+    def __getitem__(self, key):
+        result = self.config[key]
+        if isinstance(result, dict) and '()' in result:
+            self.config[key] = result = self.configure_custom(result)
+        return result
+
+    def inc_convert(self, value):
+        """Default converter for the inc:// protocol."""
+        if not os.path.isabs(value):
+            value = os.path.join(self.base, value)
+        with codecs.open(value, 'r', encoding='utf-8') as f:
+            result = json.load(f)
+        return result
+
+
+class SubprocessMixin(object):
+    """
+    Mixin for running subprocesses and capturing their output
+    """
+    def __init__(self, verbose=False, progress=None):
+        self.verbose = verbose
+        self.progress = progress
+
+    def reader(self, stream, context):
+        """
+        Read lines from a subprocess' output stream and either pass to a progress
+        callable (if specified) or write progress information to sys.stderr.
+        """
+        progress = self.progress
+        verbose = self.verbose
+        while True:
+            s = stream.readline()
+            if not s:
+                break
+            if progress is not None:
+                progress(s, context)
+            else:
+                if not verbose:
+                    sys.stderr.write('.')
+                else:
+                    sys.stderr.write(s.decode('utf-8'))
+                sys.stderr.flush()
+        stream.close()
+
+    def run_command(self, cmd, **kwargs):
+        p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE, **kwargs)
+        t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
+        t1.start()
+        t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr'))
+        t2.start()
+        p.wait()
+        t1.join()
+        t2.join()
+        if self.progress is not None:
+            self.progress('done.', 'main')
+        elif self.verbose:
+            sys.stderr.write('done.\n')
+        return p
+
+
+def normalize_name(name):
+    """Normalize a python package name a la PEP 503"""
+    # https://www.python.org/dev/peps/pep-0503/#normalized-names
+    return re.sub('[-_.]+', '-', name).lower()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5b2ae9e514bb50e1fcb1270336697f6b4d32cdb5
GIT binary patch
literal 67805
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%0A<<mLP-Xe5^iuCZzE_L9@GQo
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
YB?Z_RWke-KIl0C7#3aRp#mvR@0Iqh*%>V!Z

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py
new file mode 100644
index 00000000..3eebe18e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py
@@ -0,0 +1,736 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012-2017 The Python Software Foundation.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+"""
+Implementation of a flexible versioning scheme providing support for PEP-440,
+setuptools-compatible and semantic versioning.
+"""
+
+import logging
+import re
+
+from .compat import string_types
+from .util import parse_requirement
+
+__all__ = ['NormalizedVersion', 'NormalizedMatcher',
+           'LegacyVersion', 'LegacyMatcher',
+           'SemanticVersion', 'SemanticMatcher',
+           'UnsupportedVersionError', 'get_scheme']
+
+logger = logging.getLogger(__name__)
+
+
+class UnsupportedVersionError(ValueError):
+    """This is an unsupported version."""
+    pass
+
+
+class Version(object):
+    def __init__(self, s):
+        self._string = s = s.strip()
+        self._parts = parts = self.parse(s)
+        assert isinstance(parts, tuple)
+        assert len(parts) > 0
+
+    def parse(self, s):
+        raise NotImplementedError('please implement in a subclass')
+
+    def _check_compatible(self, other):
+        if type(self) != type(other):
+            raise TypeError('cannot compare %r and %r' % (self, other))
+
+    def __eq__(self, other):
+        self._check_compatible(other)
+        return self._parts == other._parts
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __lt__(self, other):
+        self._check_compatible(other)
+        return self._parts < other._parts
+
+    def __gt__(self, other):
+        return not (self.__lt__(other) or self.__eq__(other))
+
+    def __le__(self, other):
+        return self.__lt__(other) or self.__eq__(other)
+
+    def __ge__(self, other):
+        return self.__gt__(other) or self.__eq__(other)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    def __hash__(self):
+        return hash(self._parts)
+
+    def __repr__(self):
+        return "%s('%s')" % (self.__class__.__name__, self._string)
+
+    def __str__(self):
+        return self._string
+
+    @property
+    def is_prerelease(self):
+        raise NotImplementedError('Please implement in subclasses.')
+
+
+class Matcher(object):
+    version_class = None
+
+    # value is either a callable or the name of a method
+    _operators = {
+        '<': lambda v, c, p: v < c,
+        '>': lambda v, c, p: v > c,
+        '<=': lambda v, c, p: v == c or v < c,
+        '>=': lambda v, c, p: v == c or v > c,
+        '==': lambda v, c, p: v == c,
+        '===': lambda v, c, p: v == c,
+        # by default, compatible => >=.
+        '~=': lambda v, c, p: v == c or v > c,
+        '!=': lambda v, c, p: v != c,
+    }
+
+    # this is a method only to support alternative implementations
+    # via overriding
+    def parse_requirement(self, s):
+        return parse_requirement(s)
+
+    def __init__(self, s):
+        if self.version_class is None:
+            raise ValueError('Please specify a version class')
+        self._string = s = s.strip()
+        r = self.parse_requirement(s)
+        if not r:
+            raise ValueError('Not valid: %r' % s)
+        self.name = r.name
+        self.key = self.name.lower()    # for case-insensitive comparisons
+        clist = []
+        if r.constraints:
+            # import pdb; pdb.set_trace()
+            for op, s in r.constraints:
+                if s.endswith('.*'):
+                    if op not in ('==', '!='):
+                        raise ValueError('\'.*\' not allowed for '
+                                         '%r constraints' % op)
+                    # Could be a partial version (e.g. for '2.*') which
+                    # won't parse as a version, so keep it as a string
+                    vn, prefix = s[:-2], True
+                    # Just to check that vn is a valid version
+                    self.version_class(vn)
+                else:
+                    # Should parse as a version, so we can create an
+                    # instance for the comparison
+                    vn, prefix = self.version_class(s), False
+                clist.append((op, vn, prefix))
+        self._parts = tuple(clist)
+
+    def match(self, version):
+        """
+        Check if the provided version matches the constraints.
+
+        :param version: The version to match against this instance.
+        :type version: String or :class:`Version` instance.
+        """
+        if isinstance(version, string_types):
+            version = self.version_class(version)
+        for operator, constraint, prefix in self._parts:
+            f = self._operators.get(operator)
+            if isinstance(f, string_types):
+                f = getattr(self, f)
+            if not f:
+                msg = ('%r not implemented '
+                       'for %s' % (operator, self.__class__.__name__))
+                raise NotImplementedError(msg)
+            if not f(version, constraint, prefix):
+                return False
+        return True
+
+    @property
+    def exact_version(self):
+        result = None
+        if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='):
+            result = self._parts[0][1]
+        return result
+
+    def _check_compatible(self, other):
+        if type(self) != type(other) or self.name != other.name:
+            raise TypeError('cannot compare %s and %s' % (self, other))
+
+    def __eq__(self, other):
+        self._check_compatible(other)
+        return self.key == other.key and self._parts == other._parts
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    # See http://docs.python.org/reference/datamodel#object.__hash__
+    def __hash__(self):
+        return hash(self.key) + hash(self._parts)
+
+    def __repr__(self):
+        return "%s(%r)" % (self.__class__.__name__, self._string)
+
+    def __str__(self):
+        return self._string
+
+
+PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?'
+                               r'(\.(post)(\d+))?(\.(dev)(\d+))?'
+                               r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$')
+
+
+def _pep_440_key(s):
+    s = s.strip()
+    m = PEP440_VERSION_RE.match(s)
+    if not m:
+        raise UnsupportedVersionError('Not a valid version: %s' % s)
+    groups = m.groups()
+    nums = tuple(int(v) for v in groups[1].split('.'))
+    while len(nums) > 1 and nums[-1] == 0:
+        nums = nums[:-1]
+
+    if not groups[0]:
+        epoch = 0
+    else:
+        epoch = int(groups[0])
+    pre = groups[4:6]
+    post = groups[7:9]
+    dev = groups[10:12]
+    local = groups[13]
+    if pre == (None, None):
+        pre = ()
+    else:
+        pre = pre[0], int(pre[1])
+    if post == (None, None):
+        post = ()
+    else:
+        post = post[0], int(post[1])
+    if dev == (None, None):
+        dev = ()
+    else:
+        dev = dev[0], int(dev[1])
+    if local is None:
+        local = ()
+    else:
+        parts = []
+        for part in local.split('.'):
+            # to ensure that numeric compares as > lexicographic, avoid
+            # comparing them directly, but encode a tuple which ensures
+            # correct sorting
+            if part.isdigit():
+                part = (1, int(part))
+            else:
+                part = (0, part)
+            parts.append(part)
+        local = tuple(parts)
+    if not pre:
+        # either before pre-release, or final release and after
+        if not post and dev:
+            # before pre-release
+            pre = ('a', -1)     # to sort before a0
+        else:
+            pre = ('z',)        # to sort after all pre-releases
+    # now look at the state of post and dev.
+    if not post:
+        post = ('_',)   # sort before 'a'
+    if not dev:
+        dev = ('final',)
+
+    #print('%s -> %s' % (s, m.groups()))
+    return epoch, nums, pre, post, dev, local
+
+
+_normalized_key = _pep_440_key
+
+
+class NormalizedVersion(Version):
+    """A rational version.
+
+    Good:
+        1.2         # equivalent to "1.2.0"
+        1.2.0
+        1.2a1
+        1.2.3a2
+        1.2.3b1
+        1.2.3c1
+        1.2.3.4
+        TODO: fill this out
+
+    Bad:
+        1           # minimum two numbers
+        1.2a        # release level must have a release serial
+        1.2.3b
+    """
+    def parse(self, s):
+        result = _normalized_key(s)
+        # _normalized_key loses trailing zeroes in the release
+        # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0
+        # However, PEP 440 prefix matching needs it: for example,
+        # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0).
+        m = PEP440_VERSION_RE.match(s)      # must succeed
+        groups = m.groups()
+        self._release_clause = tuple(int(v) for v in groups[1].split('.'))
+        return result
+
+    PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev'])
+
+    @property
+    def is_prerelease(self):
+        return any(t[0] in self.PREREL_TAGS for t in self._parts if t)
+
+
+def _match_prefix(x, y):
+    x = str(x)
+    y = str(y)
+    if x == y:
+        return True
+    if not x.startswith(y):
+        return False
+    n = len(y)
+    return x[n] == '.'
+
+
+class NormalizedMatcher(Matcher):
+    version_class = NormalizedVersion
+
+    # value is either a callable or the name of a method
+    _operators = {
+        '~=': '_match_compatible',
+        '<': '_match_lt',
+        '>': '_match_gt',
+        '<=': '_match_le',
+        '>=': '_match_ge',
+        '==': '_match_eq',
+        '===': '_match_arbitrary',
+        '!=': '_match_ne',
+    }
+
+    def _adjust_local(self, version, constraint, prefix):
+        if prefix:
+            strip_local = '+' not in constraint and version._parts[-1]
+        else:
+            # both constraint and version are
+            # NormalizedVersion instances.
+            # If constraint does not have a local component,
+            # ensure the version doesn't, either.
+            strip_local = not constraint._parts[-1] and version._parts[-1]
+        if strip_local:
+            s = version._string.split('+', 1)[0]
+            version = self.version_class(s)
+        return version, constraint
+
+    def _match_lt(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if version >= constraint:
+            return False
+        release_clause = constraint._release_clause
+        pfx = '.'.join([str(i) for i in release_clause])
+        return not _match_prefix(version, pfx)
+
+    def _match_gt(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if version <= constraint:
+            return False
+        release_clause = constraint._release_clause
+        pfx = '.'.join([str(i) for i in release_clause])
+        return not _match_prefix(version, pfx)
+
+    def _match_le(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        return version <= constraint
+
+    def _match_ge(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        return version >= constraint
+
+    def _match_eq(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if not prefix:
+            result = (version == constraint)
+        else:
+            result = _match_prefix(version, constraint)
+        return result
+
+    def _match_arbitrary(self, version, constraint, prefix):
+        return str(version) == str(constraint)
+
+    def _match_ne(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if not prefix:
+            result = (version != constraint)
+        else:
+            result = not _match_prefix(version, constraint)
+        return result
+
+    def _match_compatible(self, version, constraint, prefix):
+        version, constraint = self._adjust_local(version, constraint, prefix)
+        if version == constraint:
+            return True
+        if version < constraint:
+            return False
+#        if not prefix:
+#            return True
+        release_clause = constraint._release_clause
+        if len(release_clause) > 1:
+            release_clause = release_clause[:-1]
+        pfx = '.'.join([str(i) for i in release_clause])
+        return _match_prefix(version, pfx)
+
+_REPLACEMENTS = (
+    (re.compile('[.+-]$'), ''),                     # remove trailing puncts
+    (re.compile(r'^[.](\d)'), r'0.\1'),             # .N -> 0.N at start
+    (re.compile('^[.-]'), ''),                      # remove leading puncts
+    (re.compile(r'^\((.*)\)$'), r'\1'),             # remove parentheses
+    (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'),    # remove leading v(ersion)
+    (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'),        # remove leading v(ersion)
+    (re.compile('[.]{2,}'), '.'),                   # multiple runs of '.'
+    (re.compile(r'\b(alfa|apha)\b'), 'alpha'),      # misspelt alpha
+    (re.compile(r'\b(pre-alpha|prealpha)\b'),
+                'pre.alpha'),                       # standardise
+    (re.compile(r'\(beta\)$'), 'beta'),             # remove parentheses
+)
+
+_SUFFIX_REPLACEMENTS = (
+    (re.compile('^[:~._+-]+'), ''),                   # remove leading puncts
+    (re.compile('[,*")([\\]]'), ''),                  # remove unwanted chars
+    (re.compile('[~:+_ -]'), '.'),                    # replace illegal chars
+    (re.compile('[.]{2,}'), '.'),                   # multiple runs of '.'
+    (re.compile(r'\.$'), ''),                       # trailing '.'
+)
+
+_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)')
+
+
+def _suggest_semantic_version(s):
+    """
+    Try to suggest a semantic form for a version for which
+    _suggest_normalized_version couldn't come up with anything.
+    """
+    result = s.strip().lower()
+    for pat, repl in _REPLACEMENTS:
+        result = pat.sub(repl, result)
+    if not result:
+        result = '0.0.0'
+
+    # Now look for numeric prefix, and separate it out from
+    # the rest.
+    #import pdb; pdb.set_trace()
+    m = _NUMERIC_PREFIX.match(result)
+    if not m:
+        prefix = '0.0.0'
+        suffix = result
+    else:
+        prefix = m.groups()[0].split('.')
+        prefix = [int(i) for i in prefix]
+        while len(prefix) < 3:
+            prefix.append(0)
+        if len(prefix) == 3:
+            suffix = result[m.end():]
+        else:
+            suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():]
+            prefix = prefix[:3]
+        prefix = '.'.join([str(i) for i in prefix])
+        suffix = suffix.strip()
+    if suffix:
+        #import pdb; pdb.set_trace()
+        # massage the suffix.
+        for pat, repl in _SUFFIX_REPLACEMENTS:
+            suffix = pat.sub(repl, suffix)
+
+    if not suffix:
+        result = prefix
+    else:
+        sep = '-' if 'dev' in suffix else '+'
+        result = prefix + sep + suffix
+    if not is_semver(result):
+        result = None
+    return result
+
+
+def _suggest_normalized_version(s):
+    """Suggest a normalized version close to the given version string.
+
+    If you have a version string that isn't rational (i.e. NormalizedVersion
+    doesn't like it) then you might be able to get an equivalent (or close)
+    rational version from this function.
+
+    This does a number of simple normalizations to the given string, based
+    on observation of versions currently in use on PyPI. Given a dump of
+    those version during PyCon 2009, 4287 of them:
+    - 2312 (53.93%) match NormalizedVersion without change
+      with the automatic suggestion
+    - 3474 (81.04%) match when using this suggestion method
+
+    @param s {str} An irrational version string.
+    @returns A rational version string, or None, if couldn't determine one.
+    """
+    try:
+        _normalized_key(s)
+        return s   # already rational
+    except UnsupportedVersionError:
+        pass
+
+    rs = s.lower()
+
+    # part of this could use maketrans
+    for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'),
+                       ('beta', 'b'), ('rc', 'c'), ('-final', ''),
+                       ('-pre', 'c'),
+                       ('-release', ''), ('.release', ''), ('-stable', ''),
+                       ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''),
+                       ('final', '')):
+        rs = rs.replace(orig, repl)
+
+    # if something ends with dev or pre, we add a 0
+    rs = re.sub(r"pre$", r"pre0", rs)
+    rs = re.sub(r"dev$", r"dev0", rs)
+
+    # if we have something like "b-2" or "a.2" at the end of the
+    # version, that is probably beta, alpha, etc
+    # let's remove the dash or dot
+    rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs)
+
+    # 1.0-dev-r371 -> 1.0.dev371
+    # 0.1-dev-r79 -> 0.1.dev79
+    rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs)
+
+    # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1
+    rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs)
+
+    # Clean: v0.3, v1.0
+    if rs.startswith('v'):
+        rs = rs[1:]
+
+    # Clean leading '0's on numbers.
+    #TODO: unintended side-effect on, e.g., "2003.05.09"
+    # PyPI stats: 77 (~2%) better
+    rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs)
+
+    # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers
+    # zero.
+    # PyPI stats: 245 (7.56%) better
+    rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs)
+
+    # the 'dev-rNNN' tag is a dev tag
+    rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs)
+
+    # clean the - when used as a pre delimiter
+    rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs)
+
+    # a terminal "dev" or "devel" can be changed into ".dev0"
+    rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs)
+
+    # a terminal "dev" can be changed into ".dev0"
+    rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs)
+
+    # a terminal "final" or "stable" can be removed
+    rs = re.sub(r"(final|stable)$", "", rs)
+
+    # The 'r' and the '-' tags are post release tags
+    #   0.4a1.r10       ->  0.4a1.post10
+    #   0.9.33-17222    ->  0.9.33.post17222
+    #   0.9.33-r17222   ->  0.9.33.post17222
+    rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs)
+
+    # Clean 'r' instead of 'dev' usage:
+    #   0.9.33+r17222   ->  0.9.33.dev17222
+    #   1.0dev123       ->  1.0.dev123
+    #   1.0.git123      ->  1.0.dev123
+    #   1.0.bzr123      ->  1.0.dev123
+    #   0.1a0dev.123    ->  0.1a0.dev123
+    # PyPI stats:  ~150 (~4%) better
+    rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs)
+
+    # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage:
+    #   0.2.pre1        ->  0.2c1
+    #   0.2-c1         ->  0.2c1
+    #   1.0preview123   ->  1.0c123
+    # PyPI stats: ~21 (0.62%) better
+    rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs)
+
+    # Tcl/Tk uses "px" for their post release markers
+    rs = re.sub(r"p(\d+)$", r".post\1", rs)
+
+    try:
+        _normalized_key(rs)
+    except UnsupportedVersionError:
+        rs = None
+    return rs
+
+#
+#   Legacy version processing (distribute-compatible)
+#
+
+_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I)
+_VERSION_REPLACE = {
+    'pre': 'c',
+    'preview': 'c',
+    '-': 'final-',
+    'rc': 'c',
+    'dev': '@',
+    '': None,
+    '.': None,
+}
+
+
+def _legacy_key(s):
+    def get_parts(s):
+        result = []
+        for p in _VERSION_PART.split(s.lower()):
+            p = _VERSION_REPLACE.get(p, p)
+            if p:
+                if '0' <= p[:1] <= '9':
+                    p = p.zfill(8)
+                else:
+                    p = '*' + p
+                result.append(p)
+        result.append('*final')
+        return result
+
+    result = []
+    for p in get_parts(s):
+        if p.startswith('*'):
+            if p < '*final':
+                while result and result[-1] == '*final-':
+                    result.pop()
+            while result and result[-1] == '00000000':
+                result.pop()
+        result.append(p)
+    return tuple(result)
+
+
+class LegacyVersion(Version):
+    def parse(self, s):
+        return _legacy_key(s)
+
+    @property
+    def is_prerelease(self):
+        result = False
+        for x in self._parts:
+            if (isinstance(x, string_types) and x.startswith('*') and
+                x < '*final'):
+                result = True
+                break
+        return result
+
+
+class LegacyMatcher(Matcher):
+    version_class = LegacyVersion
+
+    _operators = dict(Matcher._operators)
+    _operators['~='] = '_match_compatible'
+
+    numeric_re = re.compile(r'^(\d+(\.\d+)*)')
+
+    def _match_compatible(self, version, constraint, prefix):
+        if version < constraint:
+            return False
+        m = self.numeric_re.match(str(constraint))
+        if not m:
+            logger.warning('Cannot compute compatible match for version %s '
+                           ' and constraint %s', version, constraint)
+            return True
+        s = m.groups()[0]
+        if '.' in s:
+            s = s.rsplit('.', 1)[0]
+        return _match_prefix(version, s)
+
+#
+#   Semantic versioning
+#
+
+_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)'
+                        r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?'
+                        r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I)
+
+
+def is_semver(s):
+    return _SEMVER_RE.match(s)
+
+
+def _semantic_key(s):
+    def make_tuple(s, absent):
+        if s is None:
+            result = (absent,)
+        else:
+            parts = s[1:].split('.')
+            # We can't compare ints and strings on Python 3, so fudge it
+            # by zero-filling numeric values so simulate a numeric comparison
+            result = tuple([p.zfill(8) if p.isdigit() else p for p in parts])
+        return result
+
+    m = is_semver(s)
+    if not m:
+        raise UnsupportedVersionError(s)
+    groups = m.groups()
+    major, minor, patch = [int(i) for i in groups[:3]]
+    # choose the '|' and '*' so that versions sort correctly
+    pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*')
+    return (major, minor, patch), pre, build
+
+
+class SemanticVersion(Version):
+    def parse(self, s):
+        return _semantic_key(s)
+
+    @property
+    def is_prerelease(self):
+        return self._parts[1][0] != '|'
+
+
+class SemanticMatcher(Matcher):
+    version_class = SemanticVersion
+
+
+class VersionScheme(object):
+    def __init__(self, key, matcher, suggester=None):
+        self.key = key
+        self.matcher = matcher
+        self.suggester = suggester
+
+    def is_valid_version(self, s):
+        try:
+            self.matcher.version_class(s)
+            result = True
+        except UnsupportedVersionError:
+            result = False
+        return result
+
+    def is_valid_matcher(self, s):
+        try:
+            self.matcher(s)
+            result = True
+        except UnsupportedVersionError:
+            result = False
+        return result
+
+    def is_valid_constraint_list(self, s):
+        """
+        Used for processing some metadata fields
+        """
+        return self.is_valid_matcher('dummy_name (%s)' % s)
+
+    def suggest(self, s):
+        if self.suggester is None:
+            result = None
+        else:
+            result = self.suggester(s)
+        return result
+
+_SCHEMES = {
+    'normalized': VersionScheme(_normalized_key, NormalizedMatcher,
+                                _suggest_normalized_version),
+    'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s),
+    'semantic': VersionScheme(_semantic_key, SemanticMatcher,
+                              _suggest_semantic_version),
+}
+
+_SCHEMES['default'] = _SCHEMES['normalized']
+
+
+def get_scheme(name):
+    if name not in _SCHEMES:
+        raise ValueError('unknown scheme name: %r' % name)
+    return _SCHEMES[name]
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..784deb693475e67aac9c85397a136b20ceff9164
GIT binary patch
literal 29783
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
Q=gP$>#>mOY%go0N02_!st^fc4

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe
new file mode 100644
index 0000000000000000000000000000000000000000..732215a9d34ccb7b417d637a7646d9b843ecafa8
GIT binary patch
literal 89088
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%0Af}9)KdZ08U
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe
new file mode 100644
index 0000000000000000000000000000000000000000..c41bd0a011fd760ce20ba795d9e535e0d2c39876
GIT binary patch
literal 99328
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py
new file mode 100644
index 00000000..b04bfaef
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py
@@ -0,0 +1,988 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2017 Vinay Sajip.
+# Licensed to the Python Software Foundation under a contributor agreement.
+# See LICENSE.txt and CONTRIBUTORS.txt.
+#
+from __future__ import unicode_literals
+
+import base64
+import codecs
+import datetime
+import distutils.util
+from email import message_from_file
+import hashlib
+import imp
+import json
+import logging
+import os
+import posixpath
+import re
+import shutil
+import sys
+import tempfile
+import zipfile
+
+from . import __version__, DistlibException
+from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
+from .database import InstalledDistribution
+from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME
+from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
+                   cached_property, get_cache_base, read_exports, tempdir)
+from .version import NormalizedVersion, UnsupportedVersionError
+
+logger = logging.getLogger(__name__)
+
+cache = None    # created when needed
+
+if hasattr(sys, 'pypy_version_info'):  # pragma: no cover
+    IMP_PREFIX = 'pp'
+elif sys.platform.startswith('java'):  # pragma: no cover
+    IMP_PREFIX = 'jy'
+elif sys.platform == 'cli':  # pragma: no cover
+    IMP_PREFIX = 'ip'
+else:
+    IMP_PREFIX = 'cp'
+
+VER_SUFFIX = sysconfig.get_config_var('py_version_nodot')
+if not VER_SUFFIX:   # pragma: no cover
+    VER_SUFFIX = '%s%s' % sys.version_info[:2]
+PYVER = 'py' + VER_SUFFIX
+IMPVER = IMP_PREFIX + VER_SUFFIX
+
+ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_')
+
+ABI = sysconfig.get_config_var('SOABI')
+if ABI and ABI.startswith('cpython-'):
+    ABI = ABI.replace('cpython-', 'cp')
+else:
+    def _derive_abi():
+        parts = ['cp', VER_SUFFIX]
+        if sysconfig.get_config_var('Py_DEBUG'):
+            parts.append('d')
+        if sysconfig.get_config_var('WITH_PYMALLOC'):
+            parts.append('m')
+        if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4:
+            parts.append('u')
+        return ''.join(parts)
+    ABI = _derive_abi()
+    del _derive_abi
+
+FILENAME_RE = re.compile(r'''
+(?P<nm>[^-]+)
+-(?P<vn>\d+[^-]*)
+(-(?P<bn>\d+[^-]*))?
+-(?P<py>\w+\d+(\.\w+\d+)*)
+-(?P<bi>\w+)
+-(?P<ar>\w+(\.\w+)*)
+\.whl$
+''', re.IGNORECASE | re.VERBOSE)
+
+NAME_VERSION_RE = re.compile(r'''
+(?P<nm>[^-]+)
+-(?P<vn>\d+[^-]*)
+(-(?P<bn>\d+[^-]*))?$
+''', re.IGNORECASE | re.VERBOSE)
+
+SHEBANG_RE = re.compile(br'\s*#![^\r\n]*')
+SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$')
+SHEBANG_PYTHON = b'#!python'
+SHEBANG_PYTHONW = b'#!pythonw'
+
+if os.sep == '/':
+    to_posix = lambda o: o
+else:
+    to_posix = lambda o: o.replace(os.sep, '/')
+
+
+class Mounter(object):
+    def __init__(self):
+        self.impure_wheels = {}
+        self.libs = {}
+
+    def add(self, pathname, extensions):
+        self.impure_wheels[pathname] = extensions
+        self.libs.update(extensions)
+
+    def remove(self, pathname):
+        extensions = self.impure_wheels.pop(pathname)
+        for k, v in extensions:
+            if k in self.libs:
+                del self.libs[k]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.libs:
+            result = self
+        else:
+            result = None
+        return result
+
+    def load_module(self, fullname):
+        if fullname in sys.modules:
+            result = sys.modules[fullname]
+        else:
+            if fullname not in self.libs:
+                raise ImportError('unable to find extension for %s' % fullname)
+            result = imp.load_dynamic(fullname, self.libs[fullname])
+            result.__loader__ = self
+            parts = fullname.rsplit('.', 1)
+            if len(parts) > 1:
+                result.__package__ = parts[0]
+        return result
+
+_hook = Mounter()
+
+
+class Wheel(object):
+    """
+    Class to build and install from Wheel files (PEP 427).
+    """
+
+    wheel_version = (1, 1)
+    hash_kind = 'sha256'
+
+    def __init__(self, filename=None, sign=False, verify=False):
+        """
+        Initialise an instance using a (valid) filename.
+        """
+        self.sign = sign
+        self.should_verify = verify
+        self.buildver = ''
+        self.pyver = [PYVER]
+        self.abi = ['none']
+        self.arch = ['any']
+        self.dirname = os.getcwd()
+        if filename is None:
+            self.name = 'dummy'
+            self.version = '0.1'
+            self._filename = self.filename
+        else:
+            m = NAME_VERSION_RE.match(filename)
+            if m:
+                info = m.groupdict('')
+                self.name = info['nm']
+                # Reinstate the local version separator
+                self.version = info['vn'].replace('_', '-')
+                self.buildver = info['bn']
+                self._filename = self.filename
+            else:
+                dirname, filename = os.path.split(filename)
+                m = FILENAME_RE.match(filename)
+                if not m:
+                    raise DistlibException('Invalid name or '
+                                           'filename: %r' % filename)
+                if dirname:
+                    self.dirname = os.path.abspath(dirname)
+                self._filename = filename
+                info = m.groupdict('')
+                self.name = info['nm']
+                self.version = info['vn']
+                self.buildver = info['bn']
+                self.pyver = info['py'].split('.')
+                self.abi = info['bi'].split('.')
+                self.arch = info['ar'].split('.')
+
+    @property
+    def filename(self):
+        """
+        Build and return a filename from the various components.
+        """
+        if self.buildver:
+            buildver = '-' + self.buildver
+        else:
+            buildver = ''
+        pyver = '.'.join(self.pyver)
+        abi = '.'.join(self.abi)
+        arch = '.'.join(self.arch)
+        # replace - with _ as a local version separator
+        version = self.version.replace('-', '_')
+        return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver,
+                                         pyver, abi, arch)
+
+    @property
+    def exists(self):
+        path = os.path.join(self.dirname, self.filename)
+        return os.path.isfile(path)
+
+    @property
+    def tags(self):
+        for pyver in self.pyver:
+            for abi in self.abi:
+                for arch in self.arch:
+                    yield pyver, abi, arch
+
+    @cached_property
+    def metadata(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        wrapper = codecs.getreader('utf-8')
+        with ZipFile(pathname, 'r') as zf:
+            wheel_metadata = self.get_wheel_metadata(zf)
+            wv = wheel_metadata['Wheel-Version'].split('.', 1)
+            file_version = tuple([int(i) for i in wv])
+            if file_version < (1, 1):
+                fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA']
+            else:
+                fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME]
+            result = None
+            for fn in fns:
+                try:
+                    metadata_filename = posixpath.join(info_dir, fn)
+                    with zf.open(metadata_filename) as bf:
+                        wf = wrapper(bf)
+                        result = Metadata(fileobj=wf)
+                        if result:
+                            break
+                except KeyError:
+                    pass
+            if not result:
+                raise ValueError('Invalid wheel, because metadata is '
+                                 'missing: looked in %s' % ', '.join(fns))
+        return result
+
+    def get_wheel_metadata(self, zf):
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        metadata_filename = posixpath.join(info_dir, 'WHEEL')
+        with zf.open(metadata_filename) as bf:
+            wf = codecs.getreader('utf-8')(bf)
+            message = message_from_file(wf)
+        return dict(message)
+
+    @cached_property
+    def info(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        with ZipFile(pathname, 'r') as zf:
+            result = self.get_wheel_metadata(zf)
+        return result
+
+    def process_shebang(self, data):
+        m = SHEBANG_RE.match(data)
+        if m:
+            end = m.end()
+            shebang, data_after_shebang = data[:end], data[end:]
+            # Preserve any arguments after the interpreter
+            if b'pythonw' in shebang.lower():
+                shebang_python = SHEBANG_PYTHONW
+            else:
+                shebang_python = SHEBANG_PYTHON
+            m = SHEBANG_DETAIL_RE.match(shebang)
+            if m:
+                args = b' ' + m.groups()[-1]
+            else:
+                args = b''
+            shebang = shebang_python + args
+            data = shebang + data_after_shebang
+        else:
+            cr = data.find(b'\r')
+            lf = data.find(b'\n')
+            if cr < 0 or cr > lf:
+                term = b'\n'
+            else:
+                if data[cr:cr + 2] == b'\r\n':
+                    term = b'\r\n'
+                else:
+                    term = b'\r'
+            data = SHEBANG_PYTHON + term + data
+        return data
+
+    def get_hash(self, data, hash_kind=None):
+        if hash_kind is None:
+            hash_kind = self.hash_kind
+        try:
+            hasher = getattr(hashlib, hash_kind)
+        except AttributeError:
+            raise DistlibException('Unsupported hash algorithm: %r' % hash_kind)
+        result = hasher(data).digest()
+        result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii')
+        return hash_kind, result
+
+    def write_record(self, records, record_path, base):
+        records = list(records) # make a copy for sorting
+        p = to_posix(os.path.relpath(record_path, base))
+        records.append((p, '', ''))
+        records.sort()
+        with CSVWriter(record_path) as writer:
+            for row in records:
+                writer.writerow(row)
+
+    def write_records(self, info, libdir, archive_paths):
+        records = []
+        distinfo, info_dir = info
+        hasher = getattr(hashlib, self.hash_kind)
+        for ap, p in archive_paths:
+            with open(p, 'rb') as f:
+                data = f.read()
+            digest = '%s=%s' % self.get_hash(data)
+            size = os.path.getsize(p)
+            records.append((ap, digest, size))
+
+        p = os.path.join(distinfo, 'RECORD')
+        self.write_record(records, p, libdir)
+        ap = to_posix(os.path.join(info_dir, 'RECORD'))
+        archive_paths.append((ap, p))
+
+    def build_zip(self, pathname, archive_paths):
+        with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf:
+            for ap, p in archive_paths:
+                logger.debug('Wrote %s to %s in wheel', p, ap)
+                zf.write(p, ap)
+
+    def build(self, paths, tags=None, wheel_version=None):
+        """
+        Build a wheel from files in specified paths, and use any specified tags
+        when determining the name of the wheel.
+        """
+        if tags is None:
+            tags = {}
+
+        libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0]
+        if libkey == 'platlib':
+            is_pure = 'false'
+            default_pyver = [IMPVER]
+            default_abi = [ABI]
+            default_arch = [ARCH]
+        else:
+            is_pure = 'true'
+            default_pyver = [PYVER]
+            default_abi = ['none']
+            default_arch = ['any']
+
+        self.pyver = tags.get('pyver', default_pyver)
+        self.abi = tags.get('abi', default_abi)
+        self.arch = tags.get('arch', default_arch)
+
+        libdir = paths[libkey]
+
+        name_ver = '%s-%s' % (self.name, self.version)
+        data_dir = '%s.data' % name_ver
+        info_dir = '%s.dist-info' % name_ver
+
+        archive_paths = []
+
+        # First, stuff which is not in site-packages
+        for key in ('data', 'headers', 'scripts'):
+            if key not in paths:
+                continue
+            path = paths[key]
+            if os.path.isdir(path):
+                for root, dirs, files in os.walk(path):
+                    for fn in files:
+                        p = fsdecode(os.path.join(root, fn))
+                        rp = os.path.relpath(p, path)
+                        ap = to_posix(os.path.join(data_dir, key, rp))
+                        archive_paths.append((ap, p))
+                        if key == 'scripts' and not p.endswith('.exe'):
+                            with open(p, 'rb') as f:
+                                data = f.read()
+                            data = self.process_shebang(data)
+                            with open(p, 'wb') as f:
+                                f.write(data)
+
+        # Now, stuff which is in site-packages, other than the
+        # distinfo stuff.
+        path = libdir
+        distinfo = None
+        for root, dirs, files in os.walk(path):
+            if root == path:
+                # At the top level only, save distinfo for later
+                # and skip it for now
+                for i, dn in enumerate(dirs):
+                    dn = fsdecode(dn)
+                    if dn.endswith('.dist-info'):
+                        distinfo = os.path.join(root, dn)
+                        del dirs[i]
+                        break
+                assert distinfo, '.dist-info directory expected, not found'
+
+            for fn in files:
+                # comment out next suite to leave .pyc files in
+                if fsdecode(fn).endswith(('.pyc', '.pyo')):
+                    continue
+                p = os.path.join(root, fn)
+                rp = to_posix(os.path.relpath(p, path))
+                archive_paths.append((rp, p))
+
+        # Now distinfo. Assumed to be flat, i.e. os.listdir is enough.
+        files = os.listdir(distinfo)
+        for fn in files:
+            if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'):
+                p = fsdecode(os.path.join(distinfo, fn))
+                ap = to_posix(os.path.join(info_dir, fn))
+                archive_paths.append((ap, p))
+
+        wheel_metadata = [
+            'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version),
+            'Generator: distlib %s' % __version__,
+            'Root-Is-Purelib: %s' % is_pure,
+        ]
+        for pyver, abi, arch in self.tags:
+            wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch))
+        p = os.path.join(distinfo, 'WHEEL')
+        with open(p, 'w') as f:
+            f.write('\n'.join(wheel_metadata))
+        ap = to_posix(os.path.join(info_dir, 'WHEEL'))
+        archive_paths.append((ap, p))
+
+        # Now, at last, RECORD.
+        # Paths in here are archive paths - nothing else makes sense.
+        self.write_records((distinfo, info_dir), libdir, archive_paths)
+        # Now, ready to build the zip file
+        pathname = os.path.join(self.dirname, self.filename)
+        self.build_zip(pathname, archive_paths)
+        return pathname
+
+    def install(self, paths, maker, **kwargs):
+        """
+        Install a wheel to the specified paths. If kwarg ``warner`` is
+        specified, it should be a callable, which will be called with two
+        tuples indicating the wheel version of this software and the wheel
+        version in the file, if there is a discrepancy in the versions.
+        This can be used to issue any warnings to raise any exceptions.
+        If kwarg ``lib_only`` is True, only the purelib/platlib files are
+        installed, and the headers, scripts, data and dist-info metadata are
+        not written. If kwarg ``bytecode_hashed_invalidation`` is True, written
+        bytecode will try to use file-hash based invalidation (PEP-552) on
+        supported interpreter versions (CPython 2.7+).
+
+        The return value is a :class:`InstalledDistribution` instance unless
+        ``options.lib_only`` is True, in which case the return value is ``None``.
+        """
+
+        dry_run = maker.dry_run
+        warner = kwargs.get('warner')
+        lib_only = kwargs.get('lib_only', False)
+        bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False)
+
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        data_dir = '%s.data' % name_ver
+        info_dir = '%s.dist-info' % name_ver
+
+        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
+        wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
+        record_name = posixpath.join(info_dir, 'RECORD')
+
+        wrapper = codecs.getreader('utf-8')
+
+        with ZipFile(pathname, 'r') as zf:
+            with zf.open(wheel_metadata_name) as bwf:
+                wf = wrapper(bwf)
+                message = message_from_file(wf)
+            wv = message['Wheel-Version'].split('.', 1)
+            file_version = tuple([int(i) for i in wv])
+            if (file_version != self.wheel_version) and warner:
+                warner(self.wheel_version, file_version)
+
+            if message['Root-Is-Purelib'] == 'true':
+                libdir = paths['purelib']
+            else:
+                libdir = paths['platlib']
+
+            records = {}
+            with zf.open(record_name) as bf:
+                with CSVReader(stream=bf) as reader:
+                    for row in reader:
+                        p = row[0]
+                        records[p] = row
+
+            data_pfx = posixpath.join(data_dir, '')
+            info_pfx = posixpath.join(info_dir, '')
+            script_pfx = posixpath.join(data_dir, 'scripts', '')
+
+            # make a new instance rather than a copy of maker's,
+            # as we mutate it
+            fileop = FileOperator(dry_run=dry_run)
+            fileop.record = True    # so we can rollback if needed
+
+            bc = not sys.dont_write_bytecode    # Double negatives. Lovely!
+
+            outfiles = []   # for RECORD writing
+
+            # for script copying/shebang processing
+            workdir = tempfile.mkdtemp()
+            # set target dir later
+            # we default add_launchers to False, as the
+            # Python Launcher should be used instead
+            maker.source_dir = workdir
+            maker.target_dir = None
+            try:
+                for zinfo in zf.infolist():
+                    arcname = zinfo.filename
+                    if isinstance(arcname, text_type):
+                        u_arcname = arcname
+                    else:
+                        u_arcname = arcname.decode('utf-8')
+                    # The signature file won't be in RECORD,
+                    # and we  don't currently don't do anything with it
+                    if u_arcname.endswith('/RECORD.jws'):
+                        continue
+                    row = records[u_arcname]
+                    if row[2] and str(zinfo.file_size) != row[2]:
+                        raise DistlibException('size mismatch for '
+                                               '%s' % u_arcname)
+                    if row[1]:
+                        kind, value = row[1].split('=', 1)
+                        with zf.open(arcname) as bf:
+                            data = bf.read()
+                        _, digest = self.get_hash(data, kind)
+                        if digest != value:
+                            raise DistlibException('digest mismatch for '
+                                                   '%s' % arcname)
+
+                    if lib_only and u_arcname.startswith((info_pfx, data_pfx)):
+                        logger.debug('lib_only: skipping %s', u_arcname)
+                        continue
+                    is_script = (u_arcname.startswith(script_pfx)
+                                 and not u_arcname.endswith('.exe'))
+
+                    if u_arcname.startswith(data_pfx):
+                        _, where, rp = u_arcname.split('/', 2)
+                        outfile = os.path.join(paths[where], convert_path(rp))
+                    else:
+                        # meant for site-packages.
+                        if u_arcname in (wheel_metadata_name, record_name):
+                            continue
+                        outfile = os.path.join(libdir, convert_path(u_arcname))
+                    if not is_script:
+                        with zf.open(arcname) as bf:
+                            fileop.copy_stream(bf, outfile)
+                        outfiles.append(outfile)
+                        # Double check the digest of the written file
+                        if not dry_run and row[1]:
+                            with open(outfile, 'rb') as bf:
+                                data = bf.read()
+                                _, newdigest = self.get_hash(data, kind)
+                                if newdigest != digest:
+                                    raise DistlibException('digest mismatch '
+                                                           'on write for '
+                                                           '%s' % outfile)
+                        if bc and outfile.endswith('.py'):
+                            try:
+                                pyc = fileop.byte_compile(outfile,
+                                                          hashed_invalidation=bc_hashed_invalidation)
+                                outfiles.append(pyc)
+                            except Exception:
+                                # Don't give up if byte-compilation fails,
+                                # but log it and perhaps warn the user
+                                logger.warning('Byte-compilation failed',
+                                               exc_info=True)
+                    else:
+                        fn = os.path.basename(convert_path(arcname))
+                        workname = os.path.join(workdir, fn)
+                        with zf.open(arcname) as bf:
+                            fileop.copy_stream(bf, workname)
+
+                        dn, fn = os.path.split(outfile)
+                        maker.target_dir = dn
+                        filenames = maker.make(fn)
+                        fileop.set_executable_mode(filenames)
+                        outfiles.extend(filenames)
+
+                if lib_only:
+                    logger.debug('lib_only: returning None')
+                    dist = None
+                else:
+                    # Generate scripts
+
+                    # Try to get pydist.json so we can see if there are
+                    # any commands to generate. If this fails (e.g. because
+                    # of a legacy wheel), log a warning but don't give up.
+                    commands = None
+                    file_version = self.info['Wheel-Version']
+                    if file_version == '1.0':
+                        # Use legacy info
+                        ep = posixpath.join(info_dir, 'entry_points.txt')
+                        try:
+                            with zf.open(ep) as bwf:
+                                epdata = read_exports(bwf)
+                            commands = {}
+                            for key in ('console', 'gui'):
+                                k = '%s_scripts' % key
+                                if k in epdata:
+                                    commands['wrap_%s' % key] = d = {}
+                                    for v in epdata[k].values():
+                                        s = '%s:%s' % (v.prefix, v.suffix)
+                                        if v.flags:
+                                            s += ' %s' % v.flags
+                                        d[v.name] = s
+                        except Exception:
+                            logger.warning('Unable to read legacy script '
+                                           'metadata, so cannot generate '
+                                           'scripts')
+                    else:
+                        try:
+                            with zf.open(metadata_name) as bwf:
+                                wf = wrapper(bwf)
+                                commands = json.load(wf).get('extensions')
+                                if commands:
+                                    commands = commands.get('python.commands')
+                        except Exception:
+                            logger.warning('Unable to read JSON metadata, so '
+                                           'cannot generate scripts')
+                    if commands:
+                        console_scripts = commands.get('wrap_console', {})
+                        gui_scripts = commands.get('wrap_gui', {})
+                        if console_scripts or gui_scripts:
+                            script_dir = paths.get('scripts', '')
+                            if not os.path.isdir(script_dir):
+                                raise ValueError('Valid script path not '
+                                                 'specified')
+                            maker.target_dir = script_dir
+                            for k, v in console_scripts.items():
+                                script = '%s = %s' % (k, v)
+                                filenames = maker.make(script)
+                                fileop.set_executable_mode(filenames)
+
+                            if gui_scripts:
+                                options = {'gui': True }
+                                for k, v in gui_scripts.items():
+                                    script = '%s = %s' % (k, v)
+                                    filenames = maker.make(script, options)
+                                    fileop.set_executable_mode(filenames)
+
+                    p = os.path.join(libdir, info_dir)
+                    dist = InstalledDistribution(p)
+
+                    # Write SHARED
+                    paths = dict(paths)     # don't change passed in dict
+                    del paths['purelib']
+                    del paths['platlib']
+                    paths['lib'] = libdir
+                    p = dist.write_shared_locations(paths, dry_run)
+                    if p:
+                        outfiles.append(p)
+
+                    # Write RECORD
+                    dist.write_installed_files(outfiles, paths['prefix'],
+                                               dry_run)
+                return dist
+            except Exception:  # pragma: no cover
+                logger.exception('installation failed.')
+                fileop.rollback()
+                raise
+            finally:
+                shutil.rmtree(workdir)
+
+    def _get_dylib_cache(self):
+        global cache
+        if cache is None:
+            # Use native string to avoid issues on 2.x: see Python #20140.
+            base = os.path.join(get_cache_base(), str('dylib-cache'),
+                                sys.version[:3])
+            cache = Cache(base)
+        return cache
+
+    def _get_extensions(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        arcname = posixpath.join(info_dir, 'EXTENSIONS')
+        wrapper = codecs.getreader('utf-8')
+        result = []
+        with ZipFile(pathname, 'r') as zf:
+            try:
+                with zf.open(arcname) as bf:
+                    wf = wrapper(bf)
+                    extensions = json.load(wf)
+                    cache = self._get_dylib_cache()
+                    prefix = cache.prefix_to_dir(pathname)
+                    cache_base = os.path.join(cache.base, prefix)
+                    if not os.path.isdir(cache_base):
+                        os.makedirs(cache_base)
+                    for name, relpath in extensions.items():
+                        dest = os.path.join(cache_base, convert_path(relpath))
+                        if not os.path.exists(dest):
+                            extract = True
+                        else:
+                            file_time = os.stat(dest).st_mtime
+                            file_time = datetime.datetime.fromtimestamp(file_time)
+                            info = zf.getinfo(relpath)
+                            wheel_time = datetime.datetime(*info.date_time)
+                            extract = wheel_time > file_time
+                        if extract:
+                            zf.extract(relpath, cache_base)
+                        result.append((name, dest))
+            except KeyError:
+                pass
+        return result
+
+    def is_compatible(self):
+        """
+        Determine if a wheel is compatible with the running system.
+        """
+        return is_compatible(self)
+
+    def is_mountable(self):
+        """
+        Determine if a wheel is asserted as mountable by its metadata.
+        """
+        return True # for now - metadata details TBD
+
+    def mount(self, append=False):
+        pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
+        if not self.is_compatible():
+            msg = 'Wheel %s not compatible with this Python.' % pathname
+            raise DistlibException(msg)
+        if not self.is_mountable():
+            msg = 'Wheel %s is marked as not mountable.' % pathname
+            raise DistlibException(msg)
+        if pathname in sys.path:
+            logger.debug('%s already in path', pathname)
+        else:
+            if append:
+                sys.path.append(pathname)
+            else:
+                sys.path.insert(0, pathname)
+            extensions = self._get_extensions()
+            if extensions:
+                if _hook not in sys.meta_path:
+                    sys.meta_path.append(_hook)
+                _hook.add(pathname, extensions)
+
+    def unmount(self):
+        pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
+        if pathname not in sys.path:
+            logger.debug('%s not in path', pathname)
+        else:
+            sys.path.remove(pathname)
+            if pathname in _hook.impure_wheels:
+                _hook.remove(pathname)
+            if not _hook.impure_wheels:
+                if _hook in sys.meta_path:
+                    sys.meta_path.remove(_hook)
+
+    def verify(self):
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        data_dir = '%s.data' % name_ver
+        info_dir = '%s.dist-info' % name_ver
+
+        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
+        wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
+        record_name = posixpath.join(info_dir, 'RECORD')
+
+        wrapper = codecs.getreader('utf-8')
+
+        with ZipFile(pathname, 'r') as zf:
+            with zf.open(wheel_metadata_name) as bwf:
+                wf = wrapper(bwf)
+                message = message_from_file(wf)
+            wv = message['Wheel-Version'].split('.', 1)
+            file_version = tuple([int(i) for i in wv])
+            # TODO version verification
+
+            records = {}
+            with zf.open(record_name) as bf:
+                with CSVReader(stream=bf) as reader:
+                    for row in reader:
+                        p = row[0]
+                        records[p] = row
+
+            for zinfo in zf.infolist():
+                arcname = zinfo.filename
+                if isinstance(arcname, text_type):
+                    u_arcname = arcname
+                else:
+                    u_arcname = arcname.decode('utf-8')
+                if '..' in u_arcname:
+                    raise DistlibException('invalid entry in '
+                                           'wheel: %r' % u_arcname)
+
+                # The signature file won't be in RECORD,
+                # and we  don't currently don't do anything with it
+                if u_arcname.endswith('/RECORD.jws'):
+                    continue
+                row = records[u_arcname]
+                if row[2] and str(zinfo.file_size) != row[2]:
+                    raise DistlibException('size mismatch for '
+                                           '%s' % u_arcname)
+                if row[1]:
+                    kind, value = row[1].split('=', 1)
+                    with zf.open(arcname) as bf:
+                        data = bf.read()
+                    _, digest = self.get_hash(data, kind)
+                    if digest != value:
+                        raise DistlibException('digest mismatch for '
+                                               '%s' % arcname)
+
+    def update(self, modifier, dest_dir=None, **kwargs):
+        """
+        Update the contents of a wheel in a generic way. The modifier should
+        be a callable which expects a dictionary argument: its keys are
+        archive-entry paths, and its values are absolute filesystem paths
+        where the contents the corresponding archive entries can be found. The
+        modifier is free to change the contents of the files pointed to, add
+        new entries and remove entries, before returning. This method will
+        extract the entire contents of the wheel to a temporary location, call
+        the modifier, and then use the passed (and possibly updated)
+        dictionary to write a new wheel. If ``dest_dir`` is specified, the new
+        wheel is written there -- otherwise, the original wheel is overwritten.
+
+        The modifier should return True if it updated the wheel, else False.
+        This method returns the same value the modifier returns.
+        """
+
+        def get_version(path_map, info_dir):
+            version = path = None
+            key = '%s/%s' % (info_dir, METADATA_FILENAME)
+            if key not in path_map:
+                key = '%s/PKG-INFO' % info_dir
+            if key in path_map:
+                path = path_map[key]
+                version = Metadata(path=path).version
+            return version, path
+
+        def update_version(version, path):
+            updated = None
+            try:
+                v = NormalizedVersion(version)
+                i = version.find('-')
+                if i < 0:
+                    updated = '%s+1' % version
+                else:
+                    parts = [int(s) for s in version[i + 1:].split('.')]
+                    parts[-1] += 1
+                    updated = '%s+%s' % (version[:i],
+                                         '.'.join(str(i) for i in parts))
+            except UnsupportedVersionError:
+                logger.debug('Cannot update non-compliant (PEP-440) '
+                             'version %r', version)
+            if updated:
+                md = Metadata(path=path)
+                md.version = updated
+                legacy = not path.endswith(METADATA_FILENAME)
+                md.write(path=path, legacy=legacy)
+                logger.debug('Version updated from %r to %r', version,
+                             updated)
+
+        pathname = os.path.join(self.dirname, self.filename)
+        name_ver = '%s-%s' % (self.name, self.version)
+        info_dir = '%s.dist-info' % name_ver
+        record_name = posixpath.join(info_dir, 'RECORD')
+        with tempdir() as workdir:
+            with ZipFile(pathname, 'r') as zf:
+                path_map = {}
+                for zinfo in zf.infolist():
+                    arcname = zinfo.filename
+                    if isinstance(arcname, text_type):
+                        u_arcname = arcname
+                    else:
+                        u_arcname = arcname.decode('utf-8')
+                    if u_arcname == record_name:
+                        continue
+                    if '..' in u_arcname:
+                        raise DistlibException('invalid entry in '
+                                               'wheel: %r' % u_arcname)
+                    zf.extract(zinfo, workdir)
+                    path = os.path.join(workdir, convert_path(u_arcname))
+                    path_map[u_arcname] = path
+
+            # Remember the version.
+            original_version, _ = get_version(path_map, info_dir)
+            # Files extracted. Call the modifier.
+            modified = modifier(path_map, **kwargs)
+            if modified:
+                # Something changed - need to build a new wheel.
+                current_version, path = get_version(path_map, info_dir)
+                if current_version and (current_version == original_version):
+                    # Add or update local version to signify changes.
+                    update_version(current_version, path)
+                # Decide where the new wheel goes.
+                if dest_dir is None:
+                    fd, newpath = tempfile.mkstemp(suffix='.whl',
+                                                   prefix='wheel-update-',
+                                                   dir=workdir)
+                    os.close(fd)
+                else:
+                    if not os.path.isdir(dest_dir):
+                        raise DistlibException('Not a directory: %r' % dest_dir)
+                    newpath = os.path.join(dest_dir, self.filename)
+                archive_paths = list(path_map.items())
+                distinfo = os.path.join(workdir, info_dir)
+                info = distinfo, info_dir
+                self.write_records(info, workdir, archive_paths)
+                self.build_zip(newpath, archive_paths)
+                if dest_dir is None:
+                    shutil.copyfile(newpath, pathname)
+        return modified
+
+def compatible_tags():
+    """
+    Return (pyver, abi, arch) tuples compatible with this Python.
+    """
+    versions = [VER_SUFFIX]
+    major = VER_SUFFIX[0]
+    for minor in range(sys.version_info[1] - 1, - 1, -1):
+        versions.append(''.join([major, str(minor)]))
+
+    abis = []
+    for suffix, _, _ in imp.get_suffixes():
+        if suffix.startswith('.abi'):
+            abis.append(suffix.split('.', 2)[1])
+    abis.sort()
+    if ABI != 'none':
+        abis.insert(0, ABI)
+    abis.append('none')
+    result = []
+
+    arches = [ARCH]
+    if sys.platform == 'darwin':
+        m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH)
+        if m:
+            name, major, minor, arch = m.groups()
+            minor = int(minor)
+            matches = [arch]
+            if arch in ('i386', 'ppc'):
+                matches.append('fat')
+            if arch in ('i386', 'ppc', 'x86_64'):
+                matches.append('fat3')
+            if arch in ('ppc64', 'x86_64'):
+                matches.append('fat64')
+            if arch in ('i386', 'x86_64'):
+                matches.append('intel')
+            if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'):
+                matches.append('universal')
+            while minor >= 0:
+                for match in matches:
+                    s = '%s_%s_%s_%s' % (name, major, minor, match)
+                    if s != ARCH:   # already there
+                        arches.append(s)
+                minor -= 1
+
+    # Most specific - our Python version, ABI and arch
+    for abi in abis:
+        for arch in arches:
+            result.append((''.join((IMP_PREFIX, versions[0])), abi, arch))
+
+    # where no ABI / arch dependency, but IMP_PREFIX dependency
+    for i, version in enumerate(versions):
+        result.append((''.join((IMP_PREFIX, version)), 'none', 'any'))
+        if i == 0:
+            result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any'))
+
+    # no IMP_PREFIX, ABI or arch dependency
+    for i, version in enumerate(versions):
+        result.append((''.join(('py', version)), 'none', 'any'))
+        if i == 0:
+            result.append((''.join(('py', version[0])), 'none', 'any'))
+    return set(result)
+
+
+COMPATIBLE_TAGS = compatible_tags()
+
+del compatible_tags
+
+
+def is_compatible(wheel, tags=None):
+    if not isinstance(wheel, Wheel):
+        wheel = Wheel(wheel)    # assume it's a filename
+    result = False
+    if tags is None:
+        tags = COMPATIBLE_TAGS
+    for ver, abi, arch in tags:
+        if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch:
+            result = True
+            break
+    return result
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..12eeac88eff9b026499c46843ea18c86ac2fc9fc
GIT binary patch
literal 33453
zcmZSn%*&NH<x)&C0~D|@FfceUFfkPOGBYrwFfgPrGUPBY<T5fuF)}cM_)H8rObk&>
zU^ym+9A<_nW*D1=A&LdYW@U(C1GAYKa@ZMiIT)fi;QBckqBy~FObj_(3{hM#Ha9~Q
zH;m205XA#y^D;#7!q|KaQG75qKSLBhj4i+rB>-a!GDHc&*g_0ZLNK;4LzFN>3JXID
zD?^S5L#`-8lqf^47(<j810zV3jUh*zAy<MSN`fI*k|9cxAy<kaN{S&@njuP>Ay<YW
zN(Q2iogqh-Ay<weN)E#3V91eY$W>s7QeencWQbB^$W>y9Qi8~FGUO;T<f<@4sW9ZK
zGDN8|<f<`5sWIfLGeoH~<Z3WPX)xq!GDK-I<Z3ZQX))w#Gel`K<mxa)=|J>zG34kn
z<mxd*=`rN$Geqe#FsAY_WEn7|8ZtC9GDI0Mq#83MnlPlAGNcMJq;NAdGcgn$WK7{<
zh%#fyvjhodnKNWrFr@H;)EC`hOyL7d$w8%3_!+X97>d3yrU-z=*%(p;L5x%hhAc~l
z6d{nVC@Y3kD+Zn-6{Zwnur_Ok6cGjmu_!BsJO+joQIM>7lnq0w8H8oakjlo8rOc3J
z$I#5ckY&%1BF2y+4ssfZEdgamIWRyikpx@f$dKyDkl(<R>IinP6iBdW2AFHlkRk<g
zS2Ghslp{l)C_{=gLkj~#loLa$6Ud4vM}}x8hE#rrEN6xk88E{IOu8~Sf%Le6InE3z
zvS0>^oI6;^nIT0EWMPyCj4Kc3dNQOaFhqGVq$n~(c{8N)GGzHMq$q)dOp7^18SDyQ
zhCEJ&6cs2tMU^4dk0FhbAw>-&(#*gR8RgHA>JN5j07Hs8Oj-jj9mtTP3F1TrF{B28
z)de#|2Z3TXMT?<@ks&ICA%%${SVNnEfg$t%|Ns9r7#SECN(2}f7)tXplk-zj<8v}g
zQi~FEiv1u`f(#4{xv9m)iRr2FX+`<D@oAYkshJ>M8cZOq+zbp1@$qG;Ma7x<dGYaJ
zqg*nJOL8)kTq}}O3raHc^E6mNDmfV#7>X;4lk@Y^GSf@g85kI%G7H=?b5ct<7#JAR
zic?ZS_LqQ^m84db#FtbSq?WLOq%w0#Qi~wY5oKUt@XRYNNzBPfO##_cl$lftwu2dD
z2goGf)RM%M#FE4kkkfr#LmXWkLmcDXJbhgK9DQ9&#2FYE!aZDFed00XG{AQAFfcHH
zoaJATT9jClUsM7TNY2kIOD!siFGwuO06Wn+I4meNF(tJK#tSb31zZWptImnZ8L1`w
z3=9m(AXZ9zK~a7|YEemL2_FLkLwagSJXkzFDX};eY<f{@VoH2!ML~X1NijHNN>XzR
zQZkDmK@9STUw%<;VoqjNYDyR+sKNdS%_}Y~0O^7YyA~DY7nOo^6jT;e!s8_~FD<_m
z6ki1erJ!OtE3qsQ%+IPU1qEDkP9~U}SpcSz3rayr0?B~9{FM9>uvXP#)#6N$QDBt?
zm8GDxpbIAB!K7X(C=7!A9i2Q&LGh7XP+5|ZpQj717eI<Znw>%QLJb4BQYc|yNM~ZG
zWnd^_WXNIyCD3L@h9Yf-8U}_eW`-1IQ1)TWgG;l3_(fhYX;u&yNtzABPhkgVtbCXv
z4v-*7Q3@wR77IwUnUNt_gNuQI!4K?@<N~l;11jTPT%AJQ!5&E|<pre`&k&FJfJk3Q
zA0K~buy}4MC~5;L<3s&Co&8;0<AXh;Tr)wz3YIP{1=W9$G!L>M%rz)JIMmI}Ga?A2
z29XB986mzbu?U>X6AKDb^HNGcO0x1Z^B~C`6p{srMJ2@=U^78PaSj6mgML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo>)w|LB${T9yW8fP}y}zAQB_CBH~N1(JL9%QI3_bMy)-OTbw?CABECEHyqcDbpI1
zk3q?Ufsu!ipHTpeMHvMcORE?d7`Qa-18nkg?V{s!W3@H8bV1y*JiC|_ZIFnTCYJ_S
zC<#eO(;lL%pwcd;TstO3TO&pf!qC)$nvj$Ul7ey)i$ENRB9Mw0z4DA46|Pcqa;;b4
zDh9=LOtF@-Vsu<gQA}Q}R<SGt14En!SWH7HI!-B8Td5`{SX)ywrdV4;PfJs!7?ik`
z6(Om+7*uq?IOX7Upq~s%>@W;Y@Sw=8VPFUbN3I_vPC*JvKtw)-KQM6&@{3JQVs27O
zqFpQ~f<exJdjM2KfIT40zyQiTS@6ur2&#*N!R3@6#Mc@i#o$7$D77FbF*&sal;87<
zOF-hqsRdxa2gxxoFbtr7gXBTg7R;Yu*ZSs{=9Q!tflDcn=RvM^0+mu03=9mZ44_79
z3In)qWdgNiL5&7xP+0|HfZKs7%-|Z94b&_I39>T;1#5unFL*G5j06Xx7^wOMhh#hh
zLneg52x?lwQU*w62`Eiw<`$F|rN)EvVllXI$jMA928SV-SDc!YHh|#>uDavnGxIV_
z;^RR<R}4zx42+zN$)M<lVX&taL1~8xntW;)8Eio1JGjKJVFDM=DTtf_(io(|z`zis
z3aZvYp;%gwl30=oPF+E2AVE-)1y#p+iMgpIT%bs*C`ru&HA4opv;;XlF(oA(l(-;)
z!ONHoice5k4w3{1h9@X67#Ok`7_t}{Y8XNOuVrGWFkq-*VsMGoV2EL2sAXoTWnrjc
z28S3ELpB>jktCE|!^~h?D9KPL$q<e$(7;)(Ain?{c;Jc%9AZJ5pa9hZg&nB8$p)7?
zWdoUdK=E3XnwwvinhgprP>eD#3NZ>Z@<Y-ODEvS{2M#hNP>?Z#Lx2Gs8WJFOEi*$N
zxOZ5~3<@jc3<UN*IG6b4=cQ_Z3<HM)IMJq+=H!4=4oDc3jKGy}QEG8%PRT$92{*XG
zo0k%wo1apelUj%f7k)-gCN@Y?0=XH4!QnC+5-ug+qy$PO@(d7m4I_hOEfYgt1t@`m
zG8+>^HakO+BSQ%@s06EFWDsj+WN2apb-hYh7_wLq>OfkXnHXxBKtWu?#1PL0lFMQT
z6?mWq88~&8aDYO*nGw`P%VuFHnhxTourNr1G;o4UtpW8lK<VDE6jb1r<|QWOq$-r;
zE2L%Sr6{Dr@~c8xevyJ|F}VKF1NSX5K_xJ_c?M3)#g&j|F(gciArT7-DbHL`>lfVU
z1uM+VEdV#DbMg~Y;!`T~5_2<?!DT~yJV+?DC_Ww%&&35fnI&K?IjMP&7EXLYVsbX9
zn-h;nDnW*zEMp8JWCpgz0=p692WY~m03{3&P%weoUrhXr!i<uPoQy(@LW}~8ej1>x
z1WxDi@t{;59}f)$NC?Kq2dRVn1nLF`>4R7XAi@Mh*rE6noE7Na<P1_~U|>iB`H+i&
zfq{*YlZBIolZ}TR+`9?~wM#*D4aoBhplkrHro|YMs%g-mk|cOIi3vQABn28rNM!@1
z)D~ujD0YTa4rnzE8v5V_b6G)^JBZ5#=CZ-K+zhEa3@Pj|E-yn02Z$ZT2Nvf9u|c}{
z8B(}FY|z+|6lnYe)ZG?jNZ|ns3NfVcf*HaLDSTjt2zVqyiXnxcp@j)Fe3T*p78e5z
zPk`DF;-E1T5JQ3?MHnn42^uT`iGaP6A_{JANQ1^iK!P%$(GU<r7HqNvSXK_y2$2SL
z?;Sv`V+92T1?QZ^;$l!HOe)RHNl{45OHqLK2oyjad<Ag$DuBBA#R?h$t^o=rM&_D&
zTp+FByjcn=wTm+njZDpwL7@-o$;0clBa957Dy)WqA)WzL9Do>%;L?VHA)X0T@}z@{
z@OTzbQ37SNg5m|rW@9K}XUO6Jja`8Ba)Qd86aj{84u+y?P?UiLxk1BjAO;Vpc*^1h
zk@0*Cd9I8l{0vzFAT7;|;L4MQq39t)4GTk-Ajl0MK~{zuR)!Qd21$^9ZZL<PK{87S
z6sswmpw=u%f(I<Y1yRKWG9O{feXt9K8L~v67J=$&HilY8h7wV9+lv($OT<8l0j035
zVPhz=X9W3Em?2A?p$6P#1z8IzG$8@RM~u5cn$X?K3QBX5St6hm*9<X>1?(L@22@c<
zQ1GLPvN5CxFa&FWh7d}fU}**v`JQ>1C7FpinZ>CJiFuGDlb4*TP+FXsm#&bgpi!2X
zlbNCkPB@?<2a;ky8o~Wx@Yq3KeqJhgydg2K5<E(fQkt6!8G$g+GX!_U^K!vdSsu7H
zfQ%^Uf`yXuN<n3?XCBxh1&|#I`9*O1tQ1s>!0Mnw5_(`x5@cK>vB*zD0@UyUCD`K3
z^gM9mx;P`hG$#c#NRpXW2`(+cSpqcB1FEzFBEwvRz(r0$B}fdE$P<$?!7Yl!qU4Mq
zMUaW0+>oAHl3bnw?nb0!7J*zA1S(L$DnUH340MbPY!4`Rfh9OW{SY`0G_C*|q>2x7
z4GQ-3_lpm51>2vSSdt7Gc1kbGFD*#POfCsh02S6oAQyn#3aQUPRU&MlD?Z3I2;^e0
z-HA!Xpf-*MD6fLsKtaAB?V$Jt*N0`PMW7%6H4AgWt_BSl1$m)V1@x~4Ky}mvP%Qv*
zCj$#7BM9;^f*?O5517Z##Lvja$j`{jB+1Cj$j>Cf2;#Fb@-nh9N-%PQWEgoFc^SnR
z#Tdc;Fi>=XLIK=#Y6mr)z^(8iNl*a+Y9ui*h}SZL+muY8Je|S}ZlN=PMy5dJ2NS5Q
z0=3z}gHs?8@DLSL1UxncYPB<fnp0V9AVX7FK&478E40wcVh3f$8b)w2$qdTmX>1H)
zke*^GD8#`fEhyhO!OQ2O)RNMoJcUGfVuzH}B^jv-Wr;<Z`K84Q$@#ej`FW{%CB;Y?
z4-}uekn9Iy>Ou3A2m=FyYOyY8Bu^Ji>#7!m#!$emh9DPE$^cavL2e+HJBaWA5k4RS
zob0?o2?G?8khBEWfkiR6@c<_1pLRg$dnYLE2!WajtelJjOl;uRkr0z8sCxkl4^Y<v
zltsX40n`?Pw41Xa1wJ#l*oQ<OBeY2kX(NNj4nYR^f&2I1av%tl6@$RR28u**{sL#M
z%wkaX29J<HLJOo294KId?jZwqRBA<LaY^whQ22mKL<S~lNbUe}K=GQ)z{F7O$H2f)
z;SLT31_qZ{8&GzrFb4A(!JSl4k5wMb2X$ISKs{D?x=v$e2xBbNVhAskVhAtf!tAJ`
zrWd3pH<|<}`UWVZK%r5Rm|lDy6i%QPH3O3XBM5>^63`GR4+8@OIQ3L9GQg4uw$zit
z2o5GzFv-S{#>6023m)mN0kN3DEeZ}$$pR`+SQttm%^q;t>z8J%h3Mk~6&xT1Y@jAX
z3M+$T7B{FVlfn)zVAvT-co@<d7;4xVTw;Y7YB?B6co}NIBj0gM429j`F$PYC8ctCA
zAe(`q=m<jzA43U0sO6K+%uvh4kjDcR0S(84r&4RV87fK{YPc9&Vsja4c^E2#8A=2}
zMImTdf(L9ZFUVC{LJT$FX~BLShFWmTrG^h|A3sBhFhdF_Lk&MeGXrBSH$x3KLy<mX
zKpq1)MFd8K7v5!HDG_1F=3*%FWMpJyEWFDQQFxajyoQ^hxPY-l6x6Iv;Rf5u1u_!R
zX9bOY1V+?wGX!h!f(P<J6(P7hD+R@iYOx+@C|eg)m4O=@r6p;)7T_YV2r{w{>PYB9
z=TpGqkj^J~CIB`$1g<_oIXFKls}wX82y1_Uhvak=l2VfsON&z#a-p+M3Yo<UxtYbF
zMv;|5PJVuNDyVr4>fM4$8yy93K>%(?g9#1LP$13%BnVW{27$_5aIOW-k0lp_C!Eq#
zOF)xGsYO8`PnUoSIncZk*irE?w*&>jng=DN1v#nU?rvsYNf0P>g1AAYIk=U=$-ux+
zkYAix0cs+EYybR$)Vv@rkY-S-_fD;Z^sqr9VTn1VsbH=KC<8!>G|<2jxLpHk(}3Dj
zU=AqY<5Mz=z(H7E1e)L|0uKgPrGY0wP#p`FDK7&LN@apO@t{x#83r2C1G_yfuQ&+Q
z7Y8d%%L7mF!TbuImjqc4mP|?mQ{@9bHVSjzHBb=(>R*G3S}{g0Mt(*iMt(*yMpZ^0
zMj<91Mo^Q58C*euCRNxN`51W_IT+a(*%)OYV?Lmm02R&P;s#WwL(3HK=y4V!mNJD2
zG<{YBZk~X~a#%p!70~1txRKJY!BES}P{PUpYNUWgYQQsTwcrjIq)SrE4$Y*XksfwX
z<_iXoCi;Q16P}y~o?itk0_QpKyec9s2PJ}%9=NIm_3?vZKwQwILlCG=1t&mI3m4KF
z0S)yAWq?$qf`~K_kq;sYKm=%b44k~6Q`F#!0!+}oUJZ(4U|{$Hie}IxF9Rbel0l;}
zqKrbQbt^amL6sc7)&_ViE(JWh(k})bhs$CEwHZMb05ddRYM2?2=U$2+?R!wS1Y2_i
zTvULaiB#KyvMwZiK{*Q?bYO!1;TO)p!0;CoexQ^N$|gdLqL8EyDyl$rF*xMJ;WaIM
z*t~{`p=bdpY_ga@;|8FSU`Ej3g94~E!ptDgRLcTN?4S(80?HH3kn!U{h7uNrS~gHy
zzl0UUC}9J)^})FTH1x^DP}B?>rl?_J$YKYXoWjf?DPGGC(viZ#P|FUghiljw#6c~7
za35P7)O9EZXEY8_dmj{89561pn_tTbs*^$U(+mv7*FfwVP6p8E>3vXD4yuIJK<aBa
zKvF3j4C0C@oZz|a|Db9VB+mvixRwi)cWby9#A_JA9hMsSd^R{gKxQS&!KJAJc%?@P
zs3BDh%3-`<k_$Y>3ZBU?231YGT;Oa99w!X;aCLI@a|d-H13<L^sF4hsoCei3Ir-(O
zMc~B^FjWDOAs+sI;oveIRSaB0!-QO1LmWMQKwVl;F$V6)LT0o;gTWf0I0jcHko=!m
zk{A>Q%HfqD`#~MH;*8X!#JqHHRR>z$5ucb=l3ElG69#2EC_5hFd9Xo=Md`)hsvsFs
z_2i_1g-cS4a>2<QOwc{8gM+W2C_g#1xESUG7Dfh!VjWN<fxECgjG|0J;1PdNhgO`4
zjggCymx-T|AJna75(mrhL1sxnu>!*2?9l`2(t?-NfriW^zzt4DPyv$1z)&g7Py!x<
z15LPrhw#Jm6d71bSir3>KL$od#u8Rgmlf11g-#7HGDLvddf*wVEH+RksAYjRS8Ko-
zC5sc3MVc8IvbYcp*cv8q#}+jF56ZZHrJ(s<q}3`48HvRi3W+)C`9+x}8M&ab8*oy!
z1y>r0#mSkOkQ4!Lpnx>QXJ_U?Mp@EROA<>;AT0}!OipGJIQco2lz<lmL0Tw~@efdH
zOUX=6EiM5!qCkso%uK*3v$QCuI590XKFQ1^H4oId0xKvgE-A_^05c&=lE8HyIBf<s
zfRbbvC`p1$1=*Zh1a6Xm(-D}Ue_{fam!QTU$T>=&R0L`bf);1+Ffua=Gx9QuFbXj$
zGQtOILAeQ>R_Z_=VE`33pmK^4wEm_9+-Lx`5|}_GXft?b7F4`3f(A5dSU{;Gg^?i*
zvM8s9kpYq>K!cf}M8(L^uL>$^E2KfDy2J{Diq#rc(10$aNx@hc%McD}xPxadK_!nL
zs5Qd?DSbexB`34E1l)iu$&UxOOA+m3aM@OrngeR721$XO57JPaUsMtVYK?+*m4g>z
z<(ES$Ls0txsw+9aD5V%Yk5ZHhVnY^lfeZkp32^#@L_5R;aFeqrzZ@K^V1oWp3u>u@
zT@w#+vMwlkK}8)XdZoc_41PvlNYsLaL8%fPwV;MbIs<qNoDn>k45{G2>o!26Tuk7;
z8#_ZqF({f{Vza@DI2dX<L1XlwJ|d*;Aq?sl)^LFqO*Jzx)N(@`9w|)Vf`t{-ooi-f
z5Ub^309Bsgk^34>P)o6v7gPddfor=O9#HQPnq~^M8N#7z!5v!YbRs9%KyHwx8ctAM
z-ptIvSOPbe3sluYl!DSKc;*pmI47v-+YDJ!91L#RK$dhBC4mbQ)nZ%KV(^?rkgKzQ
zkPEo47}O2Q$e^+^2$Y+HK<!X)#Q^G51x*1-!dp?`)RUfCQk+?p3Qlv7QJw`LMbkh7
zVW5DA6c3;#47lLP$xH%ud_dh&&`2?8<rFB%76;7&rCCsh1$9k99i$*|i*_<d7?c+h
z3xei?*r0kk4N~0nf%u?Q3UUBA9fAq^Cq|HOkP~CE87MV^av=jF8>kz@C=BkvfJiAO
zQAS}#X-EYHN|m5aCOBn+TKgs7LMH`W;(*$0%nbdGpwXiWb5P8?#Oi}nBe>C4!VF4#
zp!CKHN*kb5QNs)_iy(X^2F5~plp+PxSb?lXDlY{u_AJUTNmWn<PkE^pD`e&=fIFU$
zp*v8$369{Z%mPq<6WsBP@(hS~adq=?3~_aVL}z|_dTJ4PC_W`MsWctT0tW@e6i^`p
zSzWONlq$g8m1Q6nC@#UV1t#bpWuQ<8&uPS0Wfr)Bq6?Jv7#JlOg&Bn*#Re#yb1^V5
zFoTBtKCytO?@~m-6K<lQwMn2A1mI$$go&Y@0lXZUk)e$Nv`iUNJAh{VK{W&msQL%3
z08a-uP+36*Njf8_0w`f&05RA>O;!+tgCS25+}dRYl^P%sHqZnsh`|mXjba3iUO`&j
zps^!1P+<j{>f!(;56~(EF3>1fGZU!HhzFMzAVF?WlNl<=#n8b3N-vVN;NdP%k;e^E
zoy7wxEyQZM7*cpa<62_1+@J~B8ZK}d1}ZUm87jOPQ&bsTVx1X5Ls@(vlR)bx6c`IR
zKubtL2J<mU*7AeK*RuE+viQNHTZ{}v9E=q_j3vC_NkD#3A?OnOgCT~Qp;myQR*<1q
zh@s*cLyZuFOYA*{T4B&Y8b~c418DF}fT2bh<V#TDCIT~9n4v}lY&H`^ttdkYTwDlL
z?AGux)QB=PgDc`%F;D@UCCX4E2GWuSuC*C!_&`(1pcqMFtPx?z5(7;rH#0Ku6eTg1
zh=UZSfbHxTW~dcss1aw#k^r~wBpAX|L>K}iK!GO7P$L2INv#9}REsFcnf)R#EmBYg
zj1WDANsNU_jNyeojNyeGpa2W6;bf@g2TfepN-|V%pasu&l;Eim0QnZ=;Ll7Ip$sL`
z3^jrv%UxpK!3Ba8L#;F@*lMIfqP5ZtHPT>TiGjF9lbKM0QyS#XT1k)*HBt<=0fm#9
z3MVs#*GMuHe`YEHPnJWQxC{&xIgofsfyN6cE*QZ^tAUM{W-k221X_X2%K(aSAqJ33
z!C_Y`f)p=E@db)UQCOsig2EaaDTTk7!V9yR!a;78WvBsfSOBGrG>8l0KrW~e1}*Lf
zrMVjB5<ysM5CW+NxeOe;C>9GbfT~!qgFqHzO$~)L%!M_~;VE*U3cuhjGbncD7{pTK
z8A{|C#8MPM!?<FgabOvS3KMWvQDAV1)dWY7EJLjvL#;eRjSNGUC};;mjVwcr97Byf
zs38a%kYz07VF7yylA0w!`y)VOP9m^WqXdeLepy7SNl^x;dl^vpf+}xF@<B=CJWx|`
zdI{tOMR2Hqb2X^lzzfO|;6w&-2?Ilx64*1!AP3YcfY~YxH431(X=Y+ztWjVH*3bYg
zkmy97?1s+0L8=PKY#XS009PNy1*yrIX_=`h3g9|j2fTy=GzOfQSE+!I1kD`4=km%k
zQu7p2QbGOB%skM9IcV+<G+e2WpQZp}gX<*3)E#(+0n`WpH4215MKc$uW5)n4jMy+&
z5JMK!f;52ZCa}XmzG9$zodaH48v?3oKz-R#P-g?Qgf%BK3Bt}v1nmt04?cj~XK9H!
z#i`)c0VPGH5C+CFfdbI{J7nQNQYKg}s8t2l4jF|6*#a8xPb^8q9Qy~goj@Z7VEZ$`
zn>LEU?BZllN3R%cpk8W4DtN^}Q4*y2Se{f03UZ`51W<S)xC$wmMXAXp`9+lqsTBpO
z$t9^NItqFDB?@WzrFkh3GYcw{VT^pFCTJ<BTK4n{4srDHaSZ}X1ba9Jxw?RT1Q|R9
z&C!Ba;=m>-tQ1sJ^i)$yK|5gFQ}ZBuQ>+v~?Z}+WB+vwdFsQ|mpI@TuS*#mST9lfT
znPdeL2esQm64OC!$aF7wt^=}2oeMl40S*l;u>@Xi3-$rN@Pilu3S~WH4}+WHV9!As
z-bDCX1GL%~ymTUHD#$aS#tOIr=II*%T8jZ{+BrITf?Mj2LCzjQuAsItNHjgQ1bw<1
zK6irDeFQc4GK)b?bC7e(6LYeIK#fyKi+(!DN>Ga)+{y>{B~$ZKipw)gGQb^#poJg>
z9Ux*I$X-w^rskFAf}$c7GW<|noLU6hjRc+`0k<nbomr55phy7caoCJT5GZE{MS)CP
z2_oRL#zE^D7#K7_%`!-*VgpDPtZp~RR*-vhGLy1XE5YVx7RQ4k4!oWvB{eOvG^ZpU
zoL#^jU6=@H*$SvH3Fm{BuPg=`3>sAjdleMJpxGKohXmA)1$Th6Q!Bw^$>1<A%FizW
zGg2~(iopd9xKIqr1DOPB>w<^ciVA|jjo;-UQSgY#QV<KY#1|}|k{1NZ{^;=q8i@vF
zF$VDJ_8^eA>0Wq&{RD0>`+!O?P)Cq~m4}g&Nr@3OMFU=c!o&t%dBVvg$|%Yx%EZM4
z8tLa^Vq@k7tKni4Vw7j(Wt3(VWt3wSW|RT<i9pjmsw|-C9C=0_W=ZhQ8Bs=dMh-?%
zCSE2{Mm9!KMrlTAW>9aQ2gG8OVisUz2d`_9V+741$S_JX3bRNuNizySdR3rR7lI57
z4BnvHVLK<d;hqKQ@`Kl`fMyREL4z@%{t_c-kgf#M>t_SC0J6Z#cA+Bd43KUXXn6wz
zXh;WCvqEN-!RsVJTn=#63GQr*fg07U3^kk#;D$6CgvHHJ!UgV_aWj;FcaMSw1z;j6
z5Yu=OYEn4BH8LM));fz9G`J0_=lMZ1&@~*ON#ABBhW<MowF02V7O0I4nO~L%HKl9#
zLCrdldLhu}#TxM5(pq7L@Dy%PyHyx8!z~F~^T!Kn+(R28Lg2}95y<4YC}>_9)P81U
z08Nf-FoFyd1Gk?UKr8#QnHh?*8EaUfBq#txK(e4FLmmUDv7W-uAPHKS$iz_8!C1ox
zYHCZ?iZkSKfkwVkgcv}aOa_Kp37GrA6XN|Y47HM=g@P%<poU8`10!h0T#BJWiJ?Y{
z!6g>l#I2DAwU;GpWk3zw8VOLd%ck%!V>rZn5E2^JT%b*}AP>qSg)F#<UMmL^;R3A?
zO#$~6YULR~>k-94T_ezZyaKp=roa#{!B8T}kR`>yQ>zFHrdlOX>pM#Z+#gV8s8I%W
zyy9iSD;b#>;^i5t4A?9Gu~p1vt`T6!QUED)iS1{uRbi-60nL@vsxp))GSsLtlz<z4
zMa!6KR2gd381nc*f?3M2=vHH>QDewbVMqaYGKx+y71o2=*&siwF-SsM_$iVMl0{t1
zC8}Vv!3}ay07)`Pf+C5FxkMeb-nB*zX*D}Yo{vGYsE--S0;L6MXj%X**HmYy)qur|
zDyRtx>H|rFVkAog<e6GcSXyFW$kJq}(PXGm2PIdKUM+@NZH5|ch8hh9kOTU_4v+!)
z3)B*BVq_@nV+JJ=Hin}8%pmV+f!oTmppGYKW8;425^aVo9Z=)8Mh#>rBh=Gs3|U&B
zHgz*2L;h{BP8H~0VxC$Za6oA>)X0KdTcpJTGFXryMV=u=5@ZIbm#M{2tIJTUhm@BY
z8ESMHBujJ|YV<(bK<PxEA<r0ORt+yh4Iju!pdABFED$FkN&#^OkS=gwLv+>XFcjyr
zf?^vSh0Tl%{o<gcT%*8{r3VVQ8hwyE7$K>%Mu{Oyp8+Jq$iP^`!oX9+&I*l+B6iji
zevnj(0!Tx@7uXa@26(`O@)~B48!*%ufI=M<<o{Seajpn51RCVv<s_iI4+?lih9W+;
z8hvoOQUdwAh>xvO4b<k(G63mGQ3j75Ff!H}GC&;)-U81UUYNtmQep_64ar~y&4y?*
zWEp`*I#N_Y8KoJtJSB%UqL7cRu$~DTSjOOx0w*F+8DfMK{K^b9Mj$`d8l$E)w16`P
zseuL@)KEc?JDVXRw<Zj=MhrD3;2bCqBC|}u<}xzWnu0xL%1~np@+Kq5GiESOVLekg
zXrZwl8#K9rBa<<Oo1xZ>A<v2##4rb!>E__#5;TS&2JUw<F%)^QL(3O#h7=8u^J*;^
zDv!c^VF9uYlw$-LN-SU{u_ZLefXX~`hKeZ+DOL<Fu{{j6RtzcH3^i5^Vzt%`HP#F@
zmf+1hli4yE7+7k|8B%n>k~XzA3>DEJ*&1sG$t+7yE_8`?W2m)dNYQ1ev1Q1z0+ZID
zG%HqX2j<u?6mhfH*fFH&LAhe)wRYf*Cw2@qHefLh2Ajf5Y~h8I*$OAKg@+d&WQWDD
z3p*l)^+7&jEIh~_kypu383FSs4@kJ*8KcUv1szBLsdYg0r~yb>tvN%DIYZG*_8N20
zEOH7sN!6NzTm#7y;dyclFuM;R*=+>U&6o$8XftOhdcpzKZwwlI1LZw?khvghOkg4o
z3^n!)#oyU$9Kh-s!S;#4Y69^7o-7v7X$dusAhV0LI7%ECQov~hvfHP|5tNSN<rym6
zKt^RbLPFaDJj!AX4s$bbT-icG+X<u`l<b^9=AkFMLI;j;kW(IVWHN%XNs1POS*<fe
zg%3lG0|U%#Ya-09aRw(fv{YR<ha<f3AxGg84$ue;csLl;P7wzUf`P(EhM~j>R7HYv
zpBY1mGpPOrvBCT5QUn=nL6x%*gKdpCNG8Rc!KTKHA<G5C0nK1CF@Wk>8HS=jPEh{Q
zhZ+SM=>w^A1r-q>6D$}cLCTpK7;DTJg2VH);gLCu6Pl3R7*Z@j0R$RU$Z`jTDPt1@
z11M%eDWJrIA<Gj~m4b#lB0wU65h<X>Yu2FAhdO2k2KZ<J^n?S2MCkZKNj`Xt05P@z
z?%(Svc%~_2mnRmbD<mY8Cl=+U79}JoWER7XfveY1$ShHStaevON>xZyNKVYj0qw=o
zQ7F&IOwLd!&&<gI$$-RDQxrg59)*(fe7H&A^<$vHkCe>h#1h!}1-L(>PzE`W05Xt~
zS*%c;pH@<ySOnT7kOFo#SQ*?XnDWd#uq3Dhp`(xq9t0^$1+AV-1odf?i&6^`^O7q;
z!}Xxy5vVSt#mylZnZ*jpiFqJrmlmg{D3s(YWEK~fg6yqS00l>8UOITtzbFy1X93hv
zhn`4*WDZgo=42+t=jY{Af<sXuq^LAiM*+kKI~3H*%E?U9FMteSfR|zyD<l@B!hHta
zMFScK0Bx!PIU73KprZgCYS2*tb+f<&Mxc&6cx@tL=^(OUppgX73`0q39!fkXRhEFy
z$%qHd_NJ!9XF|3^B!YUK$nJ*fg*y(W4-(ZSMU|lN0u5S$B0v{pm;z`P6tq|oyuSi$
zAb9_euBoY!rb2!m+$i{&6AGE29n%FxpkXaoGALHia1H<;_@H2<XRfWO#|76Hl98%V
z1X;;m23kc3iEOK6(0(MV1ZbK^J=G%tX`e}6PHHhCZ6_q;gU=Qz*25NS;7J}(!cI;s
zP6bCFy2S|zpiQ9(35X##@K6OP-J}+QSAfFI1@Ah61s}Fx2anniF%AV9e1Ht@fco&z
zK@pH3c##}<P^QQa|H@R*29Y4tAs+DX40z}aGzbPwrH}y~NJ<3{pcI3ai{^s5-3;K_
zcCZ3yq6Cj4q!d-g7nSCfg4W^aL)@m9RSrGr12h-~ntcSVYz6N{LEf=xTMAmk3Rz)+
zp#U^m1q(<kh2reYf&x(Kp^7x<1{$=~hYr1gw~3+~m7k{oO3kS-OF`p3pmQle<6WSH
zi<S$(lYUN>C8@fgJrS8Xkd&O3n3<EB0v_o|tw@dsO}&<ab_5|D2T36y*MU+7c(l<_
z&!AKQw6i>~q^L5!AU_kdy`rR|1RQ$F`FX|pIgtHK>7|+A(L&YYcxa%4m4Ft##;X=X
z6Nr^+G1yeln4BX614Af$J1l6{Ss^DiJu$fwT2jCZ1s#Rrd{8k5Di6{j!+xnyHN{{n
z;k#&yOF^jvvi3<YIX^cyF)yVUykr^8BClY7KjO>>4H<#`0P`zoKn^Sb@-S#iZy0FP
z7t}rA;c)N}XfbSr92^R&#R|3{KZD{8Gz<(%{RKs-X_*zJpo9f2Hj$%A4>F_(O3*Ny
zL7LM`Gc~}&WT1@;L0dqhVW8~e1{y&|4Dvw+^T6srn?TUloq`fL(vnk<0g%x>P&x#!
zm=1~u4Ob<A2+)XI5GYuKK;w7dp)XLi0M1fH;6)@srXXj4l444JUP(MSp~k~X3vhA+
zo#g{6WWm`iH#-Hy2d}a#&Mz%WP6dy-ftNXfhMP+gi$F_xKqH2rum&Yl&<G+}eP%H@
zsPd9igFqn@GzsLw?I7zxfm2*k1YQ{qvML^wS;4EHAY+!GaV)SA#U-G_WI)w>&>E2L
zwIBktegQmMn4Diw84oEbAVZ*__y_qV9+Hz%!4|-ebpm?`RA6T2rGtG6sz5+<8sKos
zP0UU$0fkF(YDs)*MQU<s38=*Z+P(}q)(M<&Q-VNiCW1ie034{`ilG?Hgd`C#v$!-Z
zEwchVIG2`_m=0Msm{pvg2et{cD>`T^$R{bFzyQT)W=U#paS&*LHmDdR1}dQ-QB$0e
zSd^L)pOX)2$K>Y~mw-wrh!i+<LFY<=*OEil*{8zJumXFqC_g7BDKR-4;;4+$lFS@1
zvnaQuC^c0BG$Mx>vjsaB6bg{@eZUR1;vi7c1?vF?Txt>6SXdcU0&-?jGPXJfvbq2?
zSQ~T@<Wtb95%8EVY=Jp=n>RST!OboB9sr0qDA7aGE0`YyI-LT%>K8o5n^c|_1X@WQ
z1X?2+lm#*$G*}x1I%y~fJW32&wh{zdaSe7lsJKck3Yrg62p;tXB~?(vCcYr80_-DD
zx&?DUX&O=@g1Mlq4@#i<1>lk3q-3z_{L&JTAY_k!d45qgDEWh;u?l1kIGH6DC4*BI
zC`wD?VLZ?vK6p(aNHI9+fS1gGmvY4iffvqzG-Sd`WpI>~XQURT1|0(>3s5$KS`JRy
zd8y@)$_E@Q1(nI*k!`RWLCylXAm}(qBgj;clR+Yo)Cg+Mffd3^Ua$vKAq&b<L1&jF
z1|0$gm@Y^^sH{l|(t|OJ!3#p6MIEdL0cXkd(o8rXDJ($&1PV(?(1Jq<+8lz6po6B~
z=s$Q43QlMy+5#Fr_W*fQ5VQ$Xh*5|MvRsXe3A89)h>0Ie^Dqj5_dtj;3Nr~X@-lHj
zH|g;*axqGQRfw{H&b<H)uk(O6fHE_H)-;05<YeM!2Ca?dVpIn2p5THGwM&49;RV10
z<)E#h0!;jj(u_*XLX2#T(u|-@fMSfiOoEI;j695BwM=4+qKwSo4W)vNyv#g|f=m+N
zA$Kt**cMVjCeZ#2PIeH<!z9EA*{K2Iae)^;i8G2Zax#iA%79i|vVdekW`p)_@G^q*
zg8U5fs}LhU6DOl2_|PnnI4_tj#0Xk0#ly_Q$j->l2%11(V-x@n|8syhuW~VRGl3_B
zK~qMcqz+z41=^Td0zOz1w9?lZw6r%1+&eB|1$8}3*g$JFn;D^tbyJua6q=bqTlgTG
z%bFP(5*a{)6D6QicR&@0AGqz8Qkj#PqzgWuE)ygQIfMgbDOe0LIR~Dc0_|gj)U}{e
zKIl3qaf2#D@P4Hr(98t57Kapwb3k)ipi~J?pY%_fpjKQwxMl_U4|4wA93}>aVo;`H
zVB%qt0LKY9ltDEDsJaJ-@;mr;1FYLZL3;|odwoHpmTZvG67-FI;FYwHwTqy&(;N(-
zCDY)w)3vPN!FD##NIhtbffY3V(O=G3%g#_4!&t-4kOf{42^ws5XRPG_Ezy8%=mRa&
z<Y54vNdQ@F$ps$B;{(MzWRD$a!UVi#8#D>S02&|yIiDN6GzqqE54!(E5WEzEk)ik}
zcn2eFCm(14q~a`SjZ~H}$Xu7${oo-SKG1R=s8%MB))L4XCGdLDS^=;bjG$#AH3Fcq
zkYW$e2?(`<40(ZIDRI!)8fdk+1ZY7NXwm^Z?*JK0s}%x`%w|c0mH~l=aD>6L5|W_l
zmMj^D9tMV55ztba8X?e*iCRI>&|}dia5%|=w1BoCGBJQ0Uc<(aB?lVdt`Pvm324Nn
zkPS3}!oUz15uPW=z)~U)9_D=v+HwdPp#e$NfR<K(3Rb*ZoIq*DH6p~-FWA%HFBsgq
zN9w|9D1dSTS{A|C90e_h3<7U{0_8DCOY|AYfaf4W3Y7XlX%W&GiZ96rHy1&<3EbiV
z*EpayMoMN;anK8p7Eo(0C=$dv$G`yE;ljXB3|cG?s-ufb;&V$fb0H^gf{xPyb3o>U
zPW}LKic1o63&8bBdTI%{_61dSAf@pjX|POcMM+U&atXMJ7z8?qMFW&$Ao(0Li5moN
zrhr-~L5z$H43NeKXm=5~#Q|<cK$;t%qo{%;K}sHjoC*q7a3KRe7!%TN2hGWY8+j?I
z#U(+?px^*G2vqli9RzMZf}6IGW)H}b;35W0(7&7k^%cP747ha*+PPS~6jaQBPSs&x
zgj9i`jenqO2vSXePBH*(>HwYFBgrVu2-@@ksxCk?#-KT8VMawpP<03{nm`pQs1g7d
zO`z}st)yiD<uk~^SEZmH4}8GI1vD^|o0*pi8efBrC4xrH@^cFkOEN)cF@d@Qknxey
zJn*_C&{0dNxrk8_@MJu=rI}d_?gl_Kf`!3R4i0EALHE!O(qv>{I1UP4P?#{Vz=H@B
zOyD2_H4woS97v=Tw3mrs;3R_AaHOUvBo-^=g3bg4^;#5?DitzIis8LxwD1W6Wwk*O
zB;fVSnZ@yNm!Cxn9#ANON*Pe7fP;q%l%HU=1GG$M23I94U=my(feK<KFc-Z2r`QM7
zuBd_UTdx7HK!wgLFo1S?G&3+17lPIs;84T_+TWhV2$==~Rehjs?98Ak2Jq}Uc>7$@
z8mOWy9<T%>17n^rOo$hJ5D<7V10$&3h17d2ph@i_HqaSBC7hs&4zz&sGgyxRLlzHc
zr#q+~08JwBgAN3$0q;=)TM2GO!S=R-iZJlXE6|#8(69@r^9xD!(1CH#$TMV&Q?C?s
zNFiJ`XzzDo5opVIVlj9i1Rf1~r9$9CHxv?cK)omMxHf1IA3P$b0g^)+zz6}A-r)VQ
zh-w3r)FC~3El`08ZfGI8@SsKb;I3I_9%uzp5GXBzJ3H|i`T5!4z743O2;T7$1Ul&g
zX-^YKFSvUN?)2mqrw4(`WpIuL6LinkV26W4?lLIxg3kS8U{q)10q>fIko=6oOl*w8
zOv2!{KIrf>aNY+caCqWg1*%hsN!;LxBG8r;Mg~xl@r1RQ!Q$Zb5er(Up2Y}ixIs3Z
zf);#$W=OfgiMRrsh{0zzz)~0&sOeU`3?u<EnFp+H8Q2&ekTE6TvkVvumw}q#NIRiG
zwYMrH?PTVG2h<?@RS?YyY>5LcHGofa(*Y$DQ0fc<Z5l#qii6TOIAXyB{bLu@ODxR;
z$L|YJ{DKlcD1Je43OP&|)Vl-6C+G}bP)7n>SgmHF=!lIJa0w#@YJszZPm^F_DB%FL
zw?W(BVIt78dcb?&K@Dc`!LFc5Ms{#H!Ufv304fhTKuerJEq3s-rhXnK(6(MqP$>i1
z=GHF{-Z#YoYCeP1bAuLf*KmU>>RKM?9;zB1&|U}0EI!a;m=rFsQ+Pq86zB{OUdS>f
zKJfA;@X8_3GNm_Q1NcGnz@T+e5DUQ@^Fiy11VL-#Q@BB`V(7XeA@I5)(2fHs*t&8a
z21!sOS{T#}uMuIeDYSq$i&H=?;0hbY8cxvC>}JrJFM5o%qM&UCSu6~-V&ElHVxaZz
zpsN9<G1iEImUHLvgVsfXmW4z1H;aRJR)~WW{1H&wKZOspw*awF1GLdV9CYj*Xfe!9
z#=?AXgIxfmNU~NK)YeZCV2~`5WGayWTMb?!4_Xp009o-P$pl)$BnVQEWT-G`$(UqO
zJ|jpa7Xvt0g+OA>OyF*d1bCSVB*eh`1t9AeY6L;6o<LjMq+rp)z>p;kT8stS_yEx>
z4V@yckp!>!nG1G+Fv#0b2Ncd_D$ED@1bJ&CXiO8i8v#o9IM*nHs%1iRLwKi#f=)ut
z6lP!mPo?PTm4eE3=<J|EDrf=&G?xl)C4;uxf;;=vo9NL19nFSRg`w46h_$%jvmdxY
z6&$vn52%@jJ_ZkJQU_fH=>Q#~fi(0D8lDIOjekSN9&Uh?fS2fkhPyRDWe2!{3a;BA
zeUgJ9CE$(;Xn$nTR}l9bh=7lW27L!{aSn#U$3cUBfYiZ9K!X@Sr7gI(!vtb6g9y-$
zZt!?y5G#n=H?Tt>L7|}YDL@4-s0M-cMX(OXF@t(1Lf~G96q7Lc6g5sJP(Ou@k(UMc
zkQ?~OXHcpGbtu8BQl~M25BP5ZuS!i}0v%!rDs5qvGN|pw3~pJ1PdcgvpU(*rWCaUC
zhf~<Wtvz-IG0=%d?BJpsa<&2!c(*F}sK|Z|CeVopoZwxe;O%1lyFj~DL5q=i7%EnQ
z){10tL54BrFo5=^@`AP%*7AYNaqt>cP?@$JG-OcA4_>Co2O3@hEn8&-4S0Z7oI=iF
zxWQ030bFTwfQB4EtLMIh)~tf|sqrH(LF5K+3<Ga61GOQbt!pMwjZgyK=hO@vF#&BR
z;sF_EQ#b*%laULwhLr`pr3YL=#V~;uAc4k47{P+f484rd;=HJbsRm7@2xz-mjR-^0
zbkL@+8bR>k5z|3SSwWl01VGgcxWHus6^@{h!|RMCLJV2LptYSTJfOlmg%4CZ*MNeH
z8DzI8xa<cni-oM1Wz4e$kL5sydBEF|ivKW{@PST_tYJb51cav{9SBG?i-Fdl*6@Ii
zzHA2fU2DZ*#({$eG{nUOUN|cO+R>NB1TMN6K-<%5BthX<BM#o>14=29pi&sb2W{nn
zd#Q)1L<(Gri-8gZDEJF|K<i4wQ@~*>3_IU)BJ!e}P|zSfWU)YUeqIUaC_T`c7I?oI
zbp9TA1~xNUp**otPXV-^AvZq-v=yiby1EA5yF^)K16^d33f?ACtN>czk_=j}kyuoz
zkXV#nnwy$eVg>GBW~Wx7t|<ZSbIB}A)rAz`pdLdpWWN!pHwvEd0IOF>Oe)ULDJ@Bb
zEK8{@E=kP=w;mA-Ccx7k;I2O0cc2w2$@xV^sl^5Pc`2ZoZ>V+P`XVzGzP<*$r3LI^
zxCh}L&n#9*D@p~Q>YSXBn3s+jf*@-^12)A9;2CuAQXL(I#FP}cVR@<La4SJeXNtgQ
zg2RMBhis+g7o|cMk7VYhgPa2DYo(TC<bzf#<>bJPf(}lBJ(`+Vl3A3h0QWEQRx5>)
ze1${>&|GYO5hxyD6M{P6wNY^6KyHV56%z0zpq*Txg)<<j0?=qdih>5n(FOU%#hFPt
zl?srP>Qgk~hJa2p%FNFLSyPe^UCWTD0P-}rItH)rNk{;VaDhhmAgg%bQ|LNiujHkc
z!;J%L0xg~aO<R_vg4a<Mr7Gy^D&&`Bq!yKD7N<fq<rih9XXYj5Kv$7v7AxeJr4~VT
zp)JgTc@mnCp<xYP1O*yB$}E9-3+x=Q6Lb_(bBa?Hz|-%D0TJ-JtXxRU6oFU!6oa)C
zC+31qtIR2dBoMfLP&EhxP!7uv25oKt?Way*U|^{QpIHJLatH4m2cMz`?)BF&fO~Gn
z;6Vq_aRe-&5*k!8LQeXL1Jx%rEDVyh%%Eu!P*;GNp_zd(iy3+{N)337J`HhR38+1$
zTCA^H3~nc>7V8IiyX$)Tx%q=P!+^IoL8d~uLG1u85CJ--4cx5;56XhFYJ6^D0c1N3
zNDizMJO>Ewc!3G}_r5^x1<iv%7t~oZGcXi`CPx?;xflf)c^E;PSh!#ZFM)<yK_LN-
z1$9R7Fi9;FL*;zXQ6V*uvYQzcwxDZ!Akz)t_()-5039%B3)&H0!vH?(FfSc6)lmc9
zl%2xDATAHO+6R2%82GS4R?tW_<ODKMM<*1tZM=pJ)ZI#EVvtN>VK8U5Nnr<BRl~xd
zkirVuXaYHhyM~Ry1yq&7Pe6m5X~PB{-ai38(*}Gj1*n2%fYg4VrM65AMaqmNoS;e&
z)TL(t&AEV50XsuHcn3!oH)vxDXty+I-i0097ywIvI#{4K2NUSblPnI<+G&uln7~yM
z=n^x~d>SwKJVH=wRu??N174)1TC8mdKJ*W~)JqS1Die6}K($y~wHVyt1r1<;nzhBC
zWDjaX*Dx@|3W8_tz(*!DGlEXlWJbO!1Y`-g0SxZqgJ+%f41z%O_uv!;Cg`5bz}Ml}
zfNIN%f+D*BP$C0)jg6rcw9>^nF%LAZ1}P^M@<4Y(<>waUWG3d7Kvo=@m>6in78EL|
z7J+jPcz6r4MyeFlwuheE2rrgEGZ+f0MG7VP3aUjKpm7vP1_iCD2&xBVP|#_JLEvRQ
zppXp$oehDs3I?8sAzcb?kPgr`Kk&IUkU34zj3;;o1mbeY1U@*ZgM>gWd{7?<909p0
zK_-j?dch5NJ0irHunmW<pjZGW2SzsVbT_C)&&y=MD8R@Co@3x-<OZLm%*iOgD8|Uc
z2u+*1s>PUlYC&^kkX3@<#9Rbc3z-B1MKr<gr(e($(5h$9U>)e>;ULfi5V(H}u32;;
zF4qN*NTy^Km4arN{qjq|O(*ECTTmyKv|cB8mI_py;qFa>CYXW{Y3Cwn2ocn8&&>w4
zs0zR%lgT;x#i`)gH^?Sc@T?nn3nysfX3$%Z9?)bPXf+k6*`opK5`lZ7;EDlO@qsz8
zIzQ+GD7hJd5|KHG0FBW>x~yp+32-0vKZpgY3WE$mO3-?o;Is)U$YGT}EZV`HPq1ZB
zn^Pc*O-hT3Qu9h+s=&!M4RW|vUTQh0_6h>+0Sy9g-2|=C0;e1>LHE)m2xP4mDEUT!
zmJkSXa&d~orqV#GD%coNJE@>)GhRjkMrlS7W>L@q;Y^~8LQDcokdrm}83mYx7=;-n
z7(oXN@-Pa6>pdApaQO)?pTUHm255a_kUc2WL3byBGk$!0N`7*Dd=PkDAo%1UP<a+~
z7NkfW7V)s#{(?Z0ageE4@b+EMKxa@9NGa&3Nbt;M5O_B+XuKi_e4Y>@8Jz&BlK@3D
zXbu=Wpbwtz3IY%R>w_c=Km@2)4-Owt7!Bx^TA(GZAnz1|k|G;38xtEN8<UVGzaT#=
zKRdr1CnrBUryLJACnu)>CmVkT=L=3wP9;t@PBtD<P99D(&_pr=Xs{QQ-@pUDZOq^S
zU(m5IU`7h)J{v~Rk<=xOpk^GX1p#UtFfmA^Ku$Sjh8;@{>Kd|u#tlF_MHoTD?vT^T
z(!rfo&>(%GAwxLmxEE&7J{8ba44^ul!6nuXeBcEOXx}X8*ku;bV0{X>ol;Z)-Zu+w
z;DFA$1D{#b3|{OZ2{y5Sp|F4<9JJe(8#K}YI=w1|13Y4Q8?2KTG;vk}UVQ=XfrA(8
zfVROhGBARi!Uh^g0Qr_3>^pwYxG?B26kDbe0nmh13KvKLXfzspIAoD6Qw;}nq&9{H
zG!|0J2x`uP2110PlV+e(EV;mk?{I@U&MA;#*>uJlZqV=t<R(|JTev`5FhPSE%`iFe
z0X8r>N$_y)e3%^gR2G<=6j*LIOb)yk7bYhSmb(s<69$c6gXAg_Kn_e{WXNV^C^BQJ
zZ~zU^xWrn3&X`USVE~=v!3a`O!^4oq!XO42uqojK2j*Mwf)5tZ(i3p7zhx|Z%NSk*
zjtGldCWgXWjNyg0pzeN!2PoWKVjVzdQiINx0-cPl4<4Ck1N$F*=@DrC3V4`G5^_Wf
z=wKZ#(7`5P(*v2p3tgDPE6PEeb|Fn(m)K13kTO4bqy^0+*m{!`4$yuq=$U6V{Gg}@
z#pP5c(9#rG(gay80Fr`QjiRY=DpTQ9B5h6)1C8fH+>c@i!e)MEWSb!xKsgGFrb2$^
zLVo7(63FNY=wMM$%cc~x;0)Xe4FY%T6f_Dz$8zW>Bqn9*D1b%|G!>xxgz(Lnf=vK7
ziowM!q!kP**1>ILy~LzUaEn3@d@?Cm41632sKJqvSX7>w2VS<X5mT<M8LttOf<%^U
zYpQ@XWExwTfmhlW6eNS`w8Rqd?v4rzvv@NTu$r{Q5@T?qrJx|$%mmCzODuu1K>J#9
zz~@zz=4FC<N{Knpeqg+6F$96l1zlqTYVH(Nf-4WO!N`^)&d)#=MRE#68>meJaR$hj
z5Jy5}K<y*2RwN0KYJ^P)39ug^E(diXKz;`)1skjZZtQ~gJAj)oMWAsS$jWsd1_lO@
z4?(y0g4X*$R`q}z$lw)ypd-)0iwZ!UM#wts)Z(C<pxO!Co}K|>Z2}S6pz3Hdyb{bw
zEJ@2R$^|zpic*6>YcGO82Tp=p;NTTIp1uL`0YR>yi&1xgw1He*oLU0DdIsEJfw~KF
z(nM}zRzBniw%p9T{37t8pv0uiVsJwe+{ghR#0l;ufD&VBG2{SQ@YDn7{t9pf4&J?z
zS`2XxxX}(u)sQwksFRMUMd{wkfi%nDOLO8u=LhwJ8a<#c3+VO}E=CnbH73xaQhr7i
zM$p1j(BYnJOrYsf(Bf9mVpdK@9&mF8)RjkI(5Vuj7QG0g2s7w56hmf7@WJB-FdA~s
zGAJ#9QXIJU1x;5#Ru`3k2dazZkUIU4m7|ag;=mVIf(DW;L4A180muvt6@H-Ym7x8*
zppEI^iwr@vDKn@8pT!EU6dXXyH9++=8;r{emSu->OE^H4SwNu!L!ko$sCb90aPoun
z$G}rTpcV(D?FDLufy2+)-#5T9#M8;gH9o}AJsACr5%4-4kT=2E0NmGr9Kixwo(Ar1
zl%*C0fs+I%$qZm>05|q7fubKYkI29XI{6oL$Ra1B7^5yD8zTp!2B_%=&Peg`X{9Bg
zYeM5eS&|{BACw)z(`)je1wNqu3}|_JX-Q^Iu^xy7F9?APfx{v-H!(8@d;oh8_*hI(
zz7GN|L<DD>oc#3k%)E5S1Rr<`&l8l}L46%?F%ksoDFuO6Tm+SaEC&^e;MFSN><Fn2
zz_%Ym&L9WH0AwN$)KLQGb<p+!(Ebs~rVVf_8Qdf11{nt`q`(;-<aqE_97rdPA0!Ft
z^njNe2Z0;dpspf#KS>a{zX!_HLEtd}P!S0BczSAy5BNYwNaG&7iUyQ`z)KOq-pxoX
zPAn-Y3i1MZ610jPQs7B~tOFIIL7<})!G{k8Z3LBEAoqdFN6_9-P@xC8oC#DG27!x4
z(0B#dU{FYaZafEh&C}h_KgiYDG1wI>73Lb`<R9!B6b!P&A4Gtz_zS89u|OAP2UUYu
zpv5pjpfifV0h^zcm6}`vzAY~Zyxs$xBS5hj6by1YXweWN4TD+qFV;X&Y?GT0y3NuK
z)V41M9SH>LjDhZPf|OPe77EEE#;Cz4z$nA$z$C`R&&0;W55C<HRMv5VdF+fLj9iRd
zOzKSh;B$C5IXM}bnb<hQnAljvzz1c6`XBs^JWQO-V#=J%V*eRHkc-oflZlxb05`!A
A8vp<R

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distro.py b/venv/lib/python2.7/site-packages/pip/_vendor/distro.py
new file mode 100644
index 00000000..33061633
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/distro.py
@@ -0,0 +1,1216 @@
+# Copyright 2015,2016,2017 Nir Cohen
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+The ``distro`` package (``distro`` stands for Linux Distribution) provides
+information about the Linux distribution it runs on, such as a reliable
+machine-readable distro ID, or version information.
+
+It is the recommended replacement for Python's original
+:py:func:`platform.linux_distribution` function, but it provides much more
+functionality. An alternative implementation became necessary because Python
+3.5 deprecated this function, and Python 3.8 will remove it altogether.
+Its predecessor function :py:func:`platform.dist` was already
+deprecated since Python 2.6 and will also be removed in Python 3.8.
+Still, there are many cases in which access to OS distribution information
+is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for
+more information.
+"""
+
+import os
+import re
+import sys
+import json
+import shlex
+import logging
+import argparse
+import subprocess
+
+
+_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc')
+_OS_RELEASE_BASENAME = 'os-release'
+
+#: Translation table for normalizing the "ID" attribute defined in os-release
+#: files, for use by the :func:`distro.id` method.
+#:
+#: * Key: Value as defined in the os-release file, translated to lower case,
+#:   with blanks translated to underscores.
+#:
+#: * Value: Normalized value.
+NORMALIZED_OS_ID = {
+    'ol': 'oracle',  # Oracle Enterprise Linux
+}
+
+#: Translation table for normalizing the "Distributor ID" attribute returned by
+#: the lsb_release command, for use by the :func:`distro.id` method.
+#:
+#: * Key: Value as returned by the lsb_release command, translated to lower
+#:   case, with blanks translated to underscores.
+#:
+#: * Value: Normalized value.
+NORMALIZED_LSB_ID = {
+    'enterpriseenterprise': 'oracle',  # Oracle Enterprise Linux
+    'redhatenterpriseworkstation': 'rhel',  # RHEL 6, 7 Workstation
+    'redhatenterpriseserver': 'rhel',  # RHEL 6, 7 Server
+}
+
+#: Translation table for normalizing the distro ID derived from the file name
+#: of distro release files, for use by the :func:`distro.id` method.
+#:
+#: * Key: Value as derived from the file name of a distro release file,
+#:   translated to lower case, with blanks translated to underscores.
+#:
+#: * Value: Normalized value.
+NORMALIZED_DISTRO_ID = {
+    'redhat': 'rhel',  # RHEL 6.x, 7.x
+}
+
+# Pattern for content of distro release file (reversed)
+_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile(
+    r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)')
+
+# Pattern for base file name of distro release file
+_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(
+    r'(\w+)[-_](release|version)$')
+
+# Base file names to be ignored when searching for distro release file
+_DISTRO_RELEASE_IGNORE_BASENAMES = (
+    'debian_version',
+    'lsb-release',
+    'oem-release',
+    _OS_RELEASE_BASENAME,
+    'system-release'
+)
+
+
+def linux_distribution(full_distribution_name=True):
+    """
+    Return information about the current OS distribution as a tuple
+    ``(id_name, version, codename)`` with items as follows:
+
+    * ``id_name``:  If *full_distribution_name* is false, the result of
+      :func:`distro.id`. Otherwise, the result of :func:`distro.name`.
+
+    * ``version``:  The result of :func:`distro.version`.
+
+    * ``codename``:  The result of :func:`distro.codename`.
+
+    The interface of this function is compatible with the original
+    :py:func:`platform.linux_distribution` function, supporting a subset of
+    its parameters.
+
+    The data it returns may not exactly be the same, because it uses more data
+    sources than the original function, and that may lead to different data if
+    the OS distribution is not consistent across multiple data sources it
+    provides (there are indeed such distributions ...).
+
+    Another reason for differences is the fact that the :func:`distro.id`
+    method normalizes the distro ID string to a reliable machine-readable value
+    for a number of popular OS distributions.
+    """
+    return _distro.linux_distribution(full_distribution_name)
+
+
+def id():
+    """
+    Return the distro ID of the current distribution, as a
+    machine-readable string.
+
+    For a number of OS distributions, the returned distro ID value is
+    *reliable*, in the sense that it is documented and that it does not change
+    across releases of the distribution.
+
+    This package maintains the following reliable distro ID values:
+
+    ==============  =========================================
+    Distro ID       Distribution
+    ==============  =========================================
+    "ubuntu"        Ubuntu
+    "debian"        Debian
+    "rhel"          RedHat Enterprise Linux
+    "centos"        CentOS
+    "fedora"        Fedora
+    "sles"          SUSE Linux Enterprise Server
+    "opensuse"      openSUSE
+    "amazon"        Amazon Linux
+    "arch"          Arch Linux
+    "cloudlinux"    CloudLinux OS
+    "exherbo"       Exherbo Linux
+    "gentoo"        GenToo Linux
+    "ibm_powerkvm"  IBM PowerKVM
+    "kvmibm"        KVM for IBM z Systems
+    "linuxmint"     Linux Mint
+    "mageia"        Mageia
+    "mandriva"      Mandriva Linux
+    "parallels"     Parallels
+    "pidora"        Pidora
+    "raspbian"      Raspbian
+    "oracle"        Oracle Linux (and Oracle Enterprise Linux)
+    "scientific"    Scientific Linux
+    "slackware"     Slackware
+    "xenserver"     XenServer
+    "openbsd"       OpenBSD
+    "netbsd"        NetBSD
+    "freebsd"       FreeBSD
+    ==============  =========================================
+
+    If you have a need to get distros for reliable IDs added into this set,
+    or if you find that the :func:`distro.id` function returns a different
+    distro ID for one of the listed distros, please create an issue in the
+    `distro issue tracker`_.
+
+    **Lookup hierarchy and transformations:**
+
+    First, the ID is obtained from the following sources, in the specified
+    order. The first available and non-empty value is used:
+
+    * the value of the "ID" attribute of the os-release file,
+
+    * the value of the "Distributor ID" attribute returned by the lsb_release
+      command,
+
+    * the first part of the file name of the distro release file,
+
+    The so determined ID value then passes the following transformations,
+    before it is returned by this method:
+
+    * it is translated to lower case,
+
+    * blanks (which should not be there anyway) are translated to underscores,
+
+    * a normalization of the ID is performed, based upon
+      `normalization tables`_. The purpose of this normalization is to ensure
+      that the ID is as reliable as possible, even across incompatible changes
+      in the OS distributions. A common reason for an incompatible change is
+      the addition of an os-release file, or the addition of the lsb_release
+      command, with ID values that differ from what was previously determined
+      from the distro release file name.
+    """
+    return _distro.id()
+
+
+def name(pretty=False):
+    """
+    Return the name of the current OS distribution, as a human-readable
+    string.
+
+    If *pretty* is false, the name is returned without version or codename.
+    (e.g. "CentOS Linux")
+
+    If *pretty* is true, the version and codename are appended.
+    (e.g. "CentOS Linux 7.1.1503 (Core)")
+
+    **Lookup hierarchy:**
+
+    The name is obtained from the following sources, in the specified order.
+    The first available and non-empty value is used:
+
+    * If *pretty* is false:
+
+      - the value of the "NAME" attribute of the os-release file,
+
+      - the value of the "Distributor ID" attribute returned by the lsb_release
+        command,
+
+      - the value of the "<name>" field of the distro release file.
+
+    * If *pretty* is true:
+
+      - the value of the "PRETTY_NAME" attribute of the os-release file,
+
+      - the value of the "Description" attribute returned by the lsb_release
+        command,
+
+      - the value of the "<name>" field of the distro release file, appended
+        with the value of the pretty version ("<version_id>" and "<codename>"
+        fields) of the distro release file, if available.
+    """
+    return _distro.name(pretty)
+
+
+def version(pretty=False, best=False):
+    """
+    Return the version of the current OS distribution, as a human-readable
+    string.
+
+    If *pretty* is false, the version is returned without codename (e.g.
+    "7.0").
+
+    If *pretty* is true, the codename in parenthesis is appended, if the
+    codename is non-empty (e.g. "7.0 (Maipo)").
+
+    Some distributions provide version numbers with different precisions in
+    the different sources of distribution information. Examining the different
+    sources in a fixed priority order does not always yield the most precise
+    version (e.g. for Debian 8.2, or CentOS 7.1).
+
+    The *best* parameter can be used to control the approach for the returned
+    version:
+
+    If *best* is false, the first non-empty version number in priority order of
+    the examined sources is returned.
+
+    If *best* is true, the most precise version number out of all examined
+    sources is returned.
+
+    **Lookup hierarchy:**
+
+    In all cases, the version number is obtained from the following sources.
+    If *best* is false, this order represents the priority order:
+
+    * the value of the "VERSION_ID" attribute of the os-release file,
+    * the value of the "Release" attribute returned by the lsb_release
+      command,
+    * the version number parsed from the "<version_id>" field of the first line
+      of the distro release file,
+    * the version number parsed from the "PRETTY_NAME" attribute of the
+      os-release file, if it follows the format of the distro release files.
+    * the version number parsed from the "Description" attribute returned by
+      the lsb_release command, if it follows the format of the distro release
+      files.
+    """
+    return _distro.version(pretty, best)
+
+
+def version_parts(best=False):
+    """
+    Return the version of the current OS distribution as a tuple
+    ``(major, minor, build_number)`` with items as follows:
+
+    * ``major``:  The result of :func:`distro.major_version`.
+
+    * ``minor``:  The result of :func:`distro.minor_version`.
+
+    * ``build_number``:  The result of :func:`distro.build_number`.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.version_parts(best)
+
+
+def major_version(best=False):
+    """
+    Return the major version of the current OS distribution, as a string,
+    if provided.
+    Otherwise, the empty string is returned. The major version is the first
+    part of the dot-separated version string.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.major_version(best)
+
+
+def minor_version(best=False):
+    """
+    Return the minor version of the current OS distribution, as a string,
+    if provided.
+    Otherwise, the empty string is returned. The minor version is the second
+    part of the dot-separated version string.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.minor_version(best)
+
+
+def build_number(best=False):
+    """
+    Return the build number of the current OS distribution, as a string,
+    if provided.
+    Otherwise, the empty string is returned. The build number is the third part
+    of the dot-separated version string.
+
+    For a description of the *best* parameter, see the :func:`distro.version`
+    method.
+    """
+    return _distro.build_number(best)
+
+
+def like():
+    """
+    Return a space-separated list of distro IDs of distributions that are
+    closely related to the current OS distribution in regards to packaging
+    and programming interfaces, for example distributions the current
+    distribution is a derivative from.
+
+    **Lookup hierarchy:**
+
+    This information item is only provided by the os-release file.
+    For details, see the description of the "ID_LIKE" attribute in the
+    `os-release man page
+    <http://www.freedesktop.org/software/systemd/man/os-release.html>`_.
+    """
+    return _distro.like()
+
+
+def codename():
+    """
+    Return the codename for the release of the current OS distribution,
+    as a string.
+
+    If the distribution does not have a codename, an empty string is returned.
+
+    Note that the returned codename is not always really a codename. For
+    example, openSUSE returns "x86_64". This function does not handle such
+    cases in any special way and just returns the string it finds, if any.
+
+    **Lookup hierarchy:**
+
+    * the codename within the "VERSION" attribute of the os-release file, if
+      provided,
+
+    * the value of the "Codename" attribute returned by the lsb_release
+      command,
+
+    * the value of the "<codename>" field of the distro release file.
+    """
+    return _distro.codename()
+
+
+def info(pretty=False, best=False):
+    """
+    Return certain machine-readable information items about the current OS
+    distribution in a dictionary, as shown in the following example:
+
+    .. sourcecode:: python
+
+        {
+            'id': 'rhel',
+            'version': '7.0',
+            'version_parts': {
+                'major': '7',
+                'minor': '0',
+                'build_number': ''
+            },
+            'like': 'fedora',
+            'codename': 'Maipo'
+        }
+
+    The dictionary structure and keys are always the same, regardless of which
+    information items are available in the underlying data sources. The values
+    for the various keys are as follows:
+
+    * ``id``:  The result of :func:`distro.id`.
+
+    * ``version``:  The result of :func:`distro.version`.
+
+    * ``version_parts -> major``:  The result of :func:`distro.major_version`.
+
+    * ``version_parts -> minor``:  The result of :func:`distro.minor_version`.
+
+    * ``version_parts -> build_number``:  The result of
+      :func:`distro.build_number`.
+
+    * ``like``:  The result of :func:`distro.like`.
+
+    * ``codename``:  The result of :func:`distro.codename`.
+
+    For a description of the *pretty* and *best* parameters, see the
+    :func:`distro.version` method.
+    """
+    return _distro.info(pretty, best)
+
+
+def os_release_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the os-release file data source of the current OS distribution.
+
+    See `os-release file`_ for details about these information items.
+    """
+    return _distro.os_release_info()
+
+
+def lsb_release_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the lsb_release command data source of the current OS distribution.
+
+    See `lsb_release command output`_ for details about these information
+    items.
+    """
+    return _distro.lsb_release_info()
+
+
+def distro_release_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the distro release file data source of the current OS distribution.
+
+    See `distro release file`_ for details about these information items.
+    """
+    return _distro.distro_release_info()
+
+
+def uname_info():
+    """
+    Return a dictionary containing key-value pairs for the information items
+    from the distro release file data source of the current OS distribution.
+    """
+    return _distro.uname_info()
+
+
+def os_release_attr(attribute):
+    """
+    Return a single named information item from the os-release file data source
+    of the current OS distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+      The empty string, if the item does not exist.
+
+    See `os-release file`_ for details about these information items.
+    """
+    return _distro.os_release_attr(attribute)
+
+
+def lsb_release_attr(attribute):
+    """
+    Return a single named information item from the lsb_release command output
+    data source of the current OS distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+      The empty string, if the item does not exist.
+
+    See `lsb_release command output`_ for details about these information
+    items.
+    """
+    return _distro.lsb_release_attr(attribute)
+
+
+def distro_release_attr(attribute):
+    """
+    Return a single named information item from the distro release file
+    data source of the current OS distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+      The empty string, if the item does not exist.
+
+    See `distro release file`_ for details about these information items.
+    """
+    return _distro.distro_release_attr(attribute)
+
+
+def uname_attr(attribute):
+    """
+    Return a single named information item from the distro release file
+    data source of the current OS distribution.
+
+    Parameters:
+
+    * ``attribute`` (string): Key of the information item.
+
+    Returns:
+
+    * (string): Value of the information item, if the item exists.
+                The empty string, if the item does not exist.
+    """
+    return _distro.uname_attr(attribute)
+
+
+class cached_property(object):
+    """A version of @property which caches the value.  On access, it calls the
+    underlying function and sets the value in `__dict__` so future accesses
+    will not re-call the property.
+    """
+    def __init__(self, f):
+        self._fname = f.__name__
+        self._f = f
+
+    def __get__(self, obj, owner):
+        assert obj is not None, 'call {} on an instance'.format(self._fname)
+        ret = obj.__dict__[self._fname] = self._f(obj)
+        return ret
+
+
+class LinuxDistribution(object):
+    """
+    Provides information about a OS distribution.
+
+    This package creates a private module-global instance of this class with
+    default initialization arguments, that is used by the
+    `consolidated accessor functions`_ and `single source accessor functions`_.
+    By using default initialization arguments, that module-global instance
+    returns data about the current OS distribution (i.e. the distro this
+    package runs on).
+
+    Normally, it is not necessary to create additional instances of this class.
+    However, in situations where control is needed over the exact data sources
+    that are used, instances of this class can be created with a specific
+    distro release file, or a specific os-release file, or without invoking the
+    lsb_release command.
+    """
+
+    def __init__(self,
+                 include_lsb=True,
+                 os_release_file='',
+                 distro_release_file='',
+                 include_uname=True):
+        """
+        The initialization method of this class gathers information from the
+        available data sources, and stores that in private instance attributes.
+        Subsequent access to the information items uses these private instance
+        attributes, so that the data sources are read only once.
+
+        Parameters:
+
+        * ``include_lsb`` (bool): Controls whether the
+          `lsb_release command output`_ is included as a data source.
+
+          If the lsb_release command is not available in the program execution
+          path, the data source for the lsb_release command will be empty.
+
+        * ``os_release_file`` (string): The path name of the
+          `os-release file`_ that is to be used as a data source.
+
+          An empty string (the default) will cause the default path name to
+          be used (see `os-release file`_ for details).
+
+          If the specified or defaulted os-release file does not exist, the
+          data source for the os-release file will be empty.
+
+        * ``distro_release_file`` (string): The path name of the
+          `distro release file`_ that is to be used as a data source.
+
+          An empty string (the default) will cause a default search algorithm
+          to be used (see `distro release file`_ for details).
+
+          If the specified distro release file does not exist, or if no default
+          distro release file can be found, the data source for the distro
+          release file will be empty.
+
+        * ``include_name`` (bool): Controls whether uname command output is
+          included as a data source. If the uname command is not available in
+          the program execution path the data source for the uname command will
+          be empty.
+
+        Public instance attributes:
+
+        * ``os_release_file`` (string): The path name of the
+          `os-release file`_ that is actually used as a data source. The
+          empty string if no distro release file is used as a data source.
+
+        * ``distro_release_file`` (string): The path name of the
+          `distro release file`_ that is actually used as a data source. The
+          empty string if no distro release file is used as a data source.
+
+        * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter.
+          This controls whether the lsb information will be loaded.
+
+        * ``include_uname`` (bool): The result of the ``include_uname``
+          parameter. This controls whether the uname information will
+          be loaded.
+
+        Raises:
+
+        * :py:exc:`IOError`: Some I/O issue with an os-release file or distro
+          release file.
+
+        * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had
+          some issue (other than not being available in the program execution
+          path).
+
+        * :py:exc:`UnicodeError`: A data source has unexpected characters or
+          uses an unexpected encoding.
+        """
+        self.os_release_file = os_release_file or \
+            os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME)
+        self.distro_release_file = distro_release_file or ''  # updated later
+        self.include_lsb = include_lsb
+        self.include_uname = include_uname
+
+    def __repr__(self):
+        """Return repr of all info
+        """
+        return \
+            "LinuxDistribution(" \
+            "os_release_file={self.os_release_file!r}, " \
+            "distro_release_file={self.distro_release_file!r}, " \
+            "include_lsb={self.include_lsb!r}, " \
+            "include_uname={self.include_uname!r}, " \
+            "_os_release_info={self._os_release_info!r}, " \
+            "_lsb_release_info={self._lsb_release_info!r}, " \
+            "_distro_release_info={self._distro_release_info!r}, " \
+            "_uname_info={self._uname_info!r})".format(
+                self=self)
+
+    def linux_distribution(self, full_distribution_name=True):
+        """
+        Return information about the OS distribution that is compatible
+        with Python's :func:`platform.linux_distribution`, supporting a subset
+        of its parameters.
+
+        For details, see :func:`distro.linux_distribution`.
+        """
+        return (
+            self.name() if full_distribution_name else self.id(),
+            self.version(),
+            self.codename()
+        )
+
+    def id(self):
+        """Return the distro ID of the OS distribution, as a string.
+
+        For details, see :func:`distro.id`.
+        """
+        def normalize(distro_id, table):
+            distro_id = distro_id.lower().replace(' ', '_')
+            return table.get(distro_id, distro_id)
+
+        distro_id = self.os_release_attr('id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_OS_ID)
+
+        distro_id = self.lsb_release_attr('distributor_id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_LSB_ID)
+
+        distro_id = self.distro_release_attr('id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_DISTRO_ID)
+
+        distro_id = self.uname_attr('id')
+        if distro_id:
+            return normalize(distro_id, NORMALIZED_DISTRO_ID)
+
+        return ''
+
+    def name(self, pretty=False):
+        """
+        Return the name of the OS distribution, as a string.
+
+        For details, see :func:`distro.name`.
+        """
+        name = self.os_release_attr('name') \
+            or self.lsb_release_attr('distributor_id') \
+            or self.distro_release_attr('name') \
+            or self.uname_attr('name')
+        if pretty:
+            name = self.os_release_attr('pretty_name') \
+                or self.lsb_release_attr('description')
+            if not name:
+                name = self.distro_release_attr('name') \
+                       or self.uname_attr('name')
+                version = self.version(pretty=True)
+                if version:
+                    name = name + ' ' + version
+        return name or ''
+
+    def version(self, pretty=False, best=False):
+        """
+        Return the version of the OS distribution, as a string.
+
+        For details, see :func:`distro.version`.
+        """
+        versions = [
+            self.os_release_attr('version_id'),
+            self.lsb_release_attr('release'),
+            self.distro_release_attr('version_id'),
+            self._parse_distro_release_content(
+                self.os_release_attr('pretty_name')).get('version_id', ''),
+            self._parse_distro_release_content(
+                self.lsb_release_attr('description')).get('version_id', ''),
+            self.uname_attr('release')
+        ]
+        version = ''
+        if best:
+            # This algorithm uses the last version in priority order that has
+            # the best precision. If the versions are not in conflict, that
+            # does not matter; otherwise, using the last one instead of the
+            # first one might be considered a surprise.
+            for v in versions:
+                if v.count(".") > version.count(".") or version == '':
+                    version = v
+        else:
+            for v in versions:
+                if v != '':
+                    version = v
+                    break
+        if pretty and version and self.codename():
+            version = u'{0} ({1})'.format(version, self.codename())
+        return version
+
+    def version_parts(self, best=False):
+        """
+        Return the version of the OS distribution, as a tuple of version
+        numbers.
+
+        For details, see :func:`distro.version_parts`.
+        """
+        version_str = self.version(best=best)
+        if version_str:
+            version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?')
+            matches = version_regex.match(version_str)
+            if matches:
+                major, minor, build_number = matches.groups()
+                return major, minor or '', build_number or ''
+        return '', '', ''
+
+    def major_version(self, best=False):
+        """
+        Return the major version number of the current distribution.
+
+        For details, see :func:`distro.major_version`.
+        """
+        return self.version_parts(best)[0]
+
+    def minor_version(self, best=False):
+        """
+        Return the minor version number of the current distribution.
+
+        For details, see :func:`distro.minor_version`.
+        """
+        return self.version_parts(best)[1]
+
+    def build_number(self, best=False):
+        """
+        Return the build number of the current distribution.
+
+        For details, see :func:`distro.build_number`.
+        """
+        return self.version_parts(best)[2]
+
+    def like(self):
+        """
+        Return the IDs of distributions that are like the OS distribution.
+
+        For details, see :func:`distro.like`.
+        """
+        return self.os_release_attr('id_like') or ''
+
+    def codename(self):
+        """
+        Return the codename of the OS distribution.
+
+        For details, see :func:`distro.codename`.
+        """
+        try:
+            # Handle os_release specially since distros might purposefully set
+            # this to empty string to have no codename
+            return self._os_release_info['codename']
+        except KeyError:
+            return self.lsb_release_attr('codename') \
+                or self.distro_release_attr('codename') \
+                or ''
+
+    def info(self, pretty=False, best=False):
+        """
+        Return certain machine-readable information about the OS
+        distribution.
+
+        For details, see :func:`distro.info`.
+        """
+        return dict(
+            id=self.id(),
+            version=self.version(pretty, best),
+            version_parts=dict(
+                major=self.major_version(best),
+                minor=self.minor_version(best),
+                build_number=self.build_number(best)
+            ),
+            like=self.like(),
+            codename=self.codename(),
+        )
+
+    def os_release_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the os-release file data source of the OS distribution.
+
+        For details, see :func:`distro.os_release_info`.
+        """
+        return self._os_release_info
+
+    def lsb_release_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the lsb_release command data source of the OS
+        distribution.
+
+        For details, see :func:`distro.lsb_release_info`.
+        """
+        return self._lsb_release_info
+
+    def distro_release_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the distro release file data source of the OS
+        distribution.
+
+        For details, see :func:`distro.distro_release_info`.
+        """
+        return self._distro_release_info
+
+    def uname_info(self):
+        """
+        Return a dictionary containing key-value pairs for the information
+        items from the uname command data source of the OS distribution.
+
+        For details, see :func:`distro.uname_info`.
+        """
+        return self._uname_info
+
+    def os_release_attr(self, attribute):
+        """
+        Return a single named information item from the os-release file data
+        source of the OS distribution.
+
+        For details, see :func:`distro.os_release_attr`.
+        """
+        return self._os_release_info.get(attribute, '')
+
+    def lsb_release_attr(self, attribute):
+        """
+        Return a single named information item from the lsb_release command
+        output data source of the OS distribution.
+
+        For details, see :func:`distro.lsb_release_attr`.
+        """
+        return self._lsb_release_info.get(attribute, '')
+
+    def distro_release_attr(self, attribute):
+        """
+        Return a single named information item from the distro release file
+        data source of the OS distribution.
+
+        For details, see :func:`distro.distro_release_attr`.
+        """
+        return self._distro_release_info.get(attribute, '')
+
+    def uname_attr(self, attribute):
+        """
+        Return a single named information item from the uname command
+        output data source of the OS distribution.
+
+        For details, see :func:`distro.uname_release_attr`.
+        """
+        return self._uname_info.get(attribute, '')
+
+    @cached_property
+    def _os_release_info(self):
+        """
+        Get the information items from the specified os-release file.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if os.path.isfile(self.os_release_file):
+            with open(self.os_release_file) as release_file:
+                return self._parse_os_release_content(release_file)
+        return {}
+
+    @staticmethod
+    def _parse_os_release_content(lines):
+        """
+        Parse the lines of an os-release file.
+
+        Parameters:
+
+        * lines: Iterable through the lines in the os-release file.
+                 Each line must be a unicode string or a UTF-8 encoded byte
+                 string.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        props = {}
+        lexer = shlex.shlex(lines, posix=True)
+        lexer.whitespace_split = True
+
+        # The shlex module defines its `wordchars` variable using literals,
+        # making it dependent on the encoding of the Python source file.
+        # In Python 2.6 and 2.7, the shlex source file is encoded in
+        # 'iso-8859-1', and the `wordchars` variable is defined as a byte
+        # string. This causes a UnicodeDecodeError to be raised when the
+        # parsed content is a unicode object. The following fix resolves that
+        # (... but it should be fixed in shlex...):
+        if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes):
+            lexer.wordchars = lexer.wordchars.decode('iso-8859-1')
+
+        tokens = list(lexer)
+        for token in tokens:
+            # At this point, all shell-like parsing has been done (i.e.
+            # comments processed, quotes and backslash escape sequences
+            # processed, multi-line values assembled, trailing newlines
+            # stripped, etc.), so the tokens are now either:
+            # * variable assignments: var=value
+            # * commands or their arguments (not allowed in os-release)
+            if '=' in token:
+                k, v = token.split('=', 1)
+                if isinstance(v, bytes):
+                    v = v.decode('utf-8')
+                props[k.lower()] = v
+            else:
+                # Ignore any tokens that are not variable assignments
+                pass
+
+        if 'version_codename' in props:
+            # os-release added a version_codename field.  Use that in
+            # preference to anything else Note that some distros purposefully
+            # do not have code names.  They should be setting
+            # version_codename=""
+            props['codename'] = props['version_codename']
+        elif 'ubuntu_codename' in props:
+            # Same as above but a non-standard field name used on older Ubuntus
+            props['codename'] = props['ubuntu_codename']
+        elif 'version' in props:
+            # If there is no version_codename, parse it from the version
+            codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version'])
+            if codename:
+                codename = codename.group()
+                codename = codename.strip('()')
+                codename = codename.strip(',')
+                codename = codename.strip()
+                # codename appears within paranthese.
+                props['codename'] = codename
+
+        return props
+
+    @cached_property
+    def _lsb_release_info(self):
+        """
+        Get the information items from the lsb_release command output.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if not self.include_lsb:
+            return {}
+        with open(os.devnull, 'w') as devnull:
+            try:
+                cmd = ('lsb_release', '-a')
+                stdout = subprocess.check_output(cmd, stderr=devnull)
+            except OSError:  # Command not found
+                return {}
+        content = stdout.decode(sys.getfilesystemencoding()).splitlines()
+        return self._parse_lsb_release_content(content)
+
+    @staticmethod
+    def _parse_lsb_release_content(lines):
+        """
+        Parse the output of the lsb_release command.
+
+        Parameters:
+
+        * lines: Iterable through the lines of the lsb_release output.
+                 Each line must be a unicode string or a UTF-8 encoded byte
+                 string.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        props = {}
+        for line in lines:
+            kv = line.strip('\n').split(':', 1)
+            if len(kv) != 2:
+                # Ignore lines without colon.
+                continue
+            k, v = kv
+            props.update({k.replace(' ', '_').lower(): v.strip()})
+        return props
+
+    @cached_property
+    def _uname_info(self):
+        with open(os.devnull, 'w') as devnull:
+            try:
+                cmd = ('uname', '-rs')
+                stdout = subprocess.check_output(cmd, stderr=devnull)
+            except OSError:
+                return {}
+        content = stdout.decode(sys.getfilesystemencoding()).splitlines()
+        return self._parse_uname_content(content)
+
+    @staticmethod
+    def _parse_uname_content(lines):
+        props = {}
+        match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip())
+        if match:
+            name, version = match.groups()
+
+            # This is to prevent the Linux kernel version from
+            # appearing as the 'best' version on otherwise
+            # identifiable distributions.
+            if name == 'Linux':
+                return {}
+            props['id'] = name.lower()
+            props['name'] = name
+            props['release'] = version
+        return props
+
+    @cached_property
+    def _distro_release_info(self):
+        """
+        Get the information items from the specified distro release file.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if self.distro_release_file:
+            # If it was specified, we use it and parse what we can, even if
+            # its file name or content does not match the expected pattern.
+            distro_info = self._parse_distro_release_file(
+                self.distro_release_file)
+            basename = os.path.basename(self.distro_release_file)
+            # The file name pattern for user-specified distro release files
+            # is somewhat more tolerant (compared to when searching for the
+            # file), because we want to use what was specified as best as
+            # possible.
+            match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename)
+            if 'name' in distro_info \
+               and 'cloudlinux' in distro_info['name'].lower():
+                distro_info['id'] = 'cloudlinux'
+            elif match:
+                distro_info['id'] = match.group(1)
+            return distro_info
+        else:
+            try:
+                basenames = os.listdir(_UNIXCONFDIR)
+                # We sort for repeatability in cases where there are multiple
+                # distro specific files; e.g. CentOS, Oracle, Enterprise all
+                # containing `redhat-release` on top of their own.
+                basenames.sort()
+            except OSError:
+                # This may occur when /etc is not readable but we can't be
+                # sure about the *-release files. Check common entries of
+                # /etc for information. If they turn out to not be there the
+                # error is handled in `_parse_distro_release_file()`.
+                basenames = ['SuSE-release',
+                             'arch-release',
+                             'base-release',
+                             'centos-release',
+                             'fedora-release',
+                             'gentoo-release',
+                             'mageia-release',
+                             'mandrake-release',
+                             'mandriva-release',
+                             'mandrivalinux-release',
+                             'manjaro-release',
+                             'oracle-release',
+                             'redhat-release',
+                             'sl-release',
+                             'slackware-version']
+            for basename in basenames:
+                if basename in _DISTRO_RELEASE_IGNORE_BASENAMES:
+                    continue
+                match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename)
+                if match:
+                    filepath = os.path.join(_UNIXCONFDIR, basename)
+                    distro_info = self._parse_distro_release_file(filepath)
+                    if 'name' in distro_info:
+                        # The name is always present if the pattern matches
+                        self.distro_release_file = filepath
+                        distro_info['id'] = match.group(1)
+                        if 'cloudlinux' in distro_info['name'].lower():
+                            distro_info['id'] = 'cloudlinux'
+                        return distro_info
+            return {}
+
+    def _parse_distro_release_file(self, filepath):
+        """
+        Parse a distro release file.
+
+        Parameters:
+
+        * filepath: Path name of the distro release file.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        try:
+            with open(filepath) as fp:
+                # Only parse the first line. For instance, on SLES there
+                # are multiple lines. We don't want them...
+                return self._parse_distro_release_content(fp.readline())
+        except (OSError, IOError):
+            # Ignore not being able to read a specific, seemingly version
+            # related file.
+            # See https://github.com/nir0s/distro/issues/162
+            return {}
+
+    @staticmethod
+    def _parse_distro_release_content(line):
+        """
+        Parse a line from a distro release file.
+
+        Parameters:
+        * line: Line from the distro release file. Must be a unicode string
+                or a UTF-8 encoded byte string.
+
+        Returns:
+            A dictionary containing all information items.
+        """
+        if isinstance(line, bytes):
+            line = line.decode('utf-8')
+        matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(
+            line.strip()[::-1])
+        distro_info = {}
+        if matches:
+            # regexp ensures non-None
+            distro_info['name'] = matches.group(3)[::-1]
+            if matches.group(2):
+                distro_info['version_id'] = matches.group(2)[::-1]
+            if matches.group(1):
+                distro_info['codename'] = matches.group(1)[::-1]
+        elif line:
+            distro_info['name'] = line.strip()
+        return distro_info
+
+
+_distro = LinuxDistribution()
+
+
+def main():
+    logger = logging.getLogger(__name__)
+    logger.setLevel(logging.DEBUG)
+    logger.addHandler(logging.StreamHandler(sys.stdout))
+
+    parser = argparse.ArgumentParser(description="OS distro info tool")
+    parser.add_argument(
+        '--json',
+        '-j',
+        help="Output in machine readable format",
+        action="store_true")
+    args = parser.parse_args()
+
+    if args.json:
+        logger.info(json.dumps(info(), indent=4, sort_keys=True))
+    else:
+        logger.info('Name: %s', name(pretty=True))
+        distribution_version = version(pretty=True)
+        logger.info('Version: %s', distribution_version)
+        distribution_codename = codename()
+        logger.info('Codename: %s', distribution_codename)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..22d0ff19aa66888c8fc39545cffa928dc614c04a
GIT binary patch
literal 42875
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
Lb24*^^DqJcl%ddq

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py
new file mode 100644
index 00000000..04912349
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py
@@ -0,0 +1,35 @@
+"""
+HTML parsing library based on the `WHATWG HTML specification
+<https://whatwg.org/html>`_. The parser is designed to be compatible with
+existing HTML found in the wild and implements well-defined error recovery that
+is largely compatible with modern desktop web browsers.
+
+Example usage::
+
+    from pip._vendor import html5lib
+    with open("my_document.html", "rb") as f:
+        tree = html5lib.parse(f)
+
+For convenience, this module re-exports the following names:
+
+* :func:`~.html5parser.parse`
+* :func:`~.html5parser.parseFragment`
+* :class:`~.html5parser.HTMLParser`
+* :func:`~.treebuilders.getTreeBuilder`
+* :func:`~.treewalkers.getTreeWalker`
+* :func:`~.serializer.serialize`
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .html5parser import HTMLParser, parse, parseFragment
+from .treebuilders import getTreeBuilder
+from .treewalkers import getTreeWalker
+from .serializer import serialize
+
+__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder",
+           "getTreeWalker", "serialize"]
+
+# this has to be at the top level, see how setup.py parses this
+#: Distribution version number.
+__version__ = "1.0.1"
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c20502e0397998d743606dc29241c0aad5426d7
GIT binary patch
literal 1495
zcmZSn%*&NH<x)&C0~D|^FfceIFfkNQU|?WKVPJ@2U`SzPNMT~gVPwc<Vu)g5$Yo}T
zVrIx?VTfX3U`%0VNMT{fVP(i=V~Ap7$Yp1UVrR(ZV2I*?$gwiya5Cg_F+_1e_-qV0
z+zh!q3{gA~K08AWFGDULLlhqaV+sdD3MWGf7efj+LkbT=3NJ%C8$%R7Lkb^5lmJ5t
zKSQvF00RR<=^7>m1}={fUmt~n#G>NNymW<}%%q~kqDqCN#NyNxh5S5)l8jV^gm4eX
zkZ^Yeu*%|s)a1;x%;dz9%=|nqn~ai@f?_Lu{ql^&lJa!D{GxRIjFQ|OyM%Z>g^-L?
zu)(QC3Yo<UDXGPo>3OLs3MKgpNvR6S`MCv&C7DS%sS4$pB^g|)6`92)ASZxrNy{(I
zOHs&#*k7KRlcJCa;^!9Rq~@mPl@u$Kr{?77rlh82f=o;;D#|ZXC`wJvFH0?|R4B<v
zEaA#5R>(;#N>9zHM7K&IH$Nq{C=cYI?2`Nfh4R!Sg`}eV^5WE@Vm&S{*NQ}tH43H0
ziRr0UR$N>P3JMBoMftf31(^kU@nxxbDfvYTnYjh|MI{O#znbP`CV>@!{GpIvkea8V
zlv^2}lAl}(a;qLljgpRnQc;qUrb1$|LYfs=HOSbKqSRCcTevBDplC?dNYmuva?3AL
zNY2kIOU=tn%}Y+zQ7FmCEC#u}G$&P|C{;JL0%U(NIDXRdb8_;_L1CAdn44N`#l@wi
zV3k&ymu!_#2e#c5Y;F<6_yoMNZbgadAXkG`CFdj-7o!^jil2bQqT<vduo{>>Ag?5q
zX6B@TLNPtHB%~-c)d|AKP*<LqlZ~V-9Lz;gRh(LsnV6GVm0F|+XC`oEg0hwdGXn!d
z2|oh^Lt;{KeokpgYCI$|N;p6nEwe1MI5R)51f0P0GL!RDQsZ+nOHzvxbBZ$=85kHK
z`nebw7!W=wVP#-o00&YDFN_5X2@Q~@5<Uh722@``#6ilT;t+2@ggF@)7~l>sMYXIH
zZdoZvH`rR3Wu=(*fEA%wQHp9h$T&ki13g1O4M9-Qurn|)#DkJwe0&MW=J@!u(vs4m
z)cE)yQ1}Ib{1e0kQpwH0zyL~}(DV@m3fUkQ1_p*8keMYsAT>p)sjz4b0u^Z`AWfji
zhDKr#$U3k+aQ_wsfnuTrBoQB<n3EG957rbPUzS<~iktX&4Uj_+L~#KF1A~4+QD#|U
zNveKXVv&AYJ~$!iXBX;c7aN(I8y036nU@(_m>1_%rkBT?q?ni(7#J9&=jn&&7i1Rb
zX66-_B<AGkmM2=424;YSz!;ia!9@}%o9f5MXXa&=#K-FuRDzR>O>TZlX-=x0C@8)_
TNrsI{hDnA|00fzM7<pI#i&?G!

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py
new file mode 100644
index 00000000..4c77717b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py
@@ -0,0 +1,288 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import re
+import warnings
+
+from .constants import DataLossWarning
+
+baseChar = """
+[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] |
+[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] |
+[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] |
+[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 |
+[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] |
+[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] |
+[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] |
+[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] |
+[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 |
+[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] |
+[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] |
+[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D |
+[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] |
+[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] |
+[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] |
+[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] |
+[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] |
+[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] |
+[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 |
+[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] |
+[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] |
+[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] |
+[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] |
+[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] |
+[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] |
+[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] |
+[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] |
+[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] |
+[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] |
+[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A |
+#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 |
+#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] |
+#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] |
+[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] |
+[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C |
+#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 |
+[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] |
+[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] |
+[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 |
+[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] |
+[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B |
+#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE |
+[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] |
+[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 |
+[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] |
+[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]"""
+
+ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]"""
+
+combiningCharacter = """
+[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] |
+[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 |
+[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] |
+[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] |
+#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] |
+[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] |
+[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 |
+#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] |
+[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC |
+[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] |
+#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] |
+[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] |
+[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] |
+[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] |
+[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] |
+[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] |
+#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 |
+[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] |
+#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] |
+[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] |
+[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] |
+#x3099 | #x309A"""
+
+digit = """
+[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] |
+[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] |
+[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] |
+[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]"""
+
+extender = """
+#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 |
+#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]"""
+
+letter = " | ".join([baseChar, ideographic])
+
+# Without the
+name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter,
+                   extender])
+nameFirst = " | ".join([letter, "_"])
+
+reChar = re.compile(r"#x([\d|A-F]{4,4})")
+reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]")
+
+
+def charStringToList(chars):
+    charRanges = [item.strip() for item in chars.split(" | ")]
+    rv = []
+    for item in charRanges:
+        foundMatch = False
+        for regexp in (reChar, reCharRange):
+            match = regexp.match(item)
+            if match is not None:
+                rv.append([hexToInt(item) for item in match.groups()])
+                if len(rv[-1]) == 1:
+                    rv[-1] = rv[-1] * 2
+                foundMatch = True
+                break
+        if not foundMatch:
+            assert len(item) == 1
+
+            rv.append([ord(item)] * 2)
+    rv = normaliseCharList(rv)
+    return rv
+
+
+def normaliseCharList(charList):
+    charList = sorted(charList)
+    for item in charList:
+        assert item[1] >= item[0]
+    rv = []
+    i = 0
+    while i < len(charList):
+        j = 1
+        rv.append(charList[i])
+        while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1:
+            rv[-1][1] = charList[i + j][1]
+            j += 1
+        i += j
+    return rv
+
+# We don't really support characters above the BMP :(
+max_unicode = int("FFFF", 16)
+
+
+def missingRanges(charList):
+    rv = []
+    if charList[0] != 0:
+        rv.append([0, charList[0][0] - 1])
+    for i, item in enumerate(charList[:-1]):
+        rv.append([item[1] + 1, charList[i + 1][0] - 1])
+    if charList[-1][1] != max_unicode:
+        rv.append([charList[-1][1] + 1, max_unicode])
+    return rv
+
+
+def listToRegexpStr(charList):
+    rv = []
+    for item in charList:
+        if item[0] == item[1]:
+            rv.append(escapeRegexp(chr(item[0])))
+        else:
+            rv.append(escapeRegexp(chr(item[0])) + "-" +
+                      escapeRegexp(chr(item[1])))
+    return "[%s]" % "".join(rv)
+
+
+def hexToInt(hex_str):
+    return int(hex_str, 16)
+
+
+def escapeRegexp(string):
+    specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}",
+                         "[", "]", "|", "(", ")", "-")
+    for char in specialCharacters:
+        string = string.replace(char, "\\" + char)
+
+    return string
+
+# output from the above
+nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]')  # noqa
+
+nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]')  # noqa
+
+# Simpler things
+nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]")
+
+
+class InfosetFilter(object):
+    replacementRegexp = re.compile(r"U[\dA-F]{5,5}")
+
+    def __init__(self,
+                 dropXmlnsLocalName=False,
+                 dropXmlnsAttrNs=False,
+                 preventDoubleDashComments=False,
+                 preventDashAtCommentEnd=False,
+                 replaceFormFeedCharacters=True,
+                 preventSingleQuotePubid=False):
+
+        self.dropXmlnsLocalName = dropXmlnsLocalName
+        self.dropXmlnsAttrNs = dropXmlnsAttrNs
+
+        self.preventDoubleDashComments = preventDoubleDashComments
+        self.preventDashAtCommentEnd = preventDashAtCommentEnd
+
+        self.replaceFormFeedCharacters = replaceFormFeedCharacters
+
+        self.preventSingleQuotePubid = preventSingleQuotePubid
+
+        self.replaceCache = {}
+
+    def coerceAttribute(self, name, namespace=None):
+        if self.dropXmlnsLocalName and name.startswith("xmlns:"):
+            warnings.warn("Attributes cannot begin with xmlns", DataLossWarning)
+            return None
+        elif (self.dropXmlnsAttrNs and
+              namespace == "http://www.w3.org/2000/xmlns/"):
+            warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning)
+            return None
+        else:
+            return self.toXmlName(name)
+
+    def coerceElement(self, name):
+        return self.toXmlName(name)
+
+    def coerceComment(self, data):
+        if self.preventDoubleDashComments:
+            while "--" in data:
+                warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning)
+                data = data.replace("--", "- -")
+            if data.endswith("-"):
+                warnings.warn("Comments cannot end in a dash", DataLossWarning)
+                data += " "
+        return data
+
+    def coerceCharacters(self, data):
+        if self.replaceFormFeedCharacters:
+            for _ in range(data.count("\x0C")):
+                warnings.warn("Text cannot contain U+000C", DataLossWarning)
+            data = data.replace("\x0C", " ")
+        # Other non-xml characters
+        return data
+
+    def coercePubid(self, data):
+        dataOutput = data
+        for char in nonPubidCharRegexp.findall(data):
+            warnings.warn("Coercing non-XML pubid", DataLossWarning)
+            replacement = self.getReplacementCharacter(char)
+            dataOutput = dataOutput.replace(char, replacement)
+        if self.preventSingleQuotePubid and dataOutput.find("'") >= 0:
+            warnings.warn("Pubid cannot contain single quote", DataLossWarning)
+            dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'"))
+        return dataOutput
+
+    def toXmlName(self, name):
+        nameFirst = name[0]
+        nameRest = name[1:]
+        m = nonXmlNameFirstBMPRegexp.match(nameFirst)
+        if m:
+            warnings.warn("Coercing non-XML name", DataLossWarning)
+            nameFirstOutput = self.getReplacementCharacter(nameFirst)
+        else:
+            nameFirstOutput = nameFirst
+
+        nameRestOutput = nameRest
+        replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest))
+        for char in replaceChars:
+            warnings.warn("Coercing non-XML name", DataLossWarning)
+            replacement = self.getReplacementCharacter(char)
+            nameRestOutput = nameRestOutput.replace(char, replacement)
+        return nameFirstOutput + nameRestOutput
+
+    def getReplacementCharacter(self, char):
+        if char in self.replaceCache:
+            replacement = self.replaceCache[char]
+        else:
+            replacement = self.escapeChar(char)
+        return replacement
+
+    def fromXmlName(self, name):
+        for item in set(self.replacementRegexp.findall(name)):
+            name = name.replace(item, self.unescapeChar(item))
+        return name
+
+    def escapeChar(self, char):
+        replacement = "U%05X" % ord(char)
+        self.replaceCache[char] = replacement
+        return replacement
+
+    def unescapeChar(self, charcode):
+        return chr(int(charcode[1:], 16))
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ff3ec230cc8c29227f5add82f5c418b74be61cf2
GIT binary patch
literal 16440
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
MI63*5_?h{c0gp+^0{{R3

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py
new file mode 100644
index 00000000..a65e55f6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py
@@ -0,0 +1,923 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from pip._vendor.six import text_type, binary_type
+from pip._vendor.six.moves import http_client, urllib
+
+import codecs
+import re
+
+from pip._vendor import webencodings
+
+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])
+asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase])
+spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"])
+
+
+invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]"  # noqa
+
+if _utils.supports_lone_surrogates:
+    # Use one extra step of indirection and create surrogates with
+    # eval. Not using this indirection would introduce an illegal
+    # unicode literal on platforms not supporting such lone
+    # surrogates.
+    assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1
+    invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] +
+                                    eval('"\\uD800-\\uDFFF"') +  # pylint:disable=eval-used
+                                    "]")
+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])
+
+ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]")
+
+# Cache for charsUntil()
+charsUntilRegEx = {}
+
+
+class BufferedStream(object):
+    """Buffering for streams that do not have buffering of their own
+
+    The buffer is implemented as a list of chunks on the assumption that
+    joining many strings will be slow since it is O(n**2)
+    """
+
+    def __init__(self, stream):
+        self.stream = stream
+        self.buffer = []
+        self.position = [-1, 0]  # chunk number, offset
+
+    def tell(self):
+        pos = 0
+        for chunk in self.buffer[:self.position[0]]:
+            pos += len(chunk)
+        pos += self.position[1]
+        return pos
+
+    def seek(self, pos):
+        assert pos <= self._bufferedBytes()
+        offset = pos
+        i = 0
+        while len(self.buffer[i]) < offset:
+            offset -= len(self.buffer[i])
+            i += 1
+        self.position = [i, offset]
+
+    def read(self, bytes):
+        if not self.buffer:
+            return self._readStream(bytes)
+        elif (self.position[0] == len(self.buffer) and
+              self.position[1] == len(self.buffer[-1])):
+            return self._readStream(bytes)
+        else:
+            return self._readFromBuffer(bytes)
+
+    def _bufferedBytes(self):
+        return sum([len(item) for item in self.buffer])
+
+    def _readStream(self, bytes):
+        data = self.stream.read(bytes)
+        self.buffer.append(data)
+        self.position[0] += 1
+        self.position[1] = len(data)
+        return data
+
+    def _readFromBuffer(self, bytes):
+        remainingBytes = bytes
+        rv = []
+        bufferIndex = self.position[0]
+        bufferOffset = self.position[1]
+        while bufferIndex < len(self.buffer) and remainingBytes != 0:
+            assert remainingBytes > 0
+            bufferedData = self.buffer[bufferIndex]
+
+            if remainingBytes <= len(bufferedData) - bufferOffset:
+                bytesToRead = remainingBytes
+                self.position = [bufferIndex, bufferOffset + bytesToRead]
+            else:
+                bytesToRead = len(bufferedData) - bufferOffset
+                self.position = [bufferIndex, len(bufferedData)]
+                bufferIndex += 1
+            rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead])
+            remainingBytes -= bytesToRead
+
+            bufferOffset = 0
+
+        if remainingBytes:
+            rv.append(self._readStream(remainingBytes))
+
+        return b"".join(rv)
+
+
+def HTMLInputStream(source, **kwargs):
+    # Work around Python bug #20007: read(0) closes the connection.
+    # http://bugs.python.org/issue20007
+    if (isinstance(source, http_client.HTTPResponse) or
+        # Also check for addinfourl wrapping HTTPResponse
+        (isinstance(source, urllib.response.addbase) and
+         isinstance(source.fp, http_client.HTTPResponse))):
+        isUnicode = False
+    elif hasattr(source, "read"):
+        isUnicode = isinstance(source.read(0), text_type)
+    else:
+        isUnicode = isinstance(source, text_type)
+
+    if isUnicode:
+        encodings = [x for x in kwargs if x.endswith("_encoding")]
+        if encodings:
+            raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings)
+
+        return HTMLUnicodeInputStream(source, **kwargs)
+    else:
+        return HTMLBinaryInputStream(source, **kwargs)
+
+
+class HTMLUnicodeInputStream(object):
+    """Provides a unicode stream of characters to the HTMLTokenizer.
+
+    This class takes care of character encoding and removing or replacing
+    incorrect byte-sequences and also provides column and line tracking.
+
+    """
+
+    _defaultChunkSize = 10240
+
+    def __init__(self, source):
+        """Initialises the HTMLInputStream.
+
+        HTMLInputStream(source, [encoding]) -> Normalized stream from source
+        for use by html5lib.
+
+        source can be either a file-object, local filename or a string.
+
+        The optional encoding parameter must be a string that indicates
+        the encoding.  If specified, that encoding will be used,
+        regardless of any BOM or later declaration (such as in a meta
+        element)
+
+        """
+
+        if not _utils.supports_lone_surrogates:
+            # Such platforms will have already checked for such
+            # surrogate errors, so no need to do this checking.
+            self.reportCharacterErrors = None
+        elif len("\U0010FFFF") == 1:
+            self.reportCharacterErrors = self.characterErrorsUCS4
+        else:
+            self.reportCharacterErrors = self.characterErrorsUCS2
+
+        # List of where new lines occur
+        self.newLines = [0]
+
+        self.charEncoding = (lookupEncoding("utf-8"), "certain")
+        self.dataStream = self.openStream(source)
+
+        self.reset()
+
+    def reset(self):
+        self.chunk = ""
+        self.chunkSize = 0
+        self.chunkOffset = 0
+        self.errors = []
+
+        # number of (complete) lines in previous chunks
+        self.prevNumLines = 0
+        # number of columns in the last line of the previous chunk
+        self.prevNumCols = 0
+
+        # Deal with CR LF and surrogates split over chunk boundaries
+        self._bufferedCharacter = None
+
+    def openStream(self, source):
+        """Produces a file object from source.
+
+        source can be either a file object, local filename or a string.
+
+        """
+        # Already a file object
+        if hasattr(source, 'read'):
+            stream = source
+        else:
+            stream = StringIO(source)
+
+        return stream
+
+    def _position(self, offset):
+        chunk = self.chunk
+        nLines = chunk.count('\n', 0, offset)
+        positionLine = self.prevNumLines + nLines
+        lastLinePos = chunk.rfind('\n', 0, offset)
+        if lastLinePos == -1:
+            positionColumn = self.prevNumCols + offset
+        else:
+            positionColumn = offset - (lastLinePos + 1)
+        return (positionLine, positionColumn)
+
+    def position(self):
+        """Returns (line, col) of the current position in the stream."""
+        line, col = self._position(self.chunkOffset)
+        return (line + 1, col)
+
+    def char(self):
+        """ Read one character from the stream or queue if available. Return
+            EOF when EOF is reached.
+        """
+        # Read a new chunk from the input stream if necessary
+        if self.chunkOffset >= self.chunkSize:
+            if not self.readChunk():
+                return EOF
+
+        chunkOffset = self.chunkOffset
+        char = self.chunk[chunkOffset]
+        self.chunkOffset = chunkOffset + 1
+
+        return char
+
+    def readChunk(self, chunkSize=None):
+        if chunkSize is None:
+            chunkSize = self._defaultChunkSize
+
+        self.prevNumLines, self.prevNumCols = self._position(self.chunkSize)
+
+        self.chunk = ""
+        self.chunkSize = 0
+        self.chunkOffset = 0
+
+        data = self.dataStream.read(chunkSize)
+
+        # Deal with CR LF and surrogates broken across chunks
+        if self._bufferedCharacter:
+            data = self._bufferedCharacter + data
+            self._bufferedCharacter = None
+        elif not data:
+            # We have no more data, bye-bye stream
+            return False
+
+        if len(data) > 1:
+            lastv = ord(data[-1])
+            if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF:
+                self._bufferedCharacter = data[-1]
+                data = data[:-1]
+
+        if self.reportCharacterErrors:
+            self.reportCharacterErrors(data)
+
+        # Replace invalid characters
+        data = data.replace("\r\n", "\n")
+        data = data.replace("\r", "\n")
+
+        self.chunk = data
+        self.chunkSize = len(data)
+
+        return True
+
+    def characterErrorsUCS4(self, data):
+        for _ in range(len(invalid_unicode_re.findall(data))):
+            self.errors.append("invalid-codepoint")
+
+    def characterErrorsUCS2(self, data):
+        # Someone picked the wrong compile option
+        # You lose
+        skip = False
+        for match in invalid_unicode_re.finditer(data):
+            if skip:
+                continue
+            codepoint = ord(match.group())
+            pos = match.start()
+            # Pretty sure there should be endianness issues here
+            if _utils.isSurrogatePair(data[pos:pos + 2]):
+                # We have a surrogate pair!
+                char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2])
+                if char_val in non_bmp_invalid_codepoints:
+                    self.errors.append("invalid-codepoint")
+                skip = True
+            elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and
+                  pos == len(data) - 1):
+                self.errors.append("invalid-codepoint")
+            else:
+                skip = False
+                self.errors.append("invalid-codepoint")
+
+    def charsUntil(self, characters, opposite=False):
+        """ Returns a string of characters from the stream up to but not
+        including any character in 'characters' or EOF. 'characters' must be
+        a container that supports the 'in' method and iteration over its
+        characters.
+        """
+
+        # Use a cache of regexps to find the required characters
+        try:
+            chars = charsUntilRegEx[(characters, opposite)]
+        except KeyError:
+            if __debug__:
+                for c in characters:
+                    assert(ord(c) < 128)
+            regex = "".join(["\\x%02x" % ord(c) for c in characters])
+            if not opposite:
+                regex = "^%s" % regex
+            chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex)
+
+        rv = []
+
+        while True:
+            # Find the longest matching prefix
+            m = chars.match(self.chunk, self.chunkOffset)
+            if m is None:
+                # If nothing matched, and it wasn't because we ran out of chunk,
+                # then stop
+                if self.chunkOffset != self.chunkSize:
+                    break
+            else:
+                end = m.end()
+                # If not the whole chunk matched, return everything
+                # up to the part that didn't match
+                if end != self.chunkSize:
+                    rv.append(self.chunk[self.chunkOffset:end])
+                    self.chunkOffset = end
+                    break
+            # If the whole remainder of the chunk matched,
+            # use it all and read the next chunk
+            rv.append(self.chunk[self.chunkOffset:])
+            if not self.readChunk():
+                # Reached EOF
+                break
+
+        r = "".join(rv)
+        return r
+
+    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 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
+                # called char and charsUntil.
+                # So, just prepend the ungotten character onto the current
+                # chunk:
+                self.chunk = char + self.chunk
+                self.chunkSize += 1
+            else:
+                self.chunkOffset -= 1
+                assert self.chunk[self.chunkOffset] == char
+
+
+class HTMLBinaryInputStream(HTMLUnicodeInputStream):
+    """Provides a unicode stream of characters to the HTMLTokenizer.
+
+    This class takes care of character encoding and removing or replacing
+    incorrect byte-sequences and also provides column and line tracking.
+
+    """
+
+    def __init__(self, source, override_encoding=None, transport_encoding=None,
+                 same_origin_parent_encoding=None, likely_encoding=None,
+                 default_encoding="windows-1252", useChardet=True):
+        """Initialises the HTMLInputStream.
+
+        HTMLInputStream(source, [encoding]) -> Normalized stream from source
+        for use by html5lib.
+
+        source can be either a file-object, local filename or a string.
+
+        The optional encoding parameter must be a string that indicates
+        the encoding.  If specified, that encoding will be used,
+        regardless of any BOM or later declaration (such as in a meta
+        element)
+
+        """
+        # Raw Stream - for unicode objects this will encode to utf-8 and set
+        #              self.charEncoding as appropriate
+        self.rawStream = self.openStream(source)
+
+        HTMLUnicodeInputStream.__init__(self, self.rawStream)
+
+        # Encoding Information
+        # Number of bytes to use when looking for a meta element with
+        # encoding information
+        self.numBytesMeta = 1024
+        # Number of bytes to use when using detecting encoding using chardet
+        self.numBytesChardet = 100
+        # Things from args
+        self.override_encoding = override_encoding
+        self.transport_encoding = transport_encoding
+        self.same_origin_parent_encoding = same_origin_parent_encoding
+        self.likely_encoding = likely_encoding
+        self.default_encoding = default_encoding
+
+        # Determine encoding
+        self.charEncoding = self.determineEncoding(useChardet)
+        assert self.charEncoding[0] is not None
+
+        # Call superclass
+        self.reset()
+
+    def reset(self):
+        self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace')
+        HTMLUnicodeInputStream.reset(self)
+
+    def openStream(self, source):
+        """Produces a file object from source.
+
+        source can be either a file object, local filename or a string.
+
+        """
+        # Already a file object
+        if hasattr(source, 'read'):
+            stream = source
+        else:
+            stream = BytesIO(source)
+
+        try:
+            stream.seek(stream.tell())
+        except:  # pylint:disable=bare-except
+            stream = BufferedStream(stream)
+
+        return stream
+
+    def determineEncoding(self, chardet=True):
+        # BOMs take precedence over everything
+        # This will also read past the BOM if present
+        charEncoding = self.detectBOM(), "certain"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # If we've been overriden, we've been overriden
+        charEncoding = lookupEncoding(self.override_encoding), "certain"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Now check the transport layer
+        charEncoding = lookupEncoding(self.transport_encoding), "certain"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Look for meta elements with encoding information
+        charEncoding = self.detectEncodingMeta(), "tentative"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Parent document encoding
+        charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative"
+        if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"):
+            return charEncoding
+
+        # "likely" encoding
+        charEncoding = lookupEncoding(self.likely_encoding), "tentative"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Guess with chardet, if available
+        if chardet:
+            try:
+                from pip._vendor.chardet.universaldetector import UniversalDetector
+            except ImportError:
+                pass
+            else:
+                buffers = []
+                detector = UniversalDetector()
+                while not detector.done:
+                    buffer = self.rawStream.read(self.numBytesChardet)
+                    assert isinstance(buffer, bytes)
+                    if not buffer:
+                        break
+                    buffers.append(buffer)
+                    detector.feed(buffer)
+                detector.close()
+                encoding = lookupEncoding(detector.result['encoding'])
+                self.rawStream.seek(0)
+                if encoding is not None:
+                    return encoding, "tentative"
+
+        # Try the default encoding
+        charEncoding = lookupEncoding(self.default_encoding), "tentative"
+        if charEncoding[0] is not None:
+            return charEncoding
+
+        # Fallback to html5lib's default if even that hasn't worked
+        return lookupEncoding("windows-1252"), "tentative"
+
+    def changeEncoding(self, newEncoding):
+        assert self.charEncoding[1] != "certain"
+        newEncoding = lookupEncoding(newEncoding)
+        if newEncoding is None:
+            return
+        if newEncoding.name in ("utf-16be", "utf-16le"):
+            newEncoding = lookupEncoding("utf-8")
+            assert newEncoding is not None
+        elif newEncoding == self.charEncoding[0]:
+            self.charEncoding = (self.charEncoding[0], "certain")
+        else:
+            self.rawStream.seek(0)
+            self.charEncoding = (newEncoding, "certain")
+            self.reset()
+            raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding))
+
+    def detectBOM(self):
+        """Attempts to detect at BOM at the start of the stream. If
+        an encoding can be determined from the BOM return the name of the
+        encoding otherwise return None"""
+        bomDict = {
+            codecs.BOM_UTF8: 'utf-8',
+            codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be',
+            codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be'
+        }
+
+        # Go to beginning of file and read in 4 bytes
+        string = self.rawStream.read(4)
+        assert isinstance(string, bytes)
+
+        # Try detecting the BOM using bytes from the string
+        encoding = bomDict.get(string[:3])         # UTF-8
+        seek = 3
+        if not encoding:
+            # Need to detect UTF-32 before UTF-16
+            encoding = bomDict.get(string)         # UTF-32
+            seek = 4
+            if not encoding:
+                encoding = bomDict.get(string[:2])  # UTF-16
+                seek = 2
+
+        # Set the read position past the BOM if one was found, otherwise
+        # set it to the start of the stream
+        if encoding:
+            self.rawStream.seek(seek)
+            return lookupEncoding(encoding)
+        else:
+            self.rawStream.seek(0)
+            return None
+
+    def detectEncodingMeta(self):
+        """Report the encoding declared by the meta element
+        """
+        buffer = self.rawStream.read(self.numBytesMeta)
+        assert isinstance(buffer, bytes)
+        parser = EncodingParser(buffer)
+        self.rawStream.seek(0)
+        encoding = parser.getEncoding()
+
+        if encoding is not None and encoding.name in ("utf-16be", "utf-16le"):
+            encoding = lookupEncoding("utf-8")
+
+        return encoding
+
+
+class EncodingBytes(bytes):
+    """String-like object with an associated position and various extra methods
+    If the position is ever greater than the string length then an exception is
+    raised"""
+    def __new__(self, value):
+        assert isinstance(value, bytes)
+        return bytes.__new__(self, value.lower())
+
+    def __init__(self, value):
+        # pylint:disable=unused-argument
+        self._position = -1
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        p = self._position = self._position + 1
+        if p >= len(self):
+            raise StopIteration
+        elif p < 0:
+            raise TypeError
+        return self[p:p + 1]
+
+    def next(self):
+        # Py2 compat
+        return self.__next__()
+
+    def previous(self):
+        p = self._position
+        if p >= len(self):
+            raise StopIteration
+        elif p < 0:
+            raise TypeError
+        self._position = p = p - 1
+        return self[p:p + 1]
+
+    def setPosition(self, position):
+        if self._position >= len(self):
+            raise StopIteration
+        self._position = position
+
+    def getPosition(self):
+        if self._position >= len(self):
+            raise StopIteration
+        if self._position >= 0:
+            return self._position
+        else:
+            return None
+
+    position = property(getPosition, setPosition)
+
+    def getCurrentByte(self):
+        return self[self.position:self.position + 1]
+
+    currentByte = property(getCurrentByte)
+
+    def skip(self, chars=spaceCharactersBytes):
+        """Skip past a list of characters"""
+        p = self.position               # use property for the error-checking
+        while p < len(self):
+            c = self[p:p + 1]
+            if c not in chars:
+                self._position = p
+                return c
+            p += 1
+        self._position = p
+        return None
+
+    def skipUntil(self, chars):
+        p = self.position
+        while p < len(self):
+            c = self[p:p + 1]
+            if c in chars:
+                self._position = p
+                return c
+            p += 1
+        self._position = p
+        return None
+
+    def matchBytes(self, 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)
+        if rv:
+            self.position += len(bytes)
+        return rv
+
+    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:
+            raise StopIteration
+
+
+class EncodingParser(object):
+    """Mini parser for detecting character encoding from meta elements"""
+
+    def __init__(self, data):
+        """string - the data to work on for encoding detection"""
+        self.data = EncodingBytes(data)
+        self.encoding = None
+
+    def getEncoding(self):
+        methodDispatch = (
+            (b"<!--", self.handleComment),
+            (b"<meta", self.handleMeta),
+            (b"</", self.handlePossibleEndTag),
+            (b"<!", self.handleOther),
+            (b"<?", self.handleOther),
+            (b"<", self.handlePossibleStartTag))
+        for _ in self.data:
+            keepParsing = True
+            for key, method in methodDispatch:
+                if self.data.matchBytes(key):
+                    try:
+                        keepParsing = method()
+                        break
+                    except StopIteration:
+                        keepParsing = False
+                        break
+            if not keepParsing:
+                break
+
+        return self.encoding
+
+    def handleComment(self):
+        """Skip over comments"""
+        return self.data.jumpTo(b"-->")
+
+    def handleMeta(self):
+        if self.data.currentByte not in spaceCharactersBytes:
+            # if we have <meta not followed by a space so just keep going
+            return True
+        # We have a valid meta element we want to search for attributes
+        hasPragma = False
+        pendingEncoding = None
+        while True:
+            # Try to find the next attribute after the current position
+            attr = self.getAttribute()
+            if attr is None:
+                return True
+            else:
+                if attr[0] == b"http-equiv":
+                    hasPragma = attr[1] == b"content-type"
+                    if hasPragma and pendingEncoding is not None:
+                        self.encoding = pendingEncoding
+                        return False
+                elif attr[0] == b"charset":
+                    tentativeEncoding = attr[1]
+                    codec = lookupEncoding(tentativeEncoding)
+                    if codec is not None:
+                        self.encoding = codec
+                        return False
+                elif attr[0] == b"content":
+                    contentParser = ContentAttrParser(EncodingBytes(attr[1]))
+                    tentativeEncoding = contentParser.parse()
+                    if tentativeEncoding is not None:
+                        codec = lookupEncoding(tentativeEncoding)
+                        if codec is not None:
+                            if hasPragma:
+                                self.encoding = codec
+                                return False
+                            else:
+                                pendingEncoding = codec
+
+    def handlePossibleStartTag(self):
+        return self.handlePossibleTag(False)
+
+    def handlePossibleEndTag(self):
+        next(self.data)
+        return self.handlePossibleTag(True)
+
+    def handlePossibleTag(self, endTag):
+        data = self.data
+        if data.currentByte not in asciiLettersBytes:
+            # If the next byte is not an ascii letter either ignore this
+            # fragment (possible start tag case) or treat it according to
+            # handleOther
+            if endTag:
+                data.previous()
+                self.handleOther()
+            return True
+
+        c = data.skipUntil(spacesAngleBrackets)
+        if c == b"<":
+            # return to the first step in the overall "two step" algorithm
+            # reprocessing the < byte
+            data.previous()
+        else:
+            # Read all attributes
+            attr = self.getAttribute()
+            while attr is not None:
+                attr = self.getAttribute()
+        return True
+
+    def handleOther(self):
+        return self.data.jumpTo(b">")
+
+    def getAttribute(self):
+        """Return a name,value pair for the next attribute in the stream,
+        if one is found, or None"""
+        data = self.data
+        # Step 1 (skip chars)
+        c = data.skip(spaceCharactersBytes | frozenset([b"/"]))
+        assert c is None or len(c) == 1
+        # Step 2
+        if c in (b">", None):
+            return None
+        # Step 3
+        attrName = []
+        attrValue = []
+        # Step 4 attribute name
+        while True:
+            if c == b"=" and attrName:
+                break
+            elif c in spaceCharactersBytes:
+                # Step 6!
+                c = data.skip()
+                break
+            elif c in (b"/", b">"):
+                return b"".join(attrName), b""
+            elif c in asciiUppercaseBytes:
+                attrName.append(c.lower())
+            elif c is None:
+                return None
+            else:
+                attrName.append(c)
+            # Step 5
+            c = next(data)
+        # Step 7
+        if c != b"=":
+            data.previous()
+            return b"".join(attrName), b""
+        # Step 8
+        next(data)
+        # Step 9
+        c = data.skip()
+        # Step 10
+        if c in (b"'", b'"'):
+            # 10.1
+            quoteChar = c
+            while True:
+                # 10.2
+                c = next(data)
+                # 10.3
+                if c == quoteChar:
+                    next(data)
+                    return b"".join(attrName), b"".join(attrValue)
+                # 10.4
+                elif c in asciiUppercaseBytes:
+                    attrValue.append(c.lower())
+                # 10.5
+                else:
+                    attrValue.append(c)
+        elif c == b">":
+            return b"".join(attrName), b""
+        elif c in asciiUppercaseBytes:
+            attrValue.append(c.lower())
+        elif c is None:
+            return None
+        else:
+            attrValue.append(c)
+        # Step 11
+        while True:
+            c = next(data)
+            if c in spacesAngleBrackets:
+                return b"".join(attrName), b"".join(attrValue)
+            elif c in asciiUppercaseBytes:
+                attrValue.append(c.lower())
+            elif c is None:
+                return None
+            else:
+                attrValue.append(c)
+
+
+class ContentAttrParser(object):
+    def __init__(self, data):
+        assert isinstance(data, bytes)
+        self.data = data
+
+    def parse(self):
+        try:
+            # Check if the attr name is charset
+            # otherwise return
+            self.data.jumpTo(b"charset")
+            self.data.position += 1
+            self.data.skip()
+            if not self.data.currentByte == b"=":
+                # If there is no = sign keep looking for attrs
+                return None
+            self.data.position += 1
+            self.data.skip()
+            # Look for an encoding between matching quote marks
+            if self.data.currentByte in (b'"', b"'"):
+                quoteMark = self.data.currentByte
+                self.data.position += 1
+                oldPosition = self.data.position
+                if self.data.jumpTo(quoteMark):
+                    return self.data[oldPosition:self.data.position]
+                else:
+                    return None
+            else:
+                # Unquoted value
+                oldPosition = self.data.position
+                try:
+                    self.data.skipUntil(spaceCharactersBytes)
+                    return self.data[oldPosition:self.data.position]
+                except StopIteration:
+                    # Return the whole remaining value
+                    return self.data[oldPosition:]
+        except StopIteration:
+            return None
+
+
+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):
+        try:
+            encoding = encoding.decode("ascii")
+        except UnicodeDecodeError:
+            return None
+
+    if encoding is not None:
+        try:
+            return webencodings.lookup(encoding)
+        except AttributeError:
+            return None
+    else:
+        return None
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8d558135c28be0c14b01f04668933c491af3d19c
GIT binary patch
literal 30522
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
Z0h#!j*_g$=IK{=DiJcJ35ZfxI4gf(WWZ(b*

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py
new file mode 100644
index 00000000..178f6e7f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py
@@ -0,0 +1,1721 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from pip._vendor.six import unichr as chr
+
+from collections import deque
+
+from .constants import spaceCharacters
+from .constants import entities
+from .constants import asciiLetters, asciiUpper2Lower
+from .constants import digits, hexDigits, EOF
+from .constants import tokenTypes, tagTokenTypes
+from .constants import replacementCharacters
+
+from ._inputstream import HTMLInputStream
+
+from ._trie import Trie
+
+entitiesTrie = Trie(entities)
+
+
+class HTMLTokenizer(object):
+    """ This class takes care of tokenizing HTML.
+
+    * self.currentToken
+      Holds the token that is currently being processed.
+
+    * self.state
+      Holds a reference to the method to be invoked... XXX
+
+    * self.stream
+      Points to HTMLInputStream object.
+    """
+
+    def __init__(self, stream, parser=None, **kwargs):
+
+        self.stream = HTMLInputStream(stream, **kwargs)
+        self.parser = parser
+
+        # Setup the initial tokenizer state
+        self.escapeFlag = False
+        self.lastFourChars = []
+        self.state = self.dataState
+        self.escape = False
+
+        # The current token being created
+        self.currentToken = None
+        super(HTMLTokenizer, self).__init__()
+
+    def __iter__(self):
+        """ This is where the magic happens.
+
+        We do our usually processing through the states and when we have a token
+        to return we yield the token which pauses processing until the next token
+        is requested.
+        """
+        self.tokenQueue = deque([])
+        # Start processing. When EOF is reached self.state will return False
+        # instead of True and the loop will terminate.
+        while self.state():
+            while self.stream.errors:
+                yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)}
+            while self.tokenQueue:
+                yield self.tokenQueue.popleft()
+
+    def consumeNumberEntity(self, isHex):
+        """This function returns either U+FFFD or the character based on the
+        decimal or hexadecimal representation. It also discards ";" if present.
+        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
+        """
+
+        allowed = digits
+        radix = 10
+        if isHex:
+            allowed = hexDigits
+            radix = 16
+
+        charStack = []
+
+        # Consume all the characters that are in range while making sure we
+        # don't hit an EOF.
+        c = self.stream.char()
+        while c in allowed and c is not EOF:
+            charStack.append(c)
+            c = self.stream.char()
+
+        # Convert the set of characters consumed to an int.
+        charAsInt = int("".join(charStack), radix)
+
+        # Certain characters get replaced with others
+        if charAsInt in replacementCharacters:
+            char = replacementCharacters[charAsInt]
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "illegal-codepoint-for-numeric-entity",
+                                    "datavars": {"charAsInt": charAsInt}})
+        elif ((0xD800 <= charAsInt <= 0xDFFF) or
+              (charAsInt > 0x10FFFF)):
+            char = "\uFFFD"
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "illegal-codepoint-for-numeric-entity",
+                                    "datavars": {"charAsInt": charAsInt}})
+        else:
+            # Should speed up this check somehow (e.g. move the set to a constant)
+            if ((0x0001 <= charAsInt <= 0x0008) or
+                (0x000E <= charAsInt <= 0x001F) or
+                (0x007F <= charAsInt <= 0x009F) or
+                (0xFDD0 <= charAsInt <= 0xFDEF) or
+                charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 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])):
+                self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                        "data":
+                                        "illegal-codepoint-for-numeric-entity",
+                                        "datavars": {"charAsInt": charAsInt}})
+            try:
+                # Try/except needed as UCS-2 Python builds' unichar only works
+                # within the BMP.
+                char = chr(charAsInt)
+            except ValueError:
+                v = charAsInt - 0x10000
+                char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF))
+
+        # Discard the ; if present. Otherwise, put it back on the queue and
+        # invoke parseError on parser.
+        if c != ";":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "numeric-entity-without-semicolon"})
+            self.stream.unget(c)
+
+        return char
+
+    def consumeEntity(self, allowedChar=None, fromAttribute=False):
+        # Initialise to the default output for when no entity is matched
+        output = "&"
+
+        charStack = [self.stream.char()]
+        if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or
+                (allowedChar is not None and allowedChar == charStack[0])):
+            self.stream.unget(charStack[0])
+
+        elif charStack[0] == "#":
+            # Read the next character to see if it's hex or decimal
+            hex = False
+            charStack.append(self.stream.char())
+            if charStack[-1] in ("x", "X"):
+                hex = True
+                charStack.append(self.stream.char())
+
+            # charStack[-1] should be the first digit
+            if (hex and charStack[-1] in hexDigits) \
+                    or (not hex and charStack[-1] in digits):
+                # At least one digit found, so consume the whole number
+                self.stream.unget(charStack[-1])
+                output = self.consumeNumberEntity(hex)
+            else:
+                # No digits found
+                self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                        "data": "expected-numeric-entity"})
+                self.stream.unget(charStack.pop())
+                output = "&" + "".join(charStack)
+
+        else:
+            # At this point in the process might have named entity. Entities
+            # are stored in the global variable "entities".
+            #
+            # Consume characters and compare to these to a substring of the
+            # entity names in the list until the substring no longer matches.
+            while (charStack[-1] is not EOF):
+                if not entitiesTrie.has_keys_with_prefix("".join(charStack)):
+                    break
+                charStack.append(self.stream.char())
+
+            # At this point we have a string that starts with some characters
+            # that may match an entity
+            # Try to find the longest entity the string will match to take care
+            # of &noti for instance.
+            try:
+                entityName = entitiesTrie.longest_prefix("".join(charStack[:-1]))
+                entityLength = len(entityName)
+            except KeyError:
+                entityName = None
+
+            if entityName is not None:
+                if entityName[-1] != ";":
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                            "named-entity-without-semicolon"})
+                if (entityName[-1] != ";" and fromAttribute and
+                    (charStack[entityLength] in asciiLetters or
+                     charStack[entityLength] in digits or
+                     charStack[entityLength] == "=")):
+                    self.stream.unget(charStack.pop())
+                    output = "&" + "".join(charStack)
+                else:
+                    output = entities[entityName]
+                    self.stream.unget(charStack.pop())
+                    output += "".join(charStack[entityLength:])
+            else:
+                self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                        "expected-named-entity"})
+                self.stream.unget(charStack.pop())
+                output = "&" + "".join(charStack)
+
+        if fromAttribute:
+            self.currentToken["data"][-1][1] += output
+        else:
+            if output in spaceCharacters:
+                tokenType = "SpaceCharacters"
+            else:
+                tokenType = "Characters"
+            self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output})
+
+    def processEntityInAttribute(self, allowedChar):
+        """This method replaces the need for "entityInAttributeValueState".
+        """
+        self.consumeEntity(allowedChar=allowedChar, fromAttribute=True)
+
+    def emitCurrentToken(self):
+        """This method is a generic handler for emitting the tags. It also sets
+        the state to "data" because that's what's needed after a token has been
+        emitted.
+        """
+        token = self.currentToken
+        # Add token to the queue to be yielded
+        if (token["type"] in tagTokenTypes):
+            token["name"] = token["name"].translate(asciiUpper2Lower)
+            if token["type"] == tokenTypes["EndTag"]:
+                if token["data"]:
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                            "data": "attributes-in-end-tag"})
+                if token["selfClosing"]:
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                            "data": "self-closing-flag-on-end-tag"})
+        self.tokenQueue.append(token)
+        self.state = self.dataState
+
+    # Below are the various tokenizer states worked out.
+    def dataState(self):
+        data = self.stream.char()
+        if data == "&":
+            self.state = self.entityDataState
+        elif data == "<":
+            self.state = self.tagOpenState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\u0000"})
+        elif data is EOF:
+            # Tokenization ends.
+            return False
+        elif data in spaceCharacters:
+            # Directly after emitting a token you switch back to the "data
+            # state". At that point spaceCharacters are important so they are
+            # emitted separately.
+            self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data":
+                                    data + self.stream.charsUntil(spaceCharacters, True)})
+            # No need to update lastFourChars here, since the first space will
+            # have already been appended to lastFourChars and will have broken
+            # any <!-- or --> sequences
+        else:
+            chars = self.stream.charsUntil(("&", "<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def entityDataState(self):
+        self.consumeEntity()
+        self.state = self.dataState
+        return True
+
+    def rcdataState(self):
+        data = self.stream.char()
+        if data == "&":
+            self.state = self.characterReferenceInRcdata
+        elif data == "<":
+            self.state = self.rcdataLessThanSignState
+        elif data == EOF:
+            # Tokenization ends.
+            return False
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data in spaceCharacters:
+            # Directly after emitting a token you switch back to the "data
+            # state". At that point spaceCharacters are important so they are
+            # emitted separately.
+            self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data":
+                                    data + self.stream.charsUntil(spaceCharacters, True)})
+            # No need to update lastFourChars here, since the first space will
+            # have already been appended to lastFourChars and will have broken
+            # any <!-- or --> sequences
+        else:
+            chars = self.stream.charsUntil(("&", "<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def characterReferenceInRcdata(self):
+        self.consumeEntity()
+        self.state = self.rcdataState
+        return True
+
+    def rawtextState(self):
+        data = self.stream.char()
+        if data == "<":
+            self.state = self.rawtextLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            # Tokenization ends.
+            return False
+        else:
+            chars = self.stream.charsUntil(("<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def scriptDataState(self):
+        data = self.stream.char()
+        if data == "<":
+            self.state = self.scriptDataLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            # Tokenization ends.
+            return False
+        else:
+            chars = self.stream.charsUntil(("<", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def plaintextState(self):
+        data = self.stream.char()
+        if data == EOF:
+            # Tokenization ends.
+            return False
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + self.stream.charsUntil("\u0000")})
+        return True
+
+    def tagOpenState(self):
+        data = self.stream.char()
+        if data == "!":
+            self.state = self.markupDeclarationOpenState
+        elif data == "/":
+            self.state = self.closeTagOpenState
+        elif data in asciiLetters:
+            self.currentToken = {"type": tokenTypes["StartTag"],
+                                 "name": data, "data": [],
+                                 "selfClosing": False,
+                                 "selfClosingAcknowledged": False}
+            self.state = self.tagNameState
+        elif data == ">":
+            # XXX In theory it could be something besides a tag name. But
+            # do we really care?
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-tag-name-but-got-right-bracket"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"})
+            self.state = self.dataState
+        elif data == "?":
+            # XXX In theory it could be something besides a tag name. But
+            # do we really care?
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-tag-name-but-got-question-mark"})
+            self.stream.unget(data)
+            self.state = self.bogusCommentState
+        else:
+            # XXX
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-tag-name"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.dataState
+        return True
+
+    def closeTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.currentToken = {"type": tokenTypes["EndTag"], "name": data,
+                                 "data": [], "selfClosing": False}
+            self.state = self.tagNameState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-closing-tag-but-got-right-bracket"})
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-closing-tag-but-got-eof"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.state = self.dataState
+        else:
+            # XXX data can be _'_...
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-closing-tag-but-got-char",
+                                    "datavars": {"data": data}})
+            self.stream.unget(data)
+            self.state = self.bogusCommentState
+        return True
+
+    def tagNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeAttributeNameState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-tag-name"})
+            self.state = self.dataState
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["name"] += "\uFFFD"
+        else:
+            self.currentToken["name"] += data
+            # (Don't use charsUntil here, because tag names are
+            # very short and it's faster to not do anything fancy)
+        return True
+
+    def rcdataLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.rcdataEndTagOpenState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.rcdataState
+        return True
+
+    def rcdataEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer += data
+            self.state = self.rcdataEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.rcdataState
+        return True
+
+    def rcdataEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.rcdataState
+        return True
+
+    def rawtextLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.rawtextEndTagOpenState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.rawtextState
+        return True
+
+    def rawtextEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer += data
+            self.state = self.rawtextEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.rawtextState
+        return True
+
+    def rawtextEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.rawtextState
+        return True
+
+    def scriptDataLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.scriptDataEndTagOpenState
+        elif data == "!":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"})
+            self.state = self.scriptDataEscapeStartState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer += data
+            self.state = self.scriptDataEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEscapeStartState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapeStartDashState
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEscapeStartDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapedDashDashState
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataState
+        return True
+
+    def scriptDataEscapedState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapedDashState
+        elif data == "<":
+            self.state = self.scriptDataEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            self.state = self.dataState
+        else:
+            chars = self.stream.charsUntil(("<", "-", "\u0000"))
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
+                                    data + chars})
+        return True
+
+    def scriptDataEscapedDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataEscapedDashDashState
+        elif data == "<":
+            self.state = self.scriptDataEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataEscapedState
+        elif data == EOF:
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedDashDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+        elif data == "<":
+            self.state = self.scriptDataEscapedLessThanSignState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"})
+            self.state = self.scriptDataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataEscapedState
+        elif data == EOF:
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.temporaryBuffer = ""
+            self.state = self.scriptDataEscapedEndTagOpenState
+        elif data in asciiLetters:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data})
+            self.temporaryBuffer = data
+            self.state = self.scriptDataDoubleEscapeStartState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedEndTagOpenState(self):
+        data = self.stream.char()
+        if data in asciiLetters:
+            self.temporaryBuffer = data
+            self.state = self.scriptDataEscapedEndTagNameState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataEscapedEndTagNameState(self):
+        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
+        data = self.stream.char()
+        if data in spaceCharacters and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.beforeAttributeNameState
+        elif data == "/" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.state = self.selfClosingStartTagState
+        elif data == ">" and appropriate:
+            self.currentToken = {"type": tokenTypes["EndTag"],
+                                 "name": self.temporaryBuffer,
+                                 "data": [], "selfClosing": False}
+            self.emitCurrentToken()
+            self.state = self.dataState
+        elif data in asciiLetters:
+            self.temporaryBuffer += data
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "</" + self.temporaryBuffer})
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataDoubleEscapeStartState(self):
+        data = self.stream.char()
+        if data in (spaceCharacters | frozenset(("/", ">"))):
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            if self.temporaryBuffer.lower() == "script":
+                self.state = self.scriptDataDoubleEscapedState
+            else:
+                self.state = self.scriptDataEscapedState
+        elif data in asciiLetters:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.temporaryBuffer += data
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataEscapedState
+        return True
+
+    def scriptDataDoubleEscapedState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataDoubleEscapedDashState
+        elif data == "<":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.state = self.scriptDataDoubleEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-script-in-script"})
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+        return True
+
+    def scriptDataDoubleEscapedDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+            self.state = self.scriptDataDoubleEscapedDashDashState
+        elif data == "<":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.state = self.scriptDataDoubleEscapedLessThanSignState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataDoubleEscapedState
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-script-in-script"})
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def scriptDataDoubleEscapedDashDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
+        elif data == "<":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
+            self.state = self.scriptDataDoubleEscapedLessThanSignState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"})
+            self.state = self.scriptDataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": "\uFFFD"})
+            self.state = self.scriptDataDoubleEscapedState
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-script-in-script"})
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def scriptDataDoubleEscapedLessThanSignState(self):
+        data = self.stream.char()
+        if data == "/":
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"})
+            self.temporaryBuffer = ""
+            self.state = self.scriptDataDoubleEscapeEndState
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def scriptDataDoubleEscapeEndState(self):
+        data = self.stream.char()
+        if data in (spaceCharacters | frozenset(("/", ">"))):
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            if self.temporaryBuffer.lower() == "script":
+                self.state = self.scriptDataEscapedState
+            else:
+                self.state = self.scriptDataDoubleEscapedState
+        elif data in asciiLetters:
+            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
+            self.temporaryBuffer += data
+        else:
+            self.stream.unget(data)
+            self.state = self.scriptDataDoubleEscapedState
+        return True
+
+    def beforeAttributeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.stream.charsUntil(spaceCharacters, True)
+        elif data in asciiLetters:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data in ("'", '"', "=", "<"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "invalid-character-in-attribute-name"})
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"].append(["\uFFFD", ""])
+            self.state = self.attributeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-attribute-name-but-got-eof"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        return True
+
+    def attributeNameState(self):
+        data = self.stream.char()
+        leavingThisState = True
+        emitToken = False
+        if data == "=":
+            self.state = self.beforeAttributeValueState
+        elif data in asciiLetters:
+            self.currentToken["data"][-1][0] += data +\
+                self.stream.charsUntil(asciiLetters, True)
+            leavingThisState = False
+        elif data == ">":
+            # XXX If we emit here the attributes are converted to a dict
+            # without being checked and when the code below runs we error
+            # because data is a dict not a list
+            emitToken = True
+        elif data in spaceCharacters:
+            self.state = self.afterAttributeNameState
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][0] += "\uFFFD"
+            leavingThisState = False
+        elif data in ("'", '"', "<"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data":
+                                    "invalid-character-in-attribute-name"})
+            self.currentToken["data"][-1][0] += data
+            leavingThisState = False
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "eof-in-attribute-name"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][0] += data
+            leavingThisState = False
+
+        if leavingThisState:
+            # Attributes are not dropped at this stage. That happens when the
+            # start tag token is emitted so values can still be safely appended
+            # to attributes, but we do want to report the parse error in time.
+            self.currentToken["data"][-1][0] = (
+                self.currentToken["data"][-1][0].translate(asciiUpper2Lower))
+            for name, _ in self.currentToken["data"][:-1]:
+                if self.currentToken["data"][-1][0] == name:
+                    self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                            "duplicate-attribute"})
+                    break
+            # XXX Fix for above XXX
+            if emitToken:
+                self.emitCurrentToken()
+        return True
+
+    def afterAttributeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.stream.charsUntil(spaceCharacters, True)
+        elif data == "=":
+            self.state = self.beforeAttributeValueState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data in asciiLetters:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"].append(["\uFFFD", ""])
+            self.state = self.attributeNameState
+        elif data in ("'", '"', "<"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "invalid-character-after-attribute-name"})
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-end-of-tag-but-got-eof"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"].append([data, ""])
+            self.state = self.attributeNameState
+        return True
+
+    def beforeAttributeValueState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.stream.charsUntil(spaceCharacters, True)
+        elif data == "\"":
+            self.state = self.attributeValueDoubleQuotedState
+        elif data == "&":
+            self.state = self.attributeValueUnQuotedState
+            self.stream.unget(data)
+        elif data == "'":
+            self.state = self.attributeValueSingleQuotedState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-attribute-value-but-got-right-bracket"})
+            self.emitCurrentToken()
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+            self.state = self.attributeValueUnQuotedState
+        elif data in ("=", "<", "`"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "equals-in-unquoted-attribute-value"})
+            self.currentToken["data"][-1][1] += data
+            self.state = self.attributeValueUnQuotedState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-attribute-value-but-got-eof"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data
+            self.state = self.attributeValueUnQuotedState
+        return True
+
+    def attributeValueDoubleQuotedState(self):
+        data = self.stream.char()
+        if data == "\"":
+            self.state = self.afterAttributeValueState
+        elif data == "&":
+            self.processEntityInAttribute('"')
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-attribute-value-double-quote"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data +\
+                self.stream.charsUntil(("\"", "&", "\u0000"))
+        return True
+
+    def attributeValueSingleQuotedState(self):
+        data = self.stream.char()
+        if data == "'":
+            self.state = self.afterAttributeValueState
+        elif data == "&":
+            self.processEntityInAttribute("'")
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-attribute-value-single-quote"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data +\
+                self.stream.charsUntil(("'", "&", "\u0000"))
+        return True
+
+    def attributeValueUnQuotedState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeAttributeNameState
+        elif data == "&":
+            self.processEntityInAttribute(">")
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data in ('"', "'", "=", "<", "`"):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-character-in-unquoted-attribute-value"})
+            self.currentToken["data"][-1][1] += data
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"][-1][1] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-attribute-value-no-quotes"})
+            self.state = self.dataState
+        else:
+            self.currentToken["data"][-1][1] += data + self.stream.charsUntil(
+                frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters)
+        return True
+
+    def afterAttributeValueState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeAttributeNameState
+        elif data == ">":
+            self.emitCurrentToken()
+        elif data == "/":
+            self.state = self.selfClosingStartTagState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-EOF-after-attribute-value"})
+            self.stream.unget(data)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-character-after-attribute-value"})
+            self.stream.unget(data)
+            self.state = self.beforeAttributeNameState
+        return True
+
+    def selfClosingStartTagState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.currentToken["selfClosing"] = True
+            self.emitCurrentToken()
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data":
+                                    "unexpected-EOF-after-solidus-in-tag"})
+            self.stream.unget(data)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-character-after-solidus-in-tag"})
+            self.stream.unget(data)
+            self.state = self.beforeAttributeNameState
+        return True
+
+    def bogusCommentState(self):
+        # Make a new comment token and give it as value all the characters
+        # until the first > or EOF (charsUntil checks for EOF automatically)
+        # and emit it.
+        data = self.stream.charsUntil(">")
+        data = data.replace("\u0000", "\uFFFD")
+        self.tokenQueue.append(
+            {"type": tokenTypes["Comment"], "data": data})
+
+        # Eat the character directly after the bogus comment which is either a
+        # ">" or an EOF.
+        self.stream.char()
+        self.state = self.dataState
+        return True
+
+    def markupDeclarationOpenState(self):
+        charStack = [self.stream.char()]
+        if charStack[-1] == "-":
+            charStack.append(self.stream.char())
+            if charStack[-1] == "-":
+                self.currentToken = {"type": tokenTypes["Comment"], "data": ""}
+                self.state = self.commentStartState
+                return True
+        elif charStack[-1] in ('d', 'D'):
+            matched = True
+            for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'),
+                             ('y', 'Y'), ('p', 'P'), ('e', 'E')):
+                charStack.append(self.stream.char())
+                if charStack[-1] not in expected:
+                    matched = False
+                    break
+            if matched:
+                self.currentToken = {"type": tokenTypes["Doctype"],
+                                     "name": "",
+                                     "publicId": None, "systemId": None,
+                                     "correct": True}
+                self.state = self.doctypeState
+                return True
+        elif (charStack[-1] == "[" and
+              self.parser is not None and
+              self.parser.tree.openElements and
+              self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace):
+            matched = True
+            for expected in ["C", "D", "A", "T", "A", "["]:
+                charStack.append(self.stream.char())
+                if charStack[-1] != expected:
+                    matched = False
+                    break
+            if matched:
+                self.state = self.cdataSectionState
+                return True
+
+        self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                "expected-dashes-or-doctype"})
+
+        while charStack:
+            self.stream.unget(charStack.pop())
+        self.state = self.bogusCommentState
+        return True
+
+    def commentStartState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentStartDashState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "incorrect-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += data
+            self.state = self.commentState
+        return True
+
+    def commentStartDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentEndState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "-\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "incorrect-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += "-" + data
+            self.state = self.commentState
+        return True
+
+    def commentState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentEndDashState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "\uFFFD"
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "eof-in-comment"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += data + \
+                self.stream.charsUntil(("-", "\u0000"))
+        return True
+
+    def commentEndDashState(self):
+        data = self.stream.char()
+        if data == "-":
+            self.state = self.commentEndState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "-\uFFFD"
+            self.state = self.commentState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment-end-dash"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += "-" + data
+            self.state = self.commentState
+        return True
+
+    def commentEndState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "--\uFFFD"
+            self.state = self.commentState
+        elif data == "!":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-bang-after-double-dash-in-comment"})
+            self.state = self.commentEndBangState
+        elif data == "-":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-dash-after-double-dash-in-comment"})
+            self.currentToken["data"] += data
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment-double-dash"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            # XXX
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-comment"})
+            self.currentToken["data"] += "--" + data
+            self.state = self.commentState
+        return True
+
+    def commentEndBangState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "-":
+            self.currentToken["data"] += "--!"
+            self.state = self.commentEndDashState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["data"] += "--!\uFFFD"
+            self.state = self.commentState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-comment-end-bang-state"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["data"] += "--!" + data
+            self.state = self.commentState
+        return True
+
+    def doctypeState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeDoctypeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-doctype-name-but-got-eof"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "need-space-after-doctype"})
+            self.stream.unget(data)
+            self.state = self.beforeDoctypeNameState
+        return True
+
+    def beforeDoctypeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-doctype-name-but-got-right-bracket"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["name"] = "\uFFFD"
+            self.state = self.doctypeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-doctype-name-but-got-eof"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["name"] = data
+            self.state = self.doctypeNameState
+        return True
+
+    def doctypeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
+            self.state = self.afterDoctypeNameState
+        elif data == ">":
+            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["name"] += "\uFFFD"
+            self.state = self.doctypeNameState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype-name"})
+            self.currentToken["correct"] = False
+            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["name"] += data
+        return True
+
+    def afterDoctypeNameState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.currentToken["correct"] = False
+            self.stream.unget(data)
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            if data in ("p", "P"):
+                matched = True
+                for expected in (("u", "U"), ("b", "B"), ("l", "L"),
+                                 ("i", "I"), ("c", "C")):
+                    data = self.stream.char()
+                    if data not in expected:
+                        matched = False
+                        break
+                if matched:
+                    self.state = self.afterDoctypePublicKeywordState
+                    return True
+            elif data in ("s", "S"):
+                matched = True
+                for expected in (("y", "Y"), ("s", "S"), ("t", "T"),
+                                 ("e", "E"), ("m", "M")):
+                    data = self.stream.char()
+                    if data not in expected:
+                        matched = False
+                        break
+                if matched:
+                    self.state = self.afterDoctypeSystemKeywordState
+                    return True
+
+            # All the characters read before the current 'data' will be
+            # [a-zA-Z], so they're garbage in the bogus doctype and can be
+            # discarded; only the latest character might be '>' or EOF
+            # and needs to be ungetted
+            self.stream.unget(data)
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "expected-space-or-right-bracket-in-doctype", "datavars":
+                                    {"data": data}})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+
+        return True
+
+    def afterDoctypePublicKeywordState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeDoctypePublicIdentifierState
+        elif data in ("'", '"'):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.stream.unget(data)
+            self.state = self.beforeDoctypePublicIdentifierState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.stream.unget(data)
+            self.state = self.beforeDoctypePublicIdentifierState
+        return True
+
+    def beforeDoctypePublicIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == "\"":
+            self.currentToken["publicId"] = ""
+            self.state = self.doctypePublicIdentifierDoubleQuotedState
+        elif data == "'":
+            self.currentToken["publicId"] = ""
+            self.state = self.doctypePublicIdentifierSingleQuotedState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def doctypePublicIdentifierDoubleQuotedState(self):
+        data = self.stream.char()
+        if data == "\"":
+            self.state = self.afterDoctypePublicIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["publicId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["publicId"] += data
+        return True
+
+    def doctypePublicIdentifierSingleQuotedState(self):
+        data = self.stream.char()
+        if data == "'":
+            self.state = self.afterDoctypePublicIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["publicId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["publicId"] += data
+        return True
+
+    def afterDoctypePublicIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.betweenDoctypePublicAndSystemIdentifiersState
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == '"':
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierDoubleQuotedState
+        elif data == "'":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierSingleQuotedState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def betweenDoctypePublicAndSystemIdentifiersState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data == '"':
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierDoubleQuotedState
+        elif data == "'":
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierSingleQuotedState
+        elif data == EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def afterDoctypeSystemKeywordState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            self.state = self.beforeDoctypeSystemIdentifierState
+        elif data in ("'", '"'):
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.stream.unget(data)
+            self.state = self.beforeDoctypeSystemIdentifierState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.stream.unget(data)
+            self.state = self.beforeDoctypeSystemIdentifierState
+        return True
+
+    def beforeDoctypeSystemIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == "\"":
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierDoubleQuotedState
+        elif data == "'":
+            self.currentToken["systemId"] = ""
+            self.state = self.doctypeSystemIdentifierSingleQuotedState
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.currentToken["correct"] = False
+            self.state = self.bogusDoctypeState
+        return True
+
+    def doctypeSystemIdentifierDoubleQuotedState(self):
+        data = self.stream.char()
+        if data == "\"":
+            self.state = self.afterDoctypeSystemIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["systemId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["systemId"] += data
+        return True
+
+    def doctypeSystemIdentifierSingleQuotedState(self):
+        data = self.stream.char()
+        if data == "'":
+            self.state = self.afterDoctypeSystemIdentifierState
+        elif data == "\u0000":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                    "data": "invalid-codepoint"})
+            self.currentToken["systemId"] += "\uFFFD"
+        elif data == ">":
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-end-of-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.currentToken["systemId"] += data
+        return True
+
+    def afterDoctypeSystemIdentifierState(self):
+        data = self.stream.char()
+        if data in spaceCharacters:
+            pass
+        elif data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "eof-in-doctype"})
+            self.currentToken["correct"] = False
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
+                                    "unexpected-char-in-doctype"})
+            self.state = self.bogusDoctypeState
+        return True
+
+    def bogusDoctypeState(self):
+        data = self.stream.char()
+        if data == ">":
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        elif data is EOF:
+            # XXX EMIT
+            self.stream.unget(data)
+            self.tokenQueue.append(self.currentToken)
+            self.state = self.dataState
+        else:
+            pass
+        return True
+
+    def cdataSectionState(self):
+        data = []
+        while True:
+            data.append(self.stream.charsUntil("]"))
+            data.append(self.stream.charsUntil(">"))
+            char = self.stream.char()
+            if char == EOF:
+                break
+            else:
+                assert char == ">"
+                if data[-1][-2:] == "]]":
+                    data[-1] = data[-1][:-2]
+                    break
+                else:
+                    data.append(char)
+
+        data = "".join(data)  # pylint:disable=redefined-variable-type
+        # Deal with null here rather than in the parser
+        nullCount = data.count("\u0000")
+        if nullCount > 0:
+            for _ in range(nullCount):
+                self.tokenQueue.append({"type": tokenTypes["ParseError"],
+                                        "data": "invalid-codepoint"})
+            data = data.replace("\u0000", "\uFFFD")
+        if data:
+            self.tokenQueue.append({"type": tokenTypes["Characters"],
+                                    "data": data})
+        self.state = self.dataState
+        return True
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0356ca3a9790c0afcc58d170868e8347876851db
GIT binary patch
literal 57395
zcmZSn%*&NH<x)&C0~9bbFfceIFfkPWVqjoMVPHsMWXNG)$Yo@RVr0l=Vu)g5$Yo}T
zVrF0j$uTkHurTDZGDNXK_{<DB><qaa3{e~mj43P(DXa`RoD8{K3{hMVJ{y?N%@D;6
z;j@GJJPc7h47t1vQM?dQ4zMU6LlhrFE<ZyQKSQnnLzDnSjuR{=$PgvSkSoLxB?J-W
z0*eYWL<vLq+zdG)47s8VQKAq&4?~U^L#{YOlsE%psyIU`H$yWcLzDzV3NJ&dBtse_
zLkb^53j;$l14Cq#6hjI>L$HPb0|P@QC`>d!AyUH6z`&50RGgnvT9O){nOl%wR8qnL
z3Zcxh%;L=ayb_T5(!9*%{FK!AoXnEcqQsnH4MqkAh7vXg1_qE!MiGS13euKZSelv%
zl7@(Zj4v)oOip#qNGwWBE=etdY6jVnnpcupl9^hp!2~jn2jr6C<jhQ;)Dn<7u+51e
zfzX12)FLCF{PNTyh@(L^r(~vQmK2w8GB7Y?q*k~<cpxvi`ny34<N}$RpPiZ)Qdy8%
zT*3?DCZ>nLMIbH|Wnf?^N-fAqOis;B%_~87C&&XHA-+DIc?G2<!6ikhiMbGcEDQ_`
zAw`*~U~@q#zy@blr52$iIVVt(TfxM@kjel`X(<e#l$PQJN`5Vj3{fl$DNLXkiehC*
zVFokU7*f0#QrQ_&SQuKEKnX5|6)eulkirILa51E?gBjcmDI8!14?_wkn8C}C!UbmV
zF{E&V8T<?>JYa?ZC{465fYKKvO+*QS(gR3Dm?1>~tVV<(MG(voWk?YMGsGBDgux7P
zh7=JnLxLei6wHuhND%`wq!?1f!3=4J6bUdxh9N}~%#dYBkpeU17*eFc40(nW88AbE
zAw?F<P-IAv12dEuQslu5Wrh?5FhhkQMG?$UWk^v1Gt?MTl)(&jh7=VrLxUkj70l3N
zNKpebv=~y<!3=GN6b&##hap81%+O^>(E>B{7*e#s41I<a9WcXyAw?I=Fl0#412c>m
zQuM(LV}=w1FvEl)#SqLeWk@jsGt3xLjKK_Zh7=Pp!-65j6wI(>NHGI5tQb<v!3=AL
z6bmrJh9Sig%&=uhu>v#f7*edk410zY8!*FxA;lKVaAZia12dc$QtZJDXND99FvEo*
z#SzSKWk_)XGu#+boWTrth7=bt!-FBk70mEtNO1!*yckm4!3=MP6b~@Nhatri%<yFh
z3fAxjWou4G1_p(YjLc$%<ebFfVug~#?9^g~<iw&>h5R&y5>Ot>tjf$wR{*7aJuWT<
z1qB5yh2qqlG`-}~qN3Ei5^#0^iz_I2<maRmE0koULUbyWWF(d-fXs#{&8bvKN(C8K
zP?VpXT3no(f@)%MNn%MVicyIQMX712MX7noAS1yh=cblq<fkZ<<SQhlDrDxB<!7g+
z=;`SxL_|cOIIkF-hoPng<Y(rU6oWK@{DG9m74nm^Qj<&c!0M7g#R@3DgJ^G1hE4*N
zB@7HTj0`o*484pDH4F^#j0`nQU<MOI2{V|%!jR4YX0U?DEH)4s&kmF20M$Yuja&>R
z+zcf=AlYUnhAduCaSf`4g24rip9UWT149s~90HfP5ch+b1&Kw)sYNBAa@Q>}r#Q8Q
zi-Cb5wKzGkAk{4=F&$ho<s=rDxaF4?fyy;VX_=B(k{ApMQLsjE*n&-iXe<Hw(=R_S
zwFFciBgZ8~d1*mvQIH_W`=Am$K0Y%qvm`!V1EdSA6_f;mgg`D91}OrS)Y;{UMd`&F
z;5r9H6c;ftFz6Q)WtJtDr0SO?7U`$u=cJ?-73*gg>Sq@lnVTCHW*M268CsYZ=TxSb
z$D5>>m>3us7^LUvhv*k%7U*W?6_+ID<mi?sT9yW8fP}y}zAQB_CBH~Nqa-)SG$%7j
zKOUM;Q;YNpDuZMh7#Nfo7#NB{RT=}65F;luCnF~#5138{)mb16isNKZ9M^)}&j5<T
zW=2rl#4|Efq=Oh)OrRJls$i%v19O=fvRD|3!Wc4{7)n?{1-oPl6N6a|149;ACW{SJ
zv^O(?N_4X@#zIAg@Cs?LMn;CB5-1~!9b{%0V__6Sc%cwOcnT{+um&jbN}n*ma$;t&
zLU~4NQ7R<4C#Gj6D`X@V6r|=AL$eDg6NaZMq~t5)mli3M7MCXG<Wwp^GZiR*m1Gp<
zm!@Zc4FE@cu|i^A3dqzvh4NH|jKs23g+xdm1t)xvfhGA0MX4pFMPL<`nW;G`VC~?L
zRVdHMOwLd!NGvT*Ek?GeG_NEx2dpkHwW0*g#LQxaB2Y7-xCE5ZL3V&}DJby<fKs$;
zQBi(TDL6${7NmmPDqtQc;reNSl3fs35~Km_jKI>=($pXcP@)5+JV<H=8B!bsO2j3g
zC@sh@C}C${U?|8h$Vp8r0cWisIR*xX0Z*6U=2m<>sA&}+ZwN}CAV)K>^E2}^@-u2N
z@-QZY+DDuW3=FCa3=GbowE2pOfuV$fp_U1h+-jLY1yPYALkS~Tgo&Y+nIR9Ha%)+@
z>5B=J6q^|sYFQa7EEsB7K_yi-8$(e6h+V?Mkj)8ZvoK__f<&4b85lvy7fD;8B|~@#
zI3Z`TGt{tvnwd4s49!dowQLMEYz!qF3?TC^ffzMx43f3%V0$@124*rdlyHF(zhnw4
zgINk2sQF@+$q3Sx!ogsc!pUF;vM}#5V+t2YkcBy$ks<#js0EYF$dJdxz{FVm3nY=k
z!;sCwP-M)Q!plI81x1W0d?0fm7I-nH@H4<IkYh>_K**&rrU;_Q2_fW~7*m8%<U|m1
z^B7Y^k>x-k!wqUDrHF&tMk$h@_E3s6s11}N3u^bI$b;HCDT<)>O^Pz8O_QPuYR9Cg
zgW4`BnxOVdiZ-Z?lA;T0m!#-}+9D~2p!P?KF{sUvVhU<!q?m)+dFjfacmYL3AQLG5
zND6)ihDrf&EyM;gq?Vl_JkODVrG%Fun~R}n2@@kDV+|Xq0V7e%0a6BvD-KZVvv+D{
z1PfR))Np{>GY%jD@mh9<JVu6y8dgxtCYza|=oylem{3xL4LC)B(g4WOObl6kutb>0
zz)-`^5UgPfYLff_HMl`7lC;vi<dV$%JZQO8tdN>nl95`Z5UTCw=H{Z1Uj#0Al3^VV
zg`~vd)D(sMJdiNFSW8Jw&dg2B0jbVNtw@A%i&6`UQj1gbN)kaf=qY%XC?w_-=PRUS
z7AGebr4%bDSt}`IrYS&GLD~nP;>$BlAuqoKCJt!{Aqpowa5<f#QLR)`S&*t^1t}51
z{gP-UM4_h?TdN6b7r~k@aMxyn%DPNYy;TaTL2;Fpr7ED#T~1DFdSZ?)sK-_SYTxLl
z<rnGZmFA`vWhU!_`&^aq^0X9Gtbl^bvDh=Oq!d)Rf{NL)#G>L%h8qkFng8#Di2ni%
zrJz#u{r<h+&Rr%*VJ4_yk|__evK~at2N4(kGB9Mm2NB#L?!W(F?F<Z=|Nb*FWc~*c
z|Nb+9SWF->W)O=R#9{%lSU@aR5Q`PWVgs?*KrD6;iyg$`0I@hgEKU%M6U5>IvA94i
zZV-zb#Nq+5ct9*(5Q`VY;sdexKrDU`iyy=i0QH6$88R8}fLzMVz)%Wm1z49VFfcHn
z2AXbpW=TeVX^C!eYHnt7eolU#20y6I0R>?YD1yN49&jrN6rw?(007rTkjMvDLz#Ic
zU<FzEnR!8=@CyRj1F5D!=A;$nSEc3^r<Q<KCubCa+jL=xIi;!KY7yKBE6qz!Eztle
z2iIU=vCLwR)CzD7mza~2U!Ix*7A;Cl$*chPkwGpBE=f$zE&+Kj87>Bn_aIQk0+uKn
z`05bUZcNV4D=y7V^()OyN-c5)4HHy4f@;PDQ0ix6V}w9XCN>s+MrlS~Mqy?NW*$Z^
zMsY@VMo~r?Mjl2sMlhRMh7kgV7<o{jD5E$NNG&t703$CW7o!#n52H9EH={5UxU~-o
zTu{3jT-(lJ1`ij3>RAScECz-wMo?odosj`ly@Gr2k|j)_3a~g9R5zwDF-Vp$gBpD)
zj0|baFbPIbdmmKOmVm138i>AZCRiJg0aRB)ML}g@-eD#vFNK8xq^y9kgbh@K*RU{v
z>R=?7fRuyOvNA}fh=8msIuELdYgs|A!J-yatg<o`Jq1apurf%NaDp@y{{a=dJVi>3
zP_s(7K*AtC#4fOLAoXDT7#Om+K^mGFLCuXqb7oNC%>!~8s2$7;8k>*=)$J)<pqd<9
z#e-D9yqU!Z3PX@dDU6`HD~liGnr21@aZuysIAetyh!3)@gc;mE*}+&Mz>p<~qPCfl
zp?E%H0LVXB1EsK-F}zZT0i;m~p)rM(L7|xuT+6XBln8^WZ;&TIHJ&&FONj`$#{0*}
z$O!6$)v`hAF*aE2y<q~?gP@@1WdPM{4&ZtXo5#U}Fkp{^9LNS5HIz(&XxhY7!^BXu
z2^7OM><p46qM(p2ZiDl|A&=mLS}G9rNHKvo1PjfXOT<7vlSHIiaQq>3)i5K1q=ubA
zzL}B192EB6;HDck4+)SSlOS(KgOi3hNHeGjD48P2kj%s&S;Nd=&TNxs3+h5cvQJR~
zbBYi{EeAs$8))3AmIK`-H5?4!GzD@xH>BB^!oU!$0UE>e1DD%sknRGgjI#j?C};lv
z|NlRjSpg;^a8{n;px$#uL27bIY6{N!5>x<z&9N>8^&avPb5m2Gl`3Za09I&Q3UXd5
z++ZXf;JUOFREY$mj*)`h2<oy!hfF~o0I*?DKWM-^JK&-_2vk&o>zg1cP>rMmB1Axh
z8mJQs>Mey7m8L=}DNxZCWCD_eS3N<XZgCK(=m+=u!EJ=h)MD`PCdinK#Nznu)XL&`
zPz@MgP?VaMSy2M2y>jyN(o>5|U_ziKLQZNPxJToiS_!VPf<V2lAW&B}NE+1L0$UFX
zx)M<R2(7F@UIh<Vq!s1oI+m0aWhRxDq=GBY{L+$w(vlzpkVin~XQWnu>qM|4EBz94
zAtMzKu1{)SdPxSjasxNMKrJkgw;;W|0UCG!dkk8mLF%$jP+gV=N=i&@OhSyBj53Vk
zOae@7jAD!ejBJdO%wmk<Od^az%%B=cj8Tk3m{Ed}g;9!)nNfxjTwgKqFbXh=GxC9T
z2rvpTiZO~YaWRT9N-;t72s5!U$}#aUax$?&`j4O_1WG308V!_6Af<5%Bd9h?VFGm?
zn;DoGQ<xco!J|2)p0M^dbY!gvGDr>?$IDAiO;Je8FH%r~1iWV+Jl4RC74QI)5~6t=
zWDQDiHVh05e&E6RASV#t6qF!94g<Giz-k6Qwm?}6I%WciEhN9)1VtRk!3@mc0V5C-
zl)J!zdV&Ew+Ly(^PzwoEMh3|eMo`IKv;rE)l3C!vLC}B_BWUE`riKyJhmtH|0W}vS
zLDf7&DGP&SQ8BpqV`a!<0}m~Mr=28I7$JRV7D(|2s#zF8{U^zyr8t#yfO_BHil}fY
zL*WY0*Z?T<!6w&$D?)I0pB-dCJO^kpAy@;{o-JL6mIN}36%rNFQ}aMQ35ATryp){O
zB5*25&CM(+fs8PvDwHIq7bAL3#i=F5@O}(v2pBx@q)?Ktpakk^C@CbRCWFS0z=Oi-
zpdqfr67^yQPy$O$QAkWHNiBknNhxF`7AqvBrsl!T1KW!-iUf)cP#+82!vU4frJ$n6
zH7_M3F&!)hvJ_mrBD!7R0y+^^>J;l{=IN&9rRbI<rk8@sDA16mb54G7W?p)!3@8Dl
z=A`K+Lj-iwauU;Z^Whr&AkA`6Nf*QmDzZSuT}e@5UU5!hNoo+N+XQaxLz?}d(m4oJ
z?SKcbAQ=N(G=efJxBwgY>>vQD6>~F7oFQZN;9>oHpilti69!gJCQvyf0&aWrfk_cY
z0Y-4<0F~CDzz1gz(105#(ZO2J@GJsK^ID*km&F7k<Cz)qenE2!NXiu?m<1lj0!iHm
zOEH5R#52HB;8YB1a)PJKKn)Do7!#;*39=Gd1*ic58iis8<r#36$m;<a2^zrSU?^I_
zP{PR&T*C+&p8$=cyuq-7lL2f6XyhN#7UKq~E#U!;g^8!ILvy7CSRc5FoWcceX@WhM
zg~cf#lb9IbT1$8sf;B*?4%(gp*ZPpA3<G+yg{O7UczkAFSz=CR3ZmPOn%Y4%ETl1k
zt-S%BRs~z71}32vYJie3xK|5qW`HM)A?3XbY!U&Sa>1>JlEifXg48^4$&Zx0c|Zj{
z$U{M(mISz^0<OP79n#`Z&^U1rxEcVZ7H~BH?jM74DYyp<RyN?d0Gvrbfl@sv%Q7(X
zGxESOsJ;c&#5_zaj65vjjEby6jN**^kURith=M8!a2}9?R}jq%kP%i!P&$bR*9oxM
z9#Eu0YDaj%00|(FQQ!a?_|R}?U|`^9WMC);Wp4&XF3=b?$a$bR1POtCOU)c#!V1pu
zp`b+vpzN6fDFIf1f-j4mA&UcCLvn)ZIdJxbjxxha0Av-g5`Ys?0@Q#@0C1nH2$JKG
zHE@xf<H4&iY9Tou*(9jd*m685m(VW9gW~1={=F3Bd{EK_Wkqli5(Jxj^~?)O2IW*p
zAplCRMPR;9YH@K$Mq*xYW;(PyKokJrP6sF#LFz$JO&0`eYC;k@$fe*!9^?foH$ZdI
z1D@Q$9TkYjz=fL#DCL8EfKm>CazA(k30xLXvmEdPg#@U!g#-~Oqk)5Hzyl`8hk=2?
z5EL4qOpjI$fXXp&IdBqQ>OscM@YVdYK{+vn37pw$!I>L8Ck3kB!IMvtDJ%?TDXgHS
zFyP7?RJ|jsU}u1+;DD>h^8guH!VWgF7c?vu4AR8Fki`jV=z<1*AQ=^lF|drv2C3Cc
zxELVqVn{}X){#`IltBsq{r<h+HXuqB49+>AX-!BK3`z$@iRC4!6(yLt3?zxW>K){{
z3{(U{eFn~EW}t)xYHuU58B$ftgjC6b!frIVfu>uCZUcgXjF{vG>c|u)7iAWdfLeUR
zEXDDI8gy{affJnv(TNV!ssmMC;4*Fn)-nz>s>#GqBoA8g18%i2f=i(yjDn4cK{ADz
z!3?sp6l=l8235fh8bt=H$TPw)2C4{DY(e@a?4ZE~(3m=C<{i`+D&b%V2Ctxi6k*ir
zQNU6YC#a@^msOAfNpPzlt<p!7M4(UvS7zY)e!y!q@StWvPGV*rsDK5hh$v8s5Ce_X
zfm-~?wLFtJqco(I5Ap@P09wEZ8wMg=-xV=}27n;-9a>K}93%y5_p&h*O<>4m1vPzB
zm?8BWNE0iASvmu_nk!)kH)TN-2YB64JO?;waDqrsr<n(2R0=0J@x2ELW^sWgZ=kg*
zsC^5nRk^{2fl>*mf<#uq1F<!Q7exgR$Rv>QYe6+^3Ln^b8}LXHvSyg^{3x0kK<nI)
z#-8|Kh9!U)SluUpVgRxgF!u?fs6e*@=H3#}Drit5h2#N6aBZs(p85_hNh~UX4HTh{
zB7ve8)YQco5dyV(kw%Cdle6>k%X3mw(o<8wCflJm5Y#~fDzMprlEidf&?uE|QfY~9
zdVYy+QD%BZiEdI+VsdtB30Nyq&mEM`Z0x|s+Lz)tr?51&7_@{zH#e~;yHpUHonUip
zzzf2W`uL!hK3GqIOKNgXVi9;D1fpXPYGRati~|jTrG_B)`N0GIpjsT#(+5=@uz>;4
zFg-XoA+=6G0T%?CsQ??7l%HN&?3|wqT7wNy2_6*y`FIeO4?!NFS{76yn88W}P^kdM
ze2jdI?2No1HhA1#3C<E=<cEp~z<SCcf5B@Hd#oh}sP<rEC<<oCWC2wmDU1w~;B|$J
zprK-L-e+Mj0}ULrLNYxoIOni|$ar>!ycghH$p+4q6F`Dl9H2HYDAR)nzrcp2Aclq^
znI5zrm7O7PHAr&_H$yfDLlLCJz@{18-v(DkAkD}sK$)J2!7POv)FX$h-~u@V<Tf7=
z1L_`Tu;)MxcaR1ium;fTFvxnz6kbT%8)N|kLlzInU9cjG7i0=(JuM$Yum&G!Y5{$$
zm&hy(>QP~2Q!V5y14`_fdFh}bVO{Jw6;#8)=lHNGPt8xmnw|Aa6$#k{>Ue|8Cr|+d
zTAHH)YPlftEM$reHRlC|f$CyVZbi>>;0^^S-vxz(lnlyj7RtcD&;!b5;1&TWBQc6H
zihyZQ9{@D`2BMX~8H=4!h!G`Yfy!!dv+NtrW*Hkp5oFMr8Jvh%81hbll2!_&h2{(r
z%wh$tP+-hk50WTh1LuVXumtj$4)&%SB&D-3<Q0K5r$BPyY_Mi-5E;+HkQWY?f^<yp
zg9K3qvS8+Nz#Dv^ECAl=0h&Bd;Q~*d3xoB+MQa#Aq9wd2L&z8@8x%a?oB>KjsrhN3
z`3_h;gcvjiWeR<86~O?mKCq83gX%8W$}n&qL`s#Q@~s4v0+UkH@{3a86NHG$03;dY
z21<q8AOe(!f<OZ+kf9+^1p(HNRK3D#Xh;<Ss$w96BB1hgFx3;F+_wajfI&0shz=|-
zBV?5kC;@{oC=rV>31gW|1g-M}#W>da5@XQZA*iT^3|%mTQUNGQ*?|}+lMK)XBifJ&
z18Bq)srAJP(ihJHn#l;(09E6Vrjb6#5s*FtQX>SOd_XD02A*KRlNN~B2hSChq=Gh-
zB^FgWm8PYo7L|Y&LO=%6AQN(^%?hM~3S5?f%P8>R*Ptw;d>I%Rc7dW;0NxbfWaMX3
z!ci7g<133SK@q@`1zyN)&J+)hQ0Sx=D?=V6TG?Q0tH8@{A=NiCxVnT@h~Pmjq-ced
zLad<eCBYh?+~|j11Ht1Glz(jW5s?Xw03lGO1T77OR4`GX`AqaEM9a)*S$L2~VKf5+
z!%@^I<VTG{P|p?=NZ{&Z61<(3uK|j%Eby{GNk}&jlv$aeO9Qi+z)JvNJ3v4y@0mbr
z?xEeec2LP*)DCXgv4OHOxc3h+05rc3>eqqVc970KD4#=mlpG*S<2f1f*coe>Kz$w1
z1nCv9VOK~tj0<MiE|AMoAoY+osHa$@%?N68lHxLMa8(KN0i>73$&i-}GPZ;ly!^ov
z)GK5GP4F@?m@~yQG32>|Y|r9j$l?dj+^|8G3xdW#z-3VuXhsye!~tX~GeedD$UIm|
z7X)dK=VT}mf)B}pVhLOufySaC#S1t&gKIjFB&hL((R%}xVUSu5QcWV2bC4{dAq>g{
zpo#`O9SK@mTNDJ!35cQ&Jf{h%vP3|NBR~YWYKsK1+&~1VE`#JEL=HjA9H68IuEN0c
z4T%K>Mfn9qnV?kzps5gWLkLU^&?=^&7zPH03!uzm1TOEi8TlE77(rA1pmrH1iwoRZ
z6Jip_**XK&E}+OAs#P2~8I*{D_76h_<RPh!h)OL0lq3darRLAT!0-kX$pYX=2DMQ}
zK&6HeheXtBgEtQ285kJ8qsHNAt;R4~tAP$xC`GT;f?`2s5fv*mM81GmXhCrxI|fHB
z2HHWw#Kgc*Os!gM6V`S;bRYp&N39yvXoD_dDFC%)P&#cakQFCri&!{7>ah3nU>Z2U
z69KSB687!@3#2;$nyNwR<$+p4iun5nir@wnxE%#jZKHwKO8}*!5=oRvH6p6S63~b<
zVvf-jynh|s&xdsK!Of%~PzoB9HD(|K1A`nWL4hg}NKc;=-1JdG?MZ+#9;g`#?nw-j
z&LFn9CZg&bypfs6z`&pbicA4`^Jlc`9IZOR=N8ev>O|y=L0NTz&NVUzWe#dpojLfb
zPRJY)_y_{foE2odBzTnsWM&9f%Ymo8;@KGTWI**JXm=(%sB(o#bAUwS*}&_%p<`g6
zx=R;lO$REYK~)@h2Lw_lAJK0I)p{kMW%^hvEtkaN3`oTV9s(HTwHN3hn_y6!g67X4
zwHK(~!akic+~O+*6jvZTbmA+8fq@|wPkez24p0gPw=x9b<CTyhN|cqCB<HV#plp=_
zS%?ie2ZtS+xAK;Or699hyFh|j$oUpDw+kBCL!E0zRsoyrLQE*<1%r$P?aE+cD7p$Z
z5<D;n%INUT6<na>&JZg&v6u*23WYS3Si+4mGe)=&0MCEnSm-GTS_*)%;0_c4poMiH
z8cDY<n9YFRVn!=eu(gE2i4>7QOF$D!=mk#-=E6K~P=gsf>WElu1#%O3gb}>hD##nO
z`wrC38OUKp@c0>qf584t2c>h6cj4s{bk_xF)(pJLnvoxQ87N8%TbQb8|1c;uVo&>!
z{d$nJe+-;Zk<%eLX&*Eu3ahsAJV7>tHs~`k6g>nR4;i>;W60A3bCGR><|EMZFr>kA
zm|5V|&jns5L0lCGPP1gCeoz&Ov+fK^1*J`J?U)W?Wq=4odL5L#JkVy{YW(Su8{F#y
zO#t#>SrzDlFFiWoib>Gf2+)|!V*t&~K+|9}SOdK2^AwawpsNfZyW+5<3ea!@)GSa6
zgBRYA1Pqz~`3^Q0Su<$Q3aIc#6wM&b$SR<T4s^}~lJT%ahmwGWK=VLZlqFzLLV*li
zkW_p_R?R^svypaw;xEMUCu4Bp1t(*0!+j_uV^GfP2PI?BDho)lstPSs!OPX48(8os
z<^A}Y?YKs~IzUMjI{yjT*?~Ntjaa5o!^j|>0^M){s=XN);+epSk`qKChQF}uhU<i^
zf93*N3hN1QLk$4$uq1bp123qo5&{w6d2#TF7pM})sKKxfe1U95TjfxKs@o;MG$|()
z`xqEFfep&i5tI{_f|3;|H$ajVWDHD=5#Q_)_6b1fx<_MB+=1r4nL+V3I2S{p#vLTq
zQXnx;#4y<4jZe@aDqBGDDFA97g6lQ3cmy>i;r)!!brHB$Y>b3;5mcW+LgWijDuZ-b
z2GI;sHUk60eo*G1a2O1<APd}0zlF6vEdlQePhkh09^eEzi=YZx4rZ~!mdrqFO;B^6
z6|qbjygIcRyfp;0J}4Wk4N`k@F%(_{b0Kvh7eihQsFW??0k6`5^xTp6L1MLl1$3eq
zBWN8DJJO&VFUTO&s+NnP1hg_6bmj%5!G>d@4X7MJU8MtB!UL&M5&I#bn$ed&gF-P#
z6I3CC3S*?zqoAr8oHR>7dk7(>f%dQ=*RUzzekOSLau7Jxfh%b6klmoHXR{a>7;b}-
z9;}`fV^m@kW#nf9t<z9q6k@_YZijt;0d$Iz<Z+<)pqPgCLps5!30rS~6=h{2ytA<h
ztQpc<zJsBeoZfO?Jjh7sNRcGCgMsWGn33QUXyH2%AlZS9Ax{az4bbikC{sbZGvIx{
z-1O)-mx2atpewQ=DHgOg8^S_cUrT&55`6#(G};3(5+gg{8%7$G83HsS{Th@ZRNxI2
zNIwQbA_j^;EKt`Rd@v2lKv6ipjycJhgB_`pPIBfr1xm@#Zu|?3gb7Q@qzt2i`sy4Y
zlR)F9*&ySgLrJPcW)v=%X0isG20qi^?ZKCTQVou*0Gbv6VWb)&4^+#5QXFJsD=4oH
z&dmq8pv=I`zyLXOAKZM0<Oc`|$_pS2sx-hflM?c_G*ER6ZkKf6%NaxsS-BwP21utL
zxoC!#w4l8S(2^FETv=f$4w981RRyGJf=x3U_Id`Al^}y!n3V#>gIdU0DGVbk!HmbY
z`;FXjTTnuVw4!J}?1i@$0=WbC$SydGfEp)3;32W0kXiB>7#PGsnFZABgN$8(hQuIQ
z1ww){2?!I)Fxba4pzW+sP`XB$7lWmL#C&!NB=Lhu_;n$OiER#00S;?pLz*z`kUcw~
z1~Vje=o6gS2Dy>}e`^A=vKe)X8@b)=nupwS1_fLYII0I_8v&Fi4L}hr04f%tr6FiI
z1EsMH>PLV}z0uwn0|O0vV~~CpxQGBJnL*y;Dqvt>um&X_kc&a31Ku7NJQ1zOT6IE4
zHVwfg0eEu|sFTkEIy#UsuL@LGLI=pxz$(~4r*}v~dfO>X4Czdup#X4Y!vT^9Z3J=!
zX@agJtp^Eaae;T@<mrGVAP0xf0!u);{G1GVf?z2DaF_ohSPJ>9XVCeET#%jHjEFG>
zBAl`dR5*dI=wM<f@&LOMo3XqgKf$|UaAQ;WK--|O`7jw|YzZHD_iZaqWBE~x<p=o+
z6g+Am2I&4BMh3j$Si-^(tRV>Q;elE|pyfZ{QW87?3Yj^A3_qxYMU=p#Ets?cm$yhW
zN+1Kk`9~RfeE{q-3Q&Ize$uEec)t>8E*94oThIU)=-@VxS@7NEsQTgi(Npu&AP4t?
z48-D4w1XZXyO!XK10b7|K>M7)V<;s;pxgLhN1~z)W`lP$f%i6n$6UZo0#H*Qd`cpC
z#0D~GH#k;&gSKONgR-z0y!;nq<YANo*94#qxv**-A_A)D5iEWtDOlSWRL6o!D{w7Q
z#st}thqQO8gb8%}P6;#UIDF9P0c0yV<ccU3P(qAnWyqTV%6y>B<ZKK@l_0?^c2LR(
zZ2$zFTn5_O4Vm=<Eo9>Wo%vG21S%iI&6#aLMl&(w`GSmqj=%IVfNW)E$g=<mg8FuB
z3`Hx!=5m2Zkd?9^DQK_q2uLssQWUT<<S~JzAgyFESmxpd4=?gTcI0s~n1LpCnGi(*
zhI>=E!JE#RLB7x10Lrc@Lg2zB1E-1nAV0%P0SptN+t?u{#(_*M;RhE0OL3YgfMTKm
z$eSR)D}oqUgBTv3pcCqgz-RcQxI;2a5VX4xbW$?|XyYyDQU~bqJ2n*wsKzR|#QHMC
zFoCXv0NuHOu3oYRQVw&2ZQ%i(d;?n1h!nztaMuSEax)cjGlkbMGZaBwB@8am3yYZY
z7(kI74Bn6kY3td-*W-f^xd+YKKyEKVF0wGDyx|2DsKCSA)ekFj&`S}UQcxiTSC6Ma
z18ot84q~AeRi(n98$wG9ax#+>OHy^=l8Do1k&7)G4e)MCAyBUyJlP6rU4oC60q-$D
zJ5&I1>NsRL7nD=M2hKwdmju<!C7>QV_&{kaM-d>3GtksHWH%?gObc=WIRZ404L+>^
zd@&oMhy!0#nv<GXmYJ6hx-t<wWB@*c9&|i4_`qcFnYN(P9(>74JZK1RK#!ykDg;$d
zph6MUPXo1UKsTyD&a{<a6a(Fg#{#+;4^%XQFsM+J28l9?GjTIQS&ZC_{7lk}Y)ovd
zx{Pv+(%{7d987Gm^Pf?M*-nw(BAN;=ogl?1WFQXQF#-)`fg4NEb0SlrnX#FHfiW);
zqz5z@%*IeO3oOA2Ixa^NwCDuf&q8WraD(JQra>A@kd=*FL4u%jW*8ViQjo?HWDtS}
zT>9`bWN|S-^Dk&f4swMVXkjv<X9g-LvcRhoQ&^DOZEzbQjU`AMEE%V<d?2U8i%B9p
z0%<Hk%E|>ejpau%7E)HSG2}rSON4DfYAk`u2uL%?4qg-?8cvWV6ZOg;P{zb8f4~_U
zQI_a}a#<<pQYv_R33Qfwej3WzJ)pJ{sGtKk;ZO@5P^pMCzyT^aAVmnc_yJvA2`OOQ
zKt%$glmR&ooU4KmB?%8m3A_*)bPc0o1_p-tpfbP;rC|ih@1SN8q!9$-fpR~Dhsr`~
z9HHd(r=;ig4WN7r9VtP}>yTmqaz<V`ICsKklR(3T$VZvvWr0nBoDDq*tdtW(f-<r{
zSPD`Rp9Kjb&Y0r?9kC+`S~`@%4r=wla~$L*);tlgR><*rka2VP;d4k@xlpu1D|c=N
z$rK*&Z8s^rpjHyd#W2_B?E$rHK$i)!F%;E;b1OD;1@W5;X)B?an*uTy+G5&;(_A4G
zbK#|cIyh`FoR4V@xEKJ{(2%wWq)!AnJsy&wAO|X7>lx`GA9w|C1?ZN6ZaIT@XHXBq
z12tN}-7-*-gQK?uX#{~3z)mCrXKzRW1zE<LPzqX4oLX3#m;=7%p){|sG#_-`51K2$
z7wN$Z5Hv}+6H!VL6l=hpNt~rf38;928wzf@Kt|UB!Hxm9AHao738+7YsxUMUSrKUH
z4U1{PnR)3ssmKb!9W`(n1um4pg%`+h#8k$hE1p0_?S4@4WQS2a@h}QQS1p1HBv4@m
zqNTw-I#d>@fr7Lg7u19U_uu|uU2_2~fV9AQ0KDuFbiU;UP=10oHr&8cETG{AP<5ZT
z1uTbL;viq~0Na-fx$_jH0hCd}yL2T}K(hp#kg@@Cm{$hKEKnbggQ4g=*dA<Vaii?<
z<pQY#IZ_+M$igrh(V651-S!1K3l`M#0bMe|3m)$PWf$bUOKNou%a~X)AE>{8(GP%R
z@)YngM_q8{L$v-;+<|`ggal|n0(2V;yzvgsIEc&=<P55A(Gogp8b?&*gD$mKFfcGY
z1f_P62S5#SNMjr{Mh!~Qa<GHLm?Rj55zEU*(=!8jWCS%mL+T$$T|}SsTnsL7(bF@E
zJJ8Z|5NHcHxR4*(>9&f2f#D0u=@zux5L^!D;%h2G%3)?u$p%{ZZ4YjTLHdJ`a+nn~
zZUQP+^OV7IkVaxWNJADIc-$n93oHQ{kXj9v0I!b&b>KKbEg<lHf}kNT=zW5q0vdc{
zC8*&Bx~>sABnP^xa383Eh8}bb*(rg|EPl{MhwwHehFK{BpoSpiU`Xf*t0v$^8aA^8
zQOx22xgQh~rXU8Wg9&M0A~_S}eDJ}?C48VO6hT)rGckZKWCj)cpp%b9;Ke>9gFwcL
zAVn`E!J@Qea1L*SF61lCgSU}DXOx032LX+6<7`%8sVzVi5RL{Nycq{76LHiedHIlB
zR}9|V3vTe?^b7dpbFdQPybg96)?stdm@-o41vjTajs%aLLk5qq)jXP@8Vb~p9CX!B
zB?AKkI|~CtF{nj}TK&M9SFkDwM)NZ%GKwIoB2d(Vv-Df6O)Kc!7h0Cy56)4LEbR<V
z)X+m$Av;PT`8f_O!3H8hiN7192Xvta2SX7gN5fAZ<^qjufX30$?+5|k#D#P+A`i?k
zI}ihU5;5dfa_E{@P*)JP4F$59gd1cpsIUR$F<7AlK5G?J3qyKAkjw;`gU8nM0WCN}
z$~3P2Zo25>7vKgGVl)MG3^9@pL^i{!58Dx}L5Rfa21<Y6@d<7a3oXThq8>bjGdNc@
zfhtS|P!a`o;Sfm_lssXB6atL=;Oj3zttQNsen+q-OlX_m6g0RFiP;n;1{)BI1yX}R
z(i<yy0-_0=T!`9x#EG0-AkB1cY)5(GOm8R#KoTrB$dSkwIM`tvXvoFDz<@2~fg0mT
z=?IbXit}?aQ%b?TVbFz#pll58XoJcsBn{{Z4^<m_;|5g5K}O%fNe+K%1GVhIiFDAF
zilD4w0!nhACFGDK$IA#xaG+6e{E00YIkBaHFWH1_zt3U<HCj@bL9==w5%4;IEEe#P
zGI-H6_yRM~1R`qj18L8I(j{a7i34(^1!x2kx$I$pSDGLh=z;p+;siV?4U1l+(=9+#
zz~GDHp%=WOtt<v#I|L~fz!3$C+Cdjlpp(qqKoP|U8Y^HCViaQJWRzq9MHRRl0C^i6
z9tlhg#ZG8*x1fvM;TN_-`}t*{+zUFe6jJtsFMJ1={gC@wp{m|8g4&VbtKN}o9nh{d
z7H~<y3L-(LkFYZY=aqw-qKpiZDRSWXQ4PitcF?40MF2yJJVS~CLy96piV{PLGDC_A
zLmC@{ORO1mE*ZB&YM2?a*%^wKf-bhIWnu^bUGTb;AsjTR`IZrMX$UhziYWB@4pxQ~
zF$S{~28I-I2qnQ_2D&sv5^{e4#Kn-3ijAQJ<l>{CPyk;%AO*fh;4QeJ$_={;9mdT9
z&uJE+azWa%_(1;8;szbupT!TpF8wW%r+GjP@DynV(CQCqh7>7=bmBeD%uqCov4jH@
zegTEE7z<}HLOl)2Ap#(4VZjcWs260&VglzeW`-0QXn@Fq&d>$7)GHJ~J}oi?&(Jb3
zWC?+|S>UNxP^=dUF@=N76+tpr12iY;2OjnSHz{>X!3iuMe1iod!-3Kxm<KLYK`lzi
zwID8FP5EHbA512LNoO!w0wzPiWF?r41d|0|G5}1bf=O4fwJ!O|@azqq00A{g3QCi5
zGLt=1z*h$pR~DC~=6a@pl_%#H6{RLaEQtmi<A~nQ2OUKLZ``LO7H6au>*g2fra&wL
z7XV<5P~RW~pk6`<K>dXffY=*?5P<p+AprFzLICPl@I~)P!>Wh@O;Bqae2+*nBm$7m
zkCOm3bwH&Sc<vZ{L3#-fXd)Wo703XRFarYvc#^iHC>3&{cz!`@o@-7j=suES@MJD1
zT#G^1w1ek+Q&Q6sOLIy<D`Oynf(#4{;L8t#Q<Fg#uRzQNH?hDCD^RNieB%Omkq%_`
z7}SRX7rnWOCCM47Dd3CKVWB?olf)qm3=E;5QWY{u47z0jbV0c^BM&1x_@Z*qI4nqn
zjgf<q4Sf9xAGmr1$?`MuGpaJOG0KClD2J%vVPprj&zLwF;j3y;CXPUN34-z&(yAIz
zMF{C1K)Mc0;4H|@kjD%zO(8vmJdj`(mYr*$wdF|FC_5;_gF5sn?BGr~r2D}EF5C9u
zG=meQ3tUWq+y=G<!~pNi0~d&p<#@~tdHJAX13H4s2bKb>22~PB*B5dTZJs>XO>kEu
zCSf3@G&AHVM^Nhu(gc8>GJ~F%LA4*acmSnQ_zY@(N@_uVW?l)RbOOzYf>xV>N+~<&
zr4P`eLKm8^N<kGYv?~r3LOat2e8@jk3Y-hkc2R(H1Zu{Gv@Ss20B1~u=91LG*%hf}
zU|?thWejj01y4J`x*(vXWuO6DVX!Ea#RQtJ05?QH$sIJM4DKnLVjcW~c1X~YJ7hNm
zWyu|KiVgLWdoh)hyE1BWPXRZ|K;yfh>_(d;56T+4l&5)qP~i`$c~IBJ<4x^B?Xao|
zT+>17gu$_BvW<a(VJ0alTpYGc5|qNhEg?`-`zdlS2y_hsI7+dn@a>?~1Z`N8TcATy
zBnP;!j=Mld+zty$Sl}WW#6T42oS=jVnpHzfk%-weF6ia4pwx+Rt`eyHBzN8c-hIPT
z(1L;%+~|Uq^XMfns1XA#JYDn9wtb@a>Oc)9#N_WFo)`n=kqw}f2-=PU>4Re_YncR)
zr^VnU>_-yPAEb1Il(0DW+T(9ffKm~>F#t)6oZz&03Y4I*Hc$wrMOe9)hn5ymOGlWk
z;IxQ1+Zmcr$ZZh7OGnVkNz__j7qqGh)Gt6wgh3skG7a43##Z)$ViPIZftuxmuI%e%
zU|=`|N^u|$pr$y~S{<d#gQvOW_-b`qa6$lYWCSG^7WkG9*hoQM8dAHq7oi%|hGfSz
zyv+h?Q6k#4Ad?{pf{h_h3~U~x(uX8Nu<dB(p|)`$<sTbE-c4|s%mr>BLmIT$G^5@e
z3U>^oxtcc>WJU=WI3L7;8^zen-~o97-pB^40C@vT070&f0jogs1nT{yaCfBefm{G8
zsX->f0tTE@K=n4H=?odUC%e=J#l9}QA)#0b>hd9to+c&cr9(&hp-Ue?SqC&#1}(3l
z#X6ccup-DnKMrl+ZaU-&H>gRvNGeM~(n!t#4dNnO3aU_ab<uM$DA_|MvcQ!DDDOk&
zx<I{VaGRwBwWe`O%u9!KcR_9V!P#U76-!q^nHsSR1SK=W)>lAjq-H$$>Q3xg-H5WR
z{t=Wep)H<la8_pl<#2FDW&w3jLFttpBmr8%2&tbStCV+x1QDA_!Ig+)3Oj=t=t56s
z#AXeId7Low;CUNTKSA;(H)_5_G7mhZMpV9p)K3T-SwOyn<vN(H;9LhvCCIr>7qttj
zs|&f4m(<J%+MuJWs|ae%%Ys%IqGk(FeFe^j#U+U)sYIuFP-Os_&_z^TgR<7@0xiS<
zC2&Na6q3LpB(x_AP2R%bi87>xaiE$W+$TMWwZ(*e_I5TXhCy2vIT(uC!6_1XW(+jY
z4Z6}5aYtPVI2C}_EwDmn*ucs`iJS{w4|0Rd0ZsGTff!j}6`*1s>C!vYE&u4Z!ZL&O
zf$lN{-GT|~h(IpA!!{>|a`7s3WD~r8To-o7E9lZzP|$z}Z$XAZheJw14V=8x)D&It
z;2*qb2am#Hn}h`)a|_wB0v)RbjT}M>O^{iTHW8xa1sAm<pr#a}3<gyWgR^k0V_;z5
zW@TU~mH`cSgGWAKZFF8nNLu5@aV;YDvx%VTO^zWCvU?3O0$2@-+AL-U#B3RC3q1>H
z2{*WuDq#aF0*{%2XK}&GL1_%py@NCXI2rN|fD$nD>bs+0ePGp~^afs91lpDdE>fY#
zYo$OEFgxhnX|Umt#yKZL9(cY8x|~M|T$o}riJLrUN`jmT@j?n0B<H{^1|Mb#N-VJQ
zlnclFuQsSegxxxhHLc@VaE+YmAst&m(B2_j2VaAWa?nsY>b1sLZ3L~K<^`p3ArJwY
zPl0So#h(p8*#$BL4;jEmWF&5oF@v&j?q*<MkO5^7(9(BEmx38u6oWGeoQ;}o;PaQD
zh8n0G0vFN6SX&*?EaMJM#^C8U7KRd5P{|5PJItUp%iu%{&LN;{xHZ6C14xe-vRwkK
zNHPn%KJYRdh*6+PF%XLjWE;q+yPzZr-H84OB#2m313m=>JgE&jftVf9I00J*ZtQTt
z8Yes;tswJyLFR#OkK|w|iUH>*u<f9niDVupd@XbdWTufBo-@IQlj9S}mC9i4Ah$s}
zF(sgtbD-qqhe+R`%s^qU0XE<+49c94<_dB~L7uC_x(p3mH^BEMf=AxLy#?%53?f^B
zoAjVkBd7<IWk4Q-OpXo8%mZ?x87T9BDnLl)kp<T=vY@&JnspGZ99~ASI1_Z4G$`AE
zT87}P^9^6tkz>fa0?rYT+6J->30#bWk~%mefm0$p|11Nk25mOvU?|!NT8;rx2U|bH
z0NN>twCD_M6f_0HR{gM|bbG-nAcnwl7~C>TkYy?I;FSZKj3qpvnePfGjAa9?3@)+S
z;AI0yD;GfPOc)uUYXu&HTnb(*@Q|VKA!Mz<Ot8mzp}7xKspJ)aa$t%o*uI%a_Ng(X
zs57K!Fr;WQq-Zgu5w<Uov4j)k*nq-7#==0zG(E&VaGs54X8_v=nWo1cX5fh~(5A{1
z76!8v$h3VXWGI=9!7N1%Ql>zgm*AQkT+l(zfq<B=0jdCDl_YYVhO5Hl!^o51tPgGp
zg0enzjvCx?F9nmKU@{3zI)TX?FzEv(Gr^=Mn1oJ=gW1JkG8jxkC&IyO=qx#y4W0f5
zvva|uZz*VDAZ)4_+6v7t(nYDnL0x@lc>-Po0CIa-Vo@=8#0_i=)Ds8+s80|AQ12iF
zpngIKKs|;Kfcg$00QDk50P0VK0EP;v?-44XL4Xi|h6C1e5mC~COGt2W2WmDzTG=9?
zG7nUiK>Br{G7o&64|35N0A4%comyF*Uj#Yp2t!FQctr(@5>U%1DL=im7+L^>+xJNG
z{h+y>pcatzt%Kq2ji6oz1_pmn$qJh3hm@?KW(lM$<z*BA@8|}#-+36>7<m{4z@;vH
zDxVRnC>ux@JEIV2ApjG6&J$D$gG=BqB=j$jfr}tca1jLA`H8$C3VRWXydM-)k}`wK
zG!}-uN|0gDx%n#~L6j>OVTOVG4UmomxNVcg4O*iFE=|C8gN)<`HL1V_CJ)FQP-j&J
z#DE;xfl}Z@R)T>S34_WRNcjU<Wv_&DP#(vi9V{n<f)bRIk*DHea!3UmBBwy@!`dwc
ztx7@ZmO>J~XG&^bNoHDRY7saILx%qlxeDBL0OufXP+}GV5r~`y%1~h22h)URA85)R
zl+-~!h9q@ZTN{$BK?5Y<wm6PMbkhkm9Uw<BL7EP3pe3H5qyk<V2u?jLpcDc+k_6JB
zg=|F5!&JuxQ}-2=UZKaloCXPIA#V_2V}K9$aYAc9NP0!IfWgWkj({~LxIyNC95DlA
zIOy1C4u&EPa8d@V1~pE=GXW68xj~bh$eDpS!>vKKV0A4IZUZ504_3&L(V$KtB(Eqz
zjuSvx&IYP|A!!=-7Gu!Olt=^LpuxZVG}!7jL`9C2U$A8-{5cWpQPiMpPy!l)gJwze
z{DfnpFCHBPH}itCAGnSK=f(-3+&C!n;6w%nhH0QYXaXN50#!G>;A#az!gC?CSr5sP
z5K(NymDq=murDxxoaF)O?vk*;fE}_&7u-k9I}6G<DUh=OAh{B}d;pYju&(eb0gp9-
zP9Wlj4BUW~gK{NeIEoXLUqGu3z)f!GOc^9sf>om#j+iMU$#6)&mL1e%M(WpsE<{7l
zZJ@kG>bN_+LPE)<u)ZzGM7vV_`4N9ML>sFw0S((?w$+HKvOt*=($Pg^mqD3RCNVHD
zYzE~NP%9s`wt~$}fpZ2*E`fG<QO1f!^9T6wE+R4?G5G^h>kRVz5i|u<0f4(ZXf3uO
zll&($Ffg2^M)Jpggf(=i6tcpS8C?3ZFyuvn2Us8txCoFSq=SH3R)dRkP>UaOW)!3{
zS%gpxDytz!D1nD65W_nu;CWn7MZf{62*AxXkV%h_s+2e6m;`Cnu`uKzx9U8>tvYa@
z1<g%}<;Nx9Mi<CU(EI^bj>E%{RvlOcnt=#UVi*V+;bCC_kDv0ucOFBAO)2jIftnHE
zkq!9n22gFIj;$$&RK;K$GAPkyU|>i}Eh$e;&4YH{AuTt@yc9@BA5p&)W9<`xGZ(m8
z0r?ZT35c#AqX~#lF=p$J8<f4lZN9<V(gPJik3kt2vDyOE+ky-%Kw5JkJ~|6D)Bq8~
z*4DEi&;x_4bb@4H!h^Rjz}XIxflENkE<ouXya5l~UxQ?HcGw&tWZA_WOm&dP8#^rX
zL6%DW1ZQLLXf7zPfY(Psx>Ov99uN;$5i8P+1>};mEG#3<kj#h8K%_nzx`E)_4H{kr
z-NFM(l#nhJEc4;YJfMLJY_sKjcm_m~au=>ON6`Kd)=m?mo<igza0NCEl-8$%2ym(g
zc>>aY8@x$>Dgy%pBO3!lG3rzwB<VvsIS>+((D5hv(a|ynNSllDx&lk`MM|~c@hb3;
zIMhDkM$6EPcC0l6IMoiV(XxI91_o(RA|4$rV}%v%Jm3|qkbXH`M$3@u3UFgF3o-l#
zDcYf<WuWv0DcX@n%g|axpmq`N(K7twT*MBSVJ+Ih1v<DG2N&qzvK&#|gPaa2(7`Py
za3Mc<i}o1|3=I09TroO+1?pA9MwKB=AZ7;0l<^QBzk=r*`i)-^Ux|P-lL)9egvc&~
za{LOE;e9|kWpw<CA#3pD4@ldFqVX%*=Z~P7pac%CEzl~8A(Q+;wOk4{lK*Xdv*mIO
zc{{<KSYo@pkdurcyCWf&M8JELoS>OV$Z}VtwX~3C2Y7r3+$jbthxC(Sg+Cjp7Ykak
zrw3vn7Uv=v$PQoi3epN0t%5Gf0nHddnl88-Cw$cDcY<a)kdBT3ZP-ED6A4aQ;6fFg
z@W2fbMB`-eHc3Evr3RGJKv@McQ2?4!gY-60dzeT=DxfI>@M?^Dtmz9neMWe%njI+l
zL62gCEY3z>egWR51&Veo8@U)j3(<nXJuhe)KsuEOyc!tfDXcq@!0`j_QVq)L50qZ|
zL9rqP8e{=aZ-Qe4yi1jz8N4b6lmI~(91jVM3=HWE47H356-yXO7#NDyfI>El5uB&M
zVF)=w3Y_a08Bip^*Fu3M7(i#-WPy(@t7T%SVFIoG1ziE1zz|T#3F1Tc8Wk6T?v-hR
zte=A{e36GPG?)Xj7P`<*0d({RGlLCSFT_r;Rg8t44B;u@jTw-&E|ArQkh6!I8Nq80
znL(>&vRN34R2eJGK+#;o3|chf5~~5aBn6ZnxImtO4vrz+ImH86%ux7*A-skWbZijl
z96ny?Sy_1uAm<eYfQPn`4d7#tOyOcM134IK07xnL98Ay(96nHx27|jNkc1Ws?&;fs
z5AVtR_y7O@Qc#YFjfE^W0QHp^AeX7&8VeJ|x&$6R5ejQNg0wrsZb~TzI{>_a1Cpje
zi376n8l2ccX}Sbd*f|y#rxt;ZkZ~<4$}b86Ee$9ErIh6S(!3Hdt0*xqJrz=VfeWb`
zP>l&My}&17BG%r35AcGVU{jit;|ww+sC-Z?KWk=SV3-TaCZKb07#P_=XLd14g0l+?
zlMtf_qYxttlOPl1dTU`uaYlYdQARdKaYjBy9!5V6KhT*ypc*7T9<<>gKE4DL-tqCd
z`6;D2sqyjPlXc?bQ}UDJ<H5)N1cA1N1*w1n3)F*ybUd9vT=3D+ZXgyo6x~5Aknur2
zAXWf~0G)vo6bxc{fQV2K5e6cBK}0l&hyfA)AR-<_B!GxO5RnKXKqtZlC4pEeAR+@q
zq=AT35RncdK#490biaHM=%#PTor<8#T!TQDR0idNlz=Xz10R+Lxon~sBnCPuJqUDw
zbP(t?-XPFfo{-~(LFd<j&m0N@E$|Bh9a|CvI@tldi8BbiwGFf{G6=MHEC{rTCkV7r
z0kS9@v^FpZv}!5{v}_{?G$S1ZnwNu2FM>ungFvH1K{G%u0JZmnK&>7~;|)~)1%YB0
zly)H(-GEueAeZVF6lInrmZa*JB^K$Y<>#cN78UDf7wTsh8=0FM7G@clml;}^7w1%_
zm&co=n3xzC7#O7I>4)eSWESXV<`tJD=H%#>Ct8*UW`KmiIKC`3FD1W7Kcgf!$22E1
zNk6_MKRY!qvnsVnub?srlwCo$5*35yCD^#xn0WX(1vowU12|bZML1<SS;1I{Q;3tF
zQ<+nOQ;d_FlbcfpO7el(T%25-BAg<eVx0V7z5u5vr#Po1CpV`6ryQplrvj%Er!c25
zrzEEc*c@F>aZYhgAx>dVc}{UoK~5=7Nls(1Z4#UkoN}B}aJDcfpPvS(0Rm0GX{9Bl
zMXB-epcKat1S*Y!K*duDKLZ0pL1uv-)U$fUnH52xk|qe$$tnRAAIbSSIgrz*ii1Ff
z5jfW;=Yzs5ucR2VxdyZr9&*_mDC-1qf}#(UZy;-9!Nm!<sRSyCz{l~#XXX`@mK2v1
zr6%SEf!qKtg5pbxGE;*DK)TI9`4D7meo|IyatS!J!O@K%1}Nge=V{qM$^$!4Ko)~q
YcQQ-@Ajl}dD8?uQI-Lr{W8z^30IcQ~v;Y7A

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py
new file mode 100644
index 00000000..a5ba4bf1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py
@@ -0,0 +1,14 @@
+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/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ba5d89005fa1a02ff5f9fbe04622b7fb6c5799a3
GIT binary patch
literal 489
zcmZSn%*&NH<x)&C0~D|_FfceIFfkOTFfcHrFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`w{FvN1%lGE|B%Kqc705*!SS;dz1#EUBCf*<1`okqnHC
zjCt$~5vd#?)hR3t!5SbNGeNd%Ff%YPl<+e!FeD}w=jW7`q{e6F7UUO|lyHFDl3A8n
zoSC0jBEZ1FP@0#SoS%{!pOaaVT9lYmoXN<*z@PylN>~^e7($9NQ~fl!K*oWH`1rKa
zlG38o`1l}@JwYIKK};Z75K&MW1h$xsfq@~Q5~Q^R#7s#nDauR*GhH0PqTCD&44z;I
zxfT`W7ioaZLJ-Ae3=9nV1x1-<i6yD}Wr;=lY56%RsYS*5*@gPq#YX1lhJ{&1=4FN!
z=EXUc>E-bzDJCWc1_lP{dHNyx1(^l9nR&$}i8(pC<%yQ1ff*nnFpe)v%}dEI($6T#
z%`wf%Owx}BIZQu3J~J<~BtBlRpb{KDHo5sJr8%i~AkP)^F)%R5FbOcRF*7rYF!D08
GFaZEpFl_$-

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py
new file mode 100644
index 00000000..a1158bbb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py
@@ -0,0 +1,37 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from collections import Mapping
+
+
+class Trie(Mapping):
+    """Abstract base class for tries"""
+
+    def keys(self, prefix=None):
+        # pylint:disable=arguments-differ
+        keys = super(Trie, self).keys()
+
+        if prefix is None:
+            return set(keys)
+
+        return {x for x in keys if x.startswith(prefix)}
+
+    def has_keys_with_prefix(self, prefix):
+        for key in self.keys():
+            if key.startswith(prefix):
+                return True
+
+        return False
+
+    def longest_prefix(self, prefix):
+        if prefix in self:
+            return prefix
+
+        for i in range(1, len(prefix) + 1):
+            if prefix[:-i] in self:
+                return prefix[:-i]
+
+        raise KeyError(prefix)
+
+    def longest_prefix_item(self, prefix):
+        lprefix = self.longest_prefix(prefix)
+        return (lprefix, self[lprefix])
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a2d9565b3c26a55ec44b894d22a56c01c3e8a7b1
GIT binary patch
literal 2266
zcmZSn%*&NH<x)&C0~9bbFfceIFfkOnF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQv6y8KPJj7*m)TQdt?&7#UJn7+M$@ni&`(qu3ZySQ&yf*cccXGC}5R
zfJ`spXJBAROe)ULDJ@Bj&&(~zFDfbF0NIvVmRX#cpI0Klz`#(NmzkWOk{X|rS&~|m
zm{Y95$iTo*!p^|J;G0-bkeQcW!otA75K@$x3U@ja0|SE-$mymG3=F9ZAQz`FfLxry
z3i3t^BSRDmLkbhfby2JgDa>F78`Ql~><mE=mzK&hFfceK6_*qxCYLBAB^IYDB<Ca+
z7b~RY7b%n!Wu_J<gKPqM1&l#9+JhX&z)-@-P{Y8`%*2qz1PXv!CWa1hAZBwg6lpV*
zurSmxF*GwW1h+GQ1B#KMjR7R&0us{z8S0k|@+OD{@|`fqXjKLVh71Ofxv|m=wTuik
zj0{-}Aak1;8H(6I+(}Ffg=`GL8sHEH=`Z18U|=XNNh~TUF3&8<0GnI_GE~o?1SDSp
z2~1G56cnYVWmbT-78f%xFz6Q)WtJtDr0SO?7U`$u=cJ?-73*gg>Sq@lnVTCHW*M26
z8CsYZ=TxSb$D5>>m>3us7^LUvhv*k%7U*W?6_+ID<mi?sT9yW8fP}y}zAQB_CBH~N
zqa-)SG$%7jKOPi{`thKk)hnnh=44=CuqjS0NzTtLumi<?G03f)3>vJUPz4dir3I-)
zL7*T3$9i^ZWigoHm!Fqf0*Zv<)DlSA0;wrZ%}EOaC8!`!IDq{I_App%pnM5-3&^L%
zAeS*Pi8AppaxtN#Bxg``>oG7eRH%cZI}4nNTw)~|YMDT(Bnuq(pjhW+C}Cm<F63nh
zFJWc~2K&uV1LSkCB|)GN0|!q?QE6%ki077=Q=AG8pdelb1_p3IfWs|2wGt9OptLhk
zK~o|EO5%yd@t}B(2c_6}NU{_HC1Y@KF$y#CGjbq;3*=dFaK$k&fU-ah14A|&Ly-W8
z9b93}Py#NvK-rNIl;Khs8N{2J7+hi%z+uS<3QleXs3t9trWz&&ZiV1NEr#$CCJ?`w
zk)eqZRQ?5nbB|vpDBplX5FDUIiFxUel$Vp52QIw4Q!8DIit>xVYLG%1q%U(2gfSlj
z14B-JUV3VA2{d#iL7~e7ig-pIMiwRoMnOhiL<oa&6*z=JrC|*NsLZJWhb1I2)_@Bx
z$uuT-`U811NQ{Aj0X+mjWp)lELI*)O2xEjpd}c{%t}-YvK&gs>k)P2|1C;2%(HbA0
zmzbLx9}g~4<KuJlQ%Z9{T#%>Y<5TjJ<Ku(4L0Jk^)C38FSfDTnk^lt+C~ODb%iwYo
zRMr=R+{nhr#>B(P$<E2;rvdT=)MII-C8b5F@$o?*HwS^^5>yD6fc%!6pOcfCT#}ie
jR~!UN7GMJr{sOZGtn2{Alno?W>_E;g21TL_lK?XS7oP-j

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py
new file mode 100644
index 00000000..e2e5f866
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py
@@ -0,0 +1,44 @@
+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/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/datrie.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..66ca33664c86c5229b058d6fba70b0e24a7e1e87
GIT binary patch
literal 3296
zcmZSn%*&NH<x)&C0~9bbFfceIFfkOTF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQv6y8KT%Ad}f9mc7|LIhA0jO#uOHY6efloPOv-|17iv+Ln;?T8Y4pr
z8$$~NLo)+IWE3ky3Ohrv1_uKJLng?64Up|6{0s~XiAlxzIi)43@tL^=`9&oqASEf8
zWtqj9`FSM*3=9mVd6~)iDXH-}nI)-3i8;j@j0_A6B`gdK3?W6CsSq9~NGP?UB)+7w
zAT<-DAP8gu+^<Xw3=B>nzs4{yFr+eoyqLlOa$FP>$lomtAdjXnfkjvtQkcOER)!Q7
zFoTUDg_9wLm7#?Z<X?!dqBuc50%_!8NZ|l0<7Nm7*5G1bU`Pg8$Hu_G0CJ==$l669
z_kn|=mWiPvfT4zwA&U_dGA^-B47JP*B}@!8%nT*W49!do#a1BSr7$uyGcq(WGUPEZ
zR7itlU1Eh9YFQX+m>9BH8ERNS(u{?U4B>@h4B;hgpeV><2gx>rb=EL2#B(rIsDrKI
zgjglX5W@trt(KLchLxd)fgy_nWUx(PBSUx!14A%4Qv6CK7#J8Fb8-~2Q!9%Va!ZR#
z6p~UEic5+z^U{k;!I1~@WC<vMi&IO$F#%Fq0us$E&de(=Nz6-54FY+-1QanLl?AD;
zMMe2VU@eI$DJ7t=ad8AiA6R!*er8??D+2>Vd`e<TBAAs~lA2qr0a6E6QJk8S24=t&
zBxfWR6@v}TPOSt>fkeQ1%Mx=+Q#HU21rfz13=9nV1x1-<i6yD}Wr;=lY56%RsYS*5
z*@gPq#YX1lhJ{&1=4FN!=EXUc>E-bzDJCWc1_lP{dHNyx1(^l9U@zt5=$0p1mIh{k
zgupnyEHy7Bzeqo$Bsa%2Co@SuzN9EKRX-&WMClb&f|GK5d}dx|NqjsgaEgUM?qTF)
z6lUaS<Y(k%6lIcNlw<@a7f_M`VQ_NcWncis8z_bt7_!+Ig2AcW4@?H}FfcG^fRqOD
zF)%O$34*vFbHP3yIM0Hd6(66RpI4HYnO7ViFUG*YPz-V=17k8MLxM1f3-@3N12_qS
zQ!C7aAO+w^%}LFJcod`!>`}1yz{J4$ksXvq<8xB;;^QT;cn{=OWbZXIfHE*RXMv<3
z@mC_uz`)>_U*eftkdvC5npcvV0?r(e$OT0y*ppyl;Cu=yh2!HvC2oAY43bwt5d_0v
zuX2NuDg#3nIKfK7;t}LsNc@2mgX3?|Bvg=#<Kxp)OF(5ze7rn9-+}5MNG{A`1m(zP
zMtEKXdkmE5gFvMeB13`;w}PV7w9E={9D<1fi%78JlqmILi3kG&Lq=k8JgA(HFV8H=
zh==+R915UB8zenA%Ap`oYE`A!!yqr^<maWQ7MBcOugXG$99GPNA_IoOnUk303oegP
zy$Z_rxrh`!Xrfk*fq_9A5w(6ApzH^&W%CkqQ{&^oZIJl*-29Z%oYeUEAW*su5(QP0
z;vfQ4Xa`Aw+G3!_iC=zRDmZ_D(@YR3G=o4^fO9N@7`VI(YGHAL{0nL~urYG-a56(6
z5197T02O6WFQ=83loo-!3~CAlfy-Y|QUI4mkQNEJMH~cbhk)DN1(^kU&=!ndab^Xi
yxdv{8B_$T8mVl}{M<-`c8x0W@VAg<z2RNo}AaQF4@?kNkmXcu-U=&~yU<Lrl_VvF2

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py
new file mode 100644
index 00000000..c178b219
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py
@@ -0,0 +1,67 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+from bisect import bisect_left
+
+from ._base import Trie as ABCTrie
+
+
+class Trie(ABCTrie):
+    def __init__(self, data):
+        if not all(isinstance(x, text_type) for x in data.keys()):
+            raise TypeError("All keys must be strings")
+
+        self._data = data
+        self._keys = sorted(data.keys())
+        self._cachestr = ""
+        self._cachepoints = (0, len(data))
+
+    def __contains__(self, key):
+        return key in self._data
+
+    def __len__(self):
+        return len(self._data)
+
+    def __iter__(self):
+        return iter(self._data)
+
+    def __getitem__(self, key):
+        return self._data[key]
+
+    def keys(self, prefix=None):
+        if prefix is None or prefix == "" or not self._keys:
+            return set(self._keys)
+
+        if prefix.startswith(self._cachestr):
+            lo, hi = self._cachepoints
+            start = i = bisect_left(self._keys, prefix, lo, hi)
+        else:
+            start = i = bisect_left(self._keys, prefix)
+
+        keys = set()
+        if start == len(self._keys):
+            return keys
+
+        while self._keys[i].startswith(prefix):
+            keys.add(self._keys[i])
+            i += 1
+
+        self._cachestr = prefix
+        self._cachepoints = (start, i)
+
+        return keys
+
+    def has_keys_with_prefix(self, prefix):
+        if prefix in self._data:
+            return True
+
+        if prefix.startswith(self._cachestr):
+            lo, hi = self._cachepoints
+            i = bisect_left(self._keys, prefix, lo, hi)
+        else:
+            i = bisect_left(self._keys, prefix)
+
+        if i == len(self._keys):
+            return False
+
+        return self._keys[i].startswith(prefix)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f2b5496aadc2f5228da6a16419502b0c4c2c48ae
GIT binary patch
literal 3489
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py
new file mode 100644
index 00000000..0703afb3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py
@@ -0,0 +1,124 @@
+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
+except ImportError:
+    import xml.etree.ElementTree as default_etree
+
+
+__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair",
+           "surrogatePairToCodepoint", "moduleFactoryFactory",
+           "supports_lone_surrogates"]
+
+
+# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be
+# caught by the below test. In general this would be any platform
+# using UTF-16 as its encoding of unicode strings, such as
+# Jython. This is because UTF-16 itself is based on the use of such
+# surrogates, and there is no mechanism to further escape such
+# escapes.
+try:
+    _x = eval('"\\uD800"')  # pylint:disable=eval-used
+    if not isinstance(_x, text_type):
+        # 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
+    supports_lone_surrogates = False
+else:
+    supports_lone_surrogates = True
+
+
+class MethodDispatcher(dict):
+    """Dict with 2 special properties:
+
+    On initiation, keys that are lists, sets or tuples are converted to
+    multiple keys so accessing any one of the items in the original
+    list-like object returns the matching value
+
+    md = MethodDispatcher({("foo", "bar"):"baz"})
+    md["foo"] == "baz"
+
+    A default value which can be set through the default attribute.
+    """
+
+    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)):
+                for item in name:
+                    _dictEntries.append((item, value))
+            else:
+                _dictEntries.append((name, value))
+        dict.__init__(self, _dictEntries)
+        assert len(self) == len(_dictEntries)
+        self.default = None
+
+    def __getitem__(self, key):
+        return dict.get(self, key, self.default)
+
+
+# Some utility functions to deal with weirdness around UCS2 vs UCS4
+# python builds
+
+def isSurrogatePair(data):
+    return (len(data) == 2 and
+            ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and
+            ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF)
+
+
+def surrogatePairToCodepoint(data):
+    char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 +
+                (ord(data[1]) - 0xDC00))
+    return char_val
+
+# Module Factory Factory (no, this isn't Java, I know)
+# Here to stop this being duplicated all over the place.
+
+
+def moduleFactoryFactory(factory):
+    moduleCache = {}
+
+    def moduleFactory(baseModule, *args, **kwargs):
+        if isinstance(ModuleType.__name__, type("")):
+            name = "_%s_factory" % baseModule.__name__
+        else:
+            name = b"_%s_factory" % baseModule.__name__
+
+        kwargs_tuple = tuple(kwargs.items())
+
+        try:
+            return moduleCache[name][args][kwargs_tuple]
+        except KeyError:
+            mod = ModuleType(name)
+            objs = factory(baseModule, *args, **kwargs)
+            mod.__dict__.update(objs)
+            if "name" not in moduleCache:
+                moduleCache[name] = {}
+            if "args" not in moduleCache[name]:
+                moduleCache[name][args] = {}
+            if "kwargs" not in moduleCache[name][args]:
+                moduleCache[name][args][kwargs_tuple] = {}
+            moduleCache[name][args][kwargs_tuple] = mod
+            return mod
+
+    return moduleFactory
+
+
+def memoize(func):
+    cache = {}
+
+    def wrapped(*args, **kwargs):
+        key = (tuple(args), tuple(kwargs.items()))
+        if key not in cache:
+            cache[key] = func(*args, **kwargs)
+        return cache[key]
+
+    return wrapped
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..99e065a10e81c2a74b9849537335aeac4e9d6d48
GIT binary patch
literal 4808
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py
new file mode 100644
index 00000000..1ff80419
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py
@@ -0,0 +1,2947 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import string
+
+EOF = None
+
+E = {
+    "null-character":
+        "Null character in input stream, replaced with U+FFFD.",
+    "invalid-codepoint":
+        "Invalid codepoint in stream.",
+    "incorrectly-placed-solidus":
+        "Solidus (/) incorrectly placed in tag.",
+    "incorrect-cr-newline-entity":
+        "Incorrect CR newline entity, replaced with LF.",
+    "illegal-windows-1252-entity":
+        "Entity used with illegal number (windows-1252 reference).",
+    "cant-convert-numeric-entity":
+        "Numeric entity couldn't be converted to character "
+        "(codepoint U+%(charAsInt)08x).",
+    "illegal-codepoint-for-numeric-entity":
+        "Numeric entity represents an illegal codepoint: "
+        "U+%(charAsInt)08x.",
+    "numeric-entity-without-semicolon":
+        "Numeric entity didn't end with ';'.",
+    "expected-numeric-entity-but-got-eof":
+        "Numeric entity expected. Got end of file instead.",
+    "expected-numeric-entity":
+        "Numeric entity expected but none found.",
+    "named-entity-without-semicolon":
+        "Named entity didn't end with ';'.",
+    "expected-named-entity":
+        "Named entity expected. Got none.",
+    "attributes-in-end-tag":
+        "End tag contains unexpected attributes.",
+    'self-closing-flag-on-end-tag':
+        "End tag contains unexpected self-closing flag.",
+    "expected-tag-name-but-got-right-bracket":
+        "Expected tag name. Got '>' instead.",
+    "expected-tag-name-but-got-question-mark":
+        "Expected tag name. Got '?' instead. (HTML doesn't "
+        "support processing instructions.)",
+    "expected-tag-name":
+        "Expected tag name. Got something else instead",
+    "expected-closing-tag-but-got-right-bracket":
+        "Expected closing tag. Got '>' instead. Ignoring '</>'.",
+    "expected-closing-tag-but-got-eof":
+        "Expected closing tag. Unexpected end of file.",
+    "expected-closing-tag-but-got-char":
+        "Expected closing tag. Unexpected character '%(data)s' found.",
+    "eof-in-tag-name":
+        "Unexpected end of file in the tag name.",
+    "expected-attribute-name-but-got-eof":
+        "Unexpected end of file. Expected attribute name instead.",
+    "eof-in-attribute-name":
+        "Unexpected end of file in attribute name.",
+    "invalid-character-in-attribute-name":
+        "Invalid character in attribute name",
+    "duplicate-attribute":
+        "Dropped duplicate attribute on tag.",
+    "expected-end-of-tag-name-but-got-eof":
+        "Unexpected end of file. Expected = or end of tag.",
+    "expected-attribute-value-but-got-eof":
+        "Unexpected end of file. Expected attribute value.",
+    "expected-attribute-value-but-got-right-bracket":
+        "Expected attribute value. Got '>' instead.",
+    'equals-in-unquoted-attribute-value':
+        "Unexpected = in unquoted attribute",
+    'unexpected-character-in-unquoted-attribute-value':
+        "Unexpected character in unquoted attribute",
+    "invalid-character-after-attribute-name":
+        "Unexpected character after attribute name.",
+    "unexpected-character-after-attribute-value":
+        "Unexpected character after attribute value.",
+    "eof-in-attribute-value-double-quote":
+        "Unexpected end of file in attribute value (\").",
+    "eof-in-attribute-value-single-quote":
+        "Unexpected end of file in attribute value (').",
+    "eof-in-attribute-value-no-quotes":
+        "Unexpected end of file in attribute value.",
+    "unexpected-EOF-after-solidus-in-tag":
+        "Unexpected end of file in tag. Expected >",
+    "unexpected-character-after-solidus-in-tag":
+        "Unexpected character after / in tag. Expected >",
+    "expected-dashes-or-doctype":
+        "Expected '--' or 'DOCTYPE'. Not found.",
+    "unexpected-bang-after-double-dash-in-comment":
+        "Unexpected ! after -- in comment",
+    "unexpected-space-after-double-dash-in-comment":
+        "Unexpected space after -- in comment",
+    "incorrect-comment":
+        "Incorrect comment.",
+    "eof-in-comment":
+        "Unexpected end of file in comment.",
+    "eof-in-comment-end-dash":
+        "Unexpected end of file in comment (-)",
+    "unexpected-dash-after-double-dash-in-comment":
+        "Unexpected '-' after '--' found in comment.",
+    "eof-in-comment-double-dash":
+        "Unexpected end of file in comment (--).",
+    "eof-in-comment-end-space-state":
+        "Unexpected end of file in comment.",
+    "eof-in-comment-end-bang-state":
+        "Unexpected end of file in comment.",
+    "unexpected-char-in-comment":
+        "Unexpected character in comment found.",
+    "need-space-after-doctype":
+        "No space after literal string 'DOCTYPE'.",
+    "expected-doctype-name-but-got-right-bracket":
+        "Unexpected > character. Expected DOCTYPE name.",
+    "expected-doctype-name-but-got-eof":
+        "Unexpected end of file. Expected DOCTYPE name.",
+    "eof-in-doctype-name":
+        "Unexpected end of file in DOCTYPE name.",
+    "eof-in-doctype":
+        "Unexpected end of file in DOCTYPE.",
+    "expected-space-or-right-bracket-in-doctype":
+        "Expected space or '>'. Got '%(data)s'",
+    "unexpected-end-of-doctype":
+        "Unexpected end of DOCTYPE.",
+    "unexpected-char-in-doctype":
+        "Unexpected character in DOCTYPE.",
+    "eof-in-innerhtml":
+        "XXX innerHTML EOF",
+    "unexpected-doctype":
+        "Unexpected DOCTYPE. Ignored.",
+    "non-html-root":
+        "html needs to be the first start tag.",
+    "expected-doctype-but-got-eof":
+        "Unexpected End of file. Expected DOCTYPE.",
+    "unknown-doctype":
+        "Erroneous DOCTYPE.",
+    "expected-doctype-but-got-chars":
+        "Unexpected non-space characters. Expected DOCTYPE.",
+    "expected-doctype-but-got-start-tag":
+        "Unexpected start tag (%(name)s). Expected DOCTYPE.",
+    "expected-doctype-but-got-end-tag":
+        "Unexpected end tag (%(name)s). Expected DOCTYPE.",
+    "end-tag-after-implied-root":
+        "Unexpected end tag (%(name)s) after the (implied) root element.",
+    "expected-named-closing-tag-but-got-eof":
+        "Unexpected end of file. Expected end tag (%(name)s).",
+    "two-heads-are-not-better-than-one":
+        "Unexpected start tag head in existing head. Ignored.",
+    "unexpected-end-tag":
+        "Unexpected end tag (%(name)s). Ignored.",
+    "unexpected-start-tag-out-of-my-head":
+        "Unexpected start tag (%(name)s) that can be in head. Moved.",
+    "unexpected-start-tag":
+        "Unexpected start tag (%(name)s).",
+    "missing-end-tag":
+        "Missing end tag (%(name)s).",
+    "missing-end-tags":
+        "Missing end tags (%(name)s).",
+    "unexpected-start-tag-implies-end-tag":
+        "Unexpected start tag (%(startName)s) "
+        "implies end tag (%(endName)s).",
+    "unexpected-start-tag-treated-as":
+        "Unexpected start tag (%(originalName)s). Treated as %(newName)s.",
+    "deprecated-tag":
+        "Unexpected start tag %(name)s. Don't use it!",
+    "unexpected-start-tag-ignored":
+        "Unexpected start tag %(name)s. Ignored.",
+    "expected-one-end-tag-but-got-another":
+        "Unexpected end tag (%(gotName)s). "
+        "Missing end tag (%(expectedName)s).",
+    "end-tag-too-early":
+        "End tag (%(name)s) seen too early. Expected other end tag.",
+    "end-tag-too-early-named":
+        "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).",
+    "end-tag-too-early-ignored":
+        "End tag (%(name)s) seen too early. Ignored.",
+    "adoption-agency-1.1":
+        "End tag (%(name)s) violates step 1, "
+        "paragraph 1 of the adoption agency algorithm.",
+    "adoption-agency-1.2":
+        "End tag (%(name)s) violates step 1, "
+        "paragraph 2 of the adoption agency algorithm.",
+    "adoption-agency-1.3":
+        "End tag (%(name)s) violates step 1, "
+        "paragraph 3 of the adoption agency algorithm.",
+    "adoption-agency-4.4":
+        "End tag (%(name)s) violates step 4, "
+        "paragraph 4 of the adoption agency algorithm.",
+    "unexpected-end-tag-treated-as":
+        "Unexpected end tag (%(originalName)s). Treated as %(newName)s.",
+    "no-end-tag":
+        "This element (%(name)s) has no end tag.",
+    "unexpected-implied-end-tag-in-table":
+        "Unexpected implied end tag (%(name)s) in the table phase.",
+    "unexpected-implied-end-tag-in-table-body":
+        "Unexpected implied end tag (%(name)s) in the table body phase.",
+    "unexpected-char-implies-table-voodoo":
+        "Unexpected non-space characters in "
+        "table context caused voodoo mode.",
+    "unexpected-hidden-input-in-table":
+        "Unexpected input with type hidden in table context.",
+    "unexpected-form-in-table":
+        "Unexpected form in table context.",
+    "unexpected-start-tag-implies-table-voodoo":
+        "Unexpected start tag (%(name)s) in "
+        "table context caused voodoo mode.",
+    "unexpected-end-tag-implies-table-voodoo":
+        "Unexpected end tag (%(name)s) in "
+        "table context caused voodoo mode.",
+    "unexpected-cell-in-table-body":
+        "Unexpected table cell start tag (%(name)s) "
+        "in the table body phase.",
+    "unexpected-cell-end-tag":
+        "Got table cell end tag (%(name)s) "
+        "while required end tags are missing.",
+    "unexpected-end-tag-in-table-body":
+        "Unexpected end tag (%(name)s) in the table body phase. Ignored.",
+    "unexpected-implied-end-tag-in-table-row":
+        "Unexpected implied end tag (%(name)s) in the table row phase.",
+    "unexpected-end-tag-in-table-row":
+        "Unexpected end tag (%(name)s) in the table row phase. Ignored.",
+    "unexpected-select-in-select":
+        "Unexpected select start tag in the select phase "
+        "treated as select end tag.",
+    "unexpected-input-in-select":
+        "Unexpected input start tag in the select phase.",
+    "unexpected-start-tag-in-select":
+        "Unexpected start tag token (%(name)s in the select phase. "
+        "Ignored.",
+    "unexpected-end-tag-in-select":
+        "Unexpected end tag (%(name)s) in the select phase. Ignored.",
+    "unexpected-table-element-start-tag-in-select-in-table":
+        "Unexpected table element start tag (%(name)s) in the select in table phase.",
+    "unexpected-table-element-end-tag-in-select-in-table":
+        "Unexpected table element end tag (%(name)s) in the select in table phase.",
+    "unexpected-char-after-body":
+        "Unexpected non-space characters in the after body phase.",
+    "unexpected-start-tag-after-body":
+        "Unexpected start tag token (%(name)s)"
+        " in the after body phase.",
+    "unexpected-end-tag-after-body":
+        "Unexpected end tag token (%(name)s)"
+        " in the after body phase.",
+    "unexpected-char-in-frameset":
+        "Unexpected characters in the frameset phase. Characters ignored.",
+    "unexpected-start-tag-in-frameset":
+        "Unexpected start tag token (%(name)s)"
+        " in the frameset phase. Ignored.",
+    "unexpected-frameset-in-frameset-innerhtml":
+        "Unexpected end tag token (frameset) "
+        "in the frameset phase (innerHTML).",
+    "unexpected-end-tag-in-frameset":
+        "Unexpected end tag token (%(name)s)"
+        " in the frameset phase. Ignored.",
+    "unexpected-char-after-frameset":
+        "Unexpected non-space characters in the "
+        "after frameset phase. Ignored.",
+    "unexpected-start-tag-after-frameset":
+        "Unexpected start tag (%(name)s)"
+        " in the after frameset phase. Ignored.",
+    "unexpected-end-tag-after-frameset":
+        "Unexpected end tag (%(name)s)"
+        " in the after frameset phase. Ignored.",
+    "unexpected-end-tag-after-body-innerhtml":
+        "Unexpected end tag after body(innerHtml)",
+    "expected-eof-but-got-char":
+        "Unexpected non-space characters. Expected end of file.",
+    "expected-eof-but-got-start-tag":
+        "Unexpected start tag (%(name)s)"
+        ". Expected end of file.",
+    "expected-eof-but-got-end-tag":
+        "Unexpected end tag (%(name)s)"
+        ". Expected end of file.",
+    "eof-in-table":
+        "Unexpected end of file. Expected table content.",
+    "eof-in-select":
+        "Unexpected end of file. Expected select content.",
+    "eof-in-frameset":
+        "Unexpected end of file. Expected frameset content.",
+    "eof-in-script-in-script":
+        "Unexpected end of file. Expected script content.",
+    "eof-in-foreign-lands":
+        "Unexpected end of file. Expected foreign content",
+    "non-void-element-with-trailing-solidus":
+        "Trailing solidus not allowed on element %(name)s",
+    "unexpected-html-element-in-foreign-content":
+        "Element %(name)s not allowed in a non-html context",
+    "unexpected-end-tag-before-html":
+        "Unexpected end tag (%(name)s) before html.",
+    "unexpected-inhead-noscript-tag":
+        "Element %(name)s not allowed in a inhead-noscript context",
+    "eof-in-head-noscript":
+        "Unexpected end of file. Expected inhead-noscript content",
+    "char-in-head-noscript":
+        "Unexpected non-space character. Expected inhead-noscript content",
+    "XXX-undefined-error":
+        "Undefined error (this sucks and should be fixed)",
+}
+
+namespaces = {
+    "html": "http://www.w3.org/1999/xhtml",
+    "mathml": "http://www.w3.org/1998/Math/MathML",
+    "svg": "http://www.w3.org/2000/svg",
+    "xlink": "http://www.w3.org/1999/xlink",
+    "xml": "http://www.w3.org/XML/1998/namespace",
+    "xmlns": "http://www.w3.org/2000/xmlns/"
+}
+
+scopingElements = frozenset([
+    (namespaces["html"], "applet"),
+    (namespaces["html"], "caption"),
+    (namespaces["html"], "html"),
+    (namespaces["html"], "marquee"),
+    (namespaces["html"], "object"),
+    (namespaces["html"], "table"),
+    (namespaces["html"], "td"),
+    (namespaces["html"], "th"),
+    (namespaces["mathml"], "mi"),
+    (namespaces["mathml"], "mo"),
+    (namespaces["mathml"], "mn"),
+    (namespaces["mathml"], "ms"),
+    (namespaces["mathml"], "mtext"),
+    (namespaces["mathml"], "annotation-xml"),
+    (namespaces["svg"], "foreignObject"),
+    (namespaces["svg"], "desc"),
+    (namespaces["svg"], "title"),
+])
+
+formattingElements = frozenset([
+    (namespaces["html"], "a"),
+    (namespaces["html"], "b"),
+    (namespaces["html"], "big"),
+    (namespaces["html"], "code"),
+    (namespaces["html"], "em"),
+    (namespaces["html"], "font"),
+    (namespaces["html"], "i"),
+    (namespaces["html"], "nobr"),
+    (namespaces["html"], "s"),
+    (namespaces["html"], "small"),
+    (namespaces["html"], "strike"),
+    (namespaces["html"], "strong"),
+    (namespaces["html"], "tt"),
+    (namespaces["html"], "u")
+])
+
+specialElements = frozenset([
+    (namespaces["html"], "address"),
+    (namespaces["html"], "applet"),
+    (namespaces["html"], "area"),
+    (namespaces["html"], "article"),
+    (namespaces["html"], "aside"),
+    (namespaces["html"], "base"),
+    (namespaces["html"], "basefont"),
+    (namespaces["html"], "bgsound"),
+    (namespaces["html"], "blockquote"),
+    (namespaces["html"], "body"),
+    (namespaces["html"], "br"),
+    (namespaces["html"], "button"),
+    (namespaces["html"], "caption"),
+    (namespaces["html"], "center"),
+    (namespaces["html"], "col"),
+    (namespaces["html"], "colgroup"),
+    (namespaces["html"], "command"),
+    (namespaces["html"], "dd"),
+    (namespaces["html"], "details"),
+    (namespaces["html"], "dir"),
+    (namespaces["html"], "div"),
+    (namespaces["html"], "dl"),
+    (namespaces["html"], "dt"),
+    (namespaces["html"], "embed"),
+    (namespaces["html"], "fieldset"),
+    (namespaces["html"], "figure"),
+    (namespaces["html"], "footer"),
+    (namespaces["html"], "form"),
+    (namespaces["html"], "frame"),
+    (namespaces["html"], "frameset"),
+    (namespaces["html"], "h1"),
+    (namespaces["html"], "h2"),
+    (namespaces["html"], "h3"),
+    (namespaces["html"], "h4"),
+    (namespaces["html"], "h5"),
+    (namespaces["html"], "h6"),
+    (namespaces["html"], "head"),
+    (namespaces["html"], "header"),
+    (namespaces["html"], "hr"),
+    (namespaces["html"], "html"),
+    (namespaces["html"], "iframe"),
+    # Note that image is commented out in the spec as "this isn't an
+    # element that can end up on the stack, so it doesn't matter,"
+    (namespaces["html"], "image"),
+    (namespaces["html"], "img"),
+    (namespaces["html"], "input"),
+    (namespaces["html"], "isindex"),
+    (namespaces["html"], "li"),
+    (namespaces["html"], "link"),
+    (namespaces["html"], "listing"),
+    (namespaces["html"], "marquee"),
+    (namespaces["html"], "menu"),
+    (namespaces["html"], "meta"),
+    (namespaces["html"], "nav"),
+    (namespaces["html"], "noembed"),
+    (namespaces["html"], "noframes"),
+    (namespaces["html"], "noscript"),
+    (namespaces["html"], "object"),
+    (namespaces["html"], "ol"),
+    (namespaces["html"], "p"),
+    (namespaces["html"], "param"),
+    (namespaces["html"], "plaintext"),
+    (namespaces["html"], "pre"),
+    (namespaces["html"], "script"),
+    (namespaces["html"], "section"),
+    (namespaces["html"], "select"),
+    (namespaces["html"], "style"),
+    (namespaces["html"], "table"),
+    (namespaces["html"], "tbody"),
+    (namespaces["html"], "td"),
+    (namespaces["html"], "textarea"),
+    (namespaces["html"], "tfoot"),
+    (namespaces["html"], "th"),
+    (namespaces["html"], "thead"),
+    (namespaces["html"], "title"),
+    (namespaces["html"], "tr"),
+    (namespaces["html"], "ul"),
+    (namespaces["html"], "wbr"),
+    (namespaces["html"], "xmp"),
+    (namespaces["svg"], "foreignObject")
+])
+
+htmlIntegrationPointElements = frozenset([
+    (namespaces["mathml"], "annotation-xml"),
+    (namespaces["svg"], "foreignObject"),
+    (namespaces["svg"], "desc"),
+    (namespaces["svg"], "title")
+])
+
+mathmlTextIntegrationPointElements = frozenset([
+    (namespaces["mathml"], "mi"),
+    (namespaces["mathml"], "mo"),
+    (namespaces["mathml"], "mn"),
+    (namespaces["mathml"], "ms"),
+    (namespaces["mathml"], "mtext")
+])
+
+adjustSVGAttributes = {
+    "attributename": "attributeName",
+    "attributetype": "attributeType",
+    "basefrequency": "baseFrequency",
+    "baseprofile": "baseProfile",
+    "calcmode": "calcMode",
+    "clippathunits": "clipPathUnits",
+    "contentscripttype": "contentScriptType",
+    "contentstyletype": "contentStyleType",
+    "diffuseconstant": "diffuseConstant",
+    "edgemode": "edgeMode",
+    "externalresourcesrequired": "externalResourcesRequired",
+    "filterres": "filterRes",
+    "filterunits": "filterUnits",
+    "glyphref": "glyphRef",
+    "gradienttransform": "gradientTransform",
+    "gradientunits": "gradientUnits",
+    "kernelmatrix": "kernelMatrix",
+    "kernelunitlength": "kernelUnitLength",
+    "keypoints": "keyPoints",
+    "keysplines": "keySplines",
+    "keytimes": "keyTimes",
+    "lengthadjust": "lengthAdjust",
+    "limitingconeangle": "limitingConeAngle",
+    "markerheight": "markerHeight",
+    "markerunits": "markerUnits",
+    "markerwidth": "markerWidth",
+    "maskcontentunits": "maskContentUnits",
+    "maskunits": "maskUnits",
+    "numoctaves": "numOctaves",
+    "pathlength": "pathLength",
+    "patterncontentunits": "patternContentUnits",
+    "patterntransform": "patternTransform",
+    "patternunits": "patternUnits",
+    "pointsatx": "pointsAtX",
+    "pointsaty": "pointsAtY",
+    "pointsatz": "pointsAtZ",
+    "preservealpha": "preserveAlpha",
+    "preserveaspectratio": "preserveAspectRatio",
+    "primitiveunits": "primitiveUnits",
+    "refx": "refX",
+    "refy": "refY",
+    "repeatcount": "repeatCount",
+    "repeatdur": "repeatDur",
+    "requiredextensions": "requiredExtensions",
+    "requiredfeatures": "requiredFeatures",
+    "specularconstant": "specularConstant",
+    "specularexponent": "specularExponent",
+    "spreadmethod": "spreadMethod",
+    "startoffset": "startOffset",
+    "stddeviation": "stdDeviation",
+    "stitchtiles": "stitchTiles",
+    "surfacescale": "surfaceScale",
+    "systemlanguage": "systemLanguage",
+    "tablevalues": "tableValues",
+    "targetx": "targetX",
+    "targety": "targetY",
+    "textlength": "textLength",
+    "viewbox": "viewBox",
+    "viewtarget": "viewTarget",
+    "xchannelselector": "xChannelSelector",
+    "ychannelselector": "yChannelSelector",
+    "zoomandpan": "zoomAndPan"
+}
+
+adjustMathMLAttributes = {"definitionurl": "definitionURL"}
+
+adjustForeignAttributes = {
+    "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]),
+    "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]),
+    "xlink:href": ("xlink", "href", namespaces["xlink"]),
+    "xlink:role": ("xlink", "role", namespaces["xlink"]),
+    "xlink:show": ("xlink", "show", namespaces["xlink"]),
+    "xlink:title": ("xlink", "title", namespaces["xlink"]),
+    "xlink:type": ("xlink", "type", namespaces["xlink"]),
+    "xml:base": ("xml", "base", namespaces["xml"]),
+    "xml:lang": ("xml", "lang", namespaces["xml"]),
+    "xml:space": ("xml", "space", namespaces["xml"]),
+    "xmlns": (None, "xmlns", namespaces["xmlns"]),
+    "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"])
+}
+
+unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in
+                                  adjustForeignAttributes.items()])
+
+spaceCharacters = frozenset([
+    "\t",
+    "\n",
+    "\u000C",
+    " ",
+    "\r"
+])
+
+tableInsertModeElements = frozenset([
+    "table",
+    "tbody",
+    "tfoot",
+    "thead",
+    "tr"
+])
+
+asciiLowercase = frozenset(string.ascii_lowercase)
+asciiUppercase = frozenset(string.ascii_uppercase)
+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])
+
+# Heading elements need to be ordered
+headingElements = (
+    "h1",
+    "h2",
+    "h3",
+    "h4",
+    "h5",
+    "h6"
+)
+
+voidElements = frozenset([
+    "base",
+    "command",
+    "event-source",
+    "link",
+    "meta",
+    "hr",
+    "br",
+    "img",
+    "embed",
+    "param",
+    "area",
+    "col",
+    "input",
+    "source",
+    "track"
+])
+
+cdataElements = frozenset(['title', 'textarea'])
+
+rcdataElements = frozenset([
+    'style',
+    'script',
+    'xmp',
+    'iframe',
+    'noembed',
+    'noframes',
+    'noscript'
+])
+
+booleanAttributes = {
+    "": frozenset(["irrelevant", "itemscope"]),
+    "style": frozenset(["scoped"]),
+    "img": frozenset(["ismap"]),
+    "audio": frozenset(["autoplay", "controls"]),
+    "video": frozenset(["autoplay", "controls"]),
+    "script": frozenset(["defer", "async"]),
+    "details": frozenset(["open"]),
+    "datagrid": frozenset(["multiple", "disabled"]),
+    "command": frozenset(["hidden", "disabled", "checked", "default"]),
+    "hr": frozenset(["noshade"]),
+    "menu": frozenset(["autosubmit"]),
+    "fieldset": frozenset(["disabled", "readonly"]),
+    "option": frozenset(["disabled", "readonly", "selected"]),
+    "optgroup": frozenset(["disabled", "readonly"]),
+    "button": frozenset(["disabled", "autofocus"]),
+    "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]),
+    "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]),
+    "output": frozenset(["disabled", "readonly"]),
+    "iframe": frozenset(["seamless"]),
+}
+
+# entitiesWindows1252 has to be _ordered_ and needs to have an index. It
+# therefore can't be a frozenset.
+entitiesWindows1252 = (
+    8364,   # 0x80  0x20AC  EURO SIGN
+    65533,  # 0x81          UNDEFINED
+    8218,   # 0x82  0x201A  SINGLE LOW-9 QUOTATION MARK
+    402,    # 0x83  0x0192  LATIN SMALL LETTER F WITH HOOK
+    8222,   # 0x84  0x201E  DOUBLE LOW-9 QUOTATION MARK
+    8230,   # 0x85  0x2026  HORIZONTAL ELLIPSIS
+    8224,   # 0x86  0x2020  DAGGER
+    8225,   # 0x87  0x2021  DOUBLE DAGGER
+    710,    # 0x88  0x02C6  MODIFIER LETTER CIRCUMFLEX ACCENT
+    8240,   # 0x89  0x2030  PER MILLE SIGN
+    352,    # 0x8A  0x0160  LATIN CAPITAL LETTER S WITH CARON
+    8249,   # 0x8B  0x2039  SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+    338,    # 0x8C  0x0152  LATIN CAPITAL LIGATURE OE
+    65533,  # 0x8D          UNDEFINED
+    381,    # 0x8E  0x017D  LATIN CAPITAL LETTER Z WITH CARON
+    65533,  # 0x8F          UNDEFINED
+    65533,  # 0x90          UNDEFINED
+    8216,   # 0x91  0x2018  LEFT SINGLE QUOTATION MARK
+    8217,   # 0x92  0x2019  RIGHT SINGLE QUOTATION MARK
+    8220,   # 0x93  0x201C  LEFT DOUBLE QUOTATION MARK
+    8221,   # 0x94  0x201D  RIGHT DOUBLE QUOTATION MARK
+    8226,   # 0x95  0x2022  BULLET
+    8211,   # 0x96  0x2013  EN DASH
+    8212,   # 0x97  0x2014  EM DASH
+    732,    # 0x98  0x02DC  SMALL TILDE
+    8482,   # 0x99  0x2122  TRADE MARK SIGN
+    353,    # 0x9A  0x0161  LATIN SMALL LETTER S WITH CARON
+    8250,   # 0x9B  0x203A  SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+    339,    # 0x9C  0x0153  LATIN SMALL LIGATURE OE
+    65533,  # 0x9D          UNDEFINED
+    382,    # 0x9E  0x017E  LATIN SMALL LETTER Z WITH CARON
+    376     # 0x9F  0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
+)
+
+xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;'])
+
+entities = {
+    "AElig": "\xc6",
+    "AElig;": "\xc6",
+    "AMP": "&",
+    "AMP;": "&",
+    "Aacute": "\xc1",
+    "Aacute;": "\xc1",
+    "Abreve;": "\u0102",
+    "Acirc": "\xc2",
+    "Acirc;": "\xc2",
+    "Acy;": "\u0410",
+    "Afr;": "\U0001d504",
+    "Agrave": "\xc0",
+    "Agrave;": "\xc0",
+    "Alpha;": "\u0391",
+    "Amacr;": "\u0100",
+    "And;": "\u2a53",
+    "Aogon;": "\u0104",
+    "Aopf;": "\U0001d538",
+    "ApplyFunction;": "\u2061",
+    "Aring": "\xc5",
+    "Aring;": "\xc5",
+    "Ascr;": "\U0001d49c",
+    "Assign;": "\u2254",
+    "Atilde": "\xc3",
+    "Atilde;": "\xc3",
+    "Auml": "\xc4",
+    "Auml;": "\xc4",
+    "Backslash;": "\u2216",
+    "Barv;": "\u2ae7",
+    "Barwed;": "\u2306",
+    "Bcy;": "\u0411",
+    "Because;": "\u2235",
+    "Bernoullis;": "\u212c",
+    "Beta;": "\u0392",
+    "Bfr;": "\U0001d505",
+    "Bopf;": "\U0001d539",
+    "Breve;": "\u02d8",
+    "Bscr;": "\u212c",
+    "Bumpeq;": "\u224e",
+    "CHcy;": "\u0427",
+    "COPY": "\xa9",
+    "COPY;": "\xa9",
+    "Cacute;": "\u0106",
+    "Cap;": "\u22d2",
+    "CapitalDifferentialD;": "\u2145",
+    "Cayleys;": "\u212d",
+    "Ccaron;": "\u010c",
+    "Ccedil": "\xc7",
+    "Ccedil;": "\xc7",
+    "Ccirc;": "\u0108",
+    "Cconint;": "\u2230",
+    "Cdot;": "\u010a",
+    "Cedilla;": "\xb8",
+    "CenterDot;": "\xb7",
+    "Cfr;": "\u212d",
+    "Chi;": "\u03a7",
+    "CircleDot;": "\u2299",
+    "CircleMinus;": "\u2296",
+    "CirclePlus;": "\u2295",
+    "CircleTimes;": "\u2297",
+    "ClockwiseContourIntegral;": "\u2232",
+    "CloseCurlyDoubleQuote;": "\u201d",
+    "CloseCurlyQuote;": "\u2019",
+    "Colon;": "\u2237",
+    "Colone;": "\u2a74",
+    "Congruent;": "\u2261",
+    "Conint;": "\u222f",
+    "ContourIntegral;": "\u222e",
+    "Copf;": "\u2102",
+    "Coproduct;": "\u2210",
+    "CounterClockwiseContourIntegral;": "\u2233",
+    "Cross;": "\u2a2f",
+    "Cscr;": "\U0001d49e",
+    "Cup;": "\u22d3",
+    "CupCap;": "\u224d",
+    "DD;": "\u2145",
+    "DDotrahd;": "\u2911",
+    "DJcy;": "\u0402",
+    "DScy;": "\u0405",
+    "DZcy;": "\u040f",
+    "Dagger;": "\u2021",
+    "Darr;": "\u21a1",
+    "Dashv;": "\u2ae4",
+    "Dcaron;": "\u010e",
+    "Dcy;": "\u0414",
+    "Del;": "\u2207",
+    "Delta;": "\u0394",
+    "Dfr;": "\U0001d507",
+    "DiacriticalAcute;": "\xb4",
+    "DiacriticalDot;": "\u02d9",
+    "DiacriticalDoubleAcute;": "\u02dd",
+    "DiacriticalGrave;": "`",
+    "DiacriticalTilde;": "\u02dc",
+    "Diamond;": "\u22c4",
+    "DifferentialD;": "\u2146",
+    "Dopf;": "\U0001d53b",
+    "Dot;": "\xa8",
+    "DotDot;": "\u20dc",
+    "DotEqual;": "\u2250",
+    "DoubleContourIntegral;": "\u222f",
+    "DoubleDot;": "\xa8",
+    "DoubleDownArrow;": "\u21d3",
+    "DoubleLeftArrow;": "\u21d0",
+    "DoubleLeftRightArrow;": "\u21d4",
+    "DoubleLeftTee;": "\u2ae4",
+    "DoubleLongLeftArrow;": "\u27f8",
+    "DoubleLongLeftRightArrow;": "\u27fa",
+    "DoubleLongRightArrow;": "\u27f9",
+    "DoubleRightArrow;": "\u21d2",
+    "DoubleRightTee;": "\u22a8",
+    "DoubleUpArrow;": "\u21d1",
+    "DoubleUpDownArrow;": "\u21d5",
+    "DoubleVerticalBar;": "\u2225",
+    "DownArrow;": "\u2193",
+    "DownArrowBar;": "\u2913",
+    "DownArrowUpArrow;": "\u21f5",
+    "DownBreve;": "\u0311",
+    "DownLeftRightVector;": "\u2950",
+    "DownLeftTeeVector;": "\u295e",
+    "DownLeftVector;": "\u21bd",
+    "DownLeftVectorBar;": "\u2956",
+    "DownRightTeeVector;": "\u295f",
+    "DownRightVector;": "\u21c1",
+    "DownRightVectorBar;": "\u2957",
+    "DownTee;": "\u22a4",
+    "DownTeeArrow;": "\u21a7",
+    "Downarrow;": "\u21d3",
+    "Dscr;": "\U0001d49f",
+    "Dstrok;": "\u0110",
+    "ENG;": "\u014a",
+    "ETH": "\xd0",
+    "ETH;": "\xd0",
+    "Eacute": "\xc9",
+    "Eacute;": "\xc9",
+    "Ecaron;": "\u011a",
+    "Ecirc": "\xca",
+    "Ecirc;": "\xca",
+    "Ecy;": "\u042d",
+    "Edot;": "\u0116",
+    "Efr;": "\U0001d508",
+    "Egrave": "\xc8",
+    "Egrave;": "\xc8",
+    "Element;": "\u2208",
+    "Emacr;": "\u0112",
+    "EmptySmallSquare;": "\u25fb",
+    "EmptyVerySmallSquare;": "\u25ab",
+    "Eogon;": "\u0118",
+    "Eopf;": "\U0001d53c",
+    "Epsilon;": "\u0395",
+    "Equal;": "\u2a75",
+    "EqualTilde;": "\u2242",
+    "Equilibrium;": "\u21cc",
+    "Escr;": "\u2130",
+    "Esim;": "\u2a73",
+    "Eta;": "\u0397",
+    "Euml": "\xcb",
+    "Euml;": "\xcb",
+    "Exists;": "\u2203",
+    "ExponentialE;": "\u2147",
+    "Fcy;": "\u0424",
+    "Ffr;": "\U0001d509",
+    "FilledSmallSquare;": "\u25fc",
+    "FilledVerySmallSquare;": "\u25aa",
+    "Fopf;": "\U0001d53d",
+    "ForAll;": "\u2200",
+    "Fouriertrf;": "\u2131",
+    "Fscr;": "\u2131",
+    "GJcy;": "\u0403",
+    "GT": ">",
+    "GT;": ">",
+    "Gamma;": "\u0393",
+    "Gammad;": "\u03dc",
+    "Gbreve;": "\u011e",
+    "Gcedil;": "\u0122",
+    "Gcirc;": "\u011c",
+    "Gcy;": "\u0413",
+    "Gdot;": "\u0120",
+    "Gfr;": "\U0001d50a",
+    "Gg;": "\u22d9",
+    "Gopf;": "\U0001d53e",
+    "GreaterEqual;": "\u2265",
+    "GreaterEqualLess;": "\u22db",
+    "GreaterFullEqual;": "\u2267",
+    "GreaterGreater;": "\u2aa2",
+    "GreaterLess;": "\u2277",
+    "GreaterSlantEqual;": "\u2a7e",
+    "GreaterTilde;": "\u2273",
+    "Gscr;": "\U0001d4a2",
+    "Gt;": "\u226b",
+    "HARDcy;": "\u042a",
+    "Hacek;": "\u02c7",
+    "Hat;": "^",
+    "Hcirc;": "\u0124",
+    "Hfr;": "\u210c",
+    "HilbertSpace;": "\u210b",
+    "Hopf;": "\u210d",
+    "HorizontalLine;": "\u2500",
+    "Hscr;": "\u210b",
+    "Hstrok;": "\u0126",
+    "HumpDownHump;": "\u224e",
+    "HumpEqual;": "\u224f",
+    "IEcy;": "\u0415",
+    "IJlig;": "\u0132",
+    "IOcy;": "\u0401",
+    "Iacute": "\xcd",
+    "Iacute;": "\xcd",
+    "Icirc": "\xce",
+    "Icirc;": "\xce",
+    "Icy;": "\u0418",
+    "Idot;": "\u0130",
+    "Ifr;": "\u2111",
+    "Igrave": "\xcc",
+    "Igrave;": "\xcc",
+    "Im;": "\u2111",
+    "Imacr;": "\u012a",
+    "ImaginaryI;": "\u2148",
+    "Implies;": "\u21d2",
+    "Int;": "\u222c",
+    "Integral;": "\u222b",
+    "Intersection;": "\u22c2",
+    "InvisibleComma;": "\u2063",
+    "InvisibleTimes;": "\u2062",
+    "Iogon;": "\u012e",
+    "Iopf;": "\U0001d540",
+    "Iota;": "\u0399",
+    "Iscr;": "\u2110",
+    "Itilde;": "\u0128",
+    "Iukcy;": "\u0406",
+    "Iuml": "\xcf",
+    "Iuml;": "\xcf",
+    "Jcirc;": "\u0134",
+    "Jcy;": "\u0419",
+    "Jfr;": "\U0001d50d",
+    "Jopf;": "\U0001d541",
+    "Jscr;": "\U0001d4a5",
+    "Jsercy;": "\u0408",
+    "Jukcy;": "\u0404",
+    "KHcy;": "\u0425",
+    "KJcy;": "\u040c",
+    "Kappa;": "\u039a",
+    "Kcedil;": "\u0136",
+    "Kcy;": "\u041a",
+    "Kfr;": "\U0001d50e",
+    "Kopf;": "\U0001d542",
+    "Kscr;": "\U0001d4a6",
+    "LJcy;": "\u0409",
+    "LT": "<",
+    "LT;": "<",
+    "Lacute;": "\u0139",
+    "Lambda;": "\u039b",
+    "Lang;": "\u27ea",
+    "Laplacetrf;": "\u2112",
+    "Larr;": "\u219e",
+    "Lcaron;": "\u013d",
+    "Lcedil;": "\u013b",
+    "Lcy;": "\u041b",
+    "LeftAngleBracket;": "\u27e8",
+    "LeftArrow;": "\u2190",
+    "LeftArrowBar;": "\u21e4",
+    "LeftArrowRightArrow;": "\u21c6",
+    "LeftCeiling;": "\u2308",
+    "LeftDoubleBracket;": "\u27e6",
+    "LeftDownTeeVector;": "\u2961",
+    "LeftDownVector;": "\u21c3",
+    "LeftDownVectorBar;": "\u2959",
+    "LeftFloor;": "\u230a",
+    "LeftRightArrow;": "\u2194",
+    "LeftRightVector;": "\u294e",
+    "LeftTee;": "\u22a3",
+    "LeftTeeArrow;": "\u21a4",
+    "LeftTeeVector;": "\u295a",
+    "LeftTriangle;": "\u22b2",
+    "LeftTriangleBar;": "\u29cf",
+    "LeftTriangleEqual;": "\u22b4",
+    "LeftUpDownVector;": "\u2951",
+    "LeftUpTeeVector;": "\u2960",
+    "LeftUpVector;": "\u21bf",
+    "LeftUpVectorBar;": "\u2958",
+    "LeftVector;": "\u21bc",
+    "LeftVectorBar;": "\u2952",
+    "Leftarrow;": "\u21d0",
+    "Leftrightarrow;": "\u21d4",
+    "LessEqualGreater;": "\u22da",
+    "LessFullEqual;": "\u2266",
+    "LessGreater;": "\u2276",
+    "LessLess;": "\u2aa1",
+    "LessSlantEqual;": "\u2a7d",
+    "LessTilde;": "\u2272",
+    "Lfr;": "\U0001d50f",
+    "Ll;": "\u22d8",
+    "Lleftarrow;": "\u21da",
+    "Lmidot;": "\u013f",
+    "LongLeftArrow;": "\u27f5",
+    "LongLeftRightArrow;": "\u27f7",
+    "LongRightArrow;": "\u27f6",
+    "Longleftarrow;": "\u27f8",
+    "Longleftrightarrow;": "\u27fa",
+    "Longrightarrow;": "\u27f9",
+    "Lopf;": "\U0001d543",
+    "LowerLeftArrow;": "\u2199",
+    "LowerRightArrow;": "\u2198",
+    "Lscr;": "\u2112",
+    "Lsh;": "\u21b0",
+    "Lstrok;": "\u0141",
+    "Lt;": "\u226a",
+    "Map;": "\u2905",
+    "Mcy;": "\u041c",
+    "MediumSpace;": "\u205f",
+    "Mellintrf;": "\u2133",
+    "Mfr;": "\U0001d510",
+    "MinusPlus;": "\u2213",
+    "Mopf;": "\U0001d544",
+    "Mscr;": "\u2133",
+    "Mu;": "\u039c",
+    "NJcy;": "\u040a",
+    "Nacute;": "\u0143",
+    "Ncaron;": "\u0147",
+    "Ncedil;": "\u0145",
+    "Ncy;": "\u041d",
+    "NegativeMediumSpace;": "\u200b",
+    "NegativeThickSpace;": "\u200b",
+    "NegativeThinSpace;": "\u200b",
+    "NegativeVeryThinSpace;": "\u200b",
+    "NestedGreaterGreater;": "\u226b",
+    "NestedLessLess;": "\u226a",
+    "NewLine;": "\n",
+    "Nfr;": "\U0001d511",
+    "NoBreak;": "\u2060",
+    "NonBreakingSpace;": "\xa0",
+    "Nopf;": "\u2115",
+    "Not;": "\u2aec",
+    "NotCongruent;": "\u2262",
+    "NotCupCap;": "\u226d",
+    "NotDoubleVerticalBar;": "\u2226",
+    "NotElement;": "\u2209",
+    "NotEqual;": "\u2260",
+    "NotEqualTilde;": "\u2242\u0338",
+    "NotExists;": "\u2204",
+    "NotGreater;": "\u226f",
+    "NotGreaterEqual;": "\u2271",
+    "NotGreaterFullEqual;": "\u2267\u0338",
+    "NotGreaterGreater;": "\u226b\u0338",
+    "NotGreaterLess;": "\u2279",
+    "NotGreaterSlantEqual;": "\u2a7e\u0338",
+    "NotGreaterTilde;": "\u2275",
+    "NotHumpDownHump;": "\u224e\u0338",
+    "NotHumpEqual;": "\u224f\u0338",
+    "NotLeftTriangle;": "\u22ea",
+    "NotLeftTriangleBar;": "\u29cf\u0338",
+    "NotLeftTriangleEqual;": "\u22ec",
+    "NotLess;": "\u226e",
+    "NotLessEqual;": "\u2270",
+    "NotLessGreater;": "\u2278",
+    "NotLessLess;": "\u226a\u0338",
+    "NotLessSlantEqual;": "\u2a7d\u0338",
+    "NotLessTilde;": "\u2274",
+    "NotNestedGreaterGreater;": "\u2aa2\u0338",
+    "NotNestedLessLess;": "\u2aa1\u0338",
+    "NotPrecedes;": "\u2280",
+    "NotPrecedesEqual;": "\u2aaf\u0338",
+    "NotPrecedesSlantEqual;": "\u22e0",
+    "NotReverseElement;": "\u220c",
+    "NotRightTriangle;": "\u22eb",
+    "NotRightTriangleBar;": "\u29d0\u0338",
+    "NotRightTriangleEqual;": "\u22ed",
+    "NotSquareSubset;": "\u228f\u0338",
+    "NotSquareSubsetEqual;": "\u22e2",
+    "NotSquareSuperset;": "\u2290\u0338",
+    "NotSquareSupersetEqual;": "\u22e3",
+    "NotSubset;": "\u2282\u20d2",
+    "NotSubsetEqual;": "\u2288",
+    "NotSucceeds;": "\u2281",
+    "NotSucceedsEqual;": "\u2ab0\u0338",
+    "NotSucceedsSlantEqual;": "\u22e1",
+    "NotSucceedsTilde;": "\u227f\u0338",
+    "NotSuperset;": "\u2283\u20d2",
+    "NotSupersetEqual;": "\u2289",
+    "NotTilde;": "\u2241",
+    "NotTildeEqual;": "\u2244",
+    "NotTildeFullEqual;": "\u2247",
+    "NotTildeTilde;": "\u2249",
+    "NotVerticalBar;": "\u2224",
+    "Nscr;": "\U0001d4a9",
+    "Ntilde": "\xd1",
+    "Ntilde;": "\xd1",
+    "Nu;": "\u039d",
+    "OElig;": "\u0152",
+    "Oacute": "\xd3",
+    "Oacute;": "\xd3",
+    "Ocirc": "\xd4",
+    "Ocirc;": "\xd4",
+    "Ocy;": "\u041e",
+    "Odblac;": "\u0150",
+    "Ofr;": "\U0001d512",
+    "Ograve": "\xd2",
+    "Ograve;": "\xd2",
+    "Omacr;": "\u014c",
+    "Omega;": "\u03a9",
+    "Omicron;": "\u039f",
+    "Oopf;": "\U0001d546",
+    "OpenCurlyDoubleQuote;": "\u201c",
+    "OpenCurlyQuote;": "\u2018",
+    "Or;": "\u2a54",
+    "Oscr;": "\U0001d4aa",
+    "Oslash": "\xd8",
+    "Oslash;": "\xd8",
+    "Otilde": "\xd5",
+    "Otilde;": "\xd5",
+    "Otimes;": "\u2a37",
+    "Ouml": "\xd6",
+    "Ouml;": "\xd6",
+    "OverBar;": "\u203e",
+    "OverBrace;": "\u23de",
+    "OverBracket;": "\u23b4",
+    "OverParenthesis;": "\u23dc",
+    "PartialD;": "\u2202",
+    "Pcy;": "\u041f",
+    "Pfr;": "\U0001d513",
+    "Phi;": "\u03a6",
+    "Pi;": "\u03a0",
+    "PlusMinus;": "\xb1",
+    "Poincareplane;": "\u210c",
+    "Popf;": "\u2119",
+    "Pr;": "\u2abb",
+    "Precedes;": "\u227a",
+    "PrecedesEqual;": "\u2aaf",
+    "PrecedesSlantEqual;": "\u227c",
+    "PrecedesTilde;": "\u227e",
+    "Prime;": "\u2033",
+    "Product;": "\u220f",
+    "Proportion;": "\u2237",
+    "Proportional;": "\u221d",
+    "Pscr;": "\U0001d4ab",
+    "Psi;": "\u03a8",
+    "QUOT": "\"",
+    "QUOT;": "\"",
+    "Qfr;": "\U0001d514",
+    "Qopf;": "\u211a",
+    "Qscr;": "\U0001d4ac",
+    "RBarr;": "\u2910",
+    "REG": "\xae",
+    "REG;": "\xae",
+    "Racute;": "\u0154",
+    "Rang;": "\u27eb",
+    "Rarr;": "\u21a0",
+    "Rarrtl;": "\u2916",
+    "Rcaron;": "\u0158",
+    "Rcedil;": "\u0156",
+    "Rcy;": "\u0420",
+    "Re;": "\u211c",
+    "ReverseElement;": "\u220b",
+    "ReverseEquilibrium;": "\u21cb",
+    "ReverseUpEquilibrium;": "\u296f",
+    "Rfr;": "\u211c",
+    "Rho;": "\u03a1",
+    "RightAngleBracket;": "\u27e9",
+    "RightArrow;": "\u2192",
+    "RightArrowBar;": "\u21e5",
+    "RightArrowLeftArrow;": "\u21c4",
+    "RightCeiling;": "\u2309",
+    "RightDoubleBracket;": "\u27e7",
+    "RightDownTeeVector;": "\u295d",
+    "RightDownVector;": "\u21c2",
+    "RightDownVectorBar;": "\u2955",
+    "RightFloor;": "\u230b",
+    "RightTee;": "\u22a2",
+    "RightTeeArrow;": "\u21a6",
+    "RightTeeVector;": "\u295b",
+    "RightTriangle;": "\u22b3",
+    "RightTriangleBar;": "\u29d0",
+    "RightTriangleEqual;": "\u22b5",
+    "RightUpDownVector;": "\u294f",
+    "RightUpTeeVector;": "\u295c",
+    "RightUpVector;": "\u21be",
+    "RightUpVectorBar;": "\u2954",
+    "RightVector;": "\u21c0",
+    "RightVectorBar;": "\u2953",
+    "Rightarrow;": "\u21d2",
+    "Ropf;": "\u211d",
+    "RoundImplies;": "\u2970",
+    "Rrightarrow;": "\u21db",
+    "Rscr;": "\u211b",
+    "Rsh;": "\u21b1",
+    "RuleDelayed;": "\u29f4",
+    "SHCHcy;": "\u0429",
+    "SHcy;": "\u0428",
+    "SOFTcy;": "\u042c",
+    "Sacute;": "\u015a",
+    "Sc;": "\u2abc",
+    "Scaron;": "\u0160",
+    "Scedil;": "\u015e",
+    "Scirc;": "\u015c",
+    "Scy;": "\u0421",
+    "Sfr;": "\U0001d516",
+    "ShortDownArrow;": "\u2193",
+    "ShortLeftArrow;": "\u2190",
+    "ShortRightArrow;": "\u2192",
+    "ShortUpArrow;": "\u2191",
+    "Sigma;": "\u03a3",
+    "SmallCircle;": "\u2218",
+    "Sopf;": "\U0001d54a",
+    "Sqrt;": "\u221a",
+    "Square;": "\u25a1",
+    "SquareIntersection;": "\u2293",
+    "SquareSubset;": "\u228f",
+    "SquareSubsetEqual;": "\u2291",
+    "SquareSuperset;": "\u2290",
+    "SquareSupersetEqual;": "\u2292",
+    "SquareUnion;": "\u2294",
+    "Sscr;": "\U0001d4ae",
+    "Star;": "\u22c6",
+    "Sub;": "\u22d0",
+    "Subset;": "\u22d0",
+    "SubsetEqual;": "\u2286",
+    "Succeeds;": "\u227b",
+    "SucceedsEqual;": "\u2ab0",
+    "SucceedsSlantEqual;": "\u227d",
+    "SucceedsTilde;": "\u227f",
+    "SuchThat;": "\u220b",
+    "Sum;": "\u2211",
+    "Sup;": "\u22d1",
+    "Superset;": "\u2283",
+    "SupersetEqual;": "\u2287",
+    "Supset;": "\u22d1",
+    "THORN": "\xde",
+    "THORN;": "\xde",
+    "TRADE;": "\u2122",
+    "TSHcy;": "\u040b",
+    "TScy;": "\u0426",
+    "Tab;": "\t",
+    "Tau;": "\u03a4",
+    "Tcaron;": "\u0164",
+    "Tcedil;": "\u0162",
+    "Tcy;": "\u0422",
+    "Tfr;": "\U0001d517",
+    "Therefore;": "\u2234",
+    "Theta;": "\u0398",
+    "ThickSpace;": "\u205f\u200a",
+    "ThinSpace;": "\u2009",
+    "Tilde;": "\u223c",
+    "TildeEqual;": "\u2243",
+    "TildeFullEqual;": "\u2245",
+    "TildeTilde;": "\u2248",
+    "Topf;": "\U0001d54b",
+    "TripleDot;": "\u20db",
+    "Tscr;": "\U0001d4af",
+    "Tstrok;": "\u0166",
+    "Uacute": "\xda",
+    "Uacute;": "\xda",
+    "Uarr;": "\u219f",
+    "Uarrocir;": "\u2949",
+    "Ubrcy;": "\u040e",
+    "Ubreve;": "\u016c",
+    "Ucirc": "\xdb",
+    "Ucirc;": "\xdb",
+    "Ucy;": "\u0423",
+    "Udblac;": "\u0170",
+    "Ufr;": "\U0001d518",
+    "Ugrave": "\xd9",
+    "Ugrave;": "\xd9",
+    "Umacr;": "\u016a",
+    "UnderBar;": "_",
+    "UnderBrace;": "\u23df",
+    "UnderBracket;": "\u23b5",
+    "UnderParenthesis;": "\u23dd",
+    "Union;": "\u22c3",
+    "UnionPlus;": "\u228e",
+    "Uogon;": "\u0172",
+    "Uopf;": "\U0001d54c",
+    "UpArrow;": "\u2191",
+    "UpArrowBar;": "\u2912",
+    "UpArrowDownArrow;": "\u21c5",
+    "UpDownArrow;": "\u2195",
+    "UpEquilibrium;": "\u296e",
+    "UpTee;": "\u22a5",
+    "UpTeeArrow;": "\u21a5",
+    "Uparrow;": "\u21d1",
+    "Updownarrow;": "\u21d5",
+    "UpperLeftArrow;": "\u2196",
+    "UpperRightArrow;": "\u2197",
+    "Upsi;": "\u03d2",
+    "Upsilon;": "\u03a5",
+    "Uring;": "\u016e",
+    "Uscr;": "\U0001d4b0",
+    "Utilde;": "\u0168",
+    "Uuml": "\xdc",
+    "Uuml;": "\xdc",
+    "VDash;": "\u22ab",
+    "Vbar;": "\u2aeb",
+    "Vcy;": "\u0412",
+    "Vdash;": "\u22a9",
+    "Vdashl;": "\u2ae6",
+    "Vee;": "\u22c1",
+    "Verbar;": "\u2016",
+    "Vert;": "\u2016",
+    "VerticalBar;": "\u2223",
+    "VerticalLine;": "|",
+    "VerticalSeparator;": "\u2758",
+    "VerticalTilde;": "\u2240",
+    "VeryThinSpace;": "\u200a",
+    "Vfr;": "\U0001d519",
+    "Vopf;": "\U0001d54d",
+    "Vscr;": "\U0001d4b1",
+    "Vvdash;": "\u22aa",
+    "Wcirc;": "\u0174",
+    "Wedge;": "\u22c0",
+    "Wfr;": "\U0001d51a",
+    "Wopf;": "\U0001d54e",
+    "Wscr;": "\U0001d4b2",
+    "Xfr;": "\U0001d51b",
+    "Xi;": "\u039e",
+    "Xopf;": "\U0001d54f",
+    "Xscr;": "\U0001d4b3",
+    "YAcy;": "\u042f",
+    "YIcy;": "\u0407",
+    "YUcy;": "\u042e",
+    "Yacute": "\xdd",
+    "Yacute;": "\xdd",
+    "Ycirc;": "\u0176",
+    "Ycy;": "\u042b",
+    "Yfr;": "\U0001d51c",
+    "Yopf;": "\U0001d550",
+    "Yscr;": "\U0001d4b4",
+    "Yuml;": "\u0178",
+    "ZHcy;": "\u0416",
+    "Zacute;": "\u0179",
+    "Zcaron;": "\u017d",
+    "Zcy;": "\u0417",
+    "Zdot;": "\u017b",
+    "ZeroWidthSpace;": "\u200b",
+    "Zeta;": "\u0396",
+    "Zfr;": "\u2128",
+    "Zopf;": "\u2124",
+    "Zscr;": "\U0001d4b5",
+    "aacute": "\xe1",
+    "aacute;": "\xe1",
+    "abreve;": "\u0103",
+    "ac;": "\u223e",
+    "acE;": "\u223e\u0333",
+    "acd;": "\u223f",
+    "acirc": "\xe2",
+    "acirc;": "\xe2",
+    "acute": "\xb4",
+    "acute;": "\xb4",
+    "acy;": "\u0430",
+    "aelig": "\xe6",
+    "aelig;": "\xe6",
+    "af;": "\u2061",
+    "afr;": "\U0001d51e",
+    "agrave": "\xe0",
+    "agrave;": "\xe0",
+    "alefsym;": "\u2135",
+    "aleph;": "\u2135",
+    "alpha;": "\u03b1",
+    "amacr;": "\u0101",
+    "amalg;": "\u2a3f",
+    "amp": "&",
+    "amp;": "&",
+    "and;": "\u2227",
+    "andand;": "\u2a55",
+    "andd;": "\u2a5c",
+    "andslope;": "\u2a58",
+    "andv;": "\u2a5a",
+    "ang;": "\u2220",
+    "ange;": "\u29a4",
+    "angle;": "\u2220",
+    "angmsd;": "\u2221",
+    "angmsdaa;": "\u29a8",
+    "angmsdab;": "\u29a9",
+    "angmsdac;": "\u29aa",
+    "angmsdad;": "\u29ab",
+    "angmsdae;": "\u29ac",
+    "angmsdaf;": "\u29ad",
+    "angmsdag;": "\u29ae",
+    "angmsdah;": "\u29af",
+    "angrt;": "\u221f",
+    "angrtvb;": "\u22be",
+    "angrtvbd;": "\u299d",
+    "angsph;": "\u2222",
+    "angst;": "\xc5",
+    "angzarr;": "\u237c",
+    "aogon;": "\u0105",
+    "aopf;": "\U0001d552",
+    "ap;": "\u2248",
+    "apE;": "\u2a70",
+    "apacir;": "\u2a6f",
+    "ape;": "\u224a",
+    "apid;": "\u224b",
+    "apos;": "'",
+    "approx;": "\u2248",
+    "approxeq;": "\u224a",
+    "aring": "\xe5",
+    "aring;": "\xe5",
+    "ascr;": "\U0001d4b6",
+    "ast;": "*",
+    "asymp;": "\u2248",
+    "asympeq;": "\u224d",
+    "atilde": "\xe3",
+    "atilde;": "\xe3",
+    "auml": "\xe4",
+    "auml;": "\xe4",
+    "awconint;": "\u2233",
+    "awint;": "\u2a11",
+    "bNot;": "\u2aed",
+    "backcong;": "\u224c",
+    "backepsilon;": "\u03f6",
+    "backprime;": "\u2035",
+    "backsim;": "\u223d",
+    "backsimeq;": "\u22cd",
+    "barvee;": "\u22bd",
+    "barwed;": "\u2305",
+    "barwedge;": "\u2305",
+    "bbrk;": "\u23b5",
+    "bbrktbrk;": "\u23b6",
+    "bcong;": "\u224c",
+    "bcy;": "\u0431",
+    "bdquo;": "\u201e",
+    "becaus;": "\u2235",
+    "because;": "\u2235",
+    "bemptyv;": "\u29b0",
+    "bepsi;": "\u03f6",
+    "bernou;": "\u212c",
+    "beta;": "\u03b2",
+    "beth;": "\u2136",
+    "between;": "\u226c",
+    "bfr;": "\U0001d51f",
+    "bigcap;": "\u22c2",
+    "bigcirc;": "\u25ef",
+    "bigcup;": "\u22c3",
+    "bigodot;": "\u2a00",
+    "bigoplus;": "\u2a01",
+    "bigotimes;": "\u2a02",
+    "bigsqcup;": "\u2a06",
+    "bigstar;": "\u2605",
+    "bigtriangledown;": "\u25bd",
+    "bigtriangleup;": "\u25b3",
+    "biguplus;": "\u2a04",
+    "bigvee;": "\u22c1",
+    "bigwedge;": "\u22c0",
+    "bkarow;": "\u290d",
+    "blacklozenge;": "\u29eb",
+    "blacksquare;": "\u25aa",
+    "blacktriangle;": "\u25b4",
+    "blacktriangledown;": "\u25be",
+    "blacktriangleleft;": "\u25c2",
+    "blacktriangleright;": "\u25b8",
+    "blank;": "\u2423",
+    "blk12;": "\u2592",
+    "blk14;": "\u2591",
+    "blk34;": "\u2593",
+    "block;": "\u2588",
+    "bne;": "=\u20e5",
+    "bnequiv;": "\u2261\u20e5",
+    "bnot;": "\u2310",
+    "bopf;": "\U0001d553",
+    "bot;": "\u22a5",
+    "bottom;": "\u22a5",
+    "bowtie;": "\u22c8",
+    "boxDL;": "\u2557",
+    "boxDR;": "\u2554",
+    "boxDl;": "\u2556",
+    "boxDr;": "\u2553",
+    "boxH;": "\u2550",
+    "boxHD;": "\u2566",
+    "boxHU;": "\u2569",
+    "boxHd;": "\u2564",
+    "boxHu;": "\u2567",
+    "boxUL;": "\u255d",
+    "boxUR;": "\u255a",
+    "boxUl;": "\u255c",
+    "boxUr;": "\u2559",
+    "boxV;": "\u2551",
+    "boxVH;": "\u256c",
+    "boxVL;": "\u2563",
+    "boxVR;": "\u2560",
+    "boxVh;": "\u256b",
+    "boxVl;": "\u2562",
+    "boxVr;": "\u255f",
+    "boxbox;": "\u29c9",
+    "boxdL;": "\u2555",
+    "boxdR;": "\u2552",
+    "boxdl;": "\u2510",
+    "boxdr;": "\u250c",
+    "boxh;": "\u2500",
+    "boxhD;": "\u2565",
+    "boxhU;": "\u2568",
+    "boxhd;": "\u252c",
+    "boxhu;": "\u2534",
+    "boxminus;": "\u229f",
+    "boxplus;": "\u229e",
+    "boxtimes;": "\u22a0",
+    "boxuL;": "\u255b",
+    "boxuR;": "\u2558",
+    "boxul;": "\u2518",
+    "boxur;": "\u2514",
+    "boxv;": "\u2502",
+    "boxvH;": "\u256a",
+    "boxvL;": "\u2561",
+    "boxvR;": "\u255e",
+    "boxvh;": "\u253c",
+    "boxvl;": "\u2524",
+    "boxvr;": "\u251c",
+    "bprime;": "\u2035",
+    "breve;": "\u02d8",
+    "brvbar": "\xa6",
+    "brvbar;": "\xa6",
+    "bscr;": "\U0001d4b7",
+    "bsemi;": "\u204f",
+    "bsim;": "\u223d",
+    "bsime;": "\u22cd",
+    "bsol;": "\\",
+    "bsolb;": "\u29c5",
+    "bsolhsub;": "\u27c8",
+    "bull;": "\u2022",
+    "bullet;": "\u2022",
+    "bump;": "\u224e",
+    "bumpE;": "\u2aae",
+    "bumpe;": "\u224f",
+    "bumpeq;": "\u224f",
+    "cacute;": "\u0107",
+    "cap;": "\u2229",
+    "capand;": "\u2a44",
+    "capbrcup;": "\u2a49",
+    "capcap;": "\u2a4b",
+    "capcup;": "\u2a47",
+    "capdot;": "\u2a40",
+    "caps;": "\u2229\ufe00",
+    "caret;": "\u2041",
+    "caron;": "\u02c7",
+    "ccaps;": "\u2a4d",
+    "ccaron;": "\u010d",
+    "ccedil": "\xe7",
+    "ccedil;": "\xe7",
+    "ccirc;": "\u0109",
+    "ccups;": "\u2a4c",
+    "ccupssm;": "\u2a50",
+    "cdot;": "\u010b",
+    "cedil": "\xb8",
+    "cedil;": "\xb8",
+    "cemptyv;": "\u29b2",
+    "cent": "\xa2",
+    "cent;": "\xa2",
+    "centerdot;": "\xb7",
+    "cfr;": "\U0001d520",
+    "chcy;": "\u0447",
+    "check;": "\u2713",
+    "checkmark;": "\u2713",
+    "chi;": "\u03c7",
+    "cir;": "\u25cb",
+    "cirE;": "\u29c3",
+    "circ;": "\u02c6",
+    "circeq;": "\u2257",
+    "circlearrowleft;": "\u21ba",
+    "circlearrowright;": "\u21bb",
+    "circledR;": "\xae",
+    "circledS;": "\u24c8",
+    "circledast;": "\u229b",
+    "circledcirc;": "\u229a",
+    "circleddash;": "\u229d",
+    "cire;": "\u2257",
+    "cirfnint;": "\u2a10",
+    "cirmid;": "\u2aef",
+    "cirscir;": "\u29c2",
+    "clubs;": "\u2663",
+    "clubsuit;": "\u2663",
+    "colon;": ":",
+    "colone;": "\u2254",
+    "coloneq;": "\u2254",
+    "comma;": ",",
+    "commat;": "@",
+    "comp;": "\u2201",
+    "compfn;": "\u2218",
+    "complement;": "\u2201",
+    "complexes;": "\u2102",
+    "cong;": "\u2245",
+    "congdot;": "\u2a6d",
+    "conint;": "\u222e",
+    "copf;": "\U0001d554",
+    "coprod;": "\u2210",
+    "copy": "\xa9",
+    "copy;": "\xa9",
+    "copysr;": "\u2117",
+    "crarr;": "\u21b5",
+    "cross;": "\u2717",
+    "cscr;": "\U0001d4b8",
+    "csub;": "\u2acf",
+    "csube;": "\u2ad1",
+    "csup;": "\u2ad0",
+    "csupe;": "\u2ad2",
+    "ctdot;": "\u22ef",
+    "cudarrl;": "\u2938",
+    "cudarrr;": "\u2935",
+    "cuepr;": "\u22de",
+    "cuesc;": "\u22df",
+    "cularr;": "\u21b6",
+    "cularrp;": "\u293d",
+    "cup;": "\u222a",
+    "cupbrcap;": "\u2a48",
+    "cupcap;": "\u2a46",
+    "cupcup;": "\u2a4a",
+    "cupdot;": "\u228d",
+    "cupor;": "\u2a45",
+    "cups;": "\u222a\ufe00",
+    "curarr;": "\u21b7",
+    "curarrm;": "\u293c",
+    "curlyeqprec;": "\u22de",
+    "curlyeqsucc;": "\u22df",
+    "curlyvee;": "\u22ce",
+    "curlywedge;": "\u22cf",
+    "curren": "\xa4",
+    "curren;": "\xa4",
+    "curvearrowleft;": "\u21b6",
+    "curvearrowright;": "\u21b7",
+    "cuvee;": "\u22ce",
+    "cuwed;": "\u22cf",
+    "cwconint;": "\u2232",
+    "cwint;": "\u2231",
+    "cylcty;": "\u232d",
+    "dArr;": "\u21d3",
+    "dHar;": "\u2965",
+    "dagger;": "\u2020",
+    "daleth;": "\u2138",
+    "darr;": "\u2193",
+    "dash;": "\u2010",
+    "dashv;": "\u22a3",
+    "dbkarow;": "\u290f",
+    "dblac;": "\u02dd",
+    "dcaron;": "\u010f",
+    "dcy;": "\u0434",
+    "dd;": "\u2146",
+    "ddagger;": "\u2021",
+    "ddarr;": "\u21ca",
+    "ddotseq;": "\u2a77",
+    "deg": "\xb0",
+    "deg;": "\xb0",
+    "delta;": "\u03b4",
+    "demptyv;": "\u29b1",
+    "dfisht;": "\u297f",
+    "dfr;": "\U0001d521",
+    "dharl;": "\u21c3",
+    "dharr;": "\u21c2",
+    "diam;": "\u22c4",
+    "diamond;": "\u22c4",
+    "diamondsuit;": "\u2666",
+    "diams;": "\u2666",
+    "die;": "\xa8",
+    "digamma;": "\u03dd",
+    "disin;": "\u22f2",
+    "div;": "\xf7",
+    "divide": "\xf7",
+    "divide;": "\xf7",
+    "divideontimes;": "\u22c7",
+    "divonx;": "\u22c7",
+    "djcy;": "\u0452",
+    "dlcorn;": "\u231e",
+    "dlcrop;": "\u230d",
+    "dollar;": "$",
+    "dopf;": "\U0001d555",
+    "dot;": "\u02d9",
+    "doteq;": "\u2250",
+    "doteqdot;": "\u2251",
+    "dotminus;": "\u2238",
+    "dotplus;": "\u2214",
+    "dotsquare;": "\u22a1",
+    "doublebarwedge;": "\u2306",
+    "downarrow;": "\u2193",
+    "downdownarrows;": "\u21ca",
+    "downharpoonleft;": "\u21c3",
+    "downharpoonright;": "\u21c2",
+    "drbkarow;": "\u2910",
+    "drcorn;": "\u231f",
+    "drcrop;": "\u230c",
+    "dscr;": "\U0001d4b9",
+    "dscy;": "\u0455",
+    "dsol;": "\u29f6",
+    "dstrok;": "\u0111",
+    "dtdot;": "\u22f1",
+    "dtri;": "\u25bf",
+    "dtrif;": "\u25be",
+    "duarr;": "\u21f5",
+    "duhar;": "\u296f",
+    "dwangle;": "\u29a6",
+    "dzcy;": "\u045f",
+    "dzigrarr;": "\u27ff",
+    "eDDot;": "\u2a77",
+    "eDot;": "\u2251",
+    "eacute": "\xe9",
+    "eacute;": "\xe9",
+    "easter;": "\u2a6e",
+    "ecaron;": "\u011b",
+    "ecir;": "\u2256",
+    "ecirc": "\xea",
+    "ecirc;": "\xea",
+    "ecolon;": "\u2255",
+    "ecy;": "\u044d",
+    "edot;": "\u0117",
+    "ee;": "\u2147",
+    "efDot;": "\u2252",
+    "efr;": "\U0001d522",
+    "eg;": "\u2a9a",
+    "egrave": "\xe8",
+    "egrave;": "\xe8",
+    "egs;": "\u2a96",
+    "egsdot;": "\u2a98",
+    "el;": "\u2a99",
+    "elinters;": "\u23e7",
+    "ell;": "\u2113",
+    "els;": "\u2a95",
+    "elsdot;": "\u2a97",
+    "emacr;": "\u0113",
+    "empty;": "\u2205",
+    "emptyset;": "\u2205",
+    "emptyv;": "\u2205",
+    "emsp13;": "\u2004",
+    "emsp14;": "\u2005",
+    "emsp;": "\u2003",
+    "eng;": "\u014b",
+    "ensp;": "\u2002",
+    "eogon;": "\u0119",
+    "eopf;": "\U0001d556",
+    "epar;": "\u22d5",
+    "eparsl;": "\u29e3",
+    "eplus;": "\u2a71",
+    "epsi;": "\u03b5",
+    "epsilon;": "\u03b5",
+    "epsiv;": "\u03f5",
+    "eqcirc;": "\u2256",
+    "eqcolon;": "\u2255",
+    "eqsim;": "\u2242",
+    "eqslantgtr;": "\u2a96",
+    "eqslantless;": "\u2a95",
+    "equals;": "=",
+    "equest;": "\u225f",
+    "equiv;": "\u2261",
+    "equivDD;": "\u2a78",
+    "eqvparsl;": "\u29e5",
+    "erDot;": "\u2253",
+    "erarr;": "\u2971",
+    "escr;": "\u212f",
+    "esdot;": "\u2250",
+    "esim;": "\u2242",
+    "eta;": "\u03b7",
+    "eth": "\xf0",
+    "eth;": "\xf0",
+    "euml": "\xeb",
+    "euml;": "\xeb",
+    "euro;": "\u20ac",
+    "excl;": "!",
+    "exist;": "\u2203",
+    "expectation;": "\u2130",
+    "exponentiale;": "\u2147",
+    "fallingdotseq;": "\u2252",
+    "fcy;": "\u0444",
+    "female;": "\u2640",
+    "ffilig;": "\ufb03",
+    "fflig;": "\ufb00",
+    "ffllig;": "\ufb04",
+    "ffr;": "\U0001d523",
+    "filig;": "\ufb01",
+    "fjlig;": "fj",
+    "flat;": "\u266d",
+    "fllig;": "\ufb02",
+    "fltns;": "\u25b1",
+    "fnof;": "\u0192",
+    "fopf;": "\U0001d557",
+    "forall;": "\u2200",
+    "fork;": "\u22d4",
+    "forkv;": "\u2ad9",
+    "fpartint;": "\u2a0d",
+    "frac12": "\xbd",
+    "frac12;": "\xbd",
+    "frac13;": "\u2153",
+    "frac14": "\xbc",
+    "frac14;": "\xbc",
+    "frac15;": "\u2155",
+    "frac16;": "\u2159",
+    "frac18;": "\u215b",
+    "frac23;": "\u2154",
+    "frac25;": "\u2156",
+    "frac34": "\xbe",
+    "frac34;": "\xbe",
+    "frac35;": "\u2157",
+    "frac38;": "\u215c",
+    "frac45;": "\u2158",
+    "frac56;": "\u215a",
+    "frac58;": "\u215d",
+    "frac78;": "\u215e",
+    "frasl;": "\u2044",
+    "frown;": "\u2322",
+    "fscr;": "\U0001d4bb",
+    "gE;": "\u2267",
+    "gEl;": "\u2a8c",
+    "gacute;": "\u01f5",
+    "gamma;": "\u03b3",
+    "gammad;": "\u03dd",
+    "gap;": "\u2a86",
+    "gbreve;": "\u011f",
+    "gcirc;": "\u011d",
+    "gcy;": "\u0433",
+    "gdot;": "\u0121",
+    "ge;": "\u2265",
+    "gel;": "\u22db",
+    "geq;": "\u2265",
+    "geqq;": "\u2267",
+    "geqslant;": "\u2a7e",
+    "ges;": "\u2a7e",
+    "gescc;": "\u2aa9",
+    "gesdot;": "\u2a80",
+    "gesdoto;": "\u2a82",
+    "gesdotol;": "\u2a84",
+    "gesl;": "\u22db\ufe00",
+    "gesles;": "\u2a94",
+    "gfr;": "\U0001d524",
+    "gg;": "\u226b",
+    "ggg;": "\u22d9",
+    "gimel;": "\u2137",
+    "gjcy;": "\u0453",
+    "gl;": "\u2277",
+    "glE;": "\u2a92",
+    "gla;": "\u2aa5",
+    "glj;": "\u2aa4",
+    "gnE;": "\u2269",
+    "gnap;": "\u2a8a",
+    "gnapprox;": "\u2a8a",
+    "gne;": "\u2a88",
+    "gneq;": "\u2a88",
+    "gneqq;": "\u2269",
+    "gnsim;": "\u22e7",
+    "gopf;": "\U0001d558",
+    "grave;": "`",
+    "gscr;": "\u210a",
+    "gsim;": "\u2273",
+    "gsime;": "\u2a8e",
+    "gsiml;": "\u2a90",
+    "gt": ">",
+    "gt;": ">",
+    "gtcc;": "\u2aa7",
+    "gtcir;": "\u2a7a",
+    "gtdot;": "\u22d7",
+    "gtlPar;": "\u2995",
+    "gtquest;": "\u2a7c",
+    "gtrapprox;": "\u2a86",
+    "gtrarr;": "\u2978",
+    "gtrdot;": "\u22d7",
+    "gtreqless;": "\u22db",
+    "gtreqqless;": "\u2a8c",
+    "gtrless;": "\u2277",
+    "gtrsim;": "\u2273",
+    "gvertneqq;": "\u2269\ufe00",
+    "gvnE;": "\u2269\ufe00",
+    "hArr;": "\u21d4",
+    "hairsp;": "\u200a",
+    "half;": "\xbd",
+    "hamilt;": "\u210b",
+    "hardcy;": "\u044a",
+    "harr;": "\u2194",
+    "harrcir;": "\u2948",
+    "harrw;": "\u21ad",
+    "hbar;": "\u210f",
+    "hcirc;": "\u0125",
+    "hearts;": "\u2665",
+    "heartsuit;": "\u2665",
+    "hellip;": "\u2026",
+    "hercon;": "\u22b9",
+    "hfr;": "\U0001d525",
+    "hksearow;": "\u2925",
+    "hkswarow;": "\u2926",
+    "hoarr;": "\u21ff",
+    "homtht;": "\u223b",
+    "hookleftarrow;": "\u21a9",
+    "hookrightarrow;": "\u21aa",
+    "hopf;": "\U0001d559",
+    "horbar;": "\u2015",
+    "hscr;": "\U0001d4bd",
+    "hslash;": "\u210f",
+    "hstrok;": "\u0127",
+    "hybull;": "\u2043",
+    "hyphen;": "\u2010",
+    "iacute": "\xed",
+    "iacute;": "\xed",
+    "ic;": "\u2063",
+    "icirc": "\xee",
+    "icirc;": "\xee",
+    "icy;": "\u0438",
+    "iecy;": "\u0435",
+    "iexcl": "\xa1",
+    "iexcl;": "\xa1",
+    "iff;": "\u21d4",
+    "ifr;": "\U0001d526",
+    "igrave": "\xec",
+    "igrave;": "\xec",
+    "ii;": "\u2148",
+    "iiiint;": "\u2a0c",
+    "iiint;": "\u222d",
+    "iinfin;": "\u29dc",
+    "iiota;": "\u2129",
+    "ijlig;": "\u0133",
+    "imacr;": "\u012b",
+    "image;": "\u2111",
+    "imagline;": "\u2110",
+    "imagpart;": "\u2111",
+    "imath;": "\u0131",
+    "imof;": "\u22b7",
+    "imped;": "\u01b5",
+    "in;": "\u2208",
+    "incare;": "\u2105",
+    "infin;": "\u221e",
+    "infintie;": "\u29dd",
+    "inodot;": "\u0131",
+    "int;": "\u222b",
+    "intcal;": "\u22ba",
+    "integers;": "\u2124",
+    "intercal;": "\u22ba",
+    "intlarhk;": "\u2a17",
+    "intprod;": "\u2a3c",
+    "iocy;": "\u0451",
+    "iogon;": "\u012f",
+    "iopf;": "\U0001d55a",
+    "iota;": "\u03b9",
+    "iprod;": "\u2a3c",
+    "iquest": "\xbf",
+    "iquest;": "\xbf",
+    "iscr;": "\U0001d4be",
+    "isin;": "\u2208",
+    "isinE;": "\u22f9",
+    "isindot;": "\u22f5",
+    "isins;": "\u22f4",
+    "isinsv;": "\u22f3",
+    "isinv;": "\u2208",
+    "it;": "\u2062",
+    "itilde;": "\u0129",
+    "iukcy;": "\u0456",
+    "iuml": "\xef",
+    "iuml;": "\xef",
+    "jcirc;": "\u0135",
+    "jcy;": "\u0439",
+    "jfr;": "\U0001d527",
+    "jmath;": "\u0237",
+    "jopf;": "\U0001d55b",
+    "jscr;": "\U0001d4bf",
+    "jsercy;": "\u0458",
+    "jukcy;": "\u0454",
+    "kappa;": "\u03ba",
+    "kappav;": "\u03f0",
+    "kcedil;": "\u0137",
+    "kcy;": "\u043a",
+    "kfr;": "\U0001d528",
+    "kgreen;": "\u0138",
+    "khcy;": "\u0445",
+    "kjcy;": "\u045c",
+    "kopf;": "\U0001d55c",
+    "kscr;": "\U0001d4c0",
+    "lAarr;": "\u21da",
+    "lArr;": "\u21d0",
+    "lAtail;": "\u291b",
+    "lBarr;": "\u290e",
+    "lE;": "\u2266",
+    "lEg;": "\u2a8b",
+    "lHar;": "\u2962",
+    "lacute;": "\u013a",
+    "laemptyv;": "\u29b4",
+    "lagran;": "\u2112",
+    "lambda;": "\u03bb",
+    "lang;": "\u27e8",
+    "langd;": "\u2991",
+    "langle;": "\u27e8",
+    "lap;": "\u2a85",
+    "laquo": "\xab",
+    "laquo;": "\xab",
+    "larr;": "\u2190",
+    "larrb;": "\u21e4",
+    "larrbfs;": "\u291f",
+    "larrfs;": "\u291d",
+    "larrhk;": "\u21a9",
+    "larrlp;": "\u21ab",
+    "larrpl;": "\u2939",
+    "larrsim;": "\u2973",
+    "larrtl;": "\u21a2",
+    "lat;": "\u2aab",
+    "latail;": "\u2919",
+    "late;": "\u2aad",
+    "lates;": "\u2aad\ufe00",
+    "lbarr;": "\u290c",
+    "lbbrk;": "\u2772",
+    "lbrace;": "{",
+    "lbrack;": "[",
+    "lbrke;": "\u298b",
+    "lbrksld;": "\u298f",
+    "lbrkslu;": "\u298d",
+    "lcaron;": "\u013e",
+    "lcedil;": "\u013c",
+    "lceil;": "\u2308",
+    "lcub;": "{",
+    "lcy;": "\u043b",
+    "ldca;": "\u2936",
+    "ldquo;": "\u201c",
+    "ldquor;": "\u201e",
+    "ldrdhar;": "\u2967",
+    "ldrushar;": "\u294b",
+    "ldsh;": "\u21b2",
+    "le;": "\u2264",
+    "leftarrow;": "\u2190",
+    "leftarrowtail;": "\u21a2",
+    "leftharpoondown;": "\u21bd",
+    "leftharpoonup;": "\u21bc",
+    "leftleftarrows;": "\u21c7",
+    "leftrightarrow;": "\u2194",
+    "leftrightarrows;": "\u21c6",
+    "leftrightharpoons;": "\u21cb",
+    "leftrightsquigarrow;": "\u21ad",
+    "leftthreetimes;": "\u22cb",
+    "leg;": "\u22da",
+    "leq;": "\u2264",
+    "leqq;": "\u2266",
+    "leqslant;": "\u2a7d",
+    "les;": "\u2a7d",
+    "lescc;": "\u2aa8",
+    "lesdot;": "\u2a7f",
+    "lesdoto;": "\u2a81",
+    "lesdotor;": "\u2a83",
+    "lesg;": "\u22da\ufe00",
+    "lesges;": "\u2a93",
+    "lessapprox;": "\u2a85",
+    "lessdot;": "\u22d6",
+    "lesseqgtr;": "\u22da",
+    "lesseqqgtr;": "\u2a8b",
+    "lessgtr;": "\u2276",
+    "lesssim;": "\u2272",
+    "lfisht;": "\u297c",
+    "lfloor;": "\u230a",
+    "lfr;": "\U0001d529",
+    "lg;": "\u2276",
+    "lgE;": "\u2a91",
+    "lhard;": "\u21bd",
+    "lharu;": "\u21bc",
+    "lharul;": "\u296a",
+    "lhblk;": "\u2584",
+    "ljcy;": "\u0459",
+    "ll;": "\u226a",
+    "llarr;": "\u21c7",
+    "llcorner;": "\u231e",
+    "llhard;": "\u296b",
+    "lltri;": "\u25fa",
+    "lmidot;": "\u0140",
+    "lmoust;": "\u23b0",
+    "lmoustache;": "\u23b0",
+    "lnE;": "\u2268",
+    "lnap;": "\u2a89",
+    "lnapprox;": "\u2a89",
+    "lne;": "\u2a87",
+    "lneq;": "\u2a87",
+    "lneqq;": "\u2268",
+    "lnsim;": "\u22e6",
+    "loang;": "\u27ec",
+    "loarr;": "\u21fd",
+    "lobrk;": "\u27e6",
+    "longleftarrow;": "\u27f5",
+    "longleftrightarrow;": "\u27f7",
+    "longmapsto;": "\u27fc",
+    "longrightarrow;": "\u27f6",
+    "looparrowleft;": "\u21ab",
+    "looparrowright;": "\u21ac",
+    "lopar;": "\u2985",
+    "lopf;": "\U0001d55d",
+    "loplus;": "\u2a2d",
+    "lotimes;": "\u2a34",
+    "lowast;": "\u2217",
+    "lowbar;": "_",
+    "loz;": "\u25ca",
+    "lozenge;": "\u25ca",
+    "lozf;": "\u29eb",
+    "lpar;": "(",
+    "lparlt;": "\u2993",
+    "lrarr;": "\u21c6",
+    "lrcorner;": "\u231f",
+    "lrhar;": "\u21cb",
+    "lrhard;": "\u296d",
+    "lrm;": "\u200e",
+    "lrtri;": "\u22bf",
+    "lsaquo;": "\u2039",
+    "lscr;": "\U0001d4c1",
+    "lsh;": "\u21b0",
+    "lsim;": "\u2272",
+    "lsime;": "\u2a8d",
+    "lsimg;": "\u2a8f",
+    "lsqb;": "[",
+    "lsquo;": "\u2018",
+    "lsquor;": "\u201a",
+    "lstrok;": "\u0142",
+    "lt": "<",
+    "lt;": "<",
+    "ltcc;": "\u2aa6",
+    "ltcir;": "\u2a79",
+    "ltdot;": "\u22d6",
+    "lthree;": "\u22cb",
+    "ltimes;": "\u22c9",
+    "ltlarr;": "\u2976",
+    "ltquest;": "\u2a7b",
+    "ltrPar;": "\u2996",
+    "ltri;": "\u25c3",
+    "ltrie;": "\u22b4",
+    "ltrif;": "\u25c2",
+    "lurdshar;": "\u294a",
+    "luruhar;": "\u2966",
+    "lvertneqq;": "\u2268\ufe00",
+    "lvnE;": "\u2268\ufe00",
+    "mDDot;": "\u223a",
+    "macr": "\xaf",
+    "macr;": "\xaf",
+    "male;": "\u2642",
+    "malt;": "\u2720",
+    "maltese;": "\u2720",
+    "map;": "\u21a6",
+    "mapsto;": "\u21a6",
+    "mapstodown;": "\u21a7",
+    "mapstoleft;": "\u21a4",
+    "mapstoup;": "\u21a5",
+    "marker;": "\u25ae",
+    "mcomma;": "\u2a29",
+    "mcy;": "\u043c",
+    "mdash;": "\u2014",
+    "measuredangle;": "\u2221",
+    "mfr;": "\U0001d52a",
+    "mho;": "\u2127",
+    "micro": "\xb5",
+    "micro;": "\xb5",
+    "mid;": "\u2223",
+    "midast;": "*",
+    "midcir;": "\u2af0",
+    "middot": "\xb7",
+    "middot;": "\xb7",
+    "minus;": "\u2212",
+    "minusb;": "\u229f",
+    "minusd;": "\u2238",
+    "minusdu;": "\u2a2a",
+    "mlcp;": "\u2adb",
+    "mldr;": "\u2026",
+    "mnplus;": "\u2213",
+    "models;": "\u22a7",
+    "mopf;": "\U0001d55e",
+    "mp;": "\u2213",
+    "mscr;": "\U0001d4c2",
+    "mstpos;": "\u223e",
+    "mu;": "\u03bc",
+    "multimap;": "\u22b8",
+    "mumap;": "\u22b8",
+    "nGg;": "\u22d9\u0338",
+    "nGt;": "\u226b\u20d2",
+    "nGtv;": "\u226b\u0338",
+    "nLeftarrow;": "\u21cd",
+    "nLeftrightarrow;": "\u21ce",
+    "nLl;": "\u22d8\u0338",
+    "nLt;": "\u226a\u20d2",
+    "nLtv;": "\u226a\u0338",
+    "nRightarrow;": "\u21cf",
+    "nVDash;": "\u22af",
+    "nVdash;": "\u22ae",
+    "nabla;": "\u2207",
+    "nacute;": "\u0144",
+    "nang;": "\u2220\u20d2",
+    "nap;": "\u2249",
+    "napE;": "\u2a70\u0338",
+    "napid;": "\u224b\u0338",
+    "napos;": "\u0149",
+    "napprox;": "\u2249",
+    "natur;": "\u266e",
+    "natural;": "\u266e",
+    "naturals;": "\u2115",
+    "nbsp": "\xa0",
+    "nbsp;": "\xa0",
+    "nbump;": "\u224e\u0338",
+    "nbumpe;": "\u224f\u0338",
+    "ncap;": "\u2a43",
+    "ncaron;": "\u0148",
+    "ncedil;": "\u0146",
+    "ncong;": "\u2247",
+    "ncongdot;": "\u2a6d\u0338",
+    "ncup;": "\u2a42",
+    "ncy;": "\u043d",
+    "ndash;": "\u2013",
+    "ne;": "\u2260",
+    "neArr;": "\u21d7",
+    "nearhk;": "\u2924",
+    "nearr;": "\u2197",
+    "nearrow;": "\u2197",
+    "nedot;": "\u2250\u0338",
+    "nequiv;": "\u2262",
+    "nesear;": "\u2928",
+    "nesim;": "\u2242\u0338",
+    "nexist;": "\u2204",
+    "nexists;": "\u2204",
+    "nfr;": "\U0001d52b",
+    "ngE;": "\u2267\u0338",
+    "nge;": "\u2271",
+    "ngeq;": "\u2271",
+    "ngeqq;": "\u2267\u0338",
+    "ngeqslant;": "\u2a7e\u0338",
+    "nges;": "\u2a7e\u0338",
+    "ngsim;": "\u2275",
+    "ngt;": "\u226f",
+    "ngtr;": "\u226f",
+    "nhArr;": "\u21ce",
+    "nharr;": "\u21ae",
+    "nhpar;": "\u2af2",
+    "ni;": "\u220b",
+    "nis;": "\u22fc",
+    "nisd;": "\u22fa",
+    "niv;": "\u220b",
+    "njcy;": "\u045a",
+    "nlArr;": "\u21cd",
+    "nlE;": "\u2266\u0338",
+    "nlarr;": "\u219a",
+    "nldr;": "\u2025",
+    "nle;": "\u2270",
+    "nleftarrow;": "\u219a",
+    "nleftrightarrow;": "\u21ae",
+    "nleq;": "\u2270",
+    "nleqq;": "\u2266\u0338",
+    "nleqslant;": "\u2a7d\u0338",
+    "nles;": "\u2a7d\u0338",
+    "nless;": "\u226e",
+    "nlsim;": "\u2274",
+    "nlt;": "\u226e",
+    "nltri;": "\u22ea",
+    "nltrie;": "\u22ec",
+    "nmid;": "\u2224",
+    "nopf;": "\U0001d55f",
+    "not": "\xac",
+    "not;": "\xac",
+    "notin;": "\u2209",
+    "notinE;": "\u22f9\u0338",
+    "notindot;": "\u22f5\u0338",
+    "notinva;": "\u2209",
+    "notinvb;": "\u22f7",
+    "notinvc;": "\u22f6",
+    "notni;": "\u220c",
+    "notniva;": "\u220c",
+    "notnivb;": "\u22fe",
+    "notnivc;": "\u22fd",
+    "npar;": "\u2226",
+    "nparallel;": "\u2226",
+    "nparsl;": "\u2afd\u20e5",
+    "npart;": "\u2202\u0338",
+    "npolint;": "\u2a14",
+    "npr;": "\u2280",
+    "nprcue;": "\u22e0",
+    "npre;": "\u2aaf\u0338",
+    "nprec;": "\u2280",
+    "npreceq;": "\u2aaf\u0338",
+    "nrArr;": "\u21cf",
+    "nrarr;": "\u219b",
+    "nrarrc;": "\u2933\u0338",
+    "nrarrw;": "\u219d\u0338",
+    "nrightarrow;": "\u219b",
+    "nrtri;": "\u22eb",
+    "nrtrie;": "\u22ed",
+    "nsc;": "\u2281",
+    "nsccue;": "\u22e1",
+    "nsce;": "\u2ab0\u0338",
+    "nscr;": "\U0001d4c3",
+    "nshortmid;": "\u2224",
+    "nshortparallel;": "\u2226",
+    "nsim;": "\u2241",
+    "nsime;": "\u2244",
+    "nsimeq;": "\u2244",
+    "nsmid;": "\u2224",
+    "nspar;": "\u2226",
+    "nsqsube;": "\u22e2",
+    "nsqsupe;": "\u22e3",
+    "nsub;": "\u2284",
+    "nsubE;": "\u2ac5\u0338",
+    "nsube;": "\u2288",
+    "nsubset;": "\u2282\u20d2",
+    "nsubseteq;": "\u2288",
+    "nsubseteqq;": "\u2ac5\u0338",
+    "nsucc;": "\u2281",
+    "nsucceq;": "\u2ab0\u0338",
+    "nsup;": "\u2285",
+    "nsupE;": "\u2ac6\u0338",
+    "nsupe;": "\u2289",
+    "nsupset;": "\u2283\u20d2",
+    "nsupseteq;": "\u2289",
+    "nsupseteqq;": "\u2ac6\u0338",
+    "ntgl;": "\u2279",
+    "ntilde": "\xf1",
+    "ntilde;": "\xf1",
+    "ntlg;": "\u2278",
+    "ntriangleleft;": "\u22ea",
+    "ntrianglelefteq;": "\u22ec",
+    "ntriangleright;": "\u22eb",
+    "ntrianglerighteq;": "\u22ed",
+    "nu;": "\u03bd",
+    "num;": "#",
+    "numero;": "\u2116",
+    "numsp;": "\u2007",
+    "nvDash;": "\u22ad",
+    "nvHarr;": "\u2904",
+    "nvap;": "\u224d\u20d2",
+    "nvdash;": "\u22ac",
+    "nvge;": "\u2265\u20d2",
+    "nvgt;": ">\u20d2",
+    "nvinfin;": "\u29de",
+    "nvlArr;": "\u2902",
+    "nvle;": "\u2264\u20d2",
+    "nvlt;": "<\u20d2",
+    "nvltrie;": "\u22b4\u20d2",
+    "nvrArr;": "\u2903",
+    "nvrtrie;": "\u22b5\u20d2",
+    "nvsim;": "\u223c\u20d2",
+    "nwArr;": "\u21d6",
+    "nwarhk;": "\u2923",
+    "nwarr;": "\u2196",
+    "nwarrow;": "\u2196",
+    "nwnear;": "\u2927",
+    "oS;": "\u24c8",
+    "oacute": "\xf3",
+    "oacute;": "\xf3",
+    "oast;": "\u229b",
+    "ocir;": "\u229a",
+    "ocirc": "\xf4",
+    "ocirc;": "\xf4",
+    "ocy;": "\u043e",
+    "odash;": "\u229d",
+    "odblac;": "\u0151",
+    "odiv;": "\u2a38",
+    "odot;": "\u2299",
+    "odsold;": "\u29bc",
+    "oelig;": "\u0153",
+    "ofcir;": "\u29bf",
+    "ofr;": "\U0001d52c",
+    "ogon;": "\u02db",
+    "ograve": "\xf2",
+    "ograve;": "\xf2",
+    "ogt;": "\u29c1",
+    "ohbar;": "\u29b5",
+    "ohm;": "\u03a9",
+    "oint;": "\u222e",
+    "olarr;": "\u21ba",
+    "olcir;": "\u29be",
+    "olcross;": "\u29bb",
+    "oline;": "\u203e",
+    "olt;": "\u29c0",
+    "omacr;": "\u014d",
+    "omega;": "\u03c9",
+    "omicron;": "\u03bf",
+    "omid;": "\u29b6",
+    "ominus;": "\u2296",
+    "oopf;": "\U0001d560",
+    "opar;": "\u29b7",
+    "operp;": "\u29b9",
+    "oplus;": "\u2295",
+    "or;": "\u2228",
+    "orarr;": "\u21bb",
+    "ord;": "\u2a5d",
+    "order;": "\u2134",
+    "orderof;": "\u2134",
+    "ordf": "\xaa",
+    "ordf;": "\xaa",
+    "ordm": "\xba",
+    "ordm;": "\xba",
+    "origof;": "\u22b6",
+    "oror;": "\u2a56",
+    "orslope;": "\u2a57",
+    "orv;": "\u2a5b",
+    "oscr;": "\u2134",
+    "oslash": "\xf8",
+    "oslash;": "\xf8",
+    "osol;": "\u2298",
+    "otilde": "\xf5",
+    "otilde;": "\xf5",
+    "otimes;": "\u2297",
+    "otimesas;": "\u2a36",
+    "ouml": "\xf6",
+    "ouml;": "\xf6",
+    "ovbar;": "\u233d",
+    "par;": "\u2225",
+    "para": "\xb6",
+    "para;": "\xb6",
+    "parallel;": "\u2225",
+    "parsim;": "\u2af3",
+    "parsl;": "\u2afd",
+    "part;": "\u2202",
+    "pcy;": "\u043f",
+    "percnt;": "%",
+    "period;": ".",
+    "permil;": "\u2030",
+    "perp;": "\u22a5",
+    "pertenk;": "\u2031",
+    "pfr;": "\U0001d52d",
+    "phi;": "\u03c6",
+    "phiv;": "\u03d5",
+    "phmmat;": "\u2133",
+    "phone;": "\u260e",
+    "pi;": "\u03c0",
+    "pitchfork;": "\u22d4",
+    "piv;": "\u03d6",
+    "planck;": "\u210f",
+    "planckh;": "\u210e",
+    "plankv;": "\u210f",
+    "plus;": "+",
+    "plusacir;": "\u2a23",
+    "plusb;": "\u229e",
+    "pluscir;": "\u2a22",
+    "plusdo;": "\u2214",
+    "plusdu;": "\u2a25",
+    "pluse;": "\u2a72",
+    "plusmn": "\xb1",
+    "plusmn;": "\xb1",
+    "plussim;": "\u2a26",
+    "plustwo;": "\u2a27",
+    "pm;": "\xb1",
+    "pointint;": "\u2a15",
+    "popf;": "\U0001d561",
+    "pound": "\xa3",
+    "pound;": "\xa3",
+    "pr;": "\u227a",
+    "prE;": "\u2ab3",
+    "prap;": "\u2ab7",
+    "prcue;": "\u227c",
+    "pre;": "\u2aaf",
+    "prec;": "\u227a",
+    "precapprox;": "\u2ab7",
+    "preccurlyeq;": "\u227c",
+    "preceq;": "\u2aaf",
+    "precnapprox;": "\u2ab9",
+    "precneqq;": "\u2ab5",
+    "precnsim;": "\u22e8",
+    "precsim;": "\u227e",
+    "prime;": "\u2032",
+    "primes;": "\u2119",
+    "prnE;": "\u2ab5",
+    "prnap;": "\u2ab9",
+    "prnsim;": "\u22e8",
+    "prod;": "\u220f",
+    "profalar;": "\u232e",
+    "profline;": "\u2312",
+    "profsurf;": "\u2313",
+    "prop;": "\u221d",
+    "propto;": "\u221d",
+    "prsim;": "\u227e",
+    "prurel;": "\u22b0",
+    "pscr;": "\U0001d4c5",
+    "psi;": "\u03c8",
+    "puncsp;": "\u2008",
+    "qfr;": "\U0001d52e",
+    "qint;": "\u2a0c",
+    "qopf;": "\U0001d562",
+    "qprime;": "\u2057",
+    "qscr;": "\U0001d4c6",
+    "quaternions;": "\u210d",
+    "quatint;": "\u2a16",
+    "quest;": "?",
+    "questeq;": "\u225f",
+    "quot": "\"",
+    "quot;": "\"",
+    "rAarr;": "\u21db",
+    "rArr;": "\u21d2",
+    "rAtail;": "\u291c",
+    "rBarr;": "\u290f",
+    "rHar;": "\u2964",
+    "race;": "\u223d\u0331",
+    "racute;": "\u0155",
+    "radic;": "\u221a",
+    "raemptyv;": "\u29b3",
+    "rang;": "\u27e9",
+    "rangd;": "\u2992",
+    "range;": "\u29a5",
+    "rangle;": "\u27e9",
+    "raquo": "\xbb",
+    "raquo;": "\xbb",
+    "rarr;": "\u2192",
+    "rarrap;": "\u2975",
+    "rarrb;": "\u21e5",
+    "rarrbfs;": "\u2920",
+    "rarrc;": "\u2933",
+    "rarrfs;": "\u291e",
+    "rarrhk;": "\u21aa",
+    "rarrlp;": "\u21ac",
+    "rarrpl;": "\u2945",
+    "rarrsim;": "\u2974",
+    "rarrtl;": "\u21a3",
+    "rarrw;": "\u219d",
+    "ratail;": "\u291a",
+    "ratio;": "\u2236",
+    "rationals;": "\u211a",
+    "rbarr;": "\u290d",
+    "rbbrk;": "\u2773",
+    "rbrace;": "}",
+    "rbrack;": "]",
+    "rbrke;": "\u298c",
+    "rbrksld;": "\u298e",
+    "rbrkslu;": "\u2990",
+    "rcaron;": "\u0159",
+    "rcedil;": "\u0157",
+    "rceil;": "\u2309",
+    "rcub;": "}",
+    "rcy;": "\u0440",
+    "rdca;": "\u2937",
+    "rdldhar;": "\u2969",
+    "rdquo;": "\u201d",
+    "rdquor;": "\u201d",
+    "rdsh;": "\u21b3",
+    "real;": "\u211c",
+    "realine;": "\u211b",
+    "realpart;": "\u211c",
+    "reals;": "\u211d",
+    "rect;": "\u25ad",
+    "reg": "\xae",
+    "reg;": "\xae",
+    "rfisht;": "\u297d",
+    "rfloor;": "\u230b",
+    "rfr;": "\U0001d52f",
+    "rhard;": "\u21c1",
+    "rharu;": "\u21c0",
+    "rharul;": "\u296c",
+    "rho;": "\u03c1",
+    "rhov;": "\u03f1",
+    "rightarrow;": "\u2192",
+    "rightarrowtail;": "\u21a3",
+    "rightharpoondown;": "\u21c1",
+    "rightharpoonup;": "\u21c0",
+    "rightleftarrows;": "\u21c4",
+    "rightleftharpoons;": "\u21cc",
+    "rightrightarrows;": "\u21c9",
+    "rightsquigarrow;": "\u219d",
+    "rightthreetimes;": "\u22cc",
+    "ring;": "\u02da",
+    "risingdotseq;": "\u2253",
+    "rlarr;": "\u21c4",
+    "rlhar;": "\u21cc",
+    "rlm;": "\u200f",
+    "rmoust;": "\u23b1",
+    "rmoustache;": "\u23b1",
+    "rnmid;": "\u2aee",
+    "roang;": "\u27ed",
+    "roarr;": "\u21fe",
+    "robrk;": "\u27e7",
+    "ropar;": "\u2986",
+    "ropf;": "\U0001d563",
+    "roplus;": "\u2a2e",
+    "rotimes;": "\u2a35",
+    "rpar;": ")",
+    "rpargt;": "\u2994",
+    "rppolint;": "\u2a12",
+    "rrarr;": "\u21c9",
+    "rsaquo;": "\u203a",
+    "rscr;": "\U0001d4c7",
+    "rsh;": "\u21b1",
+    "rsqb;": "]",
+    "rsquo;": "\u2019",
+    "rsquor;": "\u2019",
+    "rthree;": "\u22cc",
+    "rtimes;": "\u22ca",
+    "rtri;": "\u25b9",
+    "rtrie;": "\u22b5",
+    "rtrif;": "\u25b8",
+    "rtriltri;": "\u29ce",
+    "ruluhar;": "\u2968",
+    "rx;": "\u211e",
+    "sacute;": "\u015b",
+    "sbquo;": "\u201a",
+    "sc;": "\u227b",
+    "scE;": "\u2ab4",
+    "scap;": "\u2ab8",
+    "scaron;": "\u0161",
+    "sccue;": "\u227d",
+    "sce;": "\u2ab0",
+    "scedil;": "\u015f",
+    "scirc;": "\u015d",
+    "scnE;": "\u2ab6",
+    "scnap;": "\u2aba",
+    "scnsim;": "\u22e9",
+    "scpolint;": "\u2a13",
+    "scsim;": "\u227f",
+    "scy;": "\u0441",
+    "sdot;": "\u22c5",
+    "sdotb;": "\u22a1",
+    "sdote;": "\u2a66",
+    "seArr;": "\u21d8",
+    "searhk;": "\u2925",
+    "searr;": "\u2198",
+    "searrow;": "\u2198",
+    "sect": "\xa7",
+    "sect;": "\xa7",
+    "semi;": ";",
+    "seswar;": "\u2929",
+    "setminus;": "\u2216",
+    "setmn;": "\u2216",
+    "sext;": "\u2736",
+    "sfr;": "\U0001d530",
+    "sfrown;": "\u2322",
+    "sharp;": "\u266f",
+    "shchcy;": "\u0449",
+    "shcy;": "\u0448",
+    "shortmid;": "\u2223",
+    "shortparallel;": "\u2225",
+    "shy": "\xad",
+    "shy;": "\xad",
+    "sigma;": "\u03c3",
+    "sigmaf;": "\u03c2",
+    "sigmav;": "\u03c2",
+    "sim;": "\u223c",
+    "simdot;": "\u2a6a",
+    "sime;": "\u2243",
+    "simeq;": "\u2243",
+    "simg;": "\u2a9e",
+    "simgE;": "\u2aa0",
+    "siml;": "\u2a9d",
+    "simlE;": "\u2a9f",
+    "simne;": "\u2246",
+    "simplus;": "\u2a24",
+    "simrarr;": "\u2972",
+    "slarr;": "\u2190",
+    "smallsetminus;": "\u2216",
+    "smashp;": "\u2a33",
+    "smeparsl;": "\u29e4",
+    "smid;": "\u2223",
+    "smile;": "\u2323",
+    "smt;": "\u2aaa",
+    "smte;": "\u2aac",
+    "smtes;": "\u2aac\ufe00",
+    "softcy;": "\u044c",
+    "sol;": "/",
+    "solb;": "\u29c4",
+    "solbar;": "\u233f",
+    "sopf;": "\U0001d564",
+    "spades;": "\u2660",
+    "spadesuit;": "\u2660",
+    "spar;": "\u2225",
+    "sqcap;": "\u2293",
+    "sqcaps;": "\u2293\ufe00",
+    "sqcup;": "\u2294",
+    "sqcups;": "\u2294\ufe00",
+    "sqsub;": "\u228f",
+    "sqsube;": "\u2291",
+    "sqsubset;": "\u228f",
+    "sqsubseteq;": "\u2291",
+    "sqsup;": "\u2290",
+    "sqsupe;": "\u2292",
+    "sqsupset;": "\u2290",
+    "sqsupseteq;": "\u2292",
+    "squ;": "\u25a1",
+    "square;": "\u25a1",
+    "squarf;": "\u25aa",
+    "squf;": "\u25aa",
+    "srarr;": "\u2192",
+    "sscr;": "\U0001d4c8",
+    "ssetmn;": "\u2216",
+    "ssmile;": "\u2323",
+    "sstarf;": "\u22c6",
+    "star;": "\u2606",
+    "starf;": "\u2605",
+    "straightepsilon;": "\u03f5",
+    "straightphi;": "\u03d5",
+    "strns;": "\xaf",
+    "sub;": "\u2282",
+    "subE;": "\u2ac5",
+    "subdot;": "\u2abd",
+    "sube;": "\u2286",
+    "subedot;": "\u2ac3",
+    "submult;": "\u2ac1",
+    "subnE;": "\u2acb",
+    "subne;": "\u228a",
+    "subplus;": "\u2abf",
+    "subrarr;": "\u2979",
+    "subset;": "\u2282",
+    "subseteq;": "\u2286",
+    "subseteqq;": "\u2ac5",
+    "subsetneq;": "\u228a",
+    "subsetneqq;": "\u2acb",
+    "subsim;": "\u2ac7",
+    "subsub;": "\u2ad5",
+    "subsup;": "\u2ad3",
+    "succ;": "\u227b",
+    "succapprox;": "\u2ab8",
+    "succcurlyeq;": "\u227d",
+    "succeq;": "\u2ab0",
+    "succnapprox;": "\u2aba",
+    "succneqq;": "\u2ab6",
+    "succnsim;": "\u22e9",
+    "succsim;": "\u227f",
+    "sum;": "\u2211",
+    "sung;": "\u266a",
+    "sup1": "\xb9",
+    "sup1;": "\xb9",
+    "sup2": "\xb2",
+    "sup2;": "\xb2",
+    "sup3": "\xb3",
+    "sup3;": "\xb3",
+    "sup;": "\u2283",
+    "supE;": "\u2ac6",
+    "supdot;": "\u2abe",
+    "supdsub;": "\u2ad8",
+    "supe;": "\u2287",
+    "supedot;": "\u2ac4",
+    "suphsol;": "\u27c9",
+    "suphsub;": "\u2ad7",
+    "suplarr;": "\u297b",
+    "supmult;": "\u2ac2",
+    "supnE;": "\u2acc",
+    "supne;": "\u228b",
+    "supplus;": "\u2ac0",
+    "supset;": "\u2283",
+    "supseteq;": "\u2287",
+    "supseteqq;": "\u2ac6",
+    "supsetneq;": "\u228b",
+    "supsetneqq;": "\u2acc",
+    "supsim;": "\u2ac8",
+    "supsub;": "\u2ad4",
+    "supsup;": "\u2ad6",
+    "swArr;": "\u21d9",
+    "swarhk;": "\u2926",
+    "swarr;": "\u2199",
+    "swarrow;": "\u2199",
+    "swnwar;": "\u292a",
+    "szlig": "\xdf",
+    "szlig;": "\xdf",
+    "target;": "\u2316",
+    "tau;": "\u03c4",
+    "tbrk;": "\u23b4",
+    "tcaron;": "\u0165",
+    "tcedil;": "\u0163",
+    "tcy;": "\u0442",
+    "tdot;": "\u20db",
+    "telrec;": "\u2315",
+    "tfr;": "\U0001d531",
+    "there4;": "\u2234",
+    "therefore;": "\u2234",
+    "theta;": "\u03b8",
+    "thetasym;": "\u03d1",
+    "thetav;": "\u03d1",
+    "thickapprox;": "\u2248",
+    "thicksim;": "\u223c",
+    "thinsp;": "\u2009",
+    "thkap;": "\u2248",
+    "thksim;": "\u223c",
+    "thorn": "\xfe",
+    "thorn;": "\xfe",
+    "tilde;": "\u02dc",
+    "times": "\xd7",
+    "times;": "\xd7",
+    "timesb;": "\u22a0",
+    "timesbar;": "\u2a31",
+    "timesd;": "\u2a30",
+    "tint;": "\u222d",
+    "toea;": "\u2928",
+    "top;": "\u22a4",
+    "topbot;": "\u2336",
+    "topcir;": "\u2af1",
+    "topf;": "\U0001d565",
+    "topfork;": "\u2ada",
+    "tosa;": "\u2929",
+    "tprime;": "\u2034",
+    "trade;": "\u2122",
+    "triangle;": "\u25b5",
+    "triangledown;": "\u25bf",
+    "triangleleft;": "\u25c3",
+    "trianglelefteq;": "\u22b4",
+    "triangleq;": "\u225c",
+    "triangleright;": "\u25b9",
+    "trianglerighteq;": "\u22b5",
+    "tridot;": "\u25ec",
+    "trie;": "\u225c",
+    "triminus;": "\u2a3a",
+    "triplus;": "\u2a39",
+    "trisb;": "\u29cd",
+    "tritime;": "\u2a3b",
+    "trpezium;": "\u23e2",
+    "tscr;": "\U0001d4c9",
+    "tscy;": "\u0446",
+    "tshcy;": "\u045b",
+    "tstrok;": "\u0167",
+    "twixt;": "\u226c",
+    "twoheadleftarrow;": "\u219e",
+    "twoheadrightarrow;": "\u21a0",
+    "uArr;": "\u21d1",
+    "uHar;": "\u2963",
+    "uacute": "\xfa",
+    "uacute;": "\xfa",
+    "uarr;": "\u2191",
+    "ubrcy;": "\u045e",
+    "ubreve;": "\u016d",
+    "ucirc": "\xfb",
+    "ucirc;": "\xfb",
+    "ucy;": "\u0443",
+    "udarr;": "\u21c5",
+    "udblac;": "\u0171",
+    "udhar;": "\u296e",
+    "ufisht;": "\u297e",
+    "ufr;": "\U0001d532",
+    "ugrave": "\xf9",
+    "ugrave;": "\xf9",
+    "uharl;": "\u21bf",
+    "uharr;": "\u21be",
+    "uhblk;": "\u2580",
+    "ulcorn;": "\u231c",
+    "ulcorner;": "\u231c",
+    "ulcrop;": "\u230f",
+    "ultri;": "\u25f8",
+    "umacr;": "\u016b",
+    "uml": "\xa8",
+    "uml;": "\xa8",
+    "uogon;": "\u0173",
+    "uopf;": "\U0001d566",
+    "uparrow;": "\u2191",
+    "updownarrow;": "\u2195",
+    "upharpoonleft;": "\u21bf",
+    "upharpoonright;": "\u21be",
+    "uplus;": "\u228e",
+    "upsi;": "\u03c5",
+    "upsih;": "\u03d2",
+    "upsilon;": "\u03c5",
+    "upuparrows;": "\u21c8",
+    "urcorn;": "\u231d",
+    "urcorner;": "\u231d",
+    "urcrop;": "\u230e",
+    "uring;": "\u016f",
+    "urtri;": "\u25f9",
+    "uscr;": "\U0001d4ca",
+    "utdot;": "\u22f0",
+    "utilde;": "\u0169",
+    "utri;": "\u25b5",
+    "utrif;": "\u25b4",
+    "uuarr;": "\u21c8",
+    "uuml": "\xfc",
+    "uuml;": "\xfc",
+    "uwangle;": "\u29a7",
+    "vArr;": "\u21d5",
+    "vBar;": "\u2ae8",
+    "vBarv;": "\u2ae9",
+    "vDash;": "\u22a8",
+    "vangrt;": "\u299c",
+    "varepsilon;": "\u03f5",
+    "varkappa;": "\u03f0",
+    "varnothing;": "\u2205",
+    "varphi;": "\u03d5",
+    "varpi;": "\u03d6",
+    "varpropto;": "\u221d",
+    "varr;": "\u2195",
+    "varrho;": "\u03f1",
+    "varsigma;": "\u03c2",
+    "varsubsetneq;": "\u228a\ufe00",
+    "varsubsetneqq;": "\u2acb\ufe00",
+    "varsupsetneq;": "\u228b\ufe00",
+    "varsupsetneqq;": "\u2acc\ufe00",
+    "vartheta;": "\u03d1",
+    "vartriangleleft;": "\u22b2",
+    "vartriangleright;": "\u22b3",
+    "vcy;": "\u0432",
+    "vdash;": "\u22a2",
+    "vee;": "\u2228",
+    "veebar;": "\u22bb",
+    "veeeq;": "\u225a",
+    "vellip;": "\u22ee",
+    "verbar;": "|",
+    "vert;": "|",
+    "vfr;": "\U0001d533",
+    "vltri;": "\u22b2",
+    "vnsub;": "\u2282\u20d2",
+    "vnsup;": "\u2283\u20d2",
+    "vopf;": "\U0001d567",
+    "vprop;": "\u221d",
+    "vrtri;": "\u22b3",
+    "vscr;": "\U0001d4cb",
+    "vsubnE;": "\u2acb\ufe00",
+    "vsubne;": "\u228a\ufe00",
+    "vsupnE;": "\u2acc\ufe00",
+    "vsupne;": "\u228b\ufe00",
+    "vzigzag;": "\u299a",
+    "wcirc;": "\u0175",
+    "wedbar;": "\u2a5f",
+    "wedge;": "\u2227",
+    "wedgeq;": "\u2259",
+    "weierp;": "\u2118",
+    "wfr;": "\U0001d534",
+    "wopf;": "\U0001d568",
+    "wp;": "\u2118",
+    "wr;": "\u2240",
+    "wreath;": "\u2240",
+    "wscr;": "\U0001d4cc",
+    "xcap;": "\u22c2",
+    "xcirc;": "\u25ef",
+    "xcup;": "\u22c3",
+    "xdtri;": "\u25bd",
+    "xfr;": "\U0001d535",
+    "xhArr;": "\u27fa",
+    "xharr;": "\u27f7",
+    "xi;": "\u03be",
+    "xlArr;": "\u27f8",
+    "xlarr;": "\u27f5",
+    "xmap;": "\u27fc",
+    "xnis;": "\u22fb",
+    "xodot;": "\u2a00",
+    "xopf;": "\U0001d569",
+    "xoplus;": "\u2a01",
+    "xotime;": "\u2a02",
+    "xrArr;": "\u27f9",
+    "xrarr;": "\u27f6",
+    "xscr;": "\U0001d4cd",
+    "xsqcup;": "\u2a06",
+    "xuplus;": "\u2a04",
+    "xutri;": "\u25b3",
+    "xvee;": "\u22c1",
+    "xwedge;": "\u22c0",
+    "yacute": "\xfd",
+    "yacute;": "\xfd",
+    "yacy;": "\u044f",
+    "ycirc;": "\u0177",
+    "ycy;": "\u044b",
+    "yen": "\xa5",
+    "yen;": "\xa5",
+    "yfr;": "\U0001d536",
+    "yicy;": "\u0457",
+    "yopf;": "\U0001d56a",
+    "yscr;": "\U0001d4ce",
+    "yucy;": "\u044e",
+    "yuml": "\xff",
+    "yuml;": "\xff",
+    "zacute;": "\u017a",
+    "zcaron;": "\u017e",
+    "zcy;": "\u0437",
+    "zdot;": "\u017c",
+    "zeetrf;": "\u2128",
+    "zeta;": "\u03b6",
+    "zfr;": "\U0001d537",
+    "zhcy;": "\u0436",
+    "zigrarr;": "\u21dd",
+    "zopf;": "\U0001d56b",
+    "zscr;": "\U0001d4cf",
+    "zwj;": "\u200d",
+    "zwnj;": "\u200c",
+}
+
+replacementCharacters = {
+    0x0: "\uFFFD",
+    0x0d: "\u000D",
+    0x80: "\u20AC",
+    0x81: "\u0081",
+    0x82: "\u201A",
+    0x83: "\u0192",
+    0x84: "\u201E",
+    0x85: "\u2026",
+    0x86: "\u2020",
+    0x87: "\u2021",
+    0x88: "\u02C6",
+    0x89: "\u2030",
+    0x8A: "\u0160",
+    0x8B: "\u2039",
+    0x8C: "\u0152",
+    0x8D: "\u008D",
+    0x8E: "\u017D",
+    0x8F: "\u008F",
+    0x90: "\u0090",
+    0x91: "\u2018",
+    0x92: "\u2019",
+    0x93: "\u201C",
+    0x94: "\u201D",
+    0x95: "\u2022",
+    0x96: "\u2013",
+    0x97: "\u2014",
+    0x98: "\u02DC",
+    0x99: "\u2122",
+    0x9A: "\u0161",
+    0x9B: "\u203A",
+    0x9C: "\u0153",
+    0x9D: "\u009D",
+    0x9E: "\u017E",
+    0x9F: "\u0178",
+}
+
+tokenTypes = {
+    "Doctype": 0,
+    "Characters": 1,
+    "SpaceCharacters": 2,
+    "StartTag": 3,
+    "EndTag": 4,
+    "EmptyTag": 5,
+    "Comment": 6,
+    "ParseError": 7
+}
+
+tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"],
+                           tokenTypes["EmptyTag"]])
+
+
+prefixes = dict([(v, k) for k, v in namespaces.items()])
+prefixes["http://www.w3.org/1998/Math/MathML"] = "math"
+
+
+class DataLossWarning(UserWarning):
+    """Raised when the current tree is unable to represent the input data"""
+    pass
+
+
+class _ReparseException(Exception):
+    pass
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..deaf7e3f18b739e680610d63b58ac2a4b1eb9460
GIT binary patch
literal 83207
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
D0cc>_

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..475074cce950a996ca17bb71553d825a83a1b85d
GIT binary patch
literal 207
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaRmbdgML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GM%Tn`F@{9B{N^)~db25|k(=u~PK<38BXXa&=#K-Fu
YRF-fsFfiEU=BJeAq}qX;SPXI@0M&psrvLx|

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py
new file mode 100644
index 00000000..5ba926e3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py
@@ -0,0 +1,29 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import base
+
+from collections import OrderedDict
+
+
+def _attr_key(attr):
+    """Return an appropriate key for an attribute for sorting
+
+    Attributes have a namespace that can be either ``None`` or a string. We
+    can't compare the two because they're different types, so we convert
+    ``None`` to an empty string first.
+
+    """
+    return (attr[0][0] or ''), attr[0][1]
+
+
+class Filter(base.Filter):
+    """Alphabetizes attributes for elements"""
+    def __iter__(self):
+        for token in base.Filter.__iter__(self):
+            if token["type"] in ("StartTag", "EmptyTag"):
+                attrs = OrderedDict()
+                for name, value in sorted(token["data"].items(),
+                                          key=_attr_key):
+                    attrs[name] = value
+                token["data"] = attrs
+            yield token
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..72198518a2641c0f48a3e3966e962b9854d9add4
GIT binary patch
literal 1876
zcmZSn%*&NH<x)&C0~9bbFfceIFfkM-F)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`)1%)Uq(-urcJaGeog7Fs86Fv@kG4aWJH?F{H9GWN|X2
zF*2mEg9Muy7$T!M8B#bHf;Bi97#K1^c58raF5zcjU`R|V&d(_=NsZ6UEyyn_Dd7OQ
zB(p5DI5R)5M1X;Tp)@ZuIX@*eJ}0vzwJ0&CIFpfqfk6XAl&~-`FeD`wr$Tt#3=9nZ
zMJcI8sVOd*$tB4kB_Is4${FNI1qKF&8n7oNQy3W}3j`TbnBW4;43cR~48a;8GfRIm
zFfatAmXsFdDJ148Bo-7D<rfrXCYGcsWT#dtq~#ZZg-c3`GLuS6Qo#bn`9&p}dFfnS
z3JMAejxecWg^a|qRE0!^yu{qp;)2BFRE3g^#1e(%#5{$hRE5;cl8n?Mg@gpZ{JhkJ
z1O<@63dJQwnR)4Y3gM|>vyv0@)JqhS^K%Oli$J<l6-vtU6_Qeu6HAN1{7UtrRE3nx
zw6xTs)VvaflFEYAVjYFze1-B<h2;Favecpyut9KJO7cO@Pt7eTsf1dlkd|3gT%reY
zJUD_%L9ql0Y7h$&!l1B8EGa3{01JVL;x+~b2K|Df%(BFiRQ<BVBK@@doRrj}V*Ttw
z{p?~Rb92MOEF<$WLksiboXYg_c#{+p69WSSgY-Q85dDJ80^Q8K;*!Li9NqFn%hJFM
zkPsNhm!;;V<QM5@l;q}^=42-6r)B1pfXq$IDac4nN-fDuPRs$h1sns#dIgmwpu`mq
z5{l1Gtpp{bVkVFiIZD_V7#Q5Z+TjTwlrEe=X+oTVfgzOvl-^SqK<Pb&5tL@5m>GhC
zH9*=+RTvl;9AS1=r4}oIY=Bq_j`!4@)ZEm(l45XjV`X4q0O4ei(aj7D3>7sDB@7H%
zj0{=el-A71;1Zj`P|L_r!wAZ3k|}Hq*=!6&Weg?E49yG-wM+~ZCJZGkU}+Wx$t+fo
zXbLMs2^&K*Bcn^K7()ybLoG8yEek^p3quVPLk%;7O`$(SIEcx}kix=Xlg9wk9mZHF
z%n+W!z!0p#&cMLnR|<+dP|_#`g-mcsVo^y*Vmg@P3Q7nd4oFE#Vo72ND92={Rzd;*
zr+To#K_In3AS=K*H$EPeOXK5%KxTmh9+WRqQ%XRgl39|PTO0(64Gj<%oPCQ^bJD<)
zCHdK@d0-YOfQ!MBpiBc6Doe~MO&ye}E(nzBL>U+uia})+1EVCP03#=(7^5&FA0sa#
zxHN$V49GL_@g-ag3=Hw{x%nxjIjQmSC7_Utk59=@j*kZ$h43VpHHh*TIFf}yJ_W@s
z8zUQ|p9aV?P#>k0mXsEy#>WSN@>~!oe+7Z^PYIX{N+czq@;Ny_Cnq(zBr`v+7@S1F
jsR3*<*t-Z~5P2LNe>RX9vjcgo7?dSsm;{&vm^rxtV|><%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py
new file mode 100644
index 00000000..c7dbaed0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py
@@ -0,0 +1,12 @@
+from __future__ import absolute_import, division, unicode_literals
+
+
+class Filter(object):
+    def __init__(self, source):
+        self.source = source
+
+    def __iter__(self):
+        return iter(self.source)
+
+    def __getattr__(self, name):
+        return getattr(self.source, name)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7164285450f189cf6daa38795073f1f1ff401ba1
GIT binary patch
literal 1341
zcmZSn%*&NH<x)&C0~9bbFfceIFfkOHF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpXEFr+auq%bqIFfcSTFhoYNGNiCD1Z%J|Ffe3-%+mmwR>IG~z>t_!oS#!#
zk{X|xTaaH=Qo;c;J+mycI5R)5M1X;Tp)@ZuIX@*eJ}0vzwJ0&CxP*;?fx#^^rzEuq
z?lwjS1_mdP+msm?7*ZKPPD)__Ssuj%a%T$z$YCi=U=bFEpkT1|$xI9k3^42r(#^}j
zz)-`;P{Y6w5B6fP2FPGPFbTG{IKQ+gIaLFssf2}rfuT4xCoKrX&;WZ1L==}WFfiyB
z6lInrmZa*JB^K$Y<>#cN78UDf7wTsh8=0FM7G@clml;}^7w1%_m&co=n3xzC7#O7I
z>4)eSWESXV<`tJD=H%#>Ct8*UW`KmiIKC`3FD1W7Kcgf!$22E1Nk0u72F3bGiN&dU
z1(o2Ci;vID%PfhH2L*I7$e9d`$sj*~Fo+BHW(fnxn^}wu&5R5%Z-Nwny#)$sh_^uc
zf<T51A`h0N7RASdk_pU%Aa{c>C{2Mq2ue0^57sa;G&7<4k)45oAw9Juv81F3;!Til
zus6Zp&r8fr9Sr{EW?*25kB2%mJ|4t{dKsLNpb-voZG3zQ7g%v_eoARhYJ7YUD3b(%
z0x1Zj4dELwYrxWI5Gaa3`K1`-J~l>9W=>{54G<gZ{<PAP(jt)iL0KsXoccg<1I~Q;
gNm;4MC14}KzCaKI<{xkr*gyi^4&+*J{Kzl^04Hic9smFU

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py
new file mode 100644
index 00000000..aefb5c84
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py
@@ -0,0 +1,73 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import base
+
+
+class Filter(base.Filter):
+    """Injects ``<meta charset=ENCODING>`` tag into head of document"""
+    def __init__(self, source, encoding):
+        """Creates a Filter
+
+        :arg source: the source token stream
+
+        :arg encoding: the encoding to set
+
+        """
+        base.Filter.__init__(self, source)
+        self.encoding = encoding
+
+    def __iter__(self):
+        state = "pre_head"
+        meta_found = (self.encoding is None)
+        pending = []
+
+        for token in base.Filter.__iter__(self):
+            type = token["type"]
+            if type == "StartTag":
+                if token["name"].lower() == "head":
+                    state = "in_head"
+
+            elif type == "EmptyTag":
+                if token["name"].lower() == "meta":
+                    # replace charset with actual encoding
+                    has_http_equiv_content_type = False
+                    for (namespace, name), value in token["data"].items():
+                        if namespace is not None:
+                            continue
+                        elif name.lower() == 'charset':
+                            token["data"][(namespace, name)] = self.encoding
+                            meta_found = True
+                            break
+                        elif name == 'http-equiv' and value.lower() == 'content-type':
+                            has_http_equiv_content_type = True
+                    else:
+                        if has_http_equiv_content_type and (None, "content") in token["data"]:
+                            token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding
+                            meta_found = True
+
+                elif token["name"].lower() == "head" and not meta_found:
+                    # insert meta into empty head
+                    yield {"type": "StartTag", "name": "head",
+                           "data": token["data"]}
+                    yield {"type": "EmptyTag", "name": "meta",
+                           "data": {(None, "charset"): self.encoding}}
+                    yield {"type": "EndTag", "name": "head"}
+                    meta_found = True
+                    continue
+
+            elif type == "EndTag":
+                if token["name"].lower() == "head" and pending:
+                    # insert meta into head (if necessary) and flush pending queue
+                    yield pending.pop(0)
+                    if not meta_found:
+                        yield {"type": "EmptyTag", "name": "meta",
+                               "data": {(None, "charset"): self.encoding}}
+                    while pending:
+                        yield pending.pop(0)
+                    meta_found = True
+                    state = "post_head"
+
+            if state == "in_head":
+                pending.append(token)
+            else:
+                yield token
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d4591a106ae449ddc0a45cfb65ef0ef07ef2e356
GIT binary patch
literal 2648
zcmZSn%*&NH<x)&C0~9bbFfceIFfkN+GB7ZtFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`)2GurQ>uGGwtaq%kt2urjnTFf=nTL`JbOq_8mrYp^pg
zFl2(P&;VIb!q33KkeF1QpHo_r8lRb4kY7|%!U3`{vn;bXGe56HfPsObG%qtbKP5Fj
zC$l8AC^4rvlaYaeK?6jTurM$%BqbK7mas7}Ft}yrl%y8HeE?G61oD9b0|P@U1IXbi
z3?PT6FoIka#mtbx1ZJ=>1O<bgQ)<h=z~Gsem6}{qtdNjklbc$SsF0kISX7)^V(aSX
z?C;{~=Wdsfpiq*Su8^5mlCO}FnwX-HpQezKpIn-onpctx@)Zm_!z?dhV8~)*$YNrs
zVPL3XWN2n$V5|Xi;+a9=8mz$t@?{AF1A}u>YGO%hu|lE(#4}u63Q%B`Sd^|%oL^d$
zoNA>|l938!E0pACr{*aXmlUNY=Ax-i%}dTt$;?ZKsE6?sO7azoQ%ewP{WL(K7zA>4
z5QqhifcW^#yv&mLcrXX16&y(5FfUHcNdt#D#6>}%;MV|0D~Kp=W?*2@FDS|^ODsv%
zFH0=aPs`6qNi8bY&o0!@E;ceZH!RFDGA}c<FfY!jOfQc&Nii`oFfcGk&(jalFUTy=
z&CDw<NzBR7El;#84a@)ufpL6UYF<iyk$y%=ZjNbAW|DpyILeFlGr^G-4~npOXoTq%
zR0gp!Fff3UQ!&V23>?CY$)H5R#lXM-a&R&zer7O%({?Q*C~~sENj;l`p_Yjuoq?g2
znW3VLsf39ki<u#d1*D*vk-;T4iK&)_p@s#Nd?agG8ERNT86ca9p(qC|%EBO-#R^LF
zDXa`2(R`*9HilY8hQfTNJZ2`4YId;reMXQO2-O^5(KyBuHilX@h6-1(G$(^(7CXo=
zm)JUn7$y*^WoM}6V5sF}s9^_X%xq4EqLU1TOF^iHg8^za7uc{rAU9_*fStw3AX&rC
zP{YBH#>8M#0`_7+;Zl%53O88sQid8%n06kh2uK|p$mGJM4B<6w3`KVsQ-ol~WkdLU
zP)o!>-r;1BOc92eUwDVHFrNt|jPNBaOlp`Ic#86wGMPbvm%_wgmcq)A!opw%QVlYM
zlff*E5hTkF3TLwv4zO${Jeoup%u*m~m>5#{A!;BdgfW6#&BRcs2M+QH;0WRedkCjv
zm>G)lnQE9BvN#!11Q?nb8Nxt0wAcykJ{&F(g}ES)fuTZzp@x~EC<e`pLRY46h+|R&
zVMzd71f;Nm-O~+L&jkw5W=00aLOl>G3`B>gFfasbh%qoQ_?3cEa6wUOJgBfK1*PPY
z%7Rp|XmCklQAtQ*I#@I>F*g;=0ILHRw0RIcAOl=;3rZ?sN<sMqtTZLDB(W5v6q;#D
zL3tyiq@+MMwXig^tdxg=fgw3RuOv0EL>Fu;SS>`LRFr{%p(M4U1e_hM;RU5?aVaQw
zx#p#WB&LJQ`ch5?28M$C;u5fPz@?oZ#8!w&_(dS)FR~h_2sZ-*1GwY?7fF8kd8wF%
zSV?M8e0&M09LUKpPb~to+!Aw&Q^BmvlGNN{u<nqe($o@A5m=C404~@P3kp*6QZzu}
z5d`uySbcFxVo7QVNDLH$@oD*`c_}3zS&-VyymYW4aES~y6cl15(hLj?8HvU5piqqm
zhiW`DMB~Bops)c&U2#ETaw=FGhzB;QEHS4vbr2S-pa2kNU|=YY0G0NPY>fPjY)q1j
zT#P)7VvIaYJd9#YY>di`JdA9NLX6^!Y>X_7a*Vu8VvM4UJWR4of{eV3f{en9!i;Q;
zoJ>57GE97oY>a}8VvL-OLX2!+69kwvK#>Nne&XXnArc=C4*2-^-29Z%oYeSuaKOjM
zr{pKc$Ae4yAdtHd!3AawnyLttZ$a6j7(}pve9r9$ZVf?wl~!6(T9g_e9|Q{0AW$_G
k1Zow48U+l9WDWKcf*35m14ok$Bx3A9ZU<MmGE4%@08BDlX8-^I

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py
new file mode 100644
index 00000000..fcc07eec
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py
@@ -0,0 +1,93 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from pip._vendor.six import text_type
+
+from . import base
+from ..constants import namespaces, voidElements
+
+from ..constants import spaceCharacters
+spaceCharacters = "".join(spaceCharacters)
+
+
+class Filter(base.Filter):
+    """Lints the token stream for errors
+
+    If it finds any errors, it'll raise an ``AssertionError``.
+
+    """
+    def __init__(self, source, require_matching_tags=True):
+        """Creates a Filter
+
+        :arg source: the source token stream
+
+        :arg require_matching_tags: whether or not to require matching tags
+
+        """
+        super(Filter, self).__init__(source)
+        self.require_matching_tags = require_matching_tags
+
+    def __iter__(self):
+        open_elements = []
+        for token in base.Filter.__iter__(self):
+            type = token["type"]
+            if type in ("StartTag", "EmptyTag"):
+                namespace = token["namespace"]
+                name = token["name"]
+                assert namespace is None or isinstance(namespace, text_type)
+                assert namespace != ""
+                assert isinstance(name, text_type)
+                assert name != ""
+                assert isinstance(token["data"], dict)
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    assert type == "EmptyTag"
+                else:
+                    assert type == "StartTag"
+                if type == "StartTag" and self.require_matching_tags:
+                    open_elements.append((namespace, name))
+                for (namespace, name), value in token["data"].items():
+                    assert namespace is None or isinstance(namespace, text_type)
+                    assert namespace != ""
+                    assert isinstance(name, text_type)
+                    assert name != ""
+                    assert isinstance(value, text_type)
+
+            elif type == "EndTag":
+                namespace = token["namespace"]
+                name = token["name"]
+                assert namespace is None or isinstance(namespace, text_type)
+                assert namespace != ""
+                assert isinstance(name, text_type)
+                assert name != ""
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name}
+                elif self.require_matching_tags:
+                    start = open_elements.pop()
+                    assert start == (namespace, name)
+
+            elif type == "Comment":
+                data = token["data"]
+                assert isinstance(data, text_type)
+
+            elif type in ("Characters", "SpaceCharacters"):
+                data = token["data"]
+                assert isinstance(data, text_type)
+                assert data != ""
+                if type == "SpaceCharacters":
+                    assert data.strip(spaceCharacters) == ""
+
+            elif type == "Doctype":
+                name = token["name"]
+                assert name is None or isinstance(name, text_type)
+                assert token["publicId"] is None or isinstance(name, text_type)
+                assert token["systemId"] is None or isinstance(name, text_type)
+
+            elif type == "Entity":
+                assert isinstance(token["name"], text_type)
+
+            elif type == "SerializerError":
+                assert isinstance(token["data"], text_type)
+
+            else:
+                assert False, "Unknown token type: %(type)s" % {"type": type}
+
+            yield token
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dd453df7bf71e56402384e2cc6c00ec81d8074b1
GIT binary patch
literal 3500
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
E0P{f!LjV8(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py
new file mode 100644
index 00000000..4a865012
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py
@@ -0,0 +1,207 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from . import base
+
+
+class Filter(base.Filter):
+    """Removes optional tags from the token stream"""
+    def slider(self):
+        previous1 = previous2 = None
+        for token in self.source:
+            if previous1 is not None:
+                yield previous2, previous1, token
+            previous2 = previous1
+            previous1 = token
+        if previous1 is not None:
+            yield previous2, previous1, None
+
+    def __iter__(self):
+        for previous, token, next in self.slider():
+            type = token["type"]
+            if type == "StartTag":
+                if (token["data"] or
+                        not self.is_optional_start(token["name"], previous, next)):
+                    yield token
+            elif type == "EndTag":
+                if not self.is_optional_end(token["name"], next):
+                    yield token
+            else:
+                yield token
+
+    def is_optional_start(self, tagname, previous, next):
+        type = next and next["type"] or None
+        if tagname in 'html':
+            # An html element's start tag may be omitted if the first thing
+            # inside the html element is not a space character or a comment.
+            return type not in ("Comment", "SpaceCharacters")
+        elif tagname == 'head':
+            # A head element's start tag may be omitted if the first thing
+            # inside the head element is an element.
+            # XXX: we also omit the start tag if the head element is empty
+            if type in ("StartTag", "EmptyTag"):
+                return True
+            elif type == "EndTag":
+                return next["name"] == "head"
+        elif tagname == 'body':
+            # A body element's start tag may be omitted if the first thing
+            # inside the body element is not a space character or a comment,
+            # except if the first thing inside the body element is a script
+            # or style element and the node immediately preceding the body
+            # element is a head element whose end tag has been omitted.
+            if type in ("Comment", "SpaceCharacters"):
+                return False
+            elif type == "StartTag":
+                # XXX: we do not look at the preceding event, so we never omit
+                # the body element's start tag if it's followed by a script or
+                # a style element.
+                return next["name"] not in ('script', 'style')
+            else:
+                return True
+        elif tagname == 'colgroup':
+            # A colgroup element's start tag may be omitted if the first thing
+            # inside the colgroup element is a col element, and if the element
+            # is not immediately preceded by another colgroup element whose
+            # end tag has been omitted.
+            if type in ("StartTag", "EmptyTag"):
+                # XXX: we do not look at the preceding event, so instead we never
+                # omit the colgroup element's end tag when it is immediately
+                # followed by another colgroup element. See is_optional_end.
+                return next["name"] == "col"
+            else:
+                return False
+        elif tagname == 'tbody':
+            # A tbody element's start tag may be omitted if the first thing
+            # inside the tbody element is a tr element, and if the element is
+            # not immediately preceded by a tbody, thead, or tfoot element
+            # whose end tag has been omitted.
+            if type == "StartTag":
+                # omit the thead and tfoot elements' end tag when they are
+                # immediately followed by a tbody element. See is_optional_end.
+                if previous and previous['type'] == 'EndTag' and \
+                        previous['name'] in ('tbody', 'thead', 'tfoot'):
+                    return False
+                return next["name"] == 'tr'
+            else:
+                return False
+        return False
+
+    def is_optional_end(self, tagname, next):
+        type = next and next["type"] or None
+        if tagname in ('html', 'head', 'body'):
+            # An html element's end tag may be omitted if the html element
+            # is not immediately followed by a space character or a comment.
+            return type not in ("Comment", "SpaceCharacters")
+        elif tagname in ('li', 'optgroup', 'tr'):
+            # A li element's end tag may be omitted if the li element is
+            # immediately followed by another li element or if there is
+            # no more content in the parent element.
+            # An optgroup element's end tag may be omitted if the optgroup
+            # element is immediately followed by another optgroup element,
+            # or if there is no more content in the parent element.
+            # A tr element's end tag may be omitted if the tr element is
+            # immediately followed by another tr element, or if there is
+            # no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] == tagname
+            else:
+                return type == "EndTag" or type is None
+        elif tagname in ('dt', 'dd'):
+            # A dt element's end tag may be omitted if the dt element is
+            # immediately followed by another dt element or a dd element.
+            # A dd element's end tag may be omitted if the dd element is
+            # immediately followed by another dd element or a dt element,
+            # or if there is no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] in ('dt', 'dd')
+            elif tagname == 'dd':
+                return type == "EndTag" or type is None
+            else:
+                return False
+        elif tagname == 'p':
+            # A p element's end tag may be omitted if the p element is
+            # immediately followed by an address, article, aside,
+            # blockquote, datagrid, dialog, dir, div, dl, fieldset,
+            # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu,
+            # nav, ol, p, pre, section, table, or ul, element, or if
+            # there is no more content in the parent element.
+            if type in ("StartTag", "EmptyTag"):
+                return next["name"] in ('address', 'article', 'aside',
+                                        'blockquote', 'datagrid', 'dialog',
+                                        'dir', 'div', 'dl', 'fieldset', 'footer',
+                                        'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+                                        'header', 'hr', 'menu', 'nav', 'ol',
+                                        'p', 'pre', 'section', 'table', 'ul')
+            else:
+                return type == "EndTag" or type is None
+        elif tagname == 'option':
+            # An option element's end tag may be omitted if the option
+            # element is immediately followed by another option element,
+            # or if it is immediately followed by an <code>optgroup</code>
+            # element, or if there is no more content in the parent
+            # element.
+            if type == "StartTag":
+                return next["name"] in ('option', 'optgroup')
+            else:
+                return type == "EndTag" or type is None
+        elif tagname in ('rt', 'rp'):
+            # An rt element's end tag may be omitted if the rt element is
+            # immediately followed by an rt or rp element, or if there is
+            # no more content in the parent element.
+            # An rp element's end tag may be omitted if the rp element is
+            # immediately followed by an rt or rp element, or if there is
+            # no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] in ('rt', 'rp')
+            else:
+                return type == "EndTag" or type is None
+        elif tagname == 'colgroup':
+            # A colgroup element's end tag may be omitted if the colgroup
+            # element is not immediately followed by a space character or
+            # a comment.
+            if type in ("Comment", "SpaceCharacters"):
+                return False
+            elif type == "StartTag":
+                # XXX: we also look for an immediately following colgroup
+                # element. See is_optional_start.
+                return next["name"] != 'colgroup'
+            else:
+                return True
+        elif tagname in ('thead', 'tbody'):
+            # A thead element's end tag may be omitted if the thead element
+            # is immediately followed by a tbody or tfoot element.
+            # A tbody element's end tag may be omitted if the tbody element
+            # is immediately followed by a tbody or tfoot element, or if
+            # there is no more content in the parent element.
+            # A tfoot element's end tag may be omitted if the tfoot element
+            # is immediately followed by a tbody element, or if there is no
+            # more content in the parent element.
+            # XXX: we never omit the end tag when the following element is
+            # a tbody. See is_optional_start.
+            if type == "StartTag":
+                return next["name"] in ['tbody', 'tfoot']
+            elif tagname == 'tbody':
+                return type == "EndTag" or type is None
+            else:
+                return False
+        elif tagname == 'tfoot':
+            # A tfoot element's end tag may be omitted if the tfoot element
+            # is immediately followed by a tbody element, or if there is no
+            # more content in the parent element.
+            # XXX: we never omit the end tag when the following element is
+            # a tbody. See is_optional_start.
+            if type == "StartTag":
+                return next["name"] == 'tbody'
+            else:
+                return type == "EndTag" or type is None
+        elif tagname in ('td', 'th'):
+            # A td element's end tag may be omitted if the td element is
+            # immediately followed by a td or th element, or if there is
+            # no more content in the parent element.
+            # A th element's end tag may be omitted if the th element is
+            # immediately followed by a td or th element, or if there is
+            # no more content in the parent element.
+            if type == "StartTag":
+                return next["name"] in ('td', 'th')
+            else:
+                return type == "EndTag" or type is None
+        return False
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..35a45624a08b884166173be218f1bc2628376dbe
GIT binary patch
literal 4754
zcmZSn%*&NH<x)&C0~9bbFfceIFfkN+GB7ZtFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`)2GurQ>uGGwtaq%kt2urjnTFf=nTL`JbOq_8mrYp^pg
zFl2(P&;VIb!q33KkeF1QpHo_r8lRb4kY7|%!U3`{vn;bXGe56HfPsObG%qtbKP5Fj
zC$l8AC^4rvlaYaeK?6jTurM$%BqbK7mas7}Ft}yrl%y8HeE?G61oD9q0|P@U1IXbi
z3?PT6FoIka#mtbx1ZJ>+JkY`ba(xO5ScHusC|H9PWVJQ}14B@1Zhl#6u|j@9NoIat
zVva&dVtTPcT2X$kLP<udLP>shYMw%INl|KIZZgPHkfT628Dx0|$TtiOEVYabwM+~Z
zRtz-^3|Wi}F0uLywag4PjG(a1=42=`XQ*KUach_v(wG^-81ooFyjmuP8fJ!CMutKW
zhH!-96sY192DsuB28Lj8nD}WhF)%QIL&h&Z4-zuP`K3k4sTv?hfhCGlbJ9vU85kG}
zic-rm^Gk~jQFulrAisnCr2&pB5K&yiz`&qiP?TAgSdyw=mRO{pmY<W7T2!o`U8tX3
zY-Db3SeRvGUS?=vUYt{zULJ3fVq#)oU|^7*ryrtUkXfLcnO9trn3JPho@iMbm;n+3
z<M^`Fyp;SR{fv^_9Mhc4B>gmSJQnN2!W$IadIgo>I4;h~Oi3*QC6QuK(qLfZViaKH
zVH9L!W8`AwVFZUi$nhWy4*%H<3=9=hz@ZLKi7v5i3^Cv!tz`no023%_OV+Y5)UbdO
zL^cycQ6eaKQ<xbfi^ISg8NqxO2FV&mP;@jiGw>8m28o3+7EWd;<OOSGWdLdI18ZOc
zNv41_Ff%kWF%+XJW?~3qEaYVf2S*tw;rf+=W2UkowG`yD;F83ml90r7uxLtRNg|k$
zmzbMc3R3NwmlBeg4$eP8+@Poy1m&sXcvx`77lZVJvsNaOXlh;xI7tVAvLHB<!6HA1
z3uFq&33;g%CEx^7Qdy8Xn4%sOEb;N6{2w1L#K6E%ECNcBj56Rz=VFv%<Ywey6l3IO
zN(OlY6!{?9If03xSc{PX6lp~QATouKL9##?l;=PZ&IpchHijY{a107FWV15_gK`-p
zE>ppxA`IDV3`HIcC5#Ngpd`Wpj%PK-8fJzRP6o*ou-f3fgP`o1!UdLG1lA}D*4W5U
z!UWOC29}!*b_PhJ7}z?Hv3V_E&Aea*=fRrA!J1FN74w1Qf<Z>*g@YCIg9M7y7(q^g
zm@Lm&!^BV|2qHn=Oo2EQ!Ux$W0X9;Q5o8F=@j@U|AjUF)9jYP8z`%f%9znqf%9y2~
zRO6hVo12<fQVJ@yg9{RqQ=KysixQJdQj3bgNi-uhF$FaRgW}CKx1gjFl$;TX7pxkb
zph4y*<)>7FQ+9E3QD#9&DJc4iODc09xgj|}C%q`Yw4fAJVI=40fTc^odO!+Gz?Onp
zY5DmjrQpJ^2wVmdax+8`$cgYA2jalo3y~(^Z-^q0&(IwYkpUTq-E@$5@cRXl#lc<!
z1ye{-X)3s2c1z4DPDRSgASae2rh~#Wh!0d>f#N3!R6Gu%EF8qcz`!66%DN`ttSiRI
z!_39V!@|SJ0xrLK*uX3nJ|=cX9#$S0%`C<!z{tV~5={n$7$_iQ85kJAS-X{q0aVa}
zvNog?hh}X^y=n?h?>gWtWCqS_psZ~U7R?5WLUL;m$cz+jaOs{6%B#!_DLkNjQIHN+
z#lVow!4RA$#st!C0oJ|?ECJCz5vD!G5+nyMKft-QXfs$9#HdYRHpD1!mOsu2G7gf9
ze}W~gK-!BQz>Tv8@q<A*6=K9!uqucVc^zQwIv{5jS%AwTh-<)w0LU{bHfY*Sz^b6y
zJ;B;-K}w3s!4eSdap2N}n?W+g4kU+UdofrQR67?~yFS?VEno?Ikn*C*j3B>(oD4B;
zE!;SLhHPdANI`QJTz)x#H83+F6yJg?b_B_R1JV#|#UHR0kWlyyW<%TovMjF-Y@88T
zp%apEnoKoJ4B(Ie8-nB&JFqH<5qb7t?M@&YiyFZa5T|FrwL634khIr=RYA2gfa?Vf
z7aXM~D7k_QC=df&W`Qy*zH$^)e&u9>OVRv-5=hAh5-TYJi^0nhkb$5a4=y+%O#*P)
zmjWpQQ&LJnP0<3dCRm9EE)Ww_Qi@WGiy`cylFa0sRB$nrSe%)XS_*0kB<18MXBU>{
zmp}?&PzxlzC^H3YQ%YuHPJTMLEKbQRg3@IWn{&XHrDdk(q!g!?fR%%a<kTW?ai5l7
zlnYjuVF;m&Ae1qLGJ#O05Xua!8x(S>MGz5)A-Sn}rC>|*5+Ro6=YY8dMX6v96{jYH
z+UQ^pl_VzRq=Ge<=75cZG?2g|MUYS`f`kveiUF6kAX^~@fFlen2J#13V@V2x$^aM6
zV2^>TM^JQtHG&u*eURdxKx{({0YxwND2EsVl7~ktP9fYijSQ$G19Hi*i+V^B2h|IN
z5&$IFK=m{<6@Y>ZmcbyBpkRil3!FlraKw{;A^N~+2AmwgEJS*Mb0G-~l&l~+K$auY
z7KjH)XDG=n2&6qo7*xfB8o}WH9Jo0j1ZoZk4a#btmw|yH0#xm%Ay@lcJdAuyl8m5A
zpAXb>2UYs)JdEs&3{c1plLgW2P}Pve0yC&Fz{AbM2-nF5m4~VW4>EvzIPvkIA~HU{
z1XQfW$LHp!l;)(y$CrR2F+M&eKRG@g+=U7Pb)mp5lpv6M5zQtrYruQHL7+kfly-|j
z{$OKdW8~!G<mI&VgZLCA7$2WjT2fk+8Xq473g;kD&Ike}qY^L|ltsX%fIWmD2Hb1l
UXtIGsj2+0)#UQ`RFbOaN04Z$_LI3~&

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
new file mode 100644
index 00000000..af8e77b8
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
@@ -0,0 +1,896 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import re
+from xml.sax.saxutils import escape, unescape
+
+from pip._vendor.six.moves import urllib_parse as urlparse
+
+from . import base
+from ..constants import namespaces, prefixes
+
+__all__ = ["Filter"]
+
+
+allowed_elements = frozenset((
+    (namespaces['html'], 'a'),
+    (namespaces['html'], 'abbr'),
+    (namespaces['html'], 'acronym'),
+    (namespaces['html'], 'address'),
+    (namespaces['html'], 'area'),
+    (namespaces['html'], 'article'),
+    (namespaces['html'], 'aside'),
+    (namespaces['html'], 'audio'),
+    (namespaces['html'], 'b'),
+    (namespaces['html'], 'big'),
+    (namespaces['html'], 'blockquote'),
+    (namespaces['html'], 'br'),
+    (namespaces['html'], 'button'),
+    (namespaces['html'], 'canvas'),
+    (namespaces['html'], 'caption'),
+    (namespaces['html'], 'center'),
+    (namespaces['html'], 'cite'),
+    (namespaces['html'], 'code'),
+    (namespaces['html'], 'col'),
+    (namespaces['html'], 'colgroup'),
+    (namespaces['html'], 'command'),
+    (namespaces['html'], 'datagrid'),
+    (namespaces['html'], 'datalist'),
+    (namespaces['html'], 'dd'),
+    (namespaces['html'], 'del'),
+    (namespaces['html'], 'details'),
+    (namespaces['html'], 'dfn'),
+    (namespaces['html'], 'dialog'),
+    (namespaces['html'], 'dir'),
+    (namespaces['html'], 'div'),
+    (namespaces['html'], 'dl'),
+    (namespaces['html'], 'dt'),
+    (namespaces['html'], 'em'),
+    (namespaces['html'], 'event-source'),
+    (namespaces['html'], 'fieldset'),
+    (namespaces['html'], 'figcaption'),
+    (namespaces['html'], 'figure'),
+    (namespaces['html'], 'footer'),
+    (namespaces['html'], 'font'),
+    (namespaces['html'], 'form'),
+    (namespaces['html'], 'header'),
+    (namespaces['html'], 'h1'),
+    (namespaces['html'], 'h2'),
+    (namespaces['html'], 'h3'),
+    (namespaces['html'], 'h4'),
+    (namespaces['html'], 'h5'),
+    (namespaces['html'], 'h6'),
+    (namespaces['html'], 'hr'),
+    (namespaces['html'], 'i'),
+    (namespaces['html'], 'img'),
+    (namespaces['html'], 'input'),
+    (namespaces['html'], 'ins'),
+    (namespaces['html'], 'keygen'),
+    (namespaces['html'], 'kbd'),
+    (namespaces['html'], 'label'),
+    (namespaces['html'], 'legend'),
+    (namespaces['html'], 'li'),
+    (namespaces['html'], 'm'),
+    (namespaces['html'], 'map'),
+    (namespaces['html'], 'menu'),
+    (namespaces['html'], 'meter'),
+    (namespaces['html'], 'multicol'),
+    (namespaces['html'], 'nav'),
+    (namespaces['html'], 'nextid'),
+    (namespaces['html'], 'ol'),
+    (namespaces['html'], 'output'),
+    (namespaces['html'], 'optgroup'),
+    (namespaces['html'], 'option'),
+    (namespaces['html'], 'p'),
+    (namespaces['html'], 'pre'),
+    (namespaces['html'], 'progress'),
+    (namespaces['html'], 'q'),
+    (namespaces['html'], 's'),
+    (namespaces['html'], 'samp'),
+    (namespaces['html'], 'section'),
+    (namespaces['html'], 'select'),
+    (namespaces['html'], 'small'),
+    (namespaces['html'], 'sound'),
+    (namespaces['html'], 'source'),
+    (namespaces['html'], 'spacer'),
+    (namespaces['html'], 'span'),
+    (namespaces['html'], 'strike'),
+    (namespaces['html'], 'strong'),
+    (namespaces['html'], 'sub'),
+    (namespaces['html'], 'sup'),
+    (namespaces['html'], 'table'),
+    (namespaces['html'], 'tbody'),
+    (namespaces['html'], 'td'),
+    (namespaces['html'], 'textarea'),
+    (namespaces['html'], 'time'),
+    (namespaces['html'], 'tfoot'),
+    (namespaces['html'], 'th'),
+    (namespaces['html'], 'thead'),
+    (namespaces['html'], 'tr'),
+    (namespaces['html'], 'tt'),
+    (namespaces['html'], 'u'),
+    (namespaces['html'], 'ul'),
+    (namespaces['html'], 'var'),
+    (namespaces['html'], 'video'),
+    (namespaces['mathml'], 'maction'),
+    (namespaces['mathml'], 'math'),
+    (namespaces['mathml'], 'merror'),
+    (namespaces['mathml'], 'mfrac'),
+    (namespaces['mathml'], 'mi'),
+    (namespaces['mathml'], 'mmultiscripts'),
+    (namespaces['mathml'], 'mn'),
+    (namespaces['mathml'], 'mo'),
+    (namespaces['mathml'], 'mover'),
+    (namespaces['mathml'], 'mpadded'),
+    (namespaces['mathml'], 'mphantom'),
+    (namespaces['mathml'], 'mprescripts'),
+    (namespaces['mathml'], 'mroot'),
+    (namespaces['mathml'], 'mrow'),
+    (namespaces['mathml'], 'mspace'),
+    (namespaces['mathml'], 'msqrt'),
+    (namespaces['mathml'], 'mstyle'),
+    (namespaces['mathml'], 'msub'),
+    (namespaces['mathml'], 'msubsup'),
+    (namespaces['mathml'], 'msup'),
+    (namespaces['mathml'], 'mtable'),
+    (namespaces['mathml'], 'mtd'),
+    (namespaces['mathml'], 'mtext'),
+    (namespaces['mathml'], 'mtr'),
+    (namespaces['mathml'], 'munder'),
+    (namespaces['mathml'], 'munderover'),
+    (namespaces['mathml'], 'none'),
+    (namespaces['svg'], 'a'),
+    (namespaces['svg'], 'animate'),
+    (namespaces['svg'], 'animateColor'),
+    (namespaces['svg'], 'animateMotion'),
+    (namespaces['svg'], 'animateTransform'),
+    (namespaces['svg'], 'clipPath'),
+    (namespaces['svg'], 'circle'),
+    (namespaces['svg'], 'defs'),
+    (namespaces['svg'], 'desc'),
+    (namespaces['svg'], 'ellipse'),
+    (namespaces['svg'], 'font-face'),
+    (namespaces['svg'], 'font-face-name'),
+    (namespaces['svg'], 'font-face-src'),
+    (namespaces['svg'], 'g'),
+    (namespaces['svg'], 'glyph'),
+    (namespaces['svg'], 'hkern'),
+    (namespaces['svg'], 'linearGradient'),
+    (namespaces['svg'], 'line'),
+    (namespaces['svg'], 'marker'),
+    (namespaces['svg'], 'metadata'),
+    (namespaces['svg'], 'missing-glyph'),
+    (namespaces['svg'], 'mpath'),
+    (namespaces['svg'], 'path'),
+    (namespaces['svg'], 'polygon'),
+    (namespaces['svg'], 'polyline'),
+    (namespaces['svg'], 'radialGradient'),
+    (namespaces['svg'], 'rect'),
+    (namespaces['svg'], 'set'),
+    (namespaces['svg'], 'stop'),
+    (namespaces['svg'], 'svg'),
+    (namespaces['svg'], 'switch'),
+    (namespaces['svg'], 'text'),
+    (namespaces['svg'], 'title'),
+    (namespaces['svg'], 'tspan'),
+    (namespaces['svg'], 'use'),
+))
+
+allowed_attributes = frozenset((
+    # HTML attributes
+    (None, 'abbr'),
+    (None, 'accept'),
+    (None, 'accept-charset'),
+    (None, 'accesskey'),
+    (None, 'action'),
+    (None, 'align'),
+    (None, 'alt'),
+    (None, 'autocomplete'),
+    (None, 'autofocus'),
+    (None, 'axis'),
+    (None, 'background'),
+    (None, 'balance'),
+    (None, 'bgcolor'),
+    (None, 'bgproperties'),
+    (None, 'border'),
+    (None, 'bordercolor'),
+    (None, 'bordercolordark'),
+    (None, 'bordercolorlight'),
+    (None, 'bottompadding'),
+    (None, 'cellpadding'),
+    (None, 'cellspacing'),
+    (None, 'ch'),
+    (None, 'challenge'),
+    (None, 'char'),
+    (None, 'charoff'),
+    (None, 'choff'),
+    (None, 'charset'),
+    (None, 'checked'),
+    (None, 'cite'),
+    (None, 'class'),
+    (None, 'clear'),
+    (None, 'color'),
+    (None, 'cols'),
+    (None, 'colspan'),
+    (None, 'compact'),
+    (None, 'contenteditable'),
+    (None, 'controls'),
+    (None, 'coords'),
+    (None, 'data'),
+    (None, 'datafld'),
+    (None, 'datapagesize'),
+    (None, 'datasrc'),
+    (None, 'datetime'),
+    (None, 'default'),
+    (None, 'delay'),
+    (None, 'dir'),
+    (None, 'disabled'),
+    (None, 'draggable'),
+    (None, 'dynsrc'),
+    (None, 'enctype'),
+    (None, 'end'),
+    (None, 'face'),
+    (None, 'for'),
+    (None, 'form'),
+    (None, 'frame'),
+    (None, 'galleryimg'),
+    (None, 'gutter'),
+    (None, 'headers'),
+    (None, 'height'),
+    (None, 'hidefocus'),
+    (None, 'hidden'),
+    (None, 'high'),
+    (None, 'href'),
+    (None, 'hreflang'),
+    (None, 'hspace'),
+    (None, 'icon'),
+    (None, 'id'),
+    (None, 'inputmode'),
+    (None, 'ismap'),
+    (None, 'keytype'),
+    (None, 'label'),
+    (None, 'leftspacing'),
+    (None, 'lang'),
+    (None, 'list'),
+    (None, 'longdesc'),
+    (None, 'loop'),
+    (None, 'loopcount'),
+    (None, 'loopend'),
+    (None, 'loopstart'),
+    (None, 'low'),
+    (None, 'lowsrc'),
+    (None, 'max'),
+    (None, 'maxlength'),
+    (None, 'media'),
+    (None, 'method'),
+    (None, 'min'),
+    (None, 'multiple'),
+    (None, 'name'),
+    (None, 'nohref'),
+    (None, 'noshade'),
+    (None, 'nowrap'),
+    (None, 'open'),
+    (None, 'optimum'),
+    (None, 'pattern'),
+    (None, 'ping'),
+    (None, 'point-size'),
+    (None, 'poster'),
+    (None, 'pqg'),
+    (None, 'preload'),
+    (None, 'prompt'),
+    (None, 'radiogroup'),
+    (None, 'readonly'),
+    (None, 'rel'),
+    (None, 'repeat-max'),
+    (None, 'repeat-min'),
+    (None, 'replace'),
+    (None, 'required'),
+    (None, 'rev'),
+    (None, 'rightspacing'),
+    (None, 'rows'),
+    (None, 'rowspan'),
+    (None, 'rules'),
+    (None, 'scope'),
+    (None, 'selected'),
+    (None, 'shape'),
+    (None, 'size'),
+    (None, 'span'),
+    (None, 'src'),
+    (None, 'start'),
+    (None, 'step'),
+    (None, 'style'),
+    (None, 'summary'),
+    (None, 'suppress'),
+    (None, 'tabindex'),
+    (None, 'target'),
+    (None, 'template'),
+    (None, 'title'),
+    (None, 'toppadding'),
+    (None, 'type'),
+    (None, 'unselectable'),
+    (None, 'usemap'),
+    (None, 'urn'),
+    (None, 'valign'),
+    (None, 'value'),
+    (None, 'variable'),
+    (None, 'volume'),
+    (None, 'vspace'),
+    (None, 'vrml'),
+    (None, 'width'),
+    (None, 'wrap'),
+    (namespaces['xml'], 'lang'),
+    # MathML attributes
+    (None, 'actiontype'),
+    (None, 'align'),
+    (None, 'columnalign'),
+    (None, 'columnalign'),
+    (None, 'columnalign'),
+    (None, 'columnlines'),
+    (None, 'columnspacing'),
+    (None, 'columnspan'),
+    (None, 'depth'),
+    (None, 'display'),
+    (None, 'displaystyle'),
+    (None, 'equalcolumns'),
+    (None, 'equalrows'),
+    (None, 'fence'),
+    (None, 'fontstyle'),
+    (None, 'fontweight'),
+    (None, 'frame'),
+    (None, 'height'),
+    (None, 'linethickness'),
+    (None, 'lspace'),
+    (None, 'mathbackground'),
+    (None, 'mathcolor'),
+    (None, 'mathvariant'),
+    (None, 'mathvariant'),
+    (None, 'maxsize'),
+    (None, 'minsize'),
+    (None, 'other'),
+    (None, 'rowalign'),
+    (None, 'rowalign'),
+    (None, 'rowalign'),
+    (None, 'rowlines'),
+    (None, 'rowspacing'),
+    (None, 'rowspan'),
+    (None, 'rspace'),
+    (None, 'scriptlevel'),
+    (None, 'selection'),
+    (None, 'separator'),
+    (None, 'stretchy'),
+    (None, 'width'),
+    (None, 'width'),
+    (namespaces['xlink'], 'href'),
+    (namespaces['xlink'], 'show'),
+    (namespaces['xlink'], 'type'),
+    # SVG attributes
+    (None, 'accent-height'),
+    (None, 'accumulate'),
+    (None, 'additive'),
+    (None, 'alphabetic'),
+    (None, 'arabic-form'),
+    (None, 'ascent'),
+    (None, 'attributeName'),
+    (None, 'attributeType'),
+    (None, 'baseProfile'),
+    (None, 'bbox'),
+    (None, 'begin'),
+    (None, 'by'),
+    (None, 'calcMode'),
+    (None, 'cap-height'),
+    (None, 'class'),
+    (None, 'clip-path'),
+    (None, 'color'),
+    (None, 'color-rendering'),
+    (None, 'content'),
+    (None, 'cx'),
+    (None, 'cy'),
+    (None, 'd'),
+    (None, 'dx'),
+    (None, 'dy'),
+    (None, 'descent'),
+    (None, 'display'),
+    (None, 'dur'),
+    (None, 'end'),
+    (None, 'fill'),
+    (None, 'fill-opacity'),
+    (None, 'fill-rule'),
+    (None, 'font-family'),
+    (None, 'font-size'),
+    (None, 'font-stretch'),
+    (None, 'font-style'),
+    (None, 'font-variant'),
+    (None, 'font-weight'),
+    (None, 'from'),
+    (None, 'fx'),
+    (None, 'fy'),
+    (None, 'g1'),
+    (None, 'g2'),
+    (None, 'glyph-name'),
+    (None, 'gradientUnits'),
+    (None, 'hanging'),
+    (None, 'height'),
+    (None, 'horiz-adv-x'),
+    (None, 'horiz-origin-x'),
+    (None, 'id'),
+    (None, 'ideographic'),
+    (None, 'k'),
+    (None, 'keyPoints'),
+    (None, 'keySplines'),
+    (None, 'keyTimes'),
+    (None, 'lang'),
+    (None, 'marker-end'),
+    (None, 'marker-mid'),
+    (None, 'marker-start'),
+    (None, 'markerHeight'),
+    (None, 'markerUnits'),
+    (None, 'markerWidth'),
+    (None, 'mathematical'),
+    (None, 'max'),
+    (None, 'min'),
+    (None, 'name'),
+    (None, 'offset'),
+    (None, 'opacity'),
+    (None, 'orient'),
+    (None, 'origin'),
+    (None, 'overline-position'),
+    (None, 'overline-thickness'),
+    (None, 'panose-1'),
+    (None, 'path'),
+    (None, 'pathLength'),
+    (None, 'points'),
+    (None, 'preserveAspectRatio'),
+    (None, 'r'),
+    (None, 'refX'),
+    (None, 'refY'),
+    (None, 'repeatCount'),
+    (None, 'repeatDur'),
+    (None, 'requiredExtensions'),
+    (None, 'requiredFeatures'),
+    (None, 'restart'),
+    (None, 'rotate'),
+    (None, 'rx'),
+    (None, 'ry'),
+    (None, 'slope'),
+    (None, 'stemh'),
+    (None, 'stemv'),
+    (None, 'stop-color'),
+    (None, 'stop-opacity'),
+    (None, 'strikethrough-position'),
+    (None, 'strikethrough-thickness'),
+    (None, 'stroke'),
+    (None, 'stroke-dasharray'),
+    (None, 'stroke-dashoffset'),
+    (None, 'stroke-linecap'),
+    (None, 'stroke-linejoin'),
+    (None, 'stroke-miterlimit'),
+    (None, 'stroke-opacity'),
+    (None, 'stroke-width'),
+    (None, 'systemLanguage'),
+    (None, 'target'),
+    (None, 'text-anchor'),
+    (None, 'to'),
+    (None, 'transform'),
+    (None, 'type'),
+    (None, 'u1'),
+    (None, 'u2'),
+    (None, 'underline-position'),
+    (None, 'underline-thickness'),
+    (None, 'unicode'),
+    (None, 'unicode-range'),
+    (None, 'units-per-em'),
+    (None, 'values'),
+    (None, 'version'),
+    (None, 'viewBox'),
+    (None, 'visibility'),
+    (None, 'width'),
+    (None, 'widths'),
+    (None, 'x'),
+    (None, 'x-height'),
+    (None, 'x1'),
+    (None, 'x2'),
+    (namespaces['xlink'], 'actuate'),
+    (namespaces['xlink'], 'arcrole'),
+    (namespaces['xlink'], 'href'),
+    (namespaces['xlink'], 'role'),
+    (namespaces['xlink'], 'show'),
+    (namespaces['xlink'], 'title'),
+    (namespaces['xlink'], 'type'),
+    (namespaces['xml'], 'base'),
+    (namespaces['xml'], 'lang'),
+    (namespaces['xml'], 'space'),
+    (None, 'y'),
+    (None, 'y1'),
+    (None, 'y2'),
+    (None, 'zoomAndPan'),
+))
+
+attr_val_is_uri = frozenset((
+    (None, 'href'),
+    (None, 'src'),
+    (None, 'cite'),
+    (None, 'action'),
+    (None, 'longdesc'),
+    (None, 'poster'),
+    (None, 'background'),
+    (None, 'datasrc'),
+    (None, 'dynsrc'),
+    (None, 'lowsrc'),
+    (None, 'ping'),
+    (namespaces['xlink'], 'href'),
+    (namespaces['xml'], 'base'),
+))
+
+svg_attr_val_allows_ref = frozenset((
+    (None, 'clip-path'),
+    (None, 'color-profile'),
+    (None, 'cursor'),
+    (None, 'fill'),
+    (None, 'filter'),
+    (None, 'marker'),
+    (None, 'marker-start'),
+    (None, 'marker-mid'),
+    (None, 'marker-end'),
+    (None, 'mask'),
+    (None, 'stroke'),
+))
+
+svg_allow_local_href = frozenset((
+    (None, 'altGlyph'),
+    (None, 'animate'),
+    (None, 'animateColor'),
+    (None, 'animateMotion'),
+    (None, 'animateTransform'),
+    (None, 'cursor'),
+    (None, 'feImage'),
+    (None, 'filter'),
+    (None, 'linearGradient'),
+    (None, 'pattern'),
+    (None, 'radialGradient'),
+    (None, 'textpath'),
+    (None, 'tref'),
+    (None, 'set'),
+    (None, 'use')
+))
+
+allowed_css_properties = frozenset((
+    'azimuth',
+    'background-color',
+    'border-bottom-color',
+    'border-collapse',
+    'border-color',
+    'border-left-color',
+    'border-right-color',
+    'border-top-color',
+    'clear',
+    'color',
+    'cursor',
+    'direction',
+    'display',
+    'elevation',
+    'float',
+    'font',
+    'font-family',
+    'font-size',
+    'font-style',
+    'font-variant',
+    'font-weight',
+    'height',
+    'letter-spacing',
+    'line-height',
+    'overflow',
+    'pause',
+    'pause-after',
+    'pause-before',
+    'pitch',
+    'pitch-range',
+    'richness',
+    'speak',
+    'speak-header',
+    'speak-numeral',
+    'speak-punctuation',
+    'speech-rate',
+    'stress',
+    'text-align',
+    'text-decoration',
+    'text-indent',
+    'unicode-bidi',
+    'vertical-align',
+    'voice-family',
+    'volume',
+    'white-space',
+    'width',
+))
+
+allowed_css_keywords = frozenset((
+    'auto',
+    'aqua',
+    'black',
+    'block',
+    'blue',
+    'bold',
+    'both',
+    'bottom',
+    'brown',
+    'center',
+    'collapse',
+    'dashed',
+    'dotted',
+    'fuchsia',
+    'gray',
+    'green',
+    '!important',
+    'italic',
+    'left',
+    'lime',
+    'maroon',
+    'medium',
+    'none',
+    'navy',
+    'normal',
+    'nowrap',
+    'olive',
+    'pointer',
+    'purple',
+    'red',
+    'right',
+    'solid',
+    'silver',
+    'teal',
+    'top',
+    'transparent',
+    'underline',
+    'white',
+    'yellow',
+))
+
+allowed_svg_properties = frozenset((
+    'fill',
+    'fill-opacity',
+    'fill-rule',
+    'stroke',
+    'stroke-width',
+    'stroke-linecap',
+    'stroke-linejoin',
+    'stroke-opacity',
+))
+
+allowed_protocols = frozenset((
+    'ed2k',
+    'ftp',
+    'http',
+    'https',
+    'irc',
+    'mailto',
+    'news',
+    'gopher',
+    'nntp',
+    'telnet',
+    'webcal',
+    'xmpp',
+    'callto',
+    'feed',
+    'urn',
+    'aim',
+    'rsync',
+    'tag',
+    'ssh',
+    'sftp',
+    'rtsp',
+    'afs',
+    'data',
+))
+
+allowed_content_types = frozenset((
+    'image/png',
+    'image/jpeg',
+    'image/gif',
+    'image/webp',
+    'image/bmp',
+    'text/plain',
+))
+
+
+data_content_type = re.compile(r'''
+                                ^
+                                # Match a content type <application>/<type>
+                                (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+)
+                                # Match any character set and encoding
+                                (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?)
+                                  |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?)
+                                # Assume the rest is data
+                                ,.*
+                                $
+                                ''',
+                               re.VERBOSE)
+
+
+class Filter(base.Filter):
+    """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes"""
+    def __init__(self,
+                 source,
+                 allowed_elements=allowed_elements,
+                 allowed_attributes=allowed_attributes,
+                 allowed_css_properties=allowed_css_properties,
+                 allowed_css_keywords=allowed_css_keywords,
+                 allowed_svg_properties=allowed_svg_properties,
+                 allowed_protocols=allowed_protocols,
+                 allowed_content_types=allowed_content_types,
+                 attr_val_is_uri=attr_val_is_uri,
+                 svg_attr_val_allows_ref=svg_attr_val_allows_ref,
+                 svg_allow_local_href=svg_allow_local_href):
+        """Creates a Filter
+
+        :arg allowed_elements: set of elements to allow--everything else will
+            be escaped
+
+        :arg allowed_attributes: set of attributes to allow in
+            elements--everything else will be stripped
+
+        :arg allowed_css_properties: set of CSS properties to allow--everything
+            else will be stripped
+
+        :arg allowed_css_keywords: set of CSS keywords to allow--everything
+            else will be stripped
+
+        :arg allowed_svg_properties: set of SVG properties to allow--everything
+            else will be removed
+
+        :arg allowed_protocols: set of allowed protocols for URIs
+
+        :arg allowed_content_types: set of allowed content types for ``data`` URIs.
+
+        :arg attr_val_is_uri: set of attributes that have URI values--values
+            that have a scheme not listed in ``allowed_protocols`` are removed
+
+        :arg svg_attr_val_allows_ref: set of SVG attributes that can have
+            references
+
+        :arg svg_allow_local_href: set of SVG elements that can have local
+            hrefs--these are removed
+
+        """
+        super(Filter, self).__init__(source)
+        self.allowed_elements = allowed_elements
+        self.allowed_attributes = allowed_attributes
+        self.allowed_css_properties = allowed_css_properties
+        self.allowed_css_keywords = allowed_css_keywords
+        self.allowed_svg_properties = allowed_svg_properties
+        self.allowed_protocols = allowed_protocols
+        self.allowed_content_types = allowed_content_types
+        self.attr_val_is_uri = attr_val_is_uri
+        self.svg_attr_val_allows_ref = svg_attr_val_allows_ref
+        self.svg_allow_local_href = svg_allow_local_href
+
+    def __iter__(self):
+        for token in base.Filter.__iter__(self):
+            token = self.sanitize_token(token)
+            if token:
+                yield token
+
+    # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and
+    # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes
+    # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and
+    # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI
+    # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are
+    # allowed.
+    #
+    #   sanitize_html('<script> do_nasty_stuff() </script>')
+    #    => &lt;script> do_nasty_stuff() &lt;/script>
+    #   sanitize_html('<a href="javascript: sucker();">Click here for $100</a>')
+    #    => <a>Click here for $100</a>
+    def sanitize_token(self, token):
+
+        # accommodate filters which use token_type differently
+        token_type = token["type"]
+        if token_type in ("StartTag", "EndTag", "EmptyTag"):
+            name = token["name"]
+            namespace = token["namespace"]
+            if ((namespace, name) in self.allowed_elements or
+                (namespace is None and
+                 (namespaces["html"], name) in self.allowed_elements)):
+                return self.allowed_token(token)
+            else:
+                return self.disallowed_token(token)
+        elif token_type == "Comment":
+            pass
+        else:
+            return token
+
+    def allowed_token(self, token):
+        if "data" in token:
+            attrs = token["data"]
+            attr_names = set(attrs.keys())
+
+            # Remove forbidden attributes
+            for to_remove in (attr_names - self.allowed_attributes):
+                del token["data"][to_remove]
+                attr_names.remove(to_remove)
+
+            # Remove attributes with disallowed URL values
+            for attr in (attr_names & self.attr_val_is_uri):
+                assert attr in attrs
+                # I don't have a clue where this regexp comes from or why it matches those
+                # characters, nor why we call unescape. I just know it's always been here.
+                # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all
+                # this will do is remove *more* than it otherwise would.
+                val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '',
+                                       unescape(attrs[attr])).lower()
+                # remove replacement characters from unescaped characters
+                val_unescaped = val_unescaped.replace("\ufffd", "")
+                try:
+                    uri = urlparse.urlparse(val_unescaped)
+                except ValueError:
+                    uri = None
+                    del attrs[attr]
+                if uri and uri.scheme:
+                    if uri.scheme not in self.allowed_protocols:
+                        del attrs[attr]
+                    if uri.scheme == 'data':
+                        m = data_content_type.match(uri.path)
+                        if not m:
+                            del attrs[attr]
+                        elif m.group('content_type') not in self.allowed_content_types:
+                            del attrs[attr]
+
+            for attr in self.svg_attr_val_allows_ref:
+                if attr in attrs:
+                    attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)',
+                                         ' ',
+                                         unescape(attrs[attr]))
+            if (token["name"] in self.svg_allow_local_href and
+                (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*',
+                                                                     attrs[(namespaces['xlink'], 'href')])):
+                del attrs[(namespaces['xlink'], 'href')]
+            if (None, 'style') in attrs:
+                attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')])
+            token["data"] = attrs
+        return token
+
+    def disallowed_token(self, token):
+        token_type = token["type"]
+        if token_type == "EndTag":
+            token["data"] = "</%s>" % token["name"]
+        elif token["data"]:
+            assert token_type in ("StartTag", "EmptyTag")
+            attrs = []
+            for (ns, name), v in token["data"].items():
+                attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v)))
+            token["data"] = "<%s%s>" % (token["name"], ''.join(attrs))
+        else:
+            token["data"] = "<%s>" % token["name"]
+        if token.get("selfClosing"):
+            token["data"] = token["data"][:-1] + "/>"
+
+        token["type"] = "Characters"
+
+        del token["name"]
+        return token
+
+    def sanitize_css(self, style):
+        # disallow urls
+        style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style)
+
+        # gauntlet
+        if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style):
+            return ''
+        if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style):
+            return ''
+
+        clean = []
+        for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style):
+            if not value:
+                continue
+            if prop.lower() in self.allowed_css_properties:
+                clean.append(prop + ': ' + value + ';')
+            elif prop.split('-')[0].lower() in ['background', 'border', 'margin',
+                                                'padding']:
+                for keyword in value.split():
+                    if keyword not in self.allowed_css_keywords and \
+                            not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword):  # noqa
+                        break
+                else:
+                    clean.append(prop + ': ' + value + ';')
+            elif prop.lower() in self.allowed_svg_properties:
+                clean.append(prop + ': ' + value + ';')
+
+        return ' '.join(clean)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..afe4038854318ae8fdd91fb2960a58be2a8d3b5c
GIT binary patch
literal 27270
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
Bj+y`f

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py
new file mode 100644
index 00000000..0d12584b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py
@@ -0,0 +1,38 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import re
+
+from . import base
+from ..constants import rcdataElements, spaceCharacters
+spaceCharacters = "".join(spaceCharacters)
+
+SPACES_REGEX = re.compile("[%s]+" % spaceCharacters)
+
+
+class Filter(base.Filter):
+    """Collapses whitespace except in pre, textarea, and script elements"""
+    spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements))
+
+    def __iter__(self):
+        preserve = 0
+        for token in base.Filter.__iter__(self):
+            type = token["type"]
+            if type == "StartTag" \
+                    and (preserve or token["name"] in self.spacePreserveElements):
+                preserve += 1
+
+            elif type == "EndTag" and preserve:
+                preserve -= 1
+
+            elif not preserve and type == "SpaceCharacters" and token["data"]:
+                # Test on token["data"] above to not introduce spaces where there were not
+                token["data"] = " "
+
+            elif not preserve and type == "Characters":
+                token["data"] = collapse_spaces(token["data"])
+
+            yield token
+
+
+def collapse_spaces(text):
+    return SPACES_REGEX.sub(' ', text)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fe109cb59a72feb8def92624b71e5934208d935e
GIT binary patch
literal 1941
zcmZSn%*&NH<x)&C0~9bbFfceIFfkNQV_;xNVPHsMWXNG)$Yo@RVr0l=Vu)g5$Yo}T
zVrF0j$uTkHurNfiFr+Xuq_8mLurlPbF+{O3Fs86Fq_8pMuruUxFhp@M<Z?1ZaWXKb
zurp+FF{E-bG&6$usVodx+zcrkAQ3T;5D!BNCqpV5Ll!SX8Y4pr7efmJLo)+IWE3w$
z3O9%o#mA7s#1O2(!@$6h339In$h9T>3=9m3NyYg&r6sBHnYjh|MI|L1AlGM>Wfo`V
z=amRBFff$nWhUpRq{ioDmZTOX<`ny7GBPkQXn=?k76t}}q{QOXOeT;Jh$!J>U|=Xp
zPDw0Dbj?Z4P0cGQ23u2HkeHn6oRL_Rm|T)tR9p&jL@6r+14FcGajbR;8v_G_TV_s4
zY7sm<L1sIF!qb?6fgzOv6pSehpkPd828C@36GJ)^Ln;eHDk~^h#6jV}1`5v>28Jkh
zhM-^#kO8HR3=9m;`8hd>1;wew3gsD@C8=PiD5O>-rxuhbWacRp6s77Yl%!UaBo?J6
z>L?`Ur6?397iAWdD5OGtPznmIf}+$?P~gB+CWAr%WCsW*gB*Gr6m*OXwTuiE=NL*D
z7_t}{vX~fZ7(niGiQUCe%fwK_1d0gBT4shCW{_jEnHY+q8EP0Aiv7THEDVx03=CP!
z4B2c@i4;}_^IArRykf8pHU^N6Dv*vMFqy*2U;&a20SWOGEdi@y2di2FHj#rtvS<k?
zeSoayV6e&4f~Y(PR>=icd5)ok1*W)}5z4a3V*s(j7z-sC!c!O+f;G4q7#RG($)^<L
z=aR|-NQeZNBo>u~B&LH!^AdAY!6~E^6sN9vDIf_@LJLMq0U#ql$)pq%jtZq*pooH}
z4-HV#2m%Fr5XcyCs*H~ZrNH?35>W;Q25=+>6r~oY7L}!<q_kvcY{!F@6oZoiIH4A&
z=A?lQDu8M$0a;R#pPiZqmIwJq1C%boL~#`Z1A~4+QD#|UNveKXVv&AYeojhiQL%n@
zp?-F;k-52HVV043nW2SwaZY7=dAv!AiHU)MfkAqneu#cSW`S;IUU5lcPL6JQqGf4d
z21p2u<I7U>Qu2%RGfHxEOmi}m^wYrUzE~fTIQ0rDgV-4u7(m&tSPJAMMm9!CMlMDk
zMoC6qCLu;%CRrw4CSgW#CJk_s1QGG^prDVBF9C&Qe0*+xN@-4Ne0&MWp!oQd{N(uf
z5>5sNhP0yms?@yV)Dp0#b25udf<RFb1Tq6`E7<!8VxR*86#t-ds~E&!V`O8LVFG78
zP_h9f5NA-<1BDbM$E7fWa~!C&1C>X9kmRKSVwZr72@Y^{b`6dXa&>o&C;{m&E=@ud
zW}wVHc)ZTZz`&piO6(xlGcam^vJo_T(@IN9i&Ep`gFvYx2ox4UAVno0qA0ZlEDG`+
zILedrK}j*Mq!<#@;A9Vq^Q`>LJaGC*&d)8#%t;LrW?*0dXSg7c)rf!qvj#XJfU~X*
bBw5>mJX{Q_YGjyrm;@Nb82OomnI$Cwh<w0G

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py
new file mode 100644
index 00000000..ae41a133
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py
@@ -0,0 +1,2791 @@
+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
+
+from . import treebuilders
+from .treebuilders.base import Marker
+
+from . import _utils
+from .constants import (
+    spaceCharacters, asciiUpper2Lower,
+    specialElements, headingElements, cdataElements, rcdataElements,
+    tokenTypes, tagTokenTypes,
+    namespaces,
+    htmlIntegrationPointElements, mathmlTextIntegrationPointElements,
+    adjustForeignAttributes as adjustForeignAttributesMap,
+    adjustMathMLAttributes, adjustSVGAttributes,
+    E,
+    _ReparseException
+)
+
+
+def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs):
+    """Parse an HTML document as a string or file-like object into a tree
+
+    :arg doc: the document to parse as a string or file-like object
+
+    :arg treebuilder: the treebuilder to use when parsing
+
+    :arg namespaceHTMLElements: whether or not to namespace HTML elements
+
+    :returns: parsed tree
+
+    Example:
+
+    >>> from html5lib.html5parser import parse
+    >>> parse('<html><body><p>This is a doc</p></body></html>')
+    <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0>
+
+    """
+    tb = treebuilders.getTreeBuilder(treebuilder)
+    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
+    return p.parse(doc, **kwargs)
+
+
+def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs):
+    """Parse an HTML fragment as a string or file-like object into a tree
+
+    :arg doc: the fragment to parse as a string or file-like object
+
+    :arg container: the container context to parse the fragment in
+
+    :arg treebuilder: the treebuilder to use when parsing
+
+    :arg namespaceHTMLElements: whether or not to namespace HTML elements
+
+    :returns: parsed tree
+
+    Example:
+
+    >>> from html5lib.html5libparser import parseFragment
+    >>> parseFragment('<b>this is a fragment</b>')
+    <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090>
+
+    """
+    tb = treebuilders.getTreeBuilder(treebuilder)
+    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
+    return p.parseFragment(doc, container=container, **kwargs)
+
+
+def method_decorator_metaclass(function):
+    class Decorated(type):
+        def __new__(meta, classname, bases, classDict):
+            for attributeName, attribute in classDict.items():
+                if isinstance(attribute, types.FunctionType):
+                    attribute = function(attribute)
+
+                classDict[attributeName] = attribute
+            return type.__new__(meta, classname, bases, classDict)
+    return Decorated
+
+
+class HTMLParser(object):
+    """HTML parser
+
+    Generates a tree structure from a stream of (possibly malformed) HTML.
+
+    """
+
+    def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False):
+        """
+        :arg tree: a treebuilder class controlling the type of tree that will be
+            returned. Built in treebuilders can be accessed through
+            html5lib.treebuilders.getTreeBuilder(treeType)
+
+        :arg strict: raise an exception when a parse error is encountered
+
+        :arg namespaceHTMLElements: whether or not to namespace HTML elements
+
+        :arg debug: whether or not to enable debug mode which logs things
+
+        Example:
+
+        >>> from html5lib.html5parser import HTMLParser
+        >>> parser = HTMLParser()                     # generates parser with etree builder
+        >>> parser = HTMLParser('lxml', strict=True)  # generates parser with lxml builder which is strict
+
+        """
+
+        # Raise an exception on the first error encountered
+        self.strict = strict
+
+        if tree is None:
+            tree = treebuilders.getTreeBuilder("etree")
+        self.tree = tree(namespaceHTMLElements)
+        self.errors = []
+
+        self.phases = dict([(name, cls(self, self.tree)) for name, cls in
+                            getPhases(debug).items()])
+
+    def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs):
+
+        self.innerHTMLMode = innerHTML
+        self.container = container
+        self.scripting = scripting
+        self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs)
+        self.reset()
+
+        try:
+            self.mainLoop()
+        except _ReparseException:
+            self.reset()
+            self.mainLoop()
+
+    def reset(self):
+        self.tree.reset()
+        self.firstStartTag = False
+        self.errors = []
+        self.log = []  # only used with debug mode
+        # "quirks" / "limited quirks" / "no quirks"
+        self.compatMode = "no quirks"
+
+        if self.innerHTMLMode:
+            self.innerHTML = self.container.lower()
+
+            if self.innerHTML in cdataElements:
+                self.tokenizer.state = self.tokenizer.rcdataState
+            elif self.innerHTML in rcdataElements:
+                self.tokenizer.state = self.tokenizer.rawtextState
+            elif self.innerHTML == 'plaintext':
+                self.tokenizer.state = self.tokenizer.plaintextState
+            else:
+                # state already is data state
+                # self.tokenizer.state = self.tokenizer.dataState
+                pass
+            self.phase = self.phases["beforeHtml"]
+            self.phase.insertHtmlElement()
+            self.resetInsertionMode()
+        else:
+            self.innerHTML = False  # pylint:disable=redefined-variable-type
+            self.phase = self.phases["initial"]
+
+        self.lastPhase = None
+
+        self.beforeRCDataPhase = None
+
+        self.framesetOK = True
+
+    @property
+    def documentEncoding(self):
+        """Name of the character encoding that was used to decode the input stream, or
+        :obj:`None` if that is not determined yet
+
+        """
+        if not hasattr(self, 'tokenizer'):
+            return None
+        return self.tokenizer.stream.charEncoding[0].name
+
+    def isHTMLIntegrationPoint(self, element):
+        if (element.name == "annotation-xml" and
+                element.namespace == namespaces["mathml"]):
+            return ("encoding" in element.attributes and
+                    element.attributes["encoding"].translate(
+                        asciiUpper2Lower) in
+                    ("text/html", "application/xhtml+xml"))
+        else:
+            return (element.namespace, element.name) in htmlIntegrationPointElements
+
+    def isMathMLTextIntegrationPoint(self, element):
+        return (element.namespace, element.name) in mathmlTextIntegrationPointElements
+
+    def mainLoop(self):
+        CharactersToken = tokenTypes["Characters"]
+        SpaceCharactersToken = tokenTypes["SpaceCharacters"]
+        StartTagToken = tokenTypes["StartTag"]
+        EndTagToken = tokenTypes["EndTag"]
+        CommentToken = tokenTypes["Comment"]
+        DoctypeToken = tokenTypes["Doctype"]
+        ParseErrorToken = tokenTypes["ParseError"]
+
+        for token in self.normalizedTokens():
+            prev_token = None
+            new_token = token
+            while new_token is not None:
+                prev_token = new_token
+                currentNode = self.tree.openElements[-1] if self.tree.openElements else None
+                currentNodeNamespace = currentNode.namespace if currentNode else None
+                currentNodeName = currentNode.name if currentNode else None
+
+                type = new_token["type"]
+
+                if type == ParseErrorToken:
+                    self.parseError(new_token["data"], new_token.get("datavars", {}))
+                    new_token = None
+                else:
+                    if (len(self.tree.openElements) == 0 or
+                        currentNodeNamespace == self.tree.defaultNamespace or
+                        (self.isMathMLTextIntegrationPoint(currentNode) and
+                         ((type == StartTagToken and
+                           token["name"] not in frozenset(["mglyph", "malignmark"])) or
+                          type in (CharactersToken, SpaceCharactersToken))) or
+                        (currentNodeNamespace == namespaces["mathml"] and
+                         currentNodeName == "annotation-xml" and
+                         type == StartTagToken and
+                         token["name"] == "svg") or
+                        (self.isHTMLIntegrationPoint(currentNode) and
+                         type in (StartTagToken, CharactersToken, SpaceCharactersToken))):
+                        phase = self.phase
+                    else:
+                        phase = self.phases["inForeignContent"]
+
+                    if type == CharactersToken:
+                        new_token = phase.processCharacters(new_token)
+                    elif type == SpaceCharactersToken:
+                        new_token = phase.processSpaceCharacters(new_token)
+                    elif type == StartTagToken:
+                        new_token = phase.processStartTag(new_token)
+                    elif type == EndTagToken:
+                        new_token = phase.processEndTag(new_token)
+                    elif type == CommentToken:
+                        new_token = phase.processComment(new_token)
+                    elif type == DoctypeToken:
+                        new_token = phase.processDoctype(new_token)
+
+            if (type == StartTagToken and prev_token["selfClosing"] and
+                    not prev_token["selfClosingAcknowledged"]):
+                self.parseError("non-void-element-with-trailing-solidus",
+                                {"name": prev_token["name"]})
+
+        # When the loop finishes it's EOF
+        reprocess = True
+        phases = []
+        while reprocess:
+            phases.append(self.phase)
+            reprocess = self.phase.processEOF()
+            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
+
+        :arg stream: a file-like object or string containing the HTML to be parsed
+
+            The optional encoding parameter must be a string that indicates
+            the encoding.  If specified, that encoding will be used,
+            regardless of any BOM or later declaration (such as in a meta
+            element).
+
+        :arg scripting: treat noscript elements as if JavaScript was turned on
+
+        :returns: parsed tree
+
+        Example:
+
+        >>> from html5lib.html5parser import HTMLParser
+        >>> parser = HTMLParser()
+        >>> parser.parse('<html><body><p>This is a doc</p></body></html>')
+        <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0>
+
+        """
+        self._parse(stream, False, None, *args, **kwargs)
+        return self.tree.getDocument()
+
+    def parseFragment(self, stream, *args, **kwargs):
+        """Parse a HTML fragment into a well-formed tree fragment
+
+        :arg container: name of the element we're setting the innerHTML
+            property if set to None, default to 'div'
+
+        :arg stream: a file-like object or string containing the HTML to be parsed
+
+            The optional encoding parameter must be a string that indicates
+            the encoding.  If specified, that encoding will be used,
+            regardless of any BOM or later declaration (such as in a meta
+            element)
+
+        :arg scripting: treat noscript elements as if JavaScript was turned on
+
+        :returns: parsed tree
+
+        Example:
+
+        >>> from html5lib.html5libparser import HTMLParser
+        >>> parser = HTMLParser()
+        >>> parser.parseFragment('<b>this is a fragment</b>')
+        <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090>
+
+        """
+        self._parse(stream, True, *args, **kwargs)
+        return self.tree.getFragment()
+
+    def parseError(self, errorcode="XXX-undefined-error", datavars=None):
+        # XXX The idea is to make errorcode mandatory.
+        if datavars is None:
+            datavars = {}
+        self.errors.append((self.tokenizer.stream.position(), errorcode, datavars))
+        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)
+
+    def adjustSVGAttributes(self, token):
+        adjust_attributes(token, adjustSVGAttributes)
+
+    def adjustForeignAttributes(self, token):
+        adjust_attributes(token, adjustForeignAttributesMap)
+
+    def reparseTokenNormal(self, token):
+        # pylint:disable=unused-argument
+        self.parser.phase()
+
+    def resetInsertionMode(self):
+        # The name of this method is mostly historical. (It's also used in the
+        # specification.)
+        last = False
+        newModes = {
+            "select": "inSelect",
+            "td": "inCell",
+            "th": "inCell",
+            "tr": "inRow",
+            "tbody": "inTableBody",
+            "thead": "inTableBody",
+            "tfoot": "inTableBody",
+            "caption": "inCaption",
+            "colgroup": "inColumnGroup",
+            "table": "inTable",
+            "head": "inBody",
+            "body": "inBody",
+            "frameset": "inFrameset",
+            "html": "beforeHead"
+        }
+        for node in self.tree.openElements[::-1]:
+            nodeName = node.name
+            new_phase = None
+            if node == self.tree.openElements[0]:
+                assert self.innerHTML
+                last = True
+                nodeName = self.innerHTML
+            # Check for conditions that should only happen in the innerHTML
+            # case
+            if nodeName in ("select", "colgroup", "head", "html"):
+                assert self.innerHTML
+
+            if not last and node.namespace != self.tree.defaultNamespace:
+                continue
+
+            if nodeName in newModes:
+                new_phase = self.phases[newModes[nodeName]]
+                break
+            elif last:
+                new_phase = self.phases["inBody"]
+                break
+
+        self.phase = new_phase
+
+    def parseRCDataRawtext(self, token, contentType):
+        # Generic RCDATA/RAWTEXT Parsing algorithm
+        assert contentType in ("RAWTEXT", "RCDATA")
+
+        self.tree.insertElement(token)
+
+        if contentType == "RAWTEXT":
+            self.tokenizer.state = self.tokenizer.rawtextState
+        else:
+            self.tokenizer.state = self.tokenizer.rcdataState
+
+        self.originalPhase = self.phase
+
+        self.phase = self.phases["text"]
+
+
+@_utils.memoize
+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())
+
+        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
+                if token['type'] in tagTokenTypes:
+                    info["name"] = token['name']
+
+                self.parser.log.append((self.parser.tokenizer.state.__name__,
+                                        self.parser.phase.__class__.__name__,
+                                        self.__class__.__name__,
+                                        function.__name__,
+                                        info))
+                return function(self, *args, **kwargs)
+            else:
+                return function(self, *args, **kwargs)
+        return wrapped
+
+    def getMetaclass(use_metaclass, metaclass_func):
+        if use_metaclass:
+            return method_decorator_metaclass(metaclass_func)
+        else:
+            return type
+
+    # pylint:disable=unused-argument
+    class Phase(with_metaclass(getMetaclass(debug, log))):
+        """Base class for helper object that implements each phase of processing
+        """
+
+        def __init__(self, parser, tree):
+            self.parser = parser
+            self.tree = tree
+
+        def processEOF(self):
+            raise NotImplementedError
+
+        def processComment(self, token):
+            # For most phases the following is correct. Where it's not it will be
+            # overridden.
+            self.tree.insertComment(token, self.tree.openElements[-1])
+
+        def processDoctype(self, token):
+            self.parser.parseError("unexpected-doctype")
+
+        def processCharacters(self, token):
+            self.tree.insertText(token["data"])
+
+        def processSpaceCharacters(self, token):
+            self.tree.insertText(token["data"])
+
+        def processStartTag(self, token):
+            return self.startTagHandler[token["name"]](token)
+
+        def startTagHtml(self, token):
+            if not self.parser.firstStartTag and token["name"] == "html":
+                self.parser.parseError("non-html-root")
+            # XXX Need a check here to see if the first start tag token emitted is
+            # this token... If it's not, invoke self.parser.parseError().
+            for attr, value in token["data"].items():
+                if attr not in self.tree.openElements[0].attributes:
+                    self.tree.openElements[0].attributes[attr] = value
+            self.parser.firstStartTag = False
+
+        def processEndTag(self, token):
+            return self.endTagHandler[token["name"]](token)
+
+    class InitialPhase(Phase):
+        def processSpaceCharacters(self, token):
+            pass
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processDoctype(self, token):
+            name = token["name"]
+            publicId = token["publicId"]
+            systemId = token["systemId"]
+            correct = token["correct"]
+
+            if (name != "html" or publicId is not None or
+                    systemId is not None and systemId != "about:legacy-compat"):
+                self.parser.parseError("unknown-doctype")
+
+            if publicId is None:
+                publicId = ""
+
+            self.tree.insertDoctype(token)
+
+            if publicId != "":
+                publicId = publicId.translate(asciiUpper2Lower)
+
+            if (not correct or token["name"] != "html" or
+                    publicId.startswith(
+                        ("+//silmaril//dtd html pro v0r11 19970101//",
+                         "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
+                         "-//as//dtd html 3.0 aswedit + extensions//",
+                         "-//ietf//dtd html 2.0 level 1//",
+                         "-//ietf//dtd html 2.0 level 2//",
+                         "-//ietf//dtd html 2.0 strict level 1//",
+                         "-//ietf//dtd html 2.0 strict level 2//",
+                         "-//ietf//dtd html 2.0 strict//",
+                         "-//ietf//dtd html 2.0//",
+                         "-//ietf//dtd html 2.1e//",
+                         "-//ietf//dtd html 3.0//",
+                         "-//ietf//dtd html 3.2 final//",
+                         "-//ietf//dtd html 3.2//",
+                         "-//ietf//dtd html 3//",
+                         "-//ietf//dtd html level 0//",
+                         "-//ietf//dtd html level 1//",
+                         "-//ietf//dtd html level 2//",
+                         "-//ietf//dtd html level 3//",
+                         "-//ietf//dtd html strict level 0//",
+                         "-//ietf//dtd html strict level 1//",
+                         "-//ietf//dtd html strict level 2//",
+                         "-//ietf//dtd html strict level 3//",
+                         "-//ietf//dtd html strict//",
+                         "-//ietf//dtd html//",
+                         "-//metrius//dtd metrius presentational//",
+                         "-//microsoft//dtd internet explorer 2.0 html strict//",
+                         "-//microsoft//dtd internet explorer 2.0 html//",
+                         "-//microsoft//dtd internet explorer 2.0 tables//",
+                         "-//microsoft//dtd internet explorer 3.0 html strict//",
+                         "-//microsoft//dtd internet explorer 3.0 html//",
+                         "-//microsoft//dtd internet explorer 3.0 tables//",
+                         "-//netscape comm. corp.//dtd html//",
+                         "-//netscape comm. corp.//dtd strict html//",
+                         "-//o'reilly and associates//dtd html 2.0//",
+                         "-//o'reilly and associates//dtd html extended 1.0//",
+                         "-//o'reilly and associates//dtd html extended relaxed 1.0//",
+                         "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
+                         "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
+                         "-//spyglass//dtd html 2.0 extended//",
+                         "-//sq//dtd html 2.0 hotmetal + extensions//",
+                         "-//sun microsystems corp.//dtd hotjava html//",
+                         "-//sun microsystems corp.//dtd hotjava strict html//",
+                         "-//w3c//dtd html 3 1995-03-24//",
+                         "-//w3c//dtd html 3.2 draft//",
+                         "-//w3c//dtd html 3.2 final//",
+                         "-//w3c//dtd html 3.2//",
+                         "-//w3c//dtd html 3.2s draft//",
+                         "-//w3c//dtd html 4.0 frameset//",
+                         "-//w3c//dtd html 4.0 transitional//",
+                         "-//w3c//dtd html experimental 19960712//",
+                         "-//w3c//dtd html experimental 970421//",
+                         "-//w3c//dtd w3 html//",
+                         "-//w3o//dtd w3 html 3.0//",
+                         "-//webtechs//dtd mozilla html 2.0//",
+                         "-//webtechs//dtd mozilla html//")) or
+                    publicId in ("-//w3o//dtd w3 html strict 3.0//en//",
+                                 "-/w3c/dtd html 4.0 transitional/en",
+                                 "html") or
+                    publicId.startswith(
+                        ("-//w3c//dtd html 4.01 frameset//",
+                         "-//w3c//dtd html 4.01 transitional//")) and
+                    systemId is None or
+                    systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"):
+                self.parser.compatMode = "quirks"
+            elif (publicId.startswith(
+                    ("-//w3c//dtd xhtml 1.0 frameset//",
+                     "-//w3c//dtd xhtml 1.0 transitional//")) or
+                  publicId.startswith(
+                      ("-//w3c//dtd html 4.01 frameset//",
+                       "-//w3c//dtd html 4.01 transitional//")) and
+                  systemId is not None):
+                self.parser.compatMode = "limited quirks"
+
+            self.parser.phase = self.parser.phases["beforeHtml"]
+
+        def anythingElse(self):
+            self.parser.compatMode = "quirks"
+            self.parser.phase = self.parser.phases["beforeHtml"]
+
+        def processCharacters(self, token):
+            self.parser.parseError("expected-doctype-but-got-chars")
+            self.anythingElse()
+            return token
+
+        def processStartTag(self, token):
+            self.parser.parseError("expected-doctype-but-got-start-tag",
+                                   {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def processEndTag(self, token):
+            self.parser.parseError("expected-doctype-but-got-end-tag",
+                                   {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def processEOF(self):
+            self.parser.parseError("expected-doctype-but-got-eof")
+            self.anythingElse()
+            return True
+
+    class BeforeHtmlPhase(Phase):
+        # helper methods
+        def insertHtmlElement(self):
+            self.tree.insertRoot(impliedTagToken("html", "StartTag"))
+            self.parser.phase = self.parser.phases["beforeHead"]
+
+        # other
+        def processEOF(self):
+            self.insertHtmlElement()
+            return True
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processSpaceCharacters(self, token):
+            pass
+
+        def processCharacters(self, token):
+            self.insertHtmlElement()
+            return token
+
+        def processStartTag(self, token):
+            if token["name"] == "html":
+                self.parser.firstStartTag = True
+            self.insertHtmlElement()
+            return token
+
+        def processEndTag(self, token):
+            if token["name"] not in ("head", "body", "html", "br"):
+                self.parser.parseError("unexpected-end-tag-before-html",
+                                       {"name": token["name"]})
+            else:
+                self.insertHtmlElement()
+                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
+
+        def processEOF(self):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return True
+
+        def processSpaceCharacters(self, token):
+            pass
+
+        def processCharacters(self, token):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagHead(self, token):
+            self.tree.insertElement(token)
+            self.tree.headPointer = self.tree.openElements[-1]
+            self.parser.phase = self.parser.phases["inHead"]
+
+        def startTagOther(self, token):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return token
+
+        def endTagImplyHead(self, token):
+            self.startTagHead(impliedTagToken("head", "StartTag"))
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("end-tag-after-implied-root",
+                                   {"name": token["name"]})
+
+    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
+
+        # the real thing
+        def processEOF(self):
+            self.anythingElse()
+            return True
+
+        def processCharacters(self, token):
+            self.anythingElse()
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagHead(self, token):
+            self.parser.parseError("two-heads-are-not-better-than-one")
+
+        def startTagBaseLinkCommand(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+        def startTagMeta(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+            attributes = token["data"]
+            if self.parser.tokenizer.stream.charEncoding[1] == "tentative":
+                if "charset" in attributes:
+                    self.parser.tokenizer.stream.changeEncoding(attributes["charset"])
+                elif ("content" in attributes and
+                      "http-equiv" in attributes and
+                      attributes["http-equiv"].lower() == "content-type"):
+                    # Encoding it as UTF-8 here is a hack, as really we should pass
+                    # the abstract Unicode string, and just use the
+                    # ContentAttrParser on that, but using UTF-8 allows all chars
+                    # to be encoded and as a ASCII-superset works.
+                    data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8"))
+                    parser = _inputstream.ContentAttrParser(data)
+                    codec = parser.parse()
+                    self.parser.tokenizer.stream.changeEncoding(codec)
+
+        def startTagTitle(self, token):
+            self.parser.parseRCDataRawtext(token, "RCDATA")
+
+        def startTagNoFramesStyle(self, token):
+            # Need to decide whether to implement the scripting-disabled case
+            self.parser.parseRCDataRawtext(token, "RAWTEXT")
+
+        def startTagNoscript(self, token):
+            if self.parser.scripting:
+                self.parser.parseRCDataRawtext(token, "RAWTEXT")
+            else:
+                self.tree.insertElement(token)
+                self.parser.phase = self.parser.phases["inHeadNoscript"]
+
+        def startTagScript(self, token):
+            self.tree.insertElement(token)
+            self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState
+            self.parser.originalPhase = self.parser.phase
+            self.parser.phase = self.parser.phases["text"]
+
+        def startTagOther(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagHead(self, token):
+            node = self.parser.tree.openElements.pop()
+            assert node.name == "head", "Expected head got %s" % node.name
+            self.parser.phase = self.parser.phases["afterHead"]
+
+        def endTagHtmlBodyBr(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def anythingElse(self):
+            self.endTagHead(impliedTagToken("head"))
+
+    class InHeadNoscriptPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            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
+
+        def processEOF(self):
+            self.parser.parseError("eof-in-head-noscript")
+            self.anythingElse()
+            return True
+
+        def processComment(self, token):
+            return self.parser.phases["inHead"].processComment(token)
+
+        def processCharacters(self, token):
+            self.parser.parseError("char-in-head-noscript")
+            self.anythingElse()
+            return token
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inHead"].processSpaceCharacters(token)
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagBaseLinkCommand(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagHeadNoscript(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def endTagNoscript(self, token):
+            node = self.parser.tree.openElements.pop()
+            assert node.name == "noscript", "Expected noscript got %s" % node.name
+            self.parser.phase = self.parser.phases["inHead"]
+
+        def endTagBr(self, token):
+            self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]})
+            self.anythingElse()
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def anythingElse(self):
+            # Caller must raise parse error first!
+            self.endTagNoscript(impliedTagToken("noscript"))
+
+    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
+
+        def processEOF(self):
+            self.anythingElse()
+            return True
+
+        def processCharacters(self, token):
+            self.anythingElse()
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagBody(self, token):
+            self.parser.framesetOK = False
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inBody"]
+
+        def startTagFrameset(self, token):
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inFrameset"]
+
+        def startTagFromHead(self, token):
+            self.parser.parseError("unexpected-start-tag-out-of-my-head",
+                                   {"name": token["name"]})
+            self.tree.openElements.append(self.tree.headPointer)
+            self.parser.phases["inHead"].processStartTag(token)
+            for node in self.tree.openElements[::-1]:
+                if node.name == "head":
+                    self.tree.openElements.remove(node)
+                    break
+
+        def startTagHead(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
+
+        def startTagOther(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagHtmlBodyBr(self, token):
+            self.anythingElse()
+            return token
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def anythingElse(self):
+            self.tree.insertElement(impliedTagToken("body", "StartTag"))
+            self.parser.phase = self.parser.phases["inBody"]
+            self.parser.framesetOK = True
+
+    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)
+
+            # 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
+                    node1.attributes == node2.attributes)
+
+        # helper
+        def addFormattingElement(self, token):
+            self.tree.insertElement(token)
+            element = self.tree.openElements[-1]
+
+            matchingElements = []
+            for node in self.tree.activeFormattingElements[::-1]:
+                if node is Marker:
+                    break
+                elif self.isMatchingFormattingElement(node, element):
+                    matchingElements.append(node)
+
+            assert len(matchingElements) <= 3
+            if len(matchingElements) == 3:
+                self.tree.activeFormattingElements.remove(matchingElements[-1])
+            self.tree.activeFormattingElements.append(element)
+
+        # the real deal
+        def processEOF(self):
+            allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td",
+                                          "tfoot", "th", "thead", "tr", "body",
+                                          "html"))
+            for node in self.tree.openElements[::-1]:
+                if node.name not in allowed_elements:
+                    self.parser.parseError("expected-closing-tag-but-got-eof")
+                    break
+            # Stop parsing
+
+        def processSpaceCharactersDropNewline(self, token):
+            # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we
+            # want to drop leading newlines
+            data = token["data"]
+            self.processSpaceCharacters = self.processSpaceCharactersNonPre
+            if (data.startswith("\n") and
+                self.tree.openElements[-1].name in ("pre", "listing", "textarea") and
+                    not self.tree.openElements[-1].hasContent()):
+                data = data[1:]
+            if data:
+                self.tree.reconstructActiveFormattingElements()
+                self.tree.insertText(data)
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                # The tokenizer should always emit null on its own
+                return
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertText(token["data"])
+            # This must be bad for performance
+            if (self.parser.framesetOK and
+                any([char not in spaceCharacters
+                     for char in token["data"]])):
+                self.parser.framesetOK = False
+
+        def processSpaceCharactersNonPre(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertText(token["data"])
+
+        def startTagProcessInHead(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagBody(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": "body"})
+            if (len(self.tree.openElements) == 1 or
+                    self.tree.openElements[1].name != "body"):
+                assert self.parser.innerHTML
+            else:
+                self.parser.framesetOK = False
+                for attr, value in token["data"].items():
+                    if attr not in self.tree.openElements[1].attributes:
+                        self.tree.openElements[1].attributes[attr] = value
+
+        def startTagFrameset(self, token):
+            self.parser.parseError("unexpected-start-tag", {"name": "frameset"})
+            if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"):
+                assert self.parser.innerHTML
+            elif not self.parser.framesetOK:
+                pass
+            else:
+                if self.tree.openElements[1].parent:
+                    self.tree.openElements[1].parent.removeChild(self.tree.openElements[1])
+                while self.tree.openElements[-1].name != "html":
+                    self.tree.openElements.pop()
+                self.tree.insertElement(token)
+                self.parser.phase = self.parser.phases["inFrameset"]
+
+        def startTagCloseP(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+
+        def startTagPreListing(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.parser.framesetOK = False
+            self.processSpaceCharacters = self.processSpaceCharactersDropNewline
+
+        def startTagForm(self, token):
+            if self.tree.formPointer:
+                self.parser.parseError("unexpected-start-tag", {"name": "form"})
+            else:
+                if self.tree.elementInScope("p", variant="button"):
+                    self.endTagP(impliedTagToken("p"))
+                self.tree.insertElement(token)
+                self.tree.formPointer = self.tree.openElements[-1]
+
+        def startTagListItem(self, token):
+            self.parser.framesetOK = False
+
+            stopNamesMap = {"li": ["li"],
+                            "dt": ["dt", "dd"],
+                            "dd": ["dt", "dd"]}
+            stopNames = stopNamesMap[token["name"]]
+            for node in reversed(self.tree.openElements):
+                if node.name in stopNames:
+                    self.parser.phase.processEndTag(
+                        impliedTagToken(node.name, "EndTag"))
+                    break
+                if (node.nameTuple in specialElements and
+                        node.name not in ("address", "div", "p")):
+                    break
+
+            if self.tree.elementInScope("p", variant="button"):
+                self.parser.phase.processEndTag(
+                    impliedTagToken("p", "EndTag"))
+
+            self.tree.insertElement(token)
+
+        def startTagPlaintext(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.parser.tokenizer.state = self.parser.tokenizer.plaintextState
+
+        def startTagHeading(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            if self.tree.openElements[-1].name in headingElements:
+                self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
+                self.tree.openElements.pop()
+            self.tree.insertElement(token)
+
+        def startTagA(self, token):
+            afeAElement = self.tree.elementInActiveFormattingElements("a")
+            if afeAElement:
+                self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                       {"startName": "a", "endName": "a"})
+                self.endTagFormatting(impliedTagToken("a"))
+                if afeAElement in self.tree.openElements:
+                    self.tree.openElements.remove(afeAElement)
+                if afeAElement in self.tree.activeFormattingElements:
+                    self.tree.activeFormattingElements.remove(afeAElement)
+            self.tree.reconstructActiveFormattingElements()
+            self.addFormattingElement(token)
+
+        def startTagFormatting(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.addFormattingElement(token)
+
+        def startTagNobr(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            if self.tree.elementInScope("nobr"):
+                self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                       {"startName": "nobr", "endName": "nobr"})
+                self.processEndTag(impliedTagToken("nobr"))
+                # XXX Need tests that trigger the following
+                self.tree.reconstructActiveFormattingElements()
+            self.addFormattingElement(token)
+
+        def startTagButton(self, token):
+            if self.tree.elementInScope("button"):
+                self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                       {"startName": "button", "endName": "button"})
+                self.processEndTag(impliedTagToken("button"))
+                return token
+            else:
+                self.tree.reconstructActiveFormattingElements()
+                self.tree.insertElement(token)
+                self.parser.framesetOK = False
+
+        def startTagAppletMarqueeObject(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+            self.tree.activeFormattingElements.append(Marker)
+            self.parser.framesetOK = False
+
+        def startTagXmp(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.framesetOK = False
+            self.parser.parseRCDataRawtext(token, "RAWTEXT")
+
+        def startTagTable(self, token):
+            if self.parser.compatMode != "quirks":
+                if self.tree.elementInScope("p", variant="button"):
+                    self.processEndTag(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.parser.framesetOK = False
+            self.parser.phase = self.parser.phases["inTable"]
+
+        def startTagVoidFormatting(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+            self.parser.framesetOK = False
+
+        def startTagInput(self, token):
+            framesetOK = self.parser.framesetOK
+            self.startTagVoidFormatting(token)
+            if ("type" in token["data"] and
+                    token["data"]["type"].translate(asciiUpper2Lower) == "hidden"):
+                # input type=hidden doesn't change framesetOK
+                self.parser.framesetOK = framesetOK
+
+        def startTagParamSource(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+        def startTagHr(self, token):
+            if self.tree.elementInScope("p", variant="button"):
+                self.endTagP(impliedTagToken("p"))
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+            self.parser.framesetOK = False
+
+        def startTagImage(self, token):
+            # No really...
+            self.parser.parseError("unexpected-start-tag-treated-as",
+                                   {"originalName": "image", "newName": "img"})
+            self.processStartTag(impliedTagToken("img", "StartTag",
+                                                 attributes=token["data"],
+                                                 selfClosing=token["selfClosing"]))
+
+        def startTagIsIndex(self, token):
+            self.parser.parseError("deprecated-tag", {"name": "isindex"})
+            if self.tree.formPointer:
+                return
+            form_attrs = {}
+            if "action" in token["data"]:
+                form_attrs["action"] = token["data"]["action"]
+            self.processStartTag(impliedTagToken("form", "StartTag",
+                                                 attributes=form_attrs))
+            self.processStartTag(impliedTagToken("hr", "StartTag"))
+            self.processStartTag(impliedTagToken("label", "StartTag"))
+            # XXX Localization ...
+            if "prompt" in token["data"]:
+                prompt = token["data"]["prompt"]
+            else:
+                prompt = "This is a searchable index. Enter search keywords: "
+            self.processCharacters(
+                {"type": tokenTypes["Characters"], "data": prompt})
+            attributes = token["data"].copy()
+            if "action" in attributes:
+                del attributes["action"]
+            if "prompt" in attributes:
+                del attributes["prompt"]
+            attributes["name"] = "isindex"
+            self.processStartTag(impliedTagToken("input", "StartTag",
+                                                 attributes=attributes,
+                                                 selfClosing=token["selfClosing"]))
+            self.processEndTag(impliedTagToken("label"))
+            self.processStartTag(impliedTagToken("hr", "StartTag"))
+            self.processEndTag(impliedTagToken("form"))
+
+        def startTagTextarea(self, token):
+            self.tree.insertElement(token)
+            self.parser.tokenizer.state = self.parser.tokenizer.rcdataState
+            self.processSpaceCharacters = self.processSpaceCharactersDropNewline
+            self.parser.framesetOK = False
+
+        def startTagIFrame(self, token):
+            self.parser.framesetOK = False
+            self.startTagRawtext(token)
+
+        def startTagNoscript(self, token):
+            if self.parser.scripting:
+                self.startTagRawtext(token)
+            else:
+                self.startTagOther(token)
+
+        def startTagRawtext(self, token):
+            """iframe, noembed noframes, noscript(if scripting enabled)"""
+            self.parser.parseRCDataRawtext(token, "RAWTEXT")
+
+        def startTagOpt(self, token):
+            if self.tree.openElements[-1].name == "option":
+                self.parser.phase.processEndTag(impliedTagToken("option"))
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.tree.insertElement(token)
+
+        def startTagSelect(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+            self.parser.framesetOK = False
+            if self.parser.phase in (self.parser.phases["inTable"],
+                                     self.parser.phases["inCaption"],
+                                     self.parser.phases["inColumnGroup"],
+                                     self.parser.phases["inTableBody"],
+                                     self.parser.phases["inRow"],
+                                     self.parser.phases["inCell"]):
+                self.parser.phase = self.parser.phases["inSelectInTable"]
+            else:
+                self.parser.phase = self.parser.phases["inSelect"]
+
+        def startTagRpRt(self, token):
+            if self.tree.elementInScope("ruby"):
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1].name != "ruby":
+                    self.parser.parseError()
+            self.tree.insertElement(token)
+
+        def startTagMath(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.adjustMathMLAttributes(token)
+            self.parser.adjustForeignAttributes(token)
+            token["namespace"] = namespaces["mathml"]
+            self.tree.insertElement(token)
+            # Need to get the parse error right for the case where the token
+            # has a namespace not equal to the xmlns attribute
+            if token["selfClosing"]:
+                self.tree.openElements.pop()
+                token["selfClosingAcknowledged"] = True
+
+        def startTagSvg(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.parser.adjustSVGAttributes(token)
+            self.parser.adjustForeignAttributes(token)
+            token["namespace"] = namespaces["svg"]
+            self.tree.insertElement(token)
+            # Need to get the parse error right for the case where the token
+            # has a namespace not equal to the xmlns attribute
+            if token["selfClosing"]:
+                self.tree.openElements.pop()
+                token["selfClosingAcknowledged"] = True
+
+        def startTagMisplaced(self, token):
+            """ Elements that should be children of other elements that have a
+            different insertion mode; here they are ignored
+            "caption", "col", "colgroup", "frame", "frameset", "head",
+            "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
+            "tr", "noscript"
+            """
+            self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]})
+
+        def startTagOther(self, token):
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(token)
+
+        def endTagP(self, token):
+            if not self.tree.elementInScope("p", variant="button"):
+                self.startTagCloseP(impliedTagToken("p", "StartTag"))
+                self.parser.parseError("unexpected-end-tag", {"name": "p"})
+                self.endTagP(impliedTagToken("p", "EndTag"))
+            else:
+                self.tree.generateImpliedEndTags("p")
+                if self.tree.openElements[-1].name != "p":
+                    self.parser.parseError("unexpected-end-tag", {"name": "p"})
+                node = self.tree.openElements.pop()
+                while node.name != "p":
+                    node = self.tree.openElements.pop()
+
+        def endTagBody(self, token):
+            if not self.tree.elementInScope("body"):
+                self.parser.parseError()
+                return
+            elif self.tree.openElements[-1].name != "body":
+                for node in self.tree.openElements[2:]:
+                    if node.name not in frozenset(("dd", "dt", "li", "optgroup",
+                                                   "option", "p", "rp", "rt",
+                                                   "tbody", "td", "tfoot",
+                                                   "th", "thead", "tr", "body",
+                                                   "html")):
+                        # Not sure this is the correct name for the parse error
+                        self.parser.parseError(
+                            "expected-one-end-tag-but-got-another",
+                            {"gotName": "body", "expectedName": node.name})
+                        break
+            self.parser.phase = self.parser.phases["afterBody"]
+
+        def endTagHtml(self, token):
+            # We repeat the test for the body end tag token being ignored here
+            if self.tree.elementInScope("body"):
+                self.endTagBody(impliedTagToken("body"))
+                return token
+
+        def endTagBlock(self, token):
+            # Put us back in the right whitespace handling mode
+            if token["name"] == "pre":
+                self.processSpaceCharacters = self.processSpaceCharactersNonPre
+            inScope = self.tree.elementInScope(token["name"])
+            if inScope:
+                self.tree.generateImpliedEndTags()
+            if self.tree.openElements[-1].name != token["name"]:
+                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
+            if inScope:
+                node = self.tree.openElements.pop()
+                while node.name != token["name"]:
+                    node = self.tree.openElements.pop()
+
+        def endTagForm(self, token):
+            node = self.tree.formPointer
+            self.tree.formPointer = None
+            if node is None or not self.tree.elementInScope(node):
+                self.parser.parseError("unexpected-end-tag",
+                                       {"name": "form"})
+            else:
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1] != node:
+                    self.parser.parseError("end-tag-too-early-ignored",
+                                           {"name": "form"})
+                self.tree.openElements.remove(node)
+
+        def endTagListItem(self, token):
+            if token["name"] == "li":
+                variant = "list"
+            else:
+                variant = None
+            if not self.tree.elementInScope(token["name"], variant=variant):
+                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+            else:
+                self.tree.generateImpliedEndTags(exclude=token["name"])
+                if self.tree.openElements[-1].name != token["name"]:
+                    self.parser.parseError(
+                        "end-tag-too-early",
+                        {"name": token["name"]})
+                node = self.tree.openElements.pop()
+                while node.name != token["name"]:
+                    node = self.tree.openElements.pop()
+
+        def endTagHeading(self, token):
+            for item in headingElements:
+                if self.tree.elementInScope(item):
+                    self.tree.generateImpliedEndTags()
+                    break
+            if self.tree.openElements[-1].name != token["name"]:
+                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
+
+            for item in headingElements:
+                if self.tree.elementInScope(item):
+                    item = self.tree.openElements.pop()
+                    while item.name not in headingElements:
+                        item = self.tree.openElements.pop()
+                    break
+
+        def endTagFormatting(self, token):
+            """The much-feared adoption agency algorithm"""
+            # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867
+            # XXX Better parseError messages appreciated.
+
+            # Step 1
+            outerLoopCounter = 0
+
+            # Step 2
+            while outerLoopCounter < 8:
+
+                # Step 3
+                outerLoopCounter += 1
+
+                # Step 4:
+
+                # Let the formatting element be the last element in
+                # the list of active formatting elements that:
+                # - is between the end of the list and the last scope
+                # marker in the list, if any, or the start of the list
+                # otherwise, and
+                # - has the same tag name as the token.
+                formattingElement = self.tree.elementInActiveFormattingElements(
+                    token["name"])
+                if (not formattingElement or
+                    (formattingElement in self.tree.openElements and
+                     not self.tree.elementInScope(formattingElement.name))):
+                    # If there is no such node, then abort these steps
+                    # and instead act as described in the "any other
+                    # end tag" entry below.
+                    self.endTagOther(token)
+                    return
+
+                # Otherwise, if there is such a node, but that node is
+                # not in the stack of open elements, then this is a
+                # parse error; remove the element from the list, and
+                # abort these steps.
+                elif formattingElement not in self.tree.openElements:
+                    self.parser.parseError("adoption-agency-1.2", {"name": token["name"]})
+                    self.tree.activeFormattingElements.remove(formattingElement)
+                    return
+
+                # Otherwise, if there is such a node, and that node is
+                # also in the stack of open elements, but the element
+                # is not in scope, then this is a parse error; ignore
+                # the token, and abort these steps.
+                elif not self.tree.elementInScope(formattingElement.name):
+                    self.parser.parseError("adoption-agency-4.4", {"name": token["name"]})
+                    return
+
+                # Otherwise, there is a formatting element and that
+                # element is in the stack and is in scope. If the
+                # element is not the current node, this is a parse
+                # error. In any case, proceed with the algorithm as
+                # written in the following steps.
+                else:
+                    if formattingElement != self.tree.openElements[-1]:
+                        self.parser.parseError("adoption-agency-1.3", {"name": token["name"]})
+
+                # Step 5:
+
+                # Let the furthest block be the topmost node in the
+                # stack of open elements that is lower in the stack
+                # than the formatting element, and is an element in
+                # the special category. There might not be one.
+                afeIndex = self.tree.openElements.index(formattingElement)
+                furthestBlock = None
+                for element in self.tree.openElements[afeIndex:]:
+                    if element.nameTuple in specialElements:
+                        furthestBlock = element
+                        break
+
+                # Step 6:
+
+                # If there is no furthest block, then the UA must
+                # first pop all the nodes from the bottom of the stack
+                # of open elements, from the current node up to and
+                # including the formatting element, then remove the
+                # formatting element from the list of active
+                # formatting elements, and finally abort these steps.
+                if furthestBlock is None:
+                    element = self.tree.openElements.pop()
+                    while element != formattingElement:
+                        element = self.tree.openElements.pop()
+                    self.tree.activeFormattingElements.remove(element)
+                    return
+
+                # Step 7
+                commonAncestor = self.tree.openElements[afeIndex - 1]
+
+                # Step 8:
+                # The bookmark is supposed to help us identify where to reinsert
+                # nodes in step 15. We have to ensure that we reinsert nodes after
+                # the node before the active formatting element. Note the bookmark
+                # can move in step 9.7
+                bookmark = self.tree.activeFormattingElements.index(formattingElement)
+
+                # Step 9
+                lastNode = node = furthestBlock
+                innerLoopCounter = 0
+
+                index = self.tree.openElements.index(node)
+                while innerLoopCounter < 3:
+                    innerLoopCounter += 1
+                    # Node is element before node in open elements
+                    index -= 1
+                    node = self.tree.openElements[index]
+                    if node not in self.tree.activeFormattingElements:
+                        self.tree.openElements.remove(node)
+                        continue
+                    # Step 9.6
+                    if node == formattingElement:
+                        break
+                    # Step 9.7
+                    if lastNode == furthestBlock:
+                        bookmark = self.tree.activeFormattingElements.index(node) + 1
+                    # Step 9.8
+                    clone = node.cloneNode()
+                    # Replace node with clone
+                    self.tree.activeFormattingElements[
+                        self.tree.activeFormattingElements.index(node)] = clone
+                    self.tree.openElements[
+                        self.tree.openElements.index(node)] = clone
+                    node = clone
+                    # Step 9.9
+                    # Remove lastNode from its parents, if any
+                    if lastNode.parent:
+                        lastNode.parent.removeChild(lastNode)
+                    node.appendChild(lastNode)
+                    # Step 9.10
+                    lastNode = node
+
+                # Step 10
+                # Foster parent lastNode if commonAncestor is a
+                # table, tbody, tfoot, thead, or tr we need to foster
+                # parent the lastNode
+                if lastNode.parent:
+                    lastNode.parent.removeChild(lastNode)
+
+                if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")):
+                    parent, insertBefore = self.tree.getTableMisnestedNodePosition()
+                    parent.insertBefore(lastNode, insertBefore)
+                else:
+                    commonAncestor.appendChild(lastNode)
+
+                # Step 11
+                clone = formattingElement.cloneNode()
+
+                # Step 12
+                furthestBlock.reparentChildren(clone)
+
+                # Step 13
+                furthestBlock.appendChild(clone)
+
+                # Step 14
+                self.tree.activeFormattingElements.remove(formattingElement)
+                self.tree.activeFormattingElements.insert(bookmark, clone)
+
+                # Step 15
+                self.tree.openElements.remove(formattingElement)
+                self.tree.openElements.insert(
+                    self.tree.openElements.index(furthestBlock) + 1, clone)
+
+        def endTagAppletMarqueeObject(self, token):
+            if self.tree.elementInScope(token["name"]):
+                self.tree.generateImpliedEndTags()
+            if self.tree.openElements[-1].name != token["name"]:
+                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
+
+            if self.tree.elementInScope(token["name"]):
+                element = self.tree.openElements.pop()
+                while element.name != token["name"]:
+                    element = self.tree.openElements.pop()
+                self.tree.clearActiveFormattingElements()
+
+        def endTagBr(self, token):
+            self.parser.parseError("unexpected-end-tag-treated-as",
+                                   {"originalName": "br", "newName": "br element"})
+            self.tree.reconstructActiveFormattingElements()
+            self.tree.insertElement(impliedTagToken("br", "StartTag"))
+            self.tree.openElements.pop()
+
+        def endTagOther(self, token):
+            for node in self.tree.openElements[::-1]:
+                if node.name == token["name"]:
+                    self.tree.generateImpliedEndTags(exclude=token["name"])
+                    if self.tree.openElements[-1].name != token["name"]:
+                        self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+                    while self.tree.openElements.pop() != node:
+                        pass
+                    break
+                else:
+                    if node.nameTuple in specialElements:
+                        self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+                        break
+
+    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
+
+        def processCharacters(self, token):
+            self.tree.insertText(token["data"])
+
+        def processEOF(self):
+            self.parser.parseError("expected-named-closing-tag-but-got-eof",
+                                   {"name": self.tree.openElements[-1].name})
+            self.tree.openElements.pop()
+            self.parser.phase = self.parser.originalPhase
+            return True
+
+        def startTagOther(self, token):
+            assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name']
+
+        def endTagScript(self, token):
+            node = self.tree.openElements.pop()
+            assert node.name == "script"
+            self.parser.phase = self.parser.originalPhase
+            # The rest of this method is all stuff that only happens if
+            # document.write works
+
+        def endTagOther(self, token):
+            self.tree.openElements.pop()
+            self.parser.phase = self.parser.originalPhase
+
+    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
+
+        # helper methods
+        def clearStackToTableContext(self):
+            # "clear the stack back to a table context"
+            while self.tree.openElements[-1].name not in ("table", "html"):
+                # self.parser.parseError("unexpected-implied-end-tag-in-table",
+                #  {"name":  self.tree.openElements[-1].name})
+                self.tree.openElements.pop()
+            # When the current node is <html> it's an innerHTML case
+
+        # processing methods
+        def processEOF(self):
+            if self.tree.openElements[-1].name != "html":
+                self.parser.parseError("eof-in-table")
+            else:
+                assert self.parser.innerHTML
+            # Stop parsing
+
+        def processSpaceCharacters(self, token):
+            originalPhase = self.parser.phase
+            self.parser.phase = self.parser.phases["inTableText"]
+            self.parser.phase.originalPhase = originalPhase
+            self.parser.phase.processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            originalPhase = self.parser.phase
+            self.parser.phase = self.parser.phases["inTableText"]
+            self.parser.phase.originalPhase = originalPhase
+            self.parser.phase.processCharacters(token)
+
+        def insertText(self, token):
+            # If we get here there must be at least one non-whitespace character
+            # Do the table magic!
+            self.tree.insertFromTable = True
+            self.parser.phases["inBody"].processCharacters(token)
+            self.tree.insertFromTable = False
+
+        def startTagCaption(self, token):
+            self.clearStackToTableContext()
+            self.tree.activeFormattingElements.append(Marker)
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inCaption"]
+
+        def startTagColgroup(self, token):
+            self.clearStackToTableContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inColumnGroup"]
+
+        def startTagCol(self, token):
+            self.startTagColgroup(impliedTagToken("colgroup", "StartTag"))
+            return token
+
+        def startTagRowGroup(self, token):
+            self.clearStackToTableContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inTableBody"]
+
+        def startTagImplyTbody(self, token):
+            self.startTagRowGroup(impliedTagToken("tbody", "StartTag"))
+            return token
+
+        def startTagTable(self, token):
+            self.parser.parseError("unexpected-start-tag-implies-end-tag",
+                                   {"startName": "table", "endName": "table"})
+            self.parser.phase.processEndTag(impliedTagToken("table"))
+            if not self.parser.innerHTML:
+                return token
+
+        def startTagStyleScript(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagInput(self, token):
+            if ("type" in token["data"] and
+                    token["data"]["type"].translate(asciiUpper2Lower) == "hidden"):
+                self.parser.parseError("unexpected-hidden-input-in-table")
+                self.tree.insertElement(token)
+                # XXX associate with form
+                self.tree.openElements.pop()
+            else:
+                self.startTagOther(token)
+
+        def startTagForm(self, token):
+            self.parser.parseError("unexpected-form-in-table")
+            if self.tree.formPointer is None:
+                self.tree.insertElement(token)
+                self.tree.formPointer = self.tree.openElements[-1]
+                self.tree.openElements.pop()
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]})
+            # Do the table magic!
+            self.tree.insertFromTable = True
+            self.parser.phases["inBody"].processStartTag(token)
+            self.tree.insertFromTable = False
+
+        def endTagTable(self, token):
+            if self.tree.elementInScope("table", variant="table"):
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1].name != "table":
+                    self.parser.parseError("end-tag-too-early-named",
+                                           {"gotName": "table",
+                                            "expectedName": self.tree.openElements[-1].name})
+                while self.tree.openElements[-1].name != "table":
+                    self.tree.openElements.pop()
+                self.tree.openElements.pop()
+                self.parser.resetInsertionMode()
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]})
+            # Do the table magic!
+            self.tree.insertFromTable = True
+            self.parser.phases["inBody"].processEndTag(token)
+            self.tree.insertFromTable = False
+
+    class InTableTextPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+            self.originalPhase = None
+            self.characterTokens = []
+
+        def flushCharacters(self):
+            data = "".join([item["data"] for item in self.characterTokens])
+            if any([item not in spaceCharacters for item in data]):
+                token = {"type": tokenTypes["Characters"], "data": data}
+                self.parser.phases["inTable"].insertText(token)
+            elif data:
+                self.tree.insertText(data)
+            self.characterTokens = []
+
+        def processComment(self, token):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return token
+
+        def processEOF(self):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return True
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                return
+            self.characterTokens.append(token)
+
+        def processSpaceCharacters(self, token):
+            # pretty sure we should never reach here
+            self.characterTokens.append(token)
+    #        assert False
+
+        def processStartTag(self, token):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return token
+
+        def processEndTag(self, token):
+            self.flushCharacters()
+            self.parser.phase = self.originalPhase
+            return token
+
+    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
+
+        def ignoreEndTagCaption(self):
+            return not self.tree.elementInScope("caption", variant="table")
+
+        def processEOF(self):
+            self.parser.phases["inBody"].processEOF()
+
+        def processCharacters(self, token):
+            return self.parser.phases["inBody"].processCharacters(token)
+
+        def startTagTableElement(self, token):
+            self.parser.parseError()
+            # XXX Have to duplicate logic here to find out if the tag is ignored
+            ignoreEndTag = self.ignoreEndTagCaption()
+            self.parser.phase.processEndTag(impliedTagToken("caption"))
+            if not ignoreEndTag:
+                return token
+
+        def startTagOther(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def endTagCaption(self, token):
+            if not self.ignoreEndTagCaption():
+                # AT this code is quite similar to endTagTable in "InTable"
+                self.tree.generateImpliedEndTags()
+                if self.tree.openElements[-1].name != "caption":
+                    self.parser.parseError("expected-one-end-tag-but-got-another",
+                                           {"gotName": "caption",
+                                            "expectedName": self.tree.openElements[-1].name})
+                while self.tree.openElements[-1].name != "caption":
+                    self.tree.openElements.pop()
+                self.tree.openElements.pop()
+                self.tree.clearActiveFormattingElements()
+                self.parser.phase = self.parser.phases["inTable"]
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagTable(self, token):
+            self.parser.parseError()
+            ignoreEndTag = self.ignoreEndTagCaption()
+            self.parser.phase.processEndTag(impliedTagToken("caption"))
+            if not ignoreEndTag:
+                return token
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagOther(self, token):
+            return self.parser.phases["inBody"].processEndTag(token)
+
+    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
+
+        def ignoreEndTagColgroup(self):
+            return self.tree.openElements[-1].name == "html"
+
+        def processEOF(self):
+            if self.tree.openElements[-1].name == "html":
+                assert self.parser.innerHTML
+                return
+            else:
+                ignoreEndTag = self.ignoreEndTagColgroup()
+                self.endTagColgroup(impliedTagToken("colgroup"))
+                if not ignoreEndTag:
+                    return True
+
+        def processCharacters(self, token):
+            ignoreEndTag = self.ignoreEndTagColgroup()
+            self.endTagColgroup(impliedTagToken("colgroup"))
+            if not ignoreEndTag:
+                return token
+
+        def startTagCol(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+            token["selfClosingAcknowledged"] = True
+
+        def startTagOther(self, token):
+            ignoreEndTag = self.ignoreEndTagColgroup()
+            self.endTagColgroup(impliedTagToken("colgroup"))
+            if not ignoreEndTag:
+                return token
+
+        def endTagColgroup(self, token):
+            if self.ignoreEndTagColgroup():
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+            else:
+                self.tree.openElements.pop()
+                self.parser.phase = self.parser.phases["inTable"]
+
+        def endTagCol(self, token):
+            self.parser.parseError("no-end-tag", {"name": "col"})
+
+        def endTagOther(self, token):
+            ignoreEndTag = self.ignoreEndTagColgroup()
+            self.endTagColgroup(impliedTagToken("colgroup"))
+            if not ignoreEndTag:
+                return token
+
+    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
+
+        # helper methods
+        def clearStackToTableBodyContext(self):
+            while self.tree.openElements[-1].name not in ("tbody", "tfoot",
+                                                          "thead", "html"):
+                # self.parser.parseError("unexpected-implied-end-tag-in-table",
+                #  {"name": self.tree.openElements[-1].name})
+                self.tree.openElements.pop()
+            if self.tree.openElements[-1].name == "html":
+                assert self.parser.innerHTML
+
+        # the rest
+        def processEOF(self):
+            self.parser.phases["inTable"].processEOF()
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inTable"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            return self.parser.phases["inTable"].processCharacters(token)
+
+        def startTagTr(self, token):
+            self.clearStackToTableBodyContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inRow"]
+
+        def startTagTableCell(self, token):
+            self.parser.parseError("unexpected-cell-in-table-body",
+                                   {"name": token["name"]})
+            self.startTagTr(impliedTagToken("tr", "StartTag"))
+            return token
+
+        def startTagTableOther(self, token):
+            # XXX AT Any ideas on how to share this with endTagTable?
+            if (self.tree.elementInScope("tbody", variant="table") or
+                self.tree.elementInScope("thead", variant="table") or
+                    self.tree.elementInScope("tfoot", variant="table")):
+                self.clearStackToTableBodyContext()
+                self.endTagTableRowGroup(
+                    impliedTagToken(self.tree.openElements[-1].name))
+                return token
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def startTagOther(self, token):
+            return self.parser.phases["inTable"].processStartTag(token)
+
+        def endTagTableRowGroup(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.clearStackToTableBodyContext()
+                self.tree.openElements.pop()
+                self.parser.phase = self.parser.phases["inTable"]
+            else:
+                self.parser.parseError("unexpected-end-tag-in-table-body",
+                                       {"name": token["name"]})
+
+        def endTagTable(self, token):
+            if (self.tree.elementInScope("tbody", variant="table") or
+                self.tree.elementInScope("thead", variant="table") or
+                    self.tree.elementInScope("tfoot", variant="table")):
+                self.clearStackToTableBodyContext()
+                self.endTagTableRowGroup(
+                    impliedTagToken(self.tree.openElements[-1].name))
+                return token
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag-in-table-body",
+                                   {"name": token["name"]})
+
+        def endTagOther(self, token):
+            return self.parser.phases["inTable"].processEndTag(token)
+
+    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
+
+        # helper methods (XXX unify this with other table helper methods)
+        def clearStackToTableRowContext(self):
+            while self.tree.openElements[-1].name not in ("tr", "html"):
+                self.parser.parseError("unexpected-implied-end-tag-in-table-row",
+                                       {"name": self.tree.openElements[-1].name})
+                self.tree.openElements.pop()
+
+        def ignoreEndTagTr(self):
+            return not self.tree.elementInScope("tr", variant="table")
+
+        # the rest
+        def processEOF(self):
+            self.parser.phases["inTable"].processEOF()
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inTable"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            return self.parser.phases["inTable"].processCharacters(token)
+
+        def startTagTableCell(self, token):
+            self.clearStackToTableRowContext()
+            self.tree.insertElement(token)
+            self.parser.phase = self.parser.phases["inCell"]
+            self.tree.activeFormattingElements.append(Marker)
+
+        def startTagTableOther(self, token):
+            ignoreEndTag = self.ignoreEndTagTr()
+            self.endTagTr(impliedTagToken("tr"))
+            # XXX how are we sure it's always ignored in the innerHTML case?
+            if not ignoreEndTag:
+                return token
+
+        def startTagOther(self, token):
+            return self.parser.phases["inTable"].processStartTag(token)
+
+        def endTagTr(self, token):
+            if not self.ignoreEndTagTr():
+                self.clearStackToTableRowContext()
+                self.tree.openElements.pop()
+                self.parser.phase = self.parser.phases["inTableBody"]
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagTable(self, token):
+            ignoreEndTag = self.ignoreEndTagTr()
+            self.endTagTr(impliedTagToken("tr"))
+            # Reprocess the current tag if the tr end tag was not ignored
+            # XXX how are we sure it's always ignored in the innerHTML case?
+            if not ignoreEndTag:
+                return token
+
+        def endTagTableRowGroup(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.endTagTr(impliedTagToken("tr"))
+                return token
+            else:
+                self.parser.parseError()
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag-in-table-row",
+                                   {"name": token["name"]})
+
+        def endTagOther(self, token):
+            return self.parser.phases["inTable"].processEndTag(token)
+
+    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
+
+        # helper
+        def closeCell(self):
+            if self.tree.elementInScope("td", variant="table"):
+                self.endTagTableCell(impliedTagToken("td"))
+            elif self.tree.elementInScope("th", variant="table"):
+                self.endTagTableCell(impliedTagToken("th"))
+
+        # the rest
+        def processEOF(self):
+            self.parser.phases["inBody"].processEOF()
+
+        def processCharacters(self, token):
+            return self.parser.phases["inBody"].processCharacters(token)
+
+        def startTagTableOther(self, token):
+            if (self.tree.elementInScope("td", variant="table") or
+                    self.tree.elementInScope("th", variant="table")):
+                self.closeCell()
+                return token
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def startTagOther(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def endTagTableCell(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.tree.generateImpliedEndTags(token["name"])
+                if self.tree.openElements[-1].name != token["name"]:
+                    self.parser.parseError("unexpected-cell-end-tag",
+                                           {"name": token["name"]})
+                    while True:
+                        node = self.tree.openElements.pop()
+                        if node.name == token["name"]:
+                            break
+                else:
+                    self.tree.openElements.pop()
+                self.tree.clearActiveFormattingElements()
+                self.parser.phase = self.parser.phases["inRow"]
+            else:
+                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagIgnore(self, token):
+            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+        def endTagImply(self, token):
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.closeCell()
+                return token
+            else:
+                # sometimes innerHTML case
+                self.parser.parseError()
+
+        def endTagOther(self, token):
+            return self.parser.phases["inBody"].processEndTag(token)
+
+    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
+
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-select
+        def processEOF(self):
+            if self.tree.openElements[-1].name != "html":
+                self.parser.parseError("eof-in-select")
+            else:
+                assert self.parser.innerHTML
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                return
+            self.tree.insertText(token["data"])
+
+        def startTagOption(self, token):
+            # We need to imply </option> if <option> is the current node.
+            if self.tree.openElements[-1].name == "option":
+                self.tree.openElements.pop()
+            self.tree.insertElement(token)
+
+        def startTagOptgroup(self, token):
+            if self.tree.openElements[-1].name == "option":
+                self.tree.openElements.pop()
+            if self.tree.openElements[-1].name == "optgroup":
+                self.tree.openElements.pop()
+            self.tree.insertElement(token)
+
+        def startTagSelect(self, token):
+            self.parser.parseError("unexpected-select-in-select")
+            self.endTagSelect(impliedTagToken("select"))
+
+        def startTagInput(self, token):
+            self.parser.parseError("unexpected-input-in-select")
+            if self.tree.elementInScope("select", variant="select"):
+                self.endTagSelect(impliedTagToken("select"))
+                return token
+            else:
+                assert self.parser.innerHTML
+
+        def startTagScript(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-in-select",
+                                   {"name": token["name"]})
+
+        def endTagOption(self, token):
+            if self.tree.openElements[-1].name == "option":
+                self.tree.openElements.pop()
+            else:
+                self.parser.parseError("unexpected-end-tag-in-select",
+                                       {"name": "option"})
+
+        def endTagOptgroup(self, token):
+            # </optgroup> implicitly closes <option>
+            if (self.tree.openElements[-1].name == "option" and
+                    self.tree.openElements[-2].name == "optgroup"):
+                self.tree.openElements.pop()
+            # It also closes </optgroup>
+            if self.tree.openElements[-1].name == "optgroup":
+                self.tree.openElements.pop()
+            # But nothing else
+            else:
+                self.parser.parseError("unexpected-end-tag-in-select",
+                                       {"name": "optgroup"})
+
+        def endTagSelect(self, token):
+            if self.tree.elementInScope("select", variant="select"):
+                node = self.tree.openElements.pop()
+                while node.name != "select":
+                    node = self.tree.openElements.pop()
+                self.parser.resetInsertionMode()
+            else:
+                # innerHTML case
+                assert self.parser.innerHTML
+                self.parser.parseError()
+
+        def endTagOther(self, token):
+            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
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
+                 self.endTagTable)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            self.parser.phases["inSelect"].processEOF()
+
+        def processCharacters(self, token):
+            return self.parser.phases["inSelect"].processCharacters(token)
+
+        def startTagTable(self, token):
+            self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]})
+            self.endTagOther(impliedTagToken("select"))
+            return token
+
+        def startTagOther(self, token):
+            return self.parser.phases["inSelect"].processStartTag(token)
+
+        def endTagTable(self, token):
+            self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]})
+            if self.tree.elementInScope(token["name"], variant="table"):
+                self.endTagOther(impliedTagToken("select"))
+                return token
+
+        def endTagOther(self, token):
+            return self.parser.phases["inSelect"].processEndTag(token)
+
+    class InForeignContentPhase(Phase):
+        breakoutElements = frozenset(["b", "big", "blockquote", "body", "br",
+                                      "center", "code", "dd", "div", "dl", "dt",
+                                      "em", "embed", "h1", "h2", "h3",
+                                      "h4", "h5", "h6", "head", "hr", "i", "img",
+                                      "li", "listing", "menu", "meta", "nobr",
+                                      "ol", "p", "pre", "ruby", "s", "small",
+                                      "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",
+                            "altglyphitem": "altGlyphItem",
+                            "animatecolor": "animateColor",
+                            "animatemotion": "animateMotion",
+                            "animatetransform": "animateTransform",
+                            "clippath": "clipPath",
+                            "feblend": "feBlend",
+                            "fecolormatrix": "feColorMatrix",
+                            "fecomponenttransfer": "feComponentTransfer",
+                            "fecomposite": "feComposite",
+                            "feconvolvematrix": "feConvolveMatrix",
+                            "fediffuselighting": "feDiffuseLighting",
+                            "fedisplacementmap": "feDisplacementMap",
+                            "fedistantlight": "feDistantLight",
+                            "feflood": "feFlood",
+                            "fefunca": "feFuncA",
+                            "fefuncb": "feFuncB",
+                            "fefuncg": "feFuncG",
+                            "fefuncr": "feFuncR",
+                            "fegaussianblur": "feGaussianBlur",
+                            "feimage": "feImage",
+                            "femerge": "feMerge",
+                            "femergenode": "feMergeNode",
+                            "femorphology": "feMorphology",
+                            "feoffset": "feOffset",
+                            "fepointlight": "fePointLight",
+                            "fespecularlighting": "feSpecularLighting",
+                            "fespotlight": "feSpotLight",
+                            "fetile": "feTile",
+                            "feturbulence": "feTurbulence",
+                            "foreignobject": "foreignObject",
+                            "glyphref": "glyphRef",
+                            "lineargradient": "linearGradient",
+                            "radialgradient": "radialGradient",
+                            "textpath": "textPath"}
+
+            if token["name"] in replacements:
+                token["name"] = replacements[token["name"]]
+
+        def processCharacters(self, token):
+            if token["data"] == "\u0000":
+                token["data"] = "\uFFFD"
+            elif (self.parser.framesetOK and
+                  any(char not in spaceCharacters for char in token["data"])):
+                self.parser.framesetOK = False
+            Phase.processCharacters(self, token)
+
+        def processStartTag(self, token):
+            currentNode = self.tree.openElements[-1]
+            if (token["name"] in self.breakoutElements or
+                (token["name"] == "font" and
+                 set(token["data"].keys()) & set(["color", "face", "size"]))):
+                self.parser.parseError("unexpected-html-element-in-foreign-content",
+                                       {"name": token["name"]})
+                while (self.tree.openElements[-1].namespace !=
+                       self.tree.defaultNamespace and
+                       not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and
+                       not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])):
+                    self.tree.openElements.pop()
+                return token
+
+            else:
+                if currentNode.namespace == namespaces["mathml"]:
+                    self.parser.adjustMathMLAttributes(token)
+                elif currentNode.namespace == namespaces["svg"]:
+                    self.adjustSVGTagNames(token)
+                    self.parser.adjustSVGAttributes(token)
+                self.parser.adjustForeignAttributes(token)
+                token["namespace"] = currentNode.namespace
+                self.tree.insertElement(token)
+                if token["selfClosing"]:
+                    self.tree.openElements.pop()
+                    token["selfClosingAcknowledged"] = True
+
+        def processEndTag(self, token):
+            nodeIndex = len(self.tree.openElements) - 1
+            node = self.tree.openElements[-1]
+            if node.name.translate(asciiUpper2Lower) != token["name"]:
+                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
+
+            while True:
+                if node.name.translate(asciiUpper2Lower) == token["name"]:
+                    # XXX this isn't in the spec but it seems necessary
+                    if self.parser.phase == self.parser.phases["inTableText"]:
+                        self.parser.phase.flushCharacters()
+                        self.parser.phase = self.parser.phase.originalPhase
+                    while self.tree.openElements.pop() != node:
+                        assert self.tree.openElements
+                    new_token = None
+                    break
+                nodeIndex -= 1
+
+                node = self.tree.openElements[nodeIndex]
+                if node.namespace != self.tree.defaultNamespace:
+                    continue
+                else:
+                    new_token = self.parser.phase.processEndTag(token)
+                    break
+            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
+
+        def processEOF(self):
+            # Stop parsing
+            pass
+
+        def processComment(self, token):
+            # This is needed because data is to be appended to the <html> element
+            # here and not to whatever is currently open.
+            self.tree.insertComment(token, self.tree.openElements[0])
+
+        def processCharacters(self, token):
+            self.parser.parseError("unexpected-char-after-body")
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-after-body",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def endTagHtml(self, name):
+            if self.parser.innerHTML:
+                self.parser.parseError("unexpected-end-tag-after-body-innerhtml")
+            else:
+                self.parser.phase = self.parser.phases["afterAfterBody"]
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-after-body",
+                                   {"name": token["name"]})
+            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)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("frameset", self.startTagFrameset),
+                ("frame", self.startTagFrame),
+                ("noframes", self.startTagNoframes)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("frameset", self.endTagFrameset)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            if self.tree.openElements[-1].name != "html":
+                self.parser.parseError("eof-in-frameset")
+            else:
+                assert self.parser.innerHTML
+
+        def processCharacters(self, token):
+            self.parser.parseError("unexpected-char-in-frameset")
+
+        def startTagFrameset(self, token):
+            self.tree.insertElement(token)
+
+        def startTagFrame(self, token):
+            self.tree.insertElement(token)
+            self.tree.openElements.pop()
+
+        def startTagNoframes(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-in-frameset",
+                                   {"name": token["name"]})
+
+        def endTagFrameset(self, token):
+            if self.tree.openElements[-1].name == "html":
+                # innerHTML case
+                self.parser.parseError("unexpected-frameset-in-frameset-innerhtml")
+            else:
+                self.tree.openElements.pop()
+            if (not self.parser.innerHTML and
+                    self.tree.openElements[-1].name != "frameset"):
+                # If we're not in innerHTML mode and the current node is not a
+                # "frameset" element (anymore) then switch.
+                self.parser.phase = self.parser.phases["afterFrameset"]
+
+        def endTagOther(self, token):
+            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)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("noframes", self.startTagNoframes)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+            self.endTagHandler = _utils.MethodDispatcher([
+                ("html", self.endTagHtml)
+            ])
+            self.endTagHandler.default = self.endTagOther
+
+        def processEOF(self):
+            # Stop parsing
+            pass
+
+        def processCharacters(self, token):
+            self.parser.parseError("unexpected-char-after-frameset")
+
+        def startTagNoframes(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("unexpected-start-tag-after-frameset",
+                                   {"name": token["name"]})
+
+        def endTagHtml(self, token):
+            self.parser.phase = self.parser.phases["afterAfterFrameset"]
+
+        def endTagOther(self, token):
+            self.parser.parseError("unexpected-end-tag-after-frameset",
+                                   {"name": token["name"]})
+
+    class AfterAfterBodyPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+        def processEOF(self):
+            pass
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inBody"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            self.parser.parseError("expected-eof-but-got-char")
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("expected-eof-but-got-start-tag",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+        def processEndTag(self, token):
+            self.parser.parseError("expected-eof-but-got-end-tag",
+                                   {"name": token["name"]})
+            self.parser.phase = self.parser.phases["inBody"]
+            return token
+
+    class AfterAfterFramesetPhase(Phase):
+        def __init__(self, parser, tree):
+            Phase.__init__(self, parser, tree)
+
+            self.startTagHandler = _utils.MethodDispatcher([
+                ("html", self.startTagHtml),
+                ("noframes", self.startTagNoFrames)
+            ])
+            self.startTagHandler.default = self.startTagOther
+
+        def processEOF(self):
+            pass
+
+        def processComment(self, token):
+            self.tree.insertComment(token, self.tree.document)
+
+        def processSpaceCharacters(self, token):
+            return self.parser.phases["inBody"].processSpaceCharacters(token)
+
+        def processCharacters(self, token):
+            self.parser.parseError("expected-eof-but-got-char")
+
+        def startTagHtml(self, token):
+            return self.parser.phases["inBody"].processStartTag(token)
+
+        def startTagNoFrames(self, token):
+            return self.parser.phases["inHead"].processStartTag(token)
+
+        def startTagOther(self, token):
+            self.parser.parseError("expected-eof-but-got-start-tag",
+                                   {"name": token["name"]})
+
+        def processEndTag(self, token):
+            self.parser.parseError("expected-eof-but-got-end-tag",
+                                   {"name": token["name"]})
+    # pylint:enable=unused-argument
+
+    return {
+        "initial": InitialPhase,
+        "beforeHtml": BeforeHtmlPhase,
+        "beforeHead": BeforeHeadPhase,
+        "inHead": InHeadPhase,
+        "inHeadNoscript": InHeadNoscriptPhase,
+        "afterHead": AfterHeadPhase,
+        "inBody": InBodyPhase,
+        "text": TextPhase,
+        "inTable": InTablePhase,
+        "inTableText": InTableTextPhase,
+        "inCaption": InCaptionPhase,
+        "inColumnGroup": InColumnGroupPhase,
+        "inTableBody": InTableBodyPhase,
+        "inRow": InRowPhase,
+        "inCell": InCellPhase,
+        "inSelect": InSelectPhase,
+        "inSelectInTable": InSelectInTablePhase,
+        "inForeignContent": InForeignContentPhase,
+        "afterBody": AfterBodyPhase,
+        "inFrameset": InFramesetPhase,
+        "afterFrameset": AfterFramesetPhase,
+        "afterAfterBody": AfterAfterBodyPhase,
+        "afterAfterFrameset": AfterAfterFramesetPhase,
+        # XXX after after frameset
+    }
+
+
+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())
+
+
+def impliedTagToken(name, type="EndTag", attributes=None,
+                    selfClosing=False):
+    if attributes is None:
+        attributes = {}
+    return {"type": tokenTypes[type], "name": name, "data": attributes,
+            "selfClosing": selfClosing}
+
+
+class ParseError(Exception):
+    """Error in parsed document"""
+    pass
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9e4d9b6306bf23cde678ec9256e25a8c2fe736c8
GIT binary patch
literal 141299
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
Fb^s|Zb=3d>

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py
new file mode 100644
index 00000000..53f4d44c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py
@@ -0,0 +1,409 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+import re
+
+from codecs import register_error, xmlcharrefreplace_errors
+
+from .constants import voidElements, booleanAttributes, spaceCharacters
+from .constants import rcdataElements, entities, xmlEntities
+from . import treewalkers, _utils
+from xml.sax.saxutils import escape
+
+_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`"
+_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]")
+_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars +
+                                   "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n"
+                                   "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15"
+                                   "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                                   "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000"
+                                   "\u2001\u2002\u2003\u2004\u2005\u2006\u2007"
+                                   "\u2008\u2009\u200a\u2028\u2029\u202f\u205f"
+                                   "\u3000]")
+
+
+_encode_entity_map = {}
+_is_ucs4 = len("\U0010FFFF") == 1
+for k, v in list(entities.items()):
+    # skip multi-character entities
+    if ((_is_ucs4 and len(v) > 1) or
+            (not _is_ucs4 and len(v) > 2)):
+        continue
+    if v != "&":
+        if len(v) == 2:
+            v = _utils.surrogatePairToCodepoint(v)
+        else:
+            v = ord(v)
+        if v not in _encode_entity_map or k.islower():
+            # prefer &lt; over &LT; and similarly for &amp;, &gt;, etc.
+            _encode_entity_map[v] = k
+
+
+def htmlentityreplace_errors(exc):
+    if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)):
+        res = []
+        codepoints = []
+        skip = False
+        for i, c in enumerate(exc.object[exc.start:exc.end]):
+            if skip:
+                skip = False
+                continue
+            index = i + exc.start
+            if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]):
+                codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2])
+                skip = True
+            else:
+                codepoint = ord(c)
+            codepoints.append(codepoint)
+        for cp in codepoints:
+            e = _encode_entity_map.get(cp)
+            if e:
+                res.append("&")
+                res.append(e)
+                if not e.endswith(";"):
+                    res.append(";")
+            else:
+                res.append("&#x%s;" % (hex(cp)[2:]))
+        return ("".join(res), exc.end)
+    else:
+        return xmlcharrefreplace_errors(exc)
+
+
+register_error("htmlentityreplace", htmlentityreplace_errors)
+
+
+def serialize(input, tree="etree", encoding=None, **serializer_opts):
+    """Serializes the input token stream using the specified treewalker
+
+    :arg input: the token stream to serialize
+
+    :arg tree: the treewalker to use
+
+    :arg encoding: the encoding to use
+
+    :arg serializer_opts: any options to pass to the
+        :py:class:`html5lib.serializer.HTMLSerializer` that gets created
+
+    :returns: the tree serialized as a string
+
+    Example:
+
+    >>> from html5lib.html5parser import parse
+    >>> from html5lib.serializer import serialize
+    >>> token_stream = parse('<html><body><p>Hi!</p></body></html>')
+    >>> serialize(token_stream, omit_optional_tags=False)
+    '<html><head></head><body><p>Hi!</p></body></html>'
+
+    """
+    # XXX: Should we cache this?
+    walker = treewalkers.getTreeWalker(tree)
+    s = HTMLSerializer(**serializer_opts)
+    return s.render(walker(input), encoding)
+
+
+class HTMLSerializer(object):
+
+    # attribute quoting options
+    quote_attr_values = "legacy"  # be secure by default
+    quote_char = '"'
+    use_best_quote_char = True
+
+    # tag syntax options
+    omit_optional_tags = True
+    minimize_boolean_attributes = True
+    use_trailing_solidus = False
+    space_before_trailing_solidus = True
+
+    # escaping options
+    escape_lt_in_attrs = False
+    escape_rcdata = False
+    resolve_entities = True
+
+    # miscellaneous options
+    alphabetical_attributes = False
+    inject_meta_charset = True
+    strip_whitespace = False
+    sanitize = False
+
+    options = ("quote_attr_values", "quote_char", "use_best_quote_char",
+               "omit_optional_tags", "minimize_boolean_attributes",
+               "use_trailing_solidus", "space_before_trailing_solidus",
+               "escape_lt_in_attrs", "escape_rcdata", "resolve_entities",
+               "alphabetical_attributes", "inject_meta_charset",
+               "strip_whitespace", "sanitize")
+
+    def __init__(self, **kwargs):
+        """Initialize HTMLSerializer
+
+        :arg inject_meta_charset: Whether or not to inject the meta charset.
+
+            Defaults to ``True``.
+
+        :arg quote_attr_values: Whether to quote attribute values that don't
+            require quoting per legacy browser behavior (``"legacy"``), when
+            required by the standard (``"spec"``), or always (``"always"``).
+
+            Defaults to ``"legacy"``.
+
+        :arg quote_char: Use given quote character for attribute quoting.
+
+            Defaults to ``"`` which will use double quotes unless attribute
+            value contains a double quote, in which case single quotes are
+            used.
+
+        :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute
+            values.
+
+            Defaults to ``False``.
+
+        :arg escape_rcdata: Whether to escape characters that need to be
+            escaped within normal elements within rcdata elements such as
+            style.
+
+            Defaults to ``False``.
+
+        :arg resolve_entities: Whether to resolve named character entities that
+            appear in the source tree. The XML predefined entities &lt; &gt;
+            &amp; &quot; &apos; are unaffected by this setting.
+
+            Defaults to ``True``.
+
+        :arg strip_whitespace: Whether to remove semantically meaningless
+            whitespace. (This compresses all whitespace to a single space
+            except within ``pre``.)
+
+            Defaults to ``False``.
+
+        :arg minimize_boolean_attributes: Shortens boolean attributes to give
+            just the attribute value, for example::
+
+              <input disabled="disabled">
+
+            becomes::
+
+              <input disabled>
+
+            Defaults to ``True``.
+
+        :arg use_trailing_solidus: Includes a close-tag slash at the end of the
+            start tag of void elements (empty elements whose end tag is
+            forbidden). E.g. ``<hr/>``.
+
+            Defaults to ``False``.
+
+        :arg space_before_trailing_solidus: Places a space immediately before
+            the closing slash in a tag using a trailing solidus. E.g.
+            ``<hr />``. Requires ``use_trailing_solidus=True``.
+
+            Defaults to ``True``.
+
+        :arg sanitize: Strip all unsafe or unknown constructs from output.
+            See :py:class:`html5lib.filters.sanitizer.Filter`.
+
+            Defaults to ``False``.
+
+        :arg omit_optional_tags: Omit start/end tags that are optional.
+
+            Defaults to ``True``.
+
+        :arg alphabetical_attributes: Reorder attributes to be in alphabetical order.
+
+            Defaults to ``False``.
+
+        """
+        unexpected_args = frozenset(kwargs) - frozenset(self.options)
+        if len(unexpected_args) > 0:
+            raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args)))
+        if 'quote_char' in kwargs:
+            self.use_best_quote_char = False
+        for attr in self.options:
+            setattr(self, attr, kwargs.get(attr, getattr(self, attr)))
+        self.errors = []
+        self.strict = False
+
+    def encode(self, string):
+        assert(isinstance(string, text_type))
+        if self.encoding:
+            return string.encode(self.encoding, "htmlentityreplace")
+        else:
+            return string
+
+    def encodeStrict(self, string):
+        assert(isinstance(string, text_type))
+        if self.encoding:
+            return string.encode(self.encoding, "strict")
+        else:
+            return string
+
+    def serialize(self, treewalker, encoding=None):
+        # pylint:disable=too-many-nested-blocks
+        self.encoding = encoding
+        in_cdata = False
+        self.errors = []
+
+        if encoding and self.inject_meta_charset:
+            from .filters.inject_meta_charset import Filter
+            treewalker = Filter(treewalker, encoding)
+        # Alphabetical attributes is here under the assumption that none of
+        # the later filters add or change order of attributes; it needs to be
+        # before the sanitizer so escaped elements come out correctly
+        if self.alphabetical_attributes:
+            from .filters.alphabeticalattributes import Filter
+            treewalker = Filter(treewalker)
+        # WhitespaceFilter should be used before OptionalTagFilter
+        # for maximum efficiently of this latter filter
+        if self.strip_whitespace:
+            from .filters.whitespace import Filter
+            treewalker = Filter(treewalker)
+        if self.sanitize:
+            from .filters.sanitizer import Filter
+            treewalker = Filter(treewalker)
+        if self.omit_optional_tags:
+            from .filters.optionaltags import Filter
+            treewalker = Filter(treewalker)
+
+        for token in treewalker:
+            type = token["type"]
+            if type == "Doctype":
+                doctype = "<!DOCTYPE %s" % token["name"]
+
+                if token["publicId"]:
+                    doctype += ' PUBLIC "%s"' % token["publicId"]
+                elif token["systemId"]:
+                    doctype += " SYSTEM"
+                if token["systemId"]:
+                    if token["systemId"].find('"') >= 0:
+                        if token["systemId"].find("'") >= 0:
+                            self.serializeError("System identifer contains both single and double quote characters")
+                        quote_char = "'"
+                    else:
+                        quote_char = '"'
+                    doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char)
+
+                doctype += ">"
+                yield self.encodeStrict(doctype)
+
+            elif type in ("Characters", "SpaceCharacters"):
+                if type == "SpaceCharacters" or in_cdata:
+                    if in_cdata and token["data"].find("</") >= 0:
+                        self.serializeError("Unexpected </ in CDATA")
+                    yield self.encode(token["data"])
+                else:
+                    yield self.encode(escape(token["data"]))
+
+            elif type in ("StartTag", "EmptyTag"):
+                name = token["name"]
+                yield self.encodeStrict("<%s" % name)
+                if name in rcdataElements and not self.escape_rcdata:
+                    in_cdata = True
+                elif in_cdata:
+                    self.serializeError("Unexpected child element of a CDATA element")
+                for (_, attr_name), attr_value in token["data"].items():
+                    # TODO: Add namespace support here
+                    k = attr_name
+                    v = attr_value
+                    yield self.encodeStrict(' ')
+
+                    yield self.encodeStrict(k)
+                    if not self.minimize_boolean_attributes or \
+                        (k not in booleanAttributes.get(name, tuple()) and
+                         k not in booleanAttributes.get("", tuple())):
+                        yield self.encodeStrict("=")
+                        if self.quote_attr_values == "always" or len(v) == 0:
+                            quote_attr = True
+                        elif self.quote_attr_values == "spec":
+                            quote_attr = _quoteAttributeSpec.search(v) is not None
+                        elif self.quote_attr_values == "legacy":
+                            quote_attr = _quoteAttributeLegacy.search(v) is not None
+                        else:
+                            raise ValueError("quote_attr_values must be one of: "
+                                             "'always', 'spec', or 'legacy'")
+                        v = v.replace("&", "&amp;")
+                        if self.escape_lt_in_attrs:
+                            v = v.replace("<", "&lt;")
+                        if quote_attr:
+                            quote_char = self.quote_char
+                            if self.use_best_quote_char:
+                                if "'" in v and '"' not in v:
+                                    quote_char = '"'
+                                elif '"' in v and "'" not in v:
+                                    quote_char = "'"
+                            if quote_char == "'":
+                                v = v.replace("'", "&#39;")
+                            else:
+                                v = v.replace('"', "&quot;")
+                            yield self.encodeStrict(quote_char)
+                            yield self.encode(v)
+                            yield self.encodeStrict(quote_char)
+                        else:
+                            yield self.encode(v)
+                if name in voidElements and self.use_trailing_solidus:
+                    if self.space_before_trailing_solidus:
+                        yield self.encodeStrict(" /")
+                    else:
+                        yield self.encodeStrict("/")
+                yield self.encode(">")
+
+            elif type == "EndTag":
+                name = token["name"]
+                if name in rcdataElements:
+                    in_cdata = False
+                elif in_cdata:
+                    self.serializeError("Unexpected child element of a CDATA element")
+                yield self.encodeStrict("</%s>" % name)
+
+            elif type == "Comment":
+                data = token["data"]
+                if data.find("--") >= 0:
+                    self.serializeError("Comment contains --")
+                yield self.encodeStrict("<!--%s-->" % token["data"])
+
+            elif type == "Entity":
+                name = token["name"]
+                key = name + ";"
+                if key not in entities:
+                    self.serializeError("Entity %s not recognized" % name)
+                if self.resolve_entities and key not in xmlEntities:
+                    data = entities[key]
+                else:
+                    data = "&%s;" % name
+                yield self.encodeStrict(data)
+
+            else:
+                self.serializeError(token["data"])
+
+    def render(self, treewalker, encoding=None):
+        """Serializes the stream from the treewalker into a string
+
+        :arg treewalker: the treewalker to serialize
+
+        :arg encoding: the string encoding to use
+
+        :returns: the serialized tree
+
+        Example:
+
+        >>> from html5lib import parse, getTreeWalker
+        >>> from html5lib.serializer import HTMLSerializer
+        >>> token_stream = parse('<html><body>Hi!</body></html>')
+        >>> walker = getTreeWalker('etree')
+        >>> serializer = HTMLSerializer(omit_optional_tags=False)
+        >>> serializer.render(walker(token_stream))
+        '<html><head></head><body>Hi!</body></html>'
+
+        """
+        if encoding:
+            return b"".join(list(self.serialize(treewalker, encoding)))
+        else:
+            return "".join(list(self.serialize(treewalker)))
+
+    def serializeError(self, data="XXX ERROR MESSAGE NEEDED"):
+        # XXX The idea is to make data mandatory.
+        self.errors.append(data)
+        if self.strict:
+            raise SerializeError
+
+
+class SerializeError(Exception):
+    """Error in serialized tree"""
+    pass
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d7c1e60a8f9d363d8a2ea0be3f7986be03014c8b
GIT binary patch
literal 13932
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
B&$R#m

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py
new file mode 100644
index 00000000..7ef59590
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py
@@ -0,0 +1,30 @@
+"""Tree adapters let you convert from one tree structure to another
+
+Example:
+
+.. code-block:: python
+
+   from pip._vendor import html5lib
+   from pip._vendor.html5lib.treeadapters import genshi
+
+   doc = '<html><body>Hi!</body></html>'
+   treebuilder = html5lib.getTreeBuilder('etree')
+   parser = html5lib.HTMLParser(tree=treebuilder)
+   tree = parser.parse(doc)
+   TreeWalker = html5lib.getTreeWalker('etree')
+
+   genshi_tree = genshi.to_genshi(TreeWalker(tree))
+
+"""
+from __future__ import absolute_import, division, unicode_literals
+
+from . import sax
+
+__all__ = ["sax"]
+
+try:
+    from . import genshi  # noqa
+except ImportError:
+    pass
+else:
+    __all__.append("genshi")
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dfbd6429f9d9a7c9000a30f20db52279b55d36d2
GIT binary patch
literal 1022
zcmZSn%*&NH<x)&C0~D|_FfceIFfkODFfcHrFfc?hFr+Xtq%bk$Ff!yaF+?#j<T5iv
zF*D?{FhsF1Fs3jwq_8mLurlPbF+{O3Fs86Fq%$%^u`^VPFo5LPz;YZ6Q5+16;dz1#
zEUBCf*<1`oNeqmPjCp(v5vlA9SzHV$><rC}42&rp48a<l3=9mV7Z@2BLW)vT6%tbt
z3rbRpiWPEFOB5>eOBIsy^U6|-N)*zH@^cmP^HLQ`K+1|sib|79N{dnzO7ayF^YTkF
zQj55_Tq_cD3vyDexVZH66q55(QgxGZ@{_ZztP~0=OEU8FxVRJ)AO;m=7U;#7rRJsN
z7b#@s7UUO|C}fo6=9uPWCSg;f2b0tT*$#IjRA+i>UU5by*zlD6WCdFVbsLa+JDa5Z
zluA2~Ohp@gFv~_CEUXT)0c1{6X=YAJYLS91+-|+})DloII6-7I)Kfv~)HOjm3KENo
zQ5AcH`1%BZMKwUmY(WInOt20RU%^%ZqEQb_X{6*QgXKWBgeT@?qnZe{9wLFT9b`Sk
zlkre9Aw0d3{CEgU17RN6Et;BKT$!LGroqg>z)-@^z`&50RGgnvT9O(M3AGXqP=d=W
z%Ph{!&npoCC4#(6P@Ki*WR|2BCFT@oGBPkQXn=?kkRip16{S!bBFM(TzyPtm6v6b<
z;09U9&cMJBAD@z+93Nl81!kv}f|5&od=SW0K_F9um_RDQT#&gX5Iu=GIq~s9EFdY6
zNuJ=u;aXIbUsM9JC9$9&H7`X2qzge5*D^3L=ob`amL-;?>X#)J>8Is`VzyX6yHG#7
z*vQ=6urSNWyv)$Tyf~*ay*%C|#l*zGz`!6qPd`MzAhSR>Gq1QLF(*g2Jkhc=Fasn6
z#?T}RPB);msSgT%Sn|`4kI&4@EQycTE2spArcG{sN@-52oe%>9Lop~s*%)P*1eiFP
Mm>ESFc^O%l0FTxgy#N3J

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py
new file mode 100644
index 00000000..61d5fb6a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py
@@ -0,0 +1,54 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from genshi.core import QName, Attrs
+from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
+
+
+def to_genshi(walker):
+    """Convert a tree to a genshi tree
+
+    :arg walker: the treewalker to use to walk the tree to convert it
+
+    :returns: generator of genshi nodes
+
+    """
+    text = []
+    for token in walker:
+        type = token["type"]
+        if type in ("Characters", "SpaceCharacters"):
+            text.append(token["data"])
+        elif text:
+            yield TEXT, "".join(text), (None, -1, -1)
+            text = []
+
+        if type in ("StartTag", "EmptyTag"):
+            if token["namespace"]:
+                name = "{%s}%s" % (token["namespace"], token["name"])
+            else:
+                name = token["name"]
+            attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value)
+                           for attr, value in token["data"].items()])
+            yield (START, (QName(name), attrs), (None, -1, -1))
+            if type == "EmptyTag":
+                type = "EndTag"
+
+        if type == "EndTag":
+            if token["namespace"]:
+                name = "{%s}%s" % (token["namespace"], token["name"])
+            else:
+                name = token["name"]
+
+            yield END, QName(name), (None, -1, -1)
+
+        elif type == "Comment":
+            yield COMMENT, token["data"], (None, -1, -1)
+
+        elif type == "Doctype":
+            yield DOCTYPE, (token["name"], token["publicId"],
+                            token["systemId"]), (None, -1, -1)
+
+        else:
+            pass  # FIXME: What to do?
+
+    if text:
+        yield TEXT, "".join(text), (None, -1, -1)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..59487017ef280f135a0f6024bf0feb0960136e4c
GIT binary patch
literal 1973
zcmZSn%*&NH<x)&C0~9bZFfceIFfkOTGcYiuFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQv6y8KPJja@iQ7*dU_JU{Q94D0YTi4u&WWhFngDC{Bi4E`}&BhForj
zC~gME6c&aS28Jjeh7?wYU=20~28K+K12mW!7#K?U85kH6lZx|mN=s7XGjj{_i%Lp3
zK+ef5%Ph{!&nppNU|=ZC%S_HsNsZ6REJ-a&%qi9Yxx9pxfq@~=FEKY2%yKL#DJs?g
ziGjJnA&x;IB_JzY{ai{|7#J8rTq8nC*cliYoc(=$UHu?z7k}rF$N<-5Mg|53khLKB
zWKfWNV`N}RXJDvhWT-gFSi`{J5_^!bmWiQ;2^30_wag4P%nT_a4B2c9MYaqzj0{-}
zU^x~B$!10d#ymBUSWz-V2_wkYSxg{qGb2NaC_@@ELl`5(<U9tjDPmw#G#No=b23O4
zO<_pk0vpE3APExVW{^x{Vi2okVaS7sb2CWRvM`jefE)-?z``Jz#mdkOa-<DI3==~w
zD?=?CLkSy04J$(m4})ZiFhe#cL(y%pxvUIgdF)^rUa(th*cj577~+^13O6w{Gcwe&
zGnBA{^|FAtHS8eS6mf{NL4M|7$Yx?F(qv5GW2j|jDAZ(x`hpKEUJds}6eDrI;6PZG
zA_1|ckQW>-{9qI3FqUwFLxY7uGDQ+afdE(mFGC4DSU{m62njVI2FWyLh7>8djzV6B
z@ES&jqEC$Iks=LIlgGf2BFqr1Ap=TrQ$YzOKd&scs6-)Ap`<7^RiPwbAyFYcHLo}$
z6D+{RrJ$goV3k;uu27zslbu>*rBITQ3YLQKK{`r{!5TpVa9NOeGSuwM5~wjnsU@XF
zdBs*B8&ZoBOY(~p^3y;Zkac<aDXGN}g{7dhTvAz(TFM1-Vn$+7Vsc4pQE@3KCj}QI
zCZ{?h#6W6O5=#<GK^ZRd|NsC0OF^kTxFoTtBqT8%%yG>vD5(T-I2jli@)C1Xi$R8z
zg7Rs#YH_V<G1x|s1UTDfg0c!&)-^8$qz#m1obz*YQ}aqnL2Q@&WU%u<78R5x<zyy%
zrhqLft}HG|&Gk(217}|%oDVJ`{J_oz6A*nMbFq2=Lpdn-BWov>&kZV|K;e*BP>`CJ
z5(M%cxG2fW&&&fe{POcsgFt}{E^{(VQge%gK(+*d%Ap{T)*z5`gFr#60b-Sa#6XE5
zwFqoLNoqw2SZ_&wb}Gb7P~d^(KtT>>B$kvEffbb{=9EH8JCIPZ1}Ij+L~%6(1A~4+
zQD#|UNveKXVv&AYeojhiQL%n@p?-F;k-52HVV043nW2SwaZY7=dAv!AiHU)MfkAqn
zeu#cSW`S;IUU5lcPL6JQqGf4d21p2u<I7U>Qu2%RGfHxEOmi}m^g%fxF(t78l;rdw
znL)3hvIOM8lKgmx04SV_Z9tCWU}NNE<YMGu6k%jz6ldgQ;$h@slxE^$WMd3wlw#yz
z<bjDWi8JvqiZbyq3Nnf^voNtS`f2cjf*+K~<KxpxOG=AU<Ku%sh6aIBU=X+p0L2i*
zPQB#(qEtxOgW>}z0zj@o#6pl50|Ns%%n-zYhaM<p*yQG?l;)(`fjn0XN+mK(VvHKh
E023(FEdT%j

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py
new file mode 100644
index 00000000..f4ccea5a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py
@@ -0,0 +1,50 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.sax.xmlreader import AttributesNSImpl
+
+from ..constants import adjustForeignAttributes, unadjustForeignAttributes
+
+prefix_mapping = {}
+for prefix, localName, namespace in adjustForeignAttributes.values():
+    if prefix is not None:
+        prefix_mapping[prefix] = namespace
+
+
+def to_sax(walker, handler):
+    """Call SAX-like content handler based on treewalker walker
+
+    :arg walker: the treewalker to use to walk the tree to convert it
+
+    :arg handler: SAX handler to use
+
+    """
+    handler.startDocument()
+    for prefix, namespace in prefix_mapping.items():
+        handler.startPrefixMapping(prefix, namespace)
+
+    for token in walker:
+        type = token["type"]
+        if type == "Doctype":
+            continue
+        elif type in ("StartTag", "EmptyTag"):
+            attrs = AttributesNSImpl(token["data"],
+                                     unadjustForeignAttributes)
+            handler.startElementNS((token["namespace"], token["name"]),
+                                   token["name"],
+                                   attrs)
+            if type == "EmptyTag":
+                handler.endElementNS((token["namespace"], token["name"]),
+                                     token["name"])
+        elif type == "EndTag":
+            handler.endElementNS((token["namespace"], token["name"]),
+                                 token["name"])
+        elif type in ("Characters", "SpaceCharacters"):
+            handler.characters(token["data"])
+        elif type == "Comment":
+            pass
+        else:
+            assert False, "Unknown token type"
+
+    for prefix, namespace in prefix_mapping.items():
+        handler.endPrefixMapping(prefix)
+    handler.endDocument()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fd65684904b9816fdc344b6a61b28ca48b9d9b61
GIT binary patch
literal 1970
zcmZSn%*&NH<x)&C0~D|@FfceIFfkPOF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQv6y8KPJj7*m)TQdk&r*cfuz8KT%3ayb~HI2af+85p8C87j;eQrQ`@
zxEPul7+hjC7-E<iqPQ8Nco?F18B)0!QrH->IT?yV8B%!}QaM2)Hie-Kg`o`LDXa`F
z3=C2HASJ;X><kPHnILy+Ff%YPl<+e!FeD}w=jW7`q{e6F7UUO|lyHDtomrMyoSC0j
zBEZ1FP@0#SoS%{!pOaaVT9lYmticG<3X*XwDJjZKDlJJZ_6zpREy&4aVqjp<01+kP
zAd^$FN{dU}@{3Y4)AJB&OC-UDCSsRO25AR5la+yi!5I{cZHx>IHH-{d3?RQVR%kJl
zFfwE@fjBO)G7K?H47E%Qwaj28%nUV53^mLQ%}fl8h2jk16(Wo^pzz{htYu-SVF5*j
zWGyR04J$(m6GJu=Ls0@lp&bZ;MEDr8*%*p$FqA-)vNA}Pu!2mgWdobd1~!0=K@wyR
zJA-5z6Ig(qL9&L8p_!S15o87n*i<h@kbBv|^4K(ho#(|^Xa{x)2Urg$F?t{x_`wd<
z1Z&^`Tf)j9+04iQGmsl>paqCq!pTr<$56t>kix^z%*fEh2=Z)rg*tK=N}`4#Hz*9j
zrbRP`gZ#k*3Tnm_UWQ-|P^6cx21QI_PL4vbV}x!_W_GGVa(-S(YF>##Mq*w{PHK@t
zQetsxib8&#LP=3-YI$N#c50CVgyP~-P*6~?N-Ro;3Ro$WWTYaiE6G<VElyP^$p<Td
z%Yp=w^YhA5i%JwSOOT9#+Gz!H4cq|`Lm;Y3LHV(yvLLk-l&W0vlfi6IDi1D6EGh{}
zOfLm-TyqObDnT5O@|47q#8OTM28O)E+|=TN#N<@4DIi`c8v_G_YhDUSDHkXtG7^gt
zlS@*Iic3McDHx>K86gI;(>XskH#M)MREU9rAv7;LFTXrbp(H;$HBSNL6hCl=0lNXK
zgCNp`t<vBHWlIoI4Dy#tesU?u))GDj28M#7)U?cs_}s*Tg3P@15>VF4EJ@8RE&(|S
ztULg$!WW_-2vj%(fmDHYgB7^uq=Jm|3ohYdU|>kiOF;;L+?EXYGT3yt#GK+(ux7{N
z;?$y&%=|ppqN4mFaDkGVmx5wl2{*(<n3KV!R0$}YA&I606o}Ax1`9*HQ-TsfU~9pl
zS^|neP{@LX5=%;oiZ#GR9*8KeU|?X-FDS|^ODsv%FH0=aPs`6qNi8bY&o0!@E;ceZ
zH!RFDGA}c<FfY!jOfQc&Nii`oFfcGk&(jalFUTy=&CDw<NzBR7El;#84a@)ufpL6U
zYF<iyk$y%=ZjNbAW|BTA?I)%r7J!n5esN-jUO^?;@g@23#fcT*crpXIh=Yq!l2L?-
zmywH+hmnnuhmnhslTn<Jospf9hf$nS5KQth@-T`p@-Q+pi7`ns3NreEvtkJ-<m2Ph
zN=r(MQsd);K*j}uO6MR@AzC8Hz`#(Eo1+J^ydpQJC^a!9wFn%y;Gj#+2l*tgq&Nr^
zVBqKu0);f#m1T)JrK!b1!k{z-3g?{s<is4m#N5;%5s(l_hhKhPYLEn|#0S|sSb`Xo
hmu+(MQ%ZAE?La|M3`+kpOae?|Ol*uYj695j%m8PD*g^mR

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py
new file mode 100644
index 00000000..d44447ea
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py
@@ -0,0 +1,88 @@
+"""A collection of modules for building different kinds of trees from HTML
+documents.
+
+To create a treebuilder for a new type of tree, you need to do
+implement several things:
+
+1. A set of classes for various types of elements: Document, Doctype, Comment,
+   Element. These must implement the interface of ``base.treebuilders.Node``
+   (although comment nodes have a different signature for their constructor,
+   see ``treebuilders.etree.Comment``) Textual content may also be implemented
+   as another node type, or not, as your tree implementation requires.
+
+2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits
+   from ``treebuilders.base.TreeBuilder``. This has 4 required attributes:
+
+   * ``documentClass`` - the class to use for the bottommost node of a document
+   * ``elementClass`` - the class to use for HTML Elements
+   * ``commentClass`` - the class to use for comments
+   * ``doctypeClass`` - the class to use for doctypes
+
+   It also has one required method:
+
+   * ``getDocument`` - Returns the root node of the complete document tree
+
+3. If you wish to run the unit tests, you must also create a ``testSerializer``
+   method on your treebuilder which accepts a node and returns a string
+   containing Node and its children serialized according to the format used in
+   the unittests
+
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .._utils import default_etree
+
+treeBuilderCache = {}
+
+
+def getTreeBuilder(treeType, implementation=None, **kwargs):
+    """Get a TreeBuilder class for various types of trees with built-in support
+
+    :arg treeType: the name of the tree type required (case-insensitive). Supported
+        values are:
+
+        * "dom" - A generic builder for DOM implementations, defaulting to a
+          xml.dom.minidom based implementation.
+        * "etree" - A generic builder for tree implementations exposing an
+          ElementTree-like interface, defaulting to xml.etree.cElementTree if
+          available and xml.etree.ElementTree if not.
+        * "lxml" - A etree-based builder for lxml.etree, handling limitations
+          of lxml's implementation.
+
+    :arg implementation: (Currently applies to the "etree" and "dom" tree
+        types). A module implementing the tree type e.g. xml.etree.ElementTree
+        or xml.etree.cElementTree.
+
+    :arg kwargs: Any additional options to pass to the TreeBuilder when
+        creating it.
+
+    Example:
+
+    >>> from html5lib.treebuilders import getTreeBuilder
+    >>> builder = getTreeBuilder('etree')
+
+    """
+
+    treeType = treeType.lower()
+    if treeType not in treeBuilderCache:
+        if treeType == "dom":
+            from . import dom
+            # Come up with a sane default (pref. from the stdlib)
+            if implementation is None:
+                from xml.dom import minidom
+                implementation = minidom
+            # NEVER cache here, caching is done in the dom submodule
+            return dom.getDomModule(implementation, **kwargs).TreeBuilder
+        elif treeType == "lxml":
+            from . import etree_lxml
+            treeBuilderCache[treeType] = etree_lxml.TreeBuilder
+        elif treeType == "etree":
+            from . import etree
+            if implementation is None:
+                implementation = default_etree
+            # NEVER cache here, caching is done in the etree submodule
+            return etree.getETreeModule(implementation, **kwargs).TreeBuilder
+        else:
+            raise ValueError("""Unrecognised treebuilder "%s" """ % treeType)
+    return treeBuilderCache.get(treeType)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ba5d7e5df3f48da1f3ad402165f36d5fb1b25f85
GIT binary patch
literal 3662
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
bg75(~JZvDviXA8g7lQ=Ym}Hm)nAn&B@km2B

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py
new file mode 100644
index 00000000..73973db5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py
@@ -0,0 +1,417 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+from ..constants import scopingElements, tableInsertModeElements, namespaces
+
+# The scope markers are inserted when entering object elements,
+# marquees, table cells, and table captions, and are used to prevent formatting
+# from "leaking" into tables, object elements, and marquees.
+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),
+    "table": (frozenset([(namespaces["html"], "html"),
+                         (namespaces["html"], "table")]), False),
+    "select": (frozenset([(namespaces["html"], "optgroup"),
+                          (namespaces["html"], "option")]), True)
+}
+
+
+class Node(object):
+    """Represents an item in the tree"""
+    def __init__(self, name):
+        """Creates a Node
+
+        :arg name: The tag name associated with the node
+
+        """
+        # The tag name assocaited with the node
+        self.name = name
+        # The parent of the current node (or None for the document node)
+        self.parent = None
+        # The value of the current node (applies to text nodes and comments)
+        self.value = None
+        # A dict holding name -> value pairs for attributes of the node
+        self.attributes = {}
+        # A list of child nodes of the current node. This must include all
+        # elements but not necessarily other node types.
+        self.childNodes = []
+        # A list of miscellaneous flags that can be set on the node.
+        self._flags = []
+
+    def __str__(self):
+        attributesStr = " ".join(["%s=\"%s\"" % (name, value)
+                                  for name, value in
+                                  self.attributes.items()])
+        if attributesStr:
+            return "<%s %s>" % (self.name, attributesStr)
+        else:
+            return "<%s>" % (self.name)
+
+    def __repr__(self):
+        return "<%s>" % (self.name)
+
+    def appendChild(self, node):
+        """Insert node as a child of the current node
+
+        :arg node: the node to insert
+
+        """
+        raise NotImplementedError
+
+    def insertText(self, data, insertBefore=None):
+        """Insert data as text in the current node, positioned before the
+        start of node insertBefore or to the end of the node's text.
+
+        :arg data: the data to insert
+
+        :arg insertBefore: True if you want to insert the text before the node
+            and False if you want to insert it after the node
+
+        """
+        raise NotImplementedError
+
+    def insertBefore(self, node, refNode):
+        """Insert node as a child of the current node, before refNode in the
+        list of child nodes. Raises ValueError if refNode is not a child of
+        the current node
+
+        :arg node: the node to insert
+
+        :arg refNode: the child node to insert the node before
+
+        """
+        raise NotImplementedError
+
+    def removeChild(self, node):
+        """Remove node from the children of the current node
+
+        :arg node: the child node to remove
+
+        """
+        raise NotImplementedError
+
+    def reparentChildren(self, newParent):
+        """Move all the children of the current node to newParent.
+        This is needed so that trees that don't store text as nodes move the
+        text in the correct way
+
+        :arg newParent: the node to move all this node's children to
+
+        """
+        # XXX - should this method be made more general?
+        for child in self.childNodes:
+            newParent.appendChild(child)
+        self.childNodes = []
+
+    def cloneNode(self):
+        """Return a shallow copy of the current node i.e. a node with the same
+        name and attributes but with no parent or child nodes
+        """
+        raise NotImplementedError
+
+    def hasContent(self):
+        """Return true if the node has children or text, false otherwise
+        """
+        raise NotImplementedError
+
+
+class ActiveFormattingElements(list):
+    def append(self, node):
+        equalCount = 0
+        if node != Marker:
+            for element in self[::-1]:
+                if element == Marker:
+                    break
+                if self.nodesEqual(element, node):
+                    equalCount += 1
+                if equalCount == 3:
+                    self.remove(element)
+                    break
+        list.append(self, node)
+
+    def nodesEqual(self, node1, node2):
+        if not node1.nameTuple == node2.nameTuple:
+            return False
+
+        if not node1.attributes == node2.attributes:
+            return False
+
+        return True
+
+
+class TreeBuilder(object):
+    """Base treebuilder implementation
+
+    * documentClass - the class to use for the bottommost node of a document
+    * elementClass - the class to use for HTML Elements
+    * commentClass - the class to use for comments
+    * doctypeClass - the class to use for doctypes
+
+    """
+    # pylint:disable=not-callable
+
+    # Document class
+    documentClass = None
+
+    # The class to use for creating a node
+    elementClass = None
+
+    # The class to use for creating comments
+    commentClass = None
+
+    # The class to use for creating doctypes
+    doctypeClass = None
+
+    # Fragment class
+    fragmentClass = None
+
+    def __init__(self, namespaceHTMLElements):
+        """Create a TreeBuilder
+
+        :arg namespaceHTMLElements: whether or not to namespace HTML elements
+
+        """
+        if namespaceHTMLElements:
+            self.defaultNamespace = "http://www.w3.org/1999/xhtml"
+        else:
+            self.defaultNamespace = None
+        self.reset()
+
+    def reset(self):
+        self.openElements = []
+        self.activeFormattingElements = ActiveFormattingElements()
+
+        # XXX - rename these to headElement, formElement
+        self.headPointer = None
+        self.formPointer = None
+
+        self.insertFromTable = False
+
+        self.document = self.documentClass()
+
+    def elementInScope(self, target, variant=None):
+
+        # If we pass a node in we match that. if we pass a string
+        # match any node with that name
+        exactNode = hasattr(target, "nameTuple")
+        if not exactNode:
+            if isinstance(target, text_type):
+                target = (namespaces["html"], target)
+            assert isinstance(target, tuple)
+
+        listElements, invert = listElementsMap[variant]
+
+        for node in reversed(self.openElements):
+            if exactNode and node == target:
+                return True
+            elif not exactNode and node.nameTuple == target:
+                return True
+            elif (invert ^ (node.nameTuple in listElements)):
+                return False
+
+        assert False  # We should never reach this point
+
+    def reconstructActiveFormattingElements(self):
+        # Within this algorithm the order of steps described in the
+        # specification is not quite the same as the order of steps in the
+        # code. It should still do the same though.
+
+        # Step 1: stop the algorithm when there's nothing to do.
+        if not self.activeFormattingElements:
+            return
+
+        # Step 2 and step 3: we start with the last element. So i is -1.
+        i = len(self.activeFormattingElements) - 1
+        entry = self.activeFormattingElements[i]
+        if entry == Marker or entry in self.openElements:
+            return
+
+        # Step 6
+        while entry != Marker and entry not in self.openElements:
+            if i == 0:
+                # This will be reset to 0 below
+                i = -1
+                break
+            i -= 1
+            # Step 5: let entry be one earlier in the list.
+            entry = self.activeFormattingElements[i]
+
+        while True:
+            # Step 7
+            i += 1
+
+            # Step 8
+            entry = self.activeFormattingElements[i]
+            clone = entry.cloneNode()  # Mainly to get a new copy of the attributes
+
+            # Step 9
+            element = self.insertElement({"type": "StartTag",
+                                          "name": clone.name,
+                                          "namespace": clone.namespace,
+                                          "data": clone.attributes})
+
+            # Step 10
+            self.activeFormattingElements[i] = element
+
+            # Step 11
+            if element == self.activeFormattingElements[-1]:
+                break
+
+    def clearActiveFormattingElements(self):
+        entry = self.activeFormattingElements.pop()
+        while self.activeFormattingElements and entry != Marker:
+            entry = self.activeFormattingElements.pop()
+
+    def elementInActiveFormattingElements(self, name):
+        """Check if an element exists between the end of the active
+        formatting elements and the last marker. If it does, return it, else
+        return false"""
+
+        for item in self.activeFormattingElements[::-1]:
+            # Check for Marker first because if it's a Marker it doesn't have a
+            # name attribute.
+            if item == Marker:
+                break
+            elif item.name == name:
+                return item
+        return False
+
+    def insertRoot(self, token):
+        element = self.createElement(token)
+        self.openElements.append(element)
+        self.document.appendChild(element)
+
+    def insertDoctype(self, token):
+        name = token["name"]
+        publicId = token["publicId"]
+        systemId = token["systemId"]
+
+        doctype = self.doctypeClass(name, publicId, systemId)
+        self.document.appendChild(doctype)
+
+    def insertComment(self, token, parent=None):
+        if parent is None:
+            parent = self.openElements[-1]
+        parent.appendChild(self.commentClass(token["data"]))
+
+    def createElement(self, token):
+        """Create an element but don't insert it anywhere"""
+        name = token["name"]
+        namespace = token.get("namespace", self.defaultNamespace)
+        element = self.elementClass(name, namespace)
+        element.attributes = token["data"]
+        return element
+
+    def _getInsertFromTable(self):
+        return self._insertFromTable
+
+    def _setInsertFromTable(self, value):
+        """Switch the function used to insert an element from the
+        normal one to the misnested table one and back again"""
+        self._insertFromTable = value
+        if value:
+            self.insertElement = self.insertElementTable
+        else:
+            self.insertElement = self.insertElementNormal
+
+    insertFromTable = property(_getInsertFromTable, _setInsertFromTable)
+
+    def insertElementNormal(self, token):
+        name = token["name"]
+        assert isinstance(name, text_type), "Element %s not unicode" % name
+        namespace = token.get("namespace", self.defaultNamespace)
+        element = self.elementClass(name, namespace)
+        element.attributes = token["data"]
+        self.openElements[-1].appendChild(element)
+        self.openElements.append(element)
+        return element
+
+    def insertElementTable(self, token):
+        """Create an element and insert it into the tree"""
+        element = self.createElement(token)
+        if self.openElements[-1].name not in tableInsertModeElements:
+            return self.insertElementNormal(token)
+        else:
+            # We should be in the InTable mode. This means we want to do
+            # special magic element rearranging
+            parent, insertBefore = self.getTableMisnestedNodePosition()
+            if insertBefore is None:
+                parent.appendChild(element)
+            else:
+                parent.insertBefore(element, insertBefore)
+            self.openElements.append(element)
+        return element
+
+    def insertText(self, data, parent=None):
+        """Insert text data."""
+        if parent is None:
+            parent = self.openElements[-1]
+
+        if (not self.insertFromTable or (self.insertFromTable and
+                                         self.openElements[-1].name
+                                         not in tableInsertModeElements)):
+            parent.insertText(data)
+        else:
+            # We should be in the InTable mode. This means we want to do
+            # special magic element rearranging
+            parent, insertBefore = self.getTableMisnestedNodePosition()
+            parent.insertText(data, insertBefore)
+
+    def getTableMisnestedNodePosition(self):
+        """Get the foster parent element, and sibling to insert before
+        (or None) when inserting a misnested table node"""
+        # The foster parent element is the one which comes before the most
+        # recently opened table element
+        # XXX - this is really inelegant
+        lastTable = None
+        fosterParent = None
+        insertBefore = None
+        for elm in self.openElements[::-1]:
+            if elm.name == "table":
+                lastTable = elm
+                break
+        if lastTable:
+            # XXX - we should really check that this parent is actually a
+            # node here
+            if lastTable.parent:
+                fosterParent = lastTable.parent
+                insertBefore = lastTable
+            else:
+                fosterParent = self.openElements[
+                    self.openElements.index(lastTable) - 1]
+        else:
+            fosterParent = self.openElements[0]
+        return fosterParent, insertBefore
+
+    def generateImpliedEndTags(self, exclude=None):
+        name = self.openElements[-1].name
+        # XXX td, th and tr are not actually needed
+        if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and
+                name != exclude):
+            self.openElements.pop()
+            # XXX This is not entirely what the specification says. We should
+            # investigate it more closely.
+            self.generateImpliedEndTags(exclude)
+
+    def getDocument(self):
+        """Return the final tree"""
+        return self.document
+
+    def getFragment(self):
+        """Return the final fragment"""
+        # assert self.innerHTML
+        fragment = self.fragmentClass()
+        self.openElements[0].reparentChildren(fragment)
+        return fragment
+
+    def testSerializer(self, node):
+        """Serialize the subtree of node in the format required by unit tests
+
+        :arg node: the node from which to start serializing
+
+        """
+        raise NotImplementedError
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8c444cebac9ab7c5f53ec751cd237aca58bfe0b5
GIT binary patch
literal 16123
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
YX4GO7V^m}mV3cJPU{qicOBRy=005mPxBvhE

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py
new file mode 100644
index 00000000..dcfac220
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py
@@ -0,0 +1,236 @@
+from __future__ import absolute_import, division, unicode_literals
+
+
+from collections import MutableMapping
+from xml.dom import minidom, Node
+import weakref
+
+from . import base
+from .. import constants
+from ..constants import namespaces
+from .._utils import moduleFactoryFactory
+
+
+def getDomBuilder(DomImplementation):
+    Dom = DomImplementation
+
+    class AttrList(MutableMapping):
+        def __init__(self, element):
+            self.element = element
+
+        def __iter__(self):
+            return iter(self.element.attributes.keys())
+
+        def __setitem__(self, name, value):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                attr = self.element.ownerDocument.createAttribute(name)
+                attr.value = value
+                self.element.attributes[name] = attr
+
+        def __len__(self):
+            return len(self.element.attributes)
+
+        def items(self):
+            return list(self.element.attributes.items())
+
+        def values(self):
+            return list(self.element.attributes.values())
+
+        def __getitem__(self, name):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                return self.element.attributes[name].value
+
+        def __delitem__(self, name):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                del self.element.attributes[name]
+
+    class NodeBuilder(base.Node):
+        def __init__(self, element):
+            base.Node.__init__(self, element.nodeName)
+            self.element = element
+
+        namespace = property(lambda self: hasattr(self.element, "namespaceURI") and
+                             self.element.namespaceURI or None)
+
+        def appendChild(self, node):
+            node.parent = self
+            self.element.appendChild(node.element)
+
+        def insertText(self, data, insertBefore=None):
+            text = self.element.ownerDocument.createTextNode(data)
+            if insertBefore:
+                self.element.insertBefore(text, insertBefore.element)
+            else:
+                self.element.appendChild(text)
+
+        def insertBefore(self, node, refNode):
+            self.element.insertBefore(node.element, refNode.element)
+            node.parent = self
+
+        def removeChild(self, node):
+            if node.element.parentNode == self.element:
+                self.element.removeChild(node.element)
+            node.parent = None
+
+        def reparentChildren(self, newParent):
+            while self.element.hasChildNodes():
+                child = self.element.firstChild
+                self.element.removeChild(child)
+                newParent.element.appendChild(child)
+            self.childNodes = []
+
+        def getAttributes(self):
+            return AttrList(self.element)
+
+        def setAttributes(self, attributes):
+            if attributes:
+                for name, value in list(attributes.items()):
+                    if isinstance(name, tuple):
+                        if name[0] is not None:
+                            qualifiedName = (name[0] + ":" + name[1])
+                        else:
+                            qualifiedName = name[1]
+                        self.element.setAttributeNS(name[2], qualifiedName,
+                                                    value)
+                    else:
+                        self.element.setAttribute(
+                            name, value)
+        attributes = property(getAttributes, setAttributes)
+
+        def cloneNode(self):
+            return NodeBuilder(self.element.cloneNode(False))
+
+        def hasContent(self):
+            return self.element.hasChildNodes()
+
+        def getNameTuple(self):
+            if self.namespace is None:
+                return namespaces["html"], self.name
+            else:
+                return self.namespace, self.name
+
+        nameTuple = property(getNameTuple)
+
+    class TreeBuilder(base.TreeBuilder):  # pylint:disable=unused-variable
+        def documentClass(self):
+            self.dom = Dom.getDOMImplementation().createDocument(None, None, None)
+            return weakref.proxy(self)
+
+        def insertDoctype(self, token):
+            name = token["name"]
+            publicId = token["publicId"]
+            systemId = token["systemId"]
+
+            domimpl = Dom.getDOMImplementation()
+            doctype = domimpl.createDocumentType(name, publicId, systemId)
+            self.document.appendChild(NodeBuilder(doctype))
+            if Dom == minidom:
+                doctype.ownerDocument = self.dom
+
+        def elementClass(self, name, namespace=None):
+            if namespace is None and self.defaultNamespace is None:
+                node = self.dom.createElement(name)
+            else:
+                node = self.dom.createElementNS(namespace, name)
+
+            return NodeBuilder(node)
+
+        def commentClass(self, data):
+            return NodeBuilder(self.dom.createComment(data))
+
+        def fragmentClass(self):
+            return NodeBuilder(self.dom.createDocumentFragment())
+
+        def appendChild(self, node):
+            self.dom.appendChild(node.element)
+
+        def testSerializer(self, element):
+            return testSerializer(element)
+
+        def getDocument(self):
+            return self.dom
+
+        def getFragment(self):
+            return base.TreeBuilder.getFragment(self).element
+
+        def insertText(self, data, parent=None):
+            data = data
+            if parent != self:
+                base.TreeBuilder.insertText(self, data, parent)
+            else:
+                # HACK: allow text nodes as children of the document node
+                if hasattr(self.dom, '_child_node_types'):
+                    # pylint:disable=protected-access
+                    if Node.TEXT_NODE not in self.dom._child_node_types:
+                        self.dom._child_node_types = list(self.dom._child_node_types)
+                        self.dom._child_node_types.append(Node.TEXT_NODE)
+                self.dom.appendChild(self.dom.createTextNode(data))
+
+        implementation = DomImplementation
+        name = None
+
+    def testSerializer(element):
+        element.normalize()
+        rv = []
+
+        def serializeElement(element, indent=0):
+            if element.nodeType == Node.DOCUMENT_TYPE_NODE:
+                if element.name:
+                    if element.publicId or element.systemId:
+                        publicId = element.publicId or ""
+                        systemId = element.systemId or ""
+                        rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" %
+                                  (' ' * indent, element.name, publicId, systemId))
+                    else:
+                        rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name))
+                else:
+                    rv.append("|%s<!DOCTYPE >" % (' ' * indent,))
+            elif element.nodeType == Node.DOCUMENT_NODE:
+                rv.append("#document")
+            elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
+                rv.append("#document-fragment")
+            elif element.nodeType == Node.COMMENT_NODE:
+                rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue))
+            elif element.nodeType == Node.TEXT_NODE:
+                rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue))
+            else:
+                if (hasattr(element, "namespaceURI") and
+                        element.namespaceURI is not None):
+                    name = "%s %s" % (constants.prefixes[element.namespaceURI],
+                                      element.nodeName)
+                else:
+                    name = element.nodeName
+                rv.append("|%s<%s>" % (' ' * indent, name))
+                if element.hasAttributes():
+                    attributes = []
+                    for i in range(len(element.attributes)):
+                        attr = element.attributes.item(i)
+                        name = attr.nodeName
+                        value = attr.value
+                        ns = attr.namespaceURI
+                        if ns:
+                            name = "%s %s" % (constants.prefixes[ns], attr.localName)
+                        else:
+                            name = attr.nodeName
+                        attributes.append((name, value))
+
+                    for name, value in sorted(attributes):
+                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+            indent += 2
+            for child in element.childNodes:
+                serializeElement(child, indent)
+        serializeElement(element, 0)
+
+        return "\n".join(rv)
+
+    return locals()
+
+
+# The actual means to get a module!
+getDomModule = moduleFactoryFactory(getDomBuilder)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5921ef3ee1c9b70dd854338a56f42e60fc3820b4
GIT binary patch
literal 13400
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
new file mode 100644
index 00000000..0dedf441
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
@@ -0,0 +1,340 @@
+from __future__ import absolute_import, division, unicode_literals
+# pylint:disable=protected-access
+
+from pip._vendor.six import text_type
+
+import re
+
+from . import base
+from .. import _ihatexml
+from .. import constants
+from ..constants import namespaces
+from .._utils import moduleFactoryFactory
+
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+
+def getETreeBuilder(ElementTreeImplementation, fullTree=False):
+    ElementTree = ElementTreeImplementation
+    ElementTreeCommentType = ElementTree.Comment("asd").tag
+
+    class Element(base.Node):
+        def __init__(self, name, namespace=None):
+            self._name = name
+            self._namespace = namespace
+            self._element = ElementTree.Element(self._getETreeTag(name,
+                                                                  namespace))
+            if namespace is None:
+                self.nameTuple = namespaces["html"], self._name
+            else:
+                self.nameTuple = self._namespace, self._name
+            self.parent = None
+            self._childNodes = []
+            self._flags = []
+
+        def _getETreeTag(self, name, namespace):
+            if namespace is None:
+                etree_tag = name
+            else:
+                etree_tag = "{%s}%s" % (namespace, name)
+            return etree_tag
+
+        def _setName(self, name):
+            self._name = name
+            self._element.tag = self._getETreeTag(self._name, self._namespace)
+
+        def _getName(self):
+            return self._name
+
+        name = property(_getName, _setName)
+
+        def _setNamespace(self, namespace):
+            self._namespace = namespace
+            self._element.tag = self._getETreeTag(self._name, self._namespace)
+
+        def _getNamespace(self):
+            return self._namespace
+
+        namespace = property(_getNamespace, _setNamespace)
+
+        def _getAttributes(self):
+            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)
+
+        attributes = property(_getAttributes, _setAttributes)
+
+        def _getChildNodes(self):
+            return self._childNodes
+
+        def _setChildNodes(self, value):
+            del self._element[:]
+            self._childNodes = []
+            for element in value:
+                self.insertChild(element)
+
+        childNodes = property(_getChildNodes, _setChildNodes)
+
+        def hasContent(self):
+            """Return true if the node has children or text"""
+            return bool(self._element.text or len(self._element))
+
+        def appendChild(self, node):
+            self._childNodes.append(node)
+            self._element.append(node._element)
+            node.parent = self
+
+        def insertBefore(self, node, refNode):
+            index = list(self._element).index(refNode._element)
+            self._element.insert(index, node._element)
+            node.parent = self
+
+        def removeChild(self, node):
+            self._childNodes.remove(node)
+            self._element.remove(node._element)
+            node.parent = None
+
+        def insertText(self, data, insertBefore=None):
+            if not(len(self._element)):
+                if not self._element.text:
+                    self._element.text = ""
+                self._element.text += data
+            elif insertBefore is None:
+                # Insert the text as the tail of the last child element
+                if not self._element[-1].tail:
+                    self._element[-1].tail = ""
+                self._element[-1].tail += data
+            else:
+                # Insert the text before the specified node
+                children = list(self._element)
+                index = children.index(insertBefore._element)
+                if index > 0:
+                    if not self._element[index - 1].tail:
+                        self._element[index - 1].tail = ""
+                    self._element[index - 1].tail += data
+                else:
+                    if not self._element.text:
+                        self._element.text = ""
+                    self._element.text += data
+
+        def cloneNode(self):
+            element = type(self)(self.name, self.namespace)
+            for name, value in self.attributes.items():
+                element.attributes[name] = value
+            return element
+
+        def reparentChildren(self, newParent):
+            if newParent.childNodes:
+                newParent.childNodes[-1]._element.tail += self._element.text
+            else:
+                if not newParent._element.text:
+                    newParent._element.text = ""
+                if self._element.text is not None:
+                    newParent._element.text += self._element.text
+            self._element.text = ""
+            base.Node.reparentChildren(self, newParent)
+
+    class Comment(Element):
+        def __init__(self, data):
+            # Use the superclass constructor to set all properties on the
+            # wrapper element
+            self._element = ElementTree.Comment(data)
+            self.parent = None
+            self._childNodes = []
+            self._flags = []
+
+        def _getData(self):
+            return self._element.text
+
+        def _setData(self, value):
+            self._element.text = value
+
+        data = property(_getData, _setData)
+
+    class DocumentType(Element):
+        def __init__(self, name, publicId, systemId):
+            Element.__init__(self, "<!DOCTYPE>")
+            self._element.text = name
+            self.publicId = publicId
+            self.systemId = systemId
+
+        def _getPublicId(self):
+            return self._element.get("publicId", "")
+
+        def _setPublicId(self, value):
+            if value is not None:
+                self._element.set("publicId", value)
+
+        publicId = property(_getPublicId, _setPublicId)
+
+        def _getSystemId(self):
+            return self._element.get("systemId", "")
+
+        def _setSystemId(self, value):
+            if value is not None:
+                self._element.set("systemId", value)
+
+        systemId = property(_getSystemId, _setSystemId)
+
+    class Document(Element):
+        def __init__(self):
+            Element.__init__(self, "DOCUMENT_ROOT")
+
+    class DocumentFragment(Element):
+        def __init__(self):
+            Element.__init__(self, "DOCUMENT_FRAGMENT")
+
+    def testSerializer(element):
+        rv = []
+
+        def serializeElement(element, indent=0):
+            if not(hasattr(element, "tag")):
+                element = element.getroot()
+            if element.tag == "<!DOCTYPE>":
+                if element.get("publicId") or element.get("systemId"):
+                    publicId = element.get("publicId") or ""
+                    systemId = element.get("systemId") or ""
+                    rv.append("""<!DOCTYPE %s "%s" "%s">""" %
+                              (element.text, publicId, systemId))
+                else:
+                    rv.append("<!DOCTYPE %s>" % (element.text,))
+            elif element.tag == "DOCUMENT_ROOT":
+                rv.append("#document")
+                if element.text is not None:
+                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+                if element.tail is not None:
+                    raise TypeError("Document node cannot have tail")
+                if hasattr(element, "attrib") and len(element.attrib):
+                    raise TypeError("Document node cannot have attributes")
+            elif element.tag == ElementTreeCommentType:
+                rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
+            else:
+                assert isinstance(element.tag, text_type), \
+                    "Expected unicode, got %s, %s" % (type(element.tag), element.tag)
+                nsmatch = tag_regexp.match(element.tag)
+
+                if nsmatch is None:
+                    name = element.tag
+                else:
+                    ns, name = nsmatch.groups()
+                    prefix = constants.prefixes[ns]
+                    name = "%s %s" % (prefix, name)
+                rv.append("|%s<%s>" % (' ' * indent, name))
+
+                if hasattr(element, "attrib"):
+                    attributes = []
+                    for name, value in element.attrib.items():
+                        nsmatch = tag_regexp.match(name)
+                        if nsmatch is not None:
+                            ns, name = nsmatch.groups()
+                            prefix = constants.prefixes[ns]
+                            attr_string = "%s %s" % (prefix, name)
+                        else:
+                            attr_string = name
+                        attributes.append((attr_string, value))
+
+                    for name, value in sorted(attributes):
+                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+                if element.text:
+                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+            indent += 2
+            for child in element:
+                serializeElement(child, indent)
+            if element.tail:
+                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
+        serializeElement(element, 0)
+
+        return "\n".join(rv)
+
+    def tostring(element):  # pylint:disable=unused-variable
+        """Serialize an element and its child nodes to a string"""
+        rv = []
+        filter = _ihatexml.InfosetFilter()
+
+        def serializeElement(element):
+            if isinstance(element, ElementTree.ElementTree):
+                element = element.getroot()
+
+            if element.tag == "<!DOCTYPE>":
+                if element.get("publicId") or element.get("systemId"):
+                    publicId = element.get("publicId") or ""
+                    systemId = element.get("systemId") or ""
+                    rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" %
+                              (element.text, publicId, systemId))
+                else:
+                    rv.append("<!DOCTYPE %s>" % (element.text,))
+            elif element.tag == "DOCUMENT_ROOT":
+                if element.text is not None:
+                    rv.append(element.text)
+                if element.tail is not None:
+                    raise TypeError("Document node cannot have tail")
+                if hasattr(element, "attrib") and len(element.attrib):
+                    raise TypeError("Document node cannot have attributes")
+
+                for child in element:
+                    serializeElement(child)
+
+            elif element.tag == ElementTreeCommentType:
+                rv.append("<!--%s-->" % (element.text,))
+            else:
+                # This is assumed to be an ordinary element
+                if not element.attrib:
+                    rv.append("<%s>" % (filter.fromXmlName(element.tag),))
+                else:
+                    attr = " ".join(["%s=\"%s\"" % (
+                        filter.fromXmlName(name), value)
+                        for name, value in element.attrib.items()])
+                    rv.append("<%s %s>" % (element.tag, attr))
+                if element.text:
+                    rv.append(element.text)
+
+                for child in element:
+                    serializeElement(child)
+
+                rv.append("</%s>" % (element.tag,))
+
+            if element.tail:
+                rv.append(element.tail)
+
+        serializeElement(element)
+
+        return "".join(rv)
+
+    class TreeBuilder(base.TreeBuilder):  # pylint:disable=unused-variable
+        documentClass = Document
+        doctypeClass = DocumentType
+        elementClass = Element
+        commentClass = Comment
+        fragmentClass = DocumentFragment
+        implementation = ElementTreeImplementation
+
+        def testSerializer(self, element):
+            return testSerializer(element)
+
+        def getDocument(self):
+            if fullTree:
+                return self.document._element
+            else:
+                if self.defaultNamespace is not None:
+                    return self.document._element.find(
+                        "{%s}html" % self.defaultNamespace)
+                else:
+                    return self.document._element.find("html")
+
+        def getFragment(self):
+            return base.TreeBuilder.getFragment(self)._element
+
+    return locals()
+
+
+getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..75fb60047a79797eb7602bf80abd1adde610479f
GIT binary patch
literal 16763
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
a_<#dehFO3Kw18BA5e%95nR)&*xBvjv2U2AK

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
new file mode 100644
index 00000000..ca12a99c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
@@ -0,0 +1,366 @@
+"""Module for supporting the lxml.etree library. The idea here is to use as much
+of the native library as possible, without using fragile hacks like custom element
+names that break between releases. The downside of this is that we cannot represent
+all possible trees; specifically the following are known to cause problems:
+
+Text or comments as siblings of the root element
+Docypes with no name
+
+When any of these things occur, we emit a DataLossWarning
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+# pylint:disable=protected-access
+
+import warnings
+import re
+import sys
+
+from . import base
+from ..constants import DataLossWarning
+from .. import constants
+from . import etree as etree_builders
+from .. import _ihatexml
+
+import lxml.etree as etree
+
+
+fullTree = True
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+comment_type = etree.Comment("asd").tag
+
+
+class DocumentType(object):
+    def __init__(self, name, publicId, systemId):
+        self.name = name
+        self.publicId = publicId
+        self.systemId = systemId
+
+
+class Document(object):
+    def __init__(self):
+        self._elementTree = None
+        self._childNodes = []
+
+    def appendChild(self, element):
+        self._elementTree.getroot().addnext(element._element)
+
+    def _getChildNodes(self):
+        return self._childNodes
+
+    childNodes = property(_getChildNodes)
+
+
+def testSerializer(element):
+    rv = []
+    infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
+
+    def serializeElement(element, indent=0):
+        if not hasattr(element, "tag"):
+            if hasattr(element, "getroot"):
+                # Full tree case
+                rv.append("#document")
+                if element.docinfo.internalDTD:
+                    if not (element.docinfo.public_id or
+                            element.docinfo.system_url):
+                        dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
+                    else:
+                        dtd_str = """<!DOCTYPE %s "%s" "%s">""" % (
+                            element.docinfo.root_name,
+                            element.docinfo.public_id,
+                            element.docinfo.system_url)
+                    rv.append("|%s%s" % (' ' * (indent + 2), dtd_str))
+                next_element = element.getroot()
+                while next_element.getprevious() is not None:
+                    next_element = next_element.getprevious()
+                while next_element is not None:
+                    serializeElement(next_element, indent + 2)
+                    next_element = next_element.getnext()
+            elif isinstance(element, str) or isinstance(element, bytes):
+                # Text in a fragment
+                assert isinstance(element, str) or sys.version_info[0] == 2
+                rv.append("|%s\"%s\"" % (' ' * indent, element))
+            else:
+                # Fragment case
+                rv.append("#document-fragment")
+                for next_element in element:
+                    serializeElement(next_element, indent + 2)
+        elif element.tag == comment_type:
+            rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
+            if hasattr(element, "tail") and element.tail:
+                rv.append("|%s\"%s\"" % (' ' * indent, element.tail))
+        else:
+            assert isinstance(element, etree._Element)
+            nsmatch = etree_builders.tag_regexp.match(element.tag)
+            if nsmatch is not None:
+                ns = nsmatch.group(1)
+                tag = nsmatch.group(2)
+                prefix = constants.prefixes[ns]
+                rv.append("|%s<%s %s>" % (' ' * indent, prefix,
+                                          infosetFilter.fromXmlName(tag)))
+            else:
+                rv.append("|%s<%s>" % (' ' * indent,
+                                       infosetFilter.fromXmlName(element.tag)))
+
+            if hasattr(element, "attrib"):
+                attributes = []
+                for name, value in element.attrib.items():
+                    nsmatch = tag_regexp.match(name)
+                    if nsmatch is not None:
+                        ns, name = nsmatch.groups()
+                        name = infosetFilter.fromXmlName(name)
+                        prefix = constants.prefixes[ns]
+                        attr_string = "%s %s" % (prefix, name)
+                    else:
+                        attr_string = infosetFilter.fromXmlName(name)
+                    attributes.append((attr_string, value))
+
+                for name, value in sorted(attributes):
+                    rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+
+            if element.text:
+                rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+            indent += 2
+            for child in element:
+                serializeElement(child, indent)
+            if hasattr(element, "tail") and element.tail:
+                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
+    serializeElement(element, 0)
+
+    return "\n".join(rv)
+
+
+def tostring(element):
+    """Serialize an element and its child nodes to a string"""
+    rv = []
+
+    def serializeElement(element):
+        if not hasattr(element, "tag"):
+            if element.docinfo.internalDTD:
+                if element.docinfo.doctype:
+                    dtd_str = element.docinfo.doctype
+                else:
+                    dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
+                rv.append(dtd_str)
+            serializeElement(element.getroot())
+
+        elif element.tag == comment_type:
+            rv.append("<!--%s-->" % (element.text,))
+
+        else:
+            # This is assumed to be an ordinary element
+            if not element.attrib:
+                rv.append("<%s>" % (element.tag,))
+            else:
+                attr = " ".join(["%s=\"%s\"" % (name, value)
+                                 for name, value in element.attrib.items()])
+                rv.append("<%s %s>" % (element.tag, attr))
+            if element.text:
+                rv.append(element.text)
+
+            for child in element:
+                serializeElement(child)
+
+            rv.append("</%s>" % (element.tag,))
+
+        if hasattr(element, "tail") and element.tail:
+            rv.append(element.tail)
+
+    serializeElement(element)
+
+    return "".join(rv)
+
+
+class TreeBuilder(base.TreeBuilder):
+    documentClass = Document
+    doctypeClass = DocumentType
+    elementClass = None
+    commentClass = None
+    fragmentClass = Document
+    implementation = etree
+
+    def __init__(self, namespaceHTMLElements, fullTree=False):
+        builder = etree_builders.getETreeModule(etree, fullTree=fullTree)
+        infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
+        self.namespaceHTMLElements = namespaceHTMLElements
+
+        class Attributes(dict):
+            def __init__(self, element, value=None):
+                if value is None:
+                    value = {}
+                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)
+                if isinstance(key, tuple):
+                    name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
+                else:
+                    name = infosetFilter.coerceAttribute(key)
+                self._element._element.attrib[name] = value
+
+        class Element(builder.Element):
+            def __init__(self, name, namespace):
+                name = infosetFilter.coerceElement(name)
+                builder.Element.__init__(self, name, namespace=namespace)
+                self._attributes = Attributes(self)
+
+            def _setName(self, name):
+                self._name = infosetFilter.coerceElement(name)
+                self._element.tag = self._getETreeTag(
+                    self._name, self._namespace)
+
+            def _getName(self):
+                return infosetFilter.fromXmlName(self._name)
+
+            name = property(_getName, _setName)
+
+            def _getAttributes(self):
+                return self._attributes
+
+            def _setAttributes(self, attributes):
+                self._attributes = Attributes(self, attributes)
+
+            attributes = property(_getAttributes, _setAttributes)
+
+            def insertText(self, data, insertBefore=None):
+                data = infosetFilter.coerceCharacters(data)
+                builder.Element.insertText(self, data, insertBefore)
+
+            def appendChild(self, child):
+                builder.Element.appendChild(self, child)
+
+        class Comment(builder.Comment):
+            def __init__(self, data):
+                data = infosetFilter.coerceComment(data)
+                builder.Comment.__init__(self, data)
+
+            def _setData(self, data):
+                data = infosetFilter.coerceComment(data)
+                self._element.text = data
+
+            def _getData(self):
+                return self._element.text
+
+            data = property(_getData, _setData)
+
+        self.elementClass = Element
+        self.commentClass = Comment
+        # self.fragmentClass = builder.DocumentFragment
+        base.TreeBuilder.__init__(self, namespaceHTMLElements)
+
+    def reset(self):
+        base.TreeBuilder.reset(self)
+        self.insertComment = self.insertCommentInitial
+        self.initial_comments = []
+        self.doctype = None
+
+    def testSerializer(self, element):
+        return testSerializer(element)
+
+    def getDocument(self):
+        if fullTree:
+            return self.document._elementTree
+        else:
+            return self.document._elementTree.getroot()
+
+    def getFragment(self):
+        fragment = []
+        element = self.openElements[0]._element
+        if element.text:
+            fragment.append(element.text)
+        fragment.extend(list(element))
+        if element.tail:
+            fragment.append(element.tail)
+        return fragment
+
+    def insertDoctype(self, token):
+        name = token["name"]
+        publicId = token["publicId"]
+        systemId = token["systemId"]
+
+        if not name:
+            warnings.warn("lxml cannot represent empty doctype", DataLossWarning)
+            self.doctype = None
+        else:
+            coercedName = self.infosetFilter.coerceElement(name)
+            if coercedName != name:
+                warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning)
+
+            doctype = self.doctypeClass(coercedName, publicId, systemId)
+            self.doctype = doctype
+
+    def insertCommentInitial(self, data, parent=None):
+        assert parent is None or parent is self.document
+        assert self.document._elementTree is None
+        self.initial_comments.append(data)
+
+    def insertCommentMain(self, data, parent=None):
+        if (parent == self.document and
+                self.document._elementTree.getroot()[-1].tag == comment_type):
+            warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning)
+        super(TreeBuilder, self).insertComment(data, parent)
+
+    def insertRoot(self, token):
+        # Because of the way libxml2 works, it doesn't seem to be possible to
+        # alter information like the doctype after the tree has been parsed.
+        # Therefore we need to use the built-in parser to create our initial
+        # tree, after which we can add elements like normal
+        docStr = ""
+        if self.doctype:
+            assert self.doctype.name
+            docStr += "<!DOCTYPE %s" % self.doctype.name
+            if (self.doctype.publicId is not None or
+                    self.doctype.systemId is not None):
+                docStr += (' PUBLIC "%s" ' %
+                           (self.infosetFilter.coercePubid(self.doctype.publicId or "")))
+                if self.doctype.systemId:
+                    sysid = self.doctype.systemId
+                    if sysid.find("'") >= 0 and sysid.find('"') >= 0:
+                        warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning)
+                        sysid = sysid.replace("'", 'U00027')
+                    if sysid.find("'") >= 0:
+                        docStr += '"%s"' % sysid
+                    else:
+                        docStr += "'%s'" % sysid
+                else:
+                    docStr += "''"
+            docStr += ">"
+            if self.doctype.name != token["name"]:
+                warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning)
+        docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>"
+        root = etree.fromstring(docStr)
+
+        # Append the initial comments:
+        for comment_token in self.initial_comments:
+            comment = self.commentClass(comment_token["data"])
+            root.addprevious(comment._element)
+
+        # Create the root document and add the ElementTree to it
+        self.document = self.documentClass()
+        self.document._elementTree = root.getroottree()
+
+        # Give the root element the right name
+        name = token["name"]
+        namespace = token.get("namespace", self.defaultNamespace)
+        if namespace is None:
+            etree_tag = name
+        else:
+            etree_tag = "{%s}%s" % (namespace, name)
+        root.tag = etree_tag
+
+        # Add the root element to the internal child/open data structures
+        root_element = self.elementClass(name, namespace)
+        root_element._element = root
+        self.document._childNodes.append(root_element)
+        self.openElements.append(root_element)
+
+        # Reset to the default insert comment function
+        self.insertComment = self.insertCommentMain
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f29f8ac9c01666adba00c1e2515ed3b652f935dd
GIT binary patch
literal 16913
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
He@;yR153?k

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
new file mode 100644
index 00000000..9bec2076
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
@@ -0,0 +1,154 @@
+"""A collection of modules for iterating through different kinds of
+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
+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.
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .. import constants
+from .._utils import default_etree
+
+__all__ = ["getTreeWalker", "pprint"]
+
+treeWalkerCache = {}
+
+
+def getTreeWalker(treeType, implementation=None, **kwargs):
+    """Get a TreeWalker class for various types of tree with built-in support
+
+    :arg str treeType: the name of the tree type required (case-insensitive).
+        Supported values are:
+
+        * "dom": The xml.dom.minidom DOM implementation
+        * "etree": A generic walker for tree implementations exposing an
+          elementtree-like interface (known to work with ElementTree,
+          cElementTree and lxml.etree).
+        * "lxml": Optimized walker for lxml.etree
+        * "genshi": a Genshi stream
+
+    :arg implementation: A module implementing the tree type e.g.
+        xml.etree.ElementTree or cElementTree (Currently applies to the "etree"
+        tree type only).
+
+    :arg kwargs: keyword arguments passed to the etree walker--for other
+        walkers, this has no effect
+
+    :returns: a TreeWalker class
+
+    """
+
+    treeType = treeType.lower()
+    if treeType not in treeWalkerCache:
+        if treeType == "dom":
+            from . import dom
+            treeWalkerCache[treeType] = dom.TreeWalker
+        elif treeType == "genshi":
+            from . import genshi
+            treeWalkerCache[treeType] = genshi.TreeWalker
+        elif treeType == "lxml":
+            from . import etree_lxml
+            treeWalkerCache[treeType] = etree_lxml.TreeWalker
+        elif treeType == "etree":
+            from . import etree
+            if implementation is None:
+                implementation = default_etree
+            # XXX: NEVER cache here, caching is done in the etree submodule
+            return etree.getETreeModule(implementation, **kwargs).TreeWalker
+    return treeWalkerCache.get(treeType)
+
+
+def concatenateCharacterTokens(tokens):
+    pendingCharacters = []
+    for token in tokens:
+        type = token["type"]
+        if type in ("Characters", "SpaceCharacters"):
+            pendingCharacters.append(token["data"])
+        else:
+            if pendingCharacters:
+                yield {"type": "Characters", "data": "".join(pendingCharacters)}
+                pendingCharacters = []
+            yield token
+    if pendingCharacters:
+        yield {"type": "Characters", "data": "".join(pendingCharacters)}
+
+
+def pprint(walker):
+    """Pretty printer for tree walkers
+
+    Takes a TreeWalker instance and pretty prints the output of walking the tree.
+
+    :arg walker: a TreeWalker instance
+
+    """
+    output = []
+    indent = 0
+    for token in concatenateCharacterTokens(walker):
+        type = token["type"]
+        if type in ("StartTag", "EmptyTag"):
+            # tag name
+            if token["namespace"] and token["namespace"] != constants.namespaces["html"]:
+                if token["namespace"] in constants.prefixes:
+                    ns = constants.prefixes[token["namespace"]]
+                else:
+                    ns = token["namespace"]
+                name = "%s %s" % (ns, token["name"])
+            else:
+                name = token["name"]
+            output.append("%s<%s>" % (" " * indent, name))
+            indent += 2
+            # attributes (sorted for consistent ordering)
+            attrs = token["data"]
+            for (namespace, localname), value in sorted(attrs.items()):
+                if namespace:
+                    if namespace in constants.prefixes:
+                        ns = constants.prefixes[namespace]
+                    else:
+                        ns = namespace
+                    name = "%s %s" % (ns, localname)
+                else:
+                    name = localname
+                output.append("%s%s=\"%s\"" % (" " * indent, name, value))
+            # self-closing
+            if type == "EmptyTag":
+                indent -= 2
+
+        elif type == "EndTag":
+            indent -= 2
+
+        elif type == "Comment":
+            output.append("%s<!-- %s -->" % (" " * indent, token["data"]))
+
+        elif type == "Doctype":
+            if token["name"]:
+                if token["publicId"]:
+                    output.append("""%s<!DOCTYPE %s "%s" "%s">""" %
+                                  (" " * indent,
+                                   token["name"],
+                                   token["publicId"],
+                                   token["systemId"] if token["systemId"] else ""))
+                elif token["systemId"]:
+                    output.append("""%s<!DOCTYPE %s "" "%s">""" %
+                                  (" " * indent,
+                                   token["name"],
+                                   token["systemId"]))
+                else:
+                    output.append("%s<!DOCTYPE %s>" % (" " * indent,
+                                                       token["name"]))
+            else:
+                output.append("%s<!DOCTYPE >" % (" " * indent,))
+
+        elif type == "Characters":
+            output.append("%s\"%s\"" % (" " * indent, token["data"]))
+
+        elif type == "SpaceCharacters":
+            assert False, "concatenateCharacterTokens should have got rid of all Space tokens"
+
+        else:
+            raise ValueError("Unknown token type, %s" % type)
+
+    return "\n".join(output)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..47c0d0b2e98b1eca202430b5d8a0ce85a632b1b8
GIT binary patch
literal 5071
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
N;ACQB=F#Eg2LLgF>$?B|

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py
new file mode 100644
index 00000000..80c474c4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py
@@ -0,0 +1,252 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.dom import Node
+from ..constants import namespaces, voidElements, spaceCharacters
+
+__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN",
+           "TreeWalker", "NonRecursiveTreeWalker"]
+
+DOCUMENT = Node.DOCUMENT_NODE
+DOCTYPE = Node.DOCUMENT_TYPE_NODE
+TEXT = Node.TEXT_NODE
+ELEMENT = Node.ELEMENT_NODE
+COMMENT = Node.COMMENT_NODE
+ENTITY = Node.ENTITY_NODE
+UNKNOWN = "<#UNKNOWN#>"
+
+spaceCharacters = "".join(spaceCharacters)
+
+
+class TreeWalker(object):
+    """Walks a tree yielding tokens
+
+    Tokens are dicts that all have a ``type`` field specifying the type of the
+    token.
+
+    """
+    def __init__(self, tree):
+        """Creates a TreeWalker
+
+        :arg tree: the tree to walk
+
+        """
+        self.tree = tree
+
+    def __iter__(self):
+        raise NotImplementedError
+
+    def error(self, msg):
+        """Generates an error token with the given message
+
+        :arg msg: the error message
+
+        :returns: SerializeError token
+
+        """
+        return {"type": "SerializeError", "data": msg}
+
+    def emptyTag(self, namespace, name, attrs, hasChildren=False):
+        """Generates an EmptyTag token
+
+        :arg namespace: the namespace of the token--can be ``None``
+
+        :arg name: the name of the element
+
+        :arg attrs: the attributes of the element as a dict
+
+        :arg hasChildren: whether or not to yield a SerializationError because
+            this tag shouldn't have children
+
+        :returns: EmptyTag token
+
+        """
+        yield {"type": "EmptyTag", "name": name,
+               "namespace": namespace,
+               "data": attrs}
+        if hasChildren:
+            yield self.error("Void element has children")
+
+    def startTag(self, namespace, name, attrs):
+        """Generates a StartTag token
+
+        :arg namespace: the namespace of the token--can be ``None``
+
+        :arg name: the name of the element
+
+        :arg attrs: the attributes of the element as a dict
+
+        :returns: StartTag token
+
+        """
+        return {"type": "StartTag",
+                "name": name,
+                "namespace": namespace,
+                "data": attrs}
+
+    def endTag(self, namespace, name):
+        """Generates an EndTag token
+
+        :arg namespace: the namespace of the token--can be ``None``
+
+        :arg name: the name of the element
+
+        :returns: EndTag token
+
+        """
+        return {"type": "EndTag",
+                "name": name,
+                "namespace": namespace}
+
+    def text(self, data):
+        """Generates SpaceCharacters and Characters tokens
+
+        Depending on what's in the data, this generates one or more
+        ``SpaceCharacters`` and ``Characters`` tokens.
+
+        For example:
+
+            >>> from html5lib.treewalkers.base import TreeWalker
+            >>> # Give it an empty tree just so it instantiates
+            >>> walker = TreeWalker([])
+            >>> list(walker.text(''))
+            []
+            >>> list(walker.text('  '))
+            [{u'data': '  ', u'type': u'SpaceCharacters'}]
+            >>> list(walker.text(' abc '))  # doctest: +NORMALIZE_WHITESPACE
+            [{u'data': ' ', u'type': u'SpaceCharacters'},
+            {u'data': u'abc', u'type': u'Characters'},
+            {u'data': u' ', u'type': u'SpaceCharacters'}]
+
+        :arg data: the text data
+
+        :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens
+
+        """
+        data = data
+        middle = data.lstrip(spaceCharacters)
+        left = data[:len(data) - len(middle)]
+        if left:
+            yield {"type": "SpaceCharacters", "data": left}
+        data = middle
+        middle = data.rstrip(spaceCharacters)
+        right = data[len(middle):]
+        if middle:
+            yield {"type": "Characters", "data": middle}
+        if right:
+            yield {"type": "SpaceCharacters", "data": right}
+
+    def comment(self, data):
+        """Generates a Comment token
+
+        :arg data: the comment
+
+        :returns: Comment token
+
+        """
+        return {"type": "Comment", "data": data}
+
+    def doctype(self, name, publicId=None, systemId=None):
+        """Generates a Doctype token
+
+        :arg name:
+
+        :arg publicId:
+
+        :arg systemId:
+
+        :returns: the Doctype token
+
+        """
+        return {"type": "Doctype",
+                "name": name,
+                "publicId": publicId,
+                "systemId": systemId}
+
+    def entity(self, name):
+        """Generates an Entity token
+
+        :arg name: the entity name
+
+        :returns: an Entity token
+
+        """
+        return {"type": "Entity", "name": name}
+
+    def unknown(self, nodeType):
+        """Handles unknown node types"""
+        return self.error("Unknown node type: " + nodeType)
+
+
+class NonRecursiveTreeWalker(TreeWalker):
+    def getNodeDetails(self, node):
+        raise NotImplementedError
+
+    def getFirstChild(self, node):
+        raise NotImplementedError
+
+    def getNextSibling(self, node):
+        raise NotImplementedError
+
+    def getParentNode(self, node):
+        raise NotImplementedError
+
+    def __iter__(self):
+        currentNode = self.tree
+        while currentNode is not None:
+            details = self.getNodeDetails(currentNode)
+            type, details = details[0], details[1:]
+            hasChildren = False
+
+            if type == DOCTYPE:
+                yield self.doctype(*details)
+
+            elif type == TEXT:
+                for token in self.text(*details):
+                    yield token
+
+            elif type == ELEMENT:
+                namespace, name, attributes, hasChildren = details
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    for token in self.emptyTag(namespace, name, attributes,
+                                               hasChildren):
+                        yield token
+                    hasChildren = False
+                else:
+                    yield self.startTag(namespace, name, attributes)
+
+            elif type == COMMENT:
+                yield self.comment(details[0])
+
+            elif type == ENTITY:
+                yield self.entity(details[0])
+
+            elif type == DOCUMENT:
+                hasChildren = True
+
+            else:
+                yield self.unknown(details[0])
+
+            if hasChildren:
+                firstChild = self.getFirstChild(currentNode)
+            else:
+                firstChild = None
+
+            if firstChild is not None:
+                currentNode = firstChild
+            else:
+                while currentNode is not None:
+                    details = self.getNodeDetails(currentNode)
+                    type, details = details[0], details[1:]
+                    if type == ELEMENT:
+                        namespace, name, attributes, hasChildren = details
+                        if (namespace and namespace != namespaces["html"]) or name not in voidElements:
+                            yield self.endTag(namespace, name)
+                    if self.tree is currentNode:
+                        currentNode = None
+                        break
+                    nextSibling = self.getNextSibling(currentNode)
+                    if nextSibling is not None:
+                        currentNode = nextSibling
+                        break
+                    else:
+                        currentNode = self.getParentNode(currentNode)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1aa28b17e5c3b622b34ea880bb31921e88e8ec24
GIT binary patch
literal 9693
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py
new file mode 100644
index 00000000..b0c89b00
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py
@@ -0,0 +1,43 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.dom import Node
+
+from . import base
+
+
+class TreeWalker(base.NonRecursiveTreeWalker):
+    def getNodeDetails(self, node):
+        if node.nodeType == Node.DOCUMENT_TYPE_NODE:
+            return base.DOCTYPE, node.name, node.publicId, node.systemId
+
+        elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
+            return base.TEXT, node.nodeValue
+
+        elif node.nodeType == Node.ELEMENT_NODE:
+            attrs = {}
+            for attr in list(node.attributes.keys()):
+                attr = node.getAttributeNode(attr)
+                if attr.namespaceURI:
+                    attrs[(attr.namespaceURI, attr.localName)] = attr.value
+                else:
+                    attrs[(None, attr.name)] = attr.value
+            return (base.ELEMENT, node.namespaceURI, node.nodeName,
+                    attrs, node.hasChildNodes())
+
+        elif node.nodeType == Node.COMMENT_NODE:
+            return base.COMMENT, node.nodeValue
+
+        elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE):
+            return (base.DOCUMENT,)
+
+        else:
+            return base.UNKNOWN, node.nodeType
+
+    def getFirstChild(self, node):
+        return node.firstChild
+
+    def getNextSibling(self, node):
+        return node.nextSibling
+
+    def getParentNode(self, node):
+        return node.parentNode
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aeb53c42b2770d68e4f6a0d584be7256c65d4e06
GIT binary patch
literal 2517
zcmZSn%*&NH<x)&C0~9bbFfceIFfkNIGB7ZtFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQv6y8KPJj7*m)TQdk&r*cfuz8KT%37*kjoQrQ`@I2h6x8B*97S{N9b
z85km?I2lsd8G<!97#J8bK~`#jEG*$?U|>j0D$dU-ElG{f%q_?-Dk%XeNy#kBEY8f&
zD-mE|U?|PYOwLb9jnBy}Ni9muDb`?QU|=X=VPIhJ%TGzo1o03;Nr}a&C0q;)3?W6S
zso{w^*{MZvKY~;`f&8e$z`&5o0P<Q21IUF@Od$WZFn~Om!UPs!VMt*HGgujdf;B*v
zB{MNFFn}1W3=9m;AY&pJ85n998L}7{N*Eckm>9B|7>e{5N|+h4Sis_}V3G|?vNNQy
zFa#r1bAa`5GNdsvWV108MS`_)ft7ND1d){TfDQf&3b$G&hKh8C5?-)6K87rQP~bK*
zGPuMBFw`=GMFkjYm>HTG!CYpBEJ22%gCLPCA%+?zFhdYb3WF@MDQpLGz;Y=JU^XjE
zA{^uqQLveUU{VZh0wY6~ILOvCR%Gu;fZZt12+|`7R*mipDX@p7L8gN|>;hIQ14<>q
zAWgDhO$;FE;1mXiU~r83X~==18k8dP@>5bnDhpDB!0ASafq}ur-#OIR)h{GIBr?D?
z-p}8~H3$?tCF~G6kSI8j<R#{&f)iCiX;MyRvS$jIQ(ReGlA7z8Qo;#JE3OeCU=vC}
z20ObrhB(FtyE=z>`ujnIK?aAoMudP>gPanUm{Xcs!o$G8;OgTFb_K`*VEb}1i%Y;M
zFtMbhC^M<FB()eUo}F4*3{KDKsU?muDNqUq8v}A>aY15oYG{yW2`Gh?fo%Y}E+;=Z
zF~<+&3y?GX^7B%`euP>K_6^8MU=_R!3=A2G#m*U-IVm8si@}CF`}-o?2nrvlKnX}W
zJRHG35QBssBxK!!9NiHbLD2wH40b`NpSPcXxF0xofW26pnv(`*fZPN21t<(4-UqQX
zz&Rg86qhqFFz6Q)WtJtDr0SO?7U`$u=cJ?-73*gg>Sq@lnVTCHW*M268CsYZ=TxSb
z$D5>>m>3us7^LUvhv*k%7U*W?6_+ID<mi?sT9yW8fP}y}zAQB_CBH~Nqa-)SG$%7j
zzoaNNwH#ay6ziwt=js(ymhdq!Fr=rJfWpTmwIne!rx+B>#VR0&F$yutFiA5CFbOfT
zG0HIVGjcM@Fi9~AfkgzEq#3!G!36=RFaVV&;DP`Yq>!u)OSd2?a3V;{EGjMmM~4PT
zOOO%+14EE90|Ub#2@6mPNKY+sgF6!x3dJC&GB6VDQEmnXhP>2@lHkmwoXouR!Rb?2
ztRvj1&cMJxs#if(OF?2$Y92WG3{Iay<1_&7Of7^*HP~P!YJ5DX%!!W&C)4=&-29Z%
zoYeUEAT>}51*Og)khUODT?yh1k^~zBDjPv1Q89>MW8{?PWaeb{(*VT_)F)}BC8b3m
zpMdgn5GW@GfzmU$$g0TA(M!qCh14Qoc~F^J0xI?V^7DdHlS_+=Gs{vDjR&xOgUJ8j
W;@$=lS#}`56@wyFhDm@)fEfUUT1cw^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
new file mode 100644
index 00000000..95fc0c17
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
@@ -0,0 +1,130 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from collections import OrderedDict
+import re
+
+from pip._vendor.six import string_types
+
+from . import base
+from .._utils import moduleFactoryFactory
+
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+
+def getETreeBuilder(ElementTreeImplementation):
+    ElementTree = ElementTreeImplementation
+    ElementTreeCommentType = ElementTree.Comment("asd").tag
+
+    class TreeWalker(base.NonRecursiveTreeWalker):  # pylint:disable=unused-variable
+        """Given the particular ElementTree representation, this implementation,
+        to avoid using recursion, returns "nodes" as tuples with the following
+        content:
+
+        1. The current element
+
+        2. The index of the element relative to its parent
+
+        3. A stack of ancestor elements
+
+        4. A flag "text", "tail" or None to indicate if the current node is a
+           text node; either the text or tail of the current element (1)
+        """
+        def getNodeDetails(self, node):
+            if isinstance(node, tuple):  # It might be the root Element
+                elt, _, _, flag = node
+                if flag in ("text", "tail"):
+                    return base.TEXT, getattr(elt, flag)
+                else:
+                    node = elt
+
+            if not(hasattr(node, "tag")):
+                node = node.getroot()
+
+            if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"):
+                return (base.DOCUMENT,)
+
+            elif node.tag == "<!DOCTYPE>":
+                return (base.DOCTYPE, node.text,
+                        node.get("publicId"), node.get("systemId"))
+
+            elif node.tag == ElementTreeCommentType:
+                return base.COMMENT, node.text
+
+            else:
+                assert isinstance(node.tag, string_types), type(node.tag)
+                # This is assumed to be an ordinary element
+                match = tag_regexp.match(node.tag)
+                if match:
+                    namespace, tag = match.groups()
+                else:
+                    namespace = None
+                    tag = node.tag
+                attrs = OrderedDict()
+                for name, value in list(node.attrib.items()):
+                    match = tag_regexp.match(name)
+                    if match:
+                        attrs[(match.group(1), match.group(2))] = value
+                    else:
+                        attrs[(None, name)] = value
+                return (base.ELEMENT, namespace, tag,
+                        attrs, len(node) or node.text)
+
+        def getFirstChild(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                element, key, parents, flag = node, None, [], None
+
+            if flag in ("text", "tail"):
+                return None
+            else:
+                if element.text:
+                    return element, key, parents, "text"
+                elif len(element):
+                    parents.append(element)
+                    return element[0], 0, parents, None
+                else:
+                    return None
+
+        def getNextSibling(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                return None
+
+            if flag == "text":
+                if len(element):
+                    parents.append(element)
+                    return element[0], 0, parents, None
+                else:
+                    return None
+            else:
+                if element.tail and flag != "tail":
+                    return element, key, parents, "tail"
+                elif key < len(parents[-1]) - 1:
+                    return parents[-1][key + 1], key + 1, parents, None
+                else:
+                    return None
+
+        def getParentNode(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                return None
+
+            if flag == "text":
+                if not parents:
+                    return element
+                else:
+                    return element, key, parents, None
+            else:
+                parent = parents.pop()
+                if not parents:
+                    return parent
+                else:
+                    assert list(parents[-1]).count(parent) == 1
+                    return parent, list(parents[-1]).index(parent), parents, None
+
+    return locals()
+
+getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..254fbeaee8341c3b098335124bef497115b0bc2f
GIT binary patch
literal 4770
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
new file mode 100644
index 00000000..e81ddf33
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
@@ -0,0 +1,213 @@
+from __future__ import absolute_import, division, unicode_literals
+from pip._vendor.six import text_type
+
+from lxml import etree
+from ..treebuilders.etree import tag_regexp
+
+from . import base
+
+from .. import _ihatexml
+
+
+def ensure_str(s):
+    if s is None:
+        return None
+    elif isinstance(s, text_type):
+        return s
+    else:
+        return s.decode("ascii", "strict")
+
+
+class Root(object):
+    def __init__(self, et):
+        self.elementtree = et
+        self.children = []
+
+        try:
+            if et.docinfo.internalDTD:
+                self.children.append(Doctype(self,
+                                             ensure_str(et.docinfo.root_name),
+                                             ensure_str(et.docinfo.public_id),
+                                             ensure_str(et.docinfo.system_url)))
+        except AttributeError:
+            pass
+
+        try:
+            node = et.getroot()
+        except AttributeError:
+            node = et
+
+        while node.getprevious() is not None:
+            node = node.getprevious()
+        while node is not None:
+            self.children.append(node)
+            node = node.getnext()
+
+        self.text = None
+        self.tail = None
+
+    def __getitem__(self, key):
+        return self.children[key]
+
+    def getnext(self):
+        return None
+
+    def __len__(self):
+        return 1
+
+
+class Doctype(object):
+    def __init__(self, root_node, name, public_id, system_id):
+        self.root_node = root_node
+        self.name = name
+        self.public_id = public_id
+        self.system_id = system_id
+
+        self.text = None
+        self.tail = None
+
+    def getnext(self):
+        return self.root_node.children[1]
+
+
+class FragmentRoot(Root):
+    def __init__(self, children):
+        self.children = [FragmentWrapper(self, child) for child in children]
+        self.text = self.tail = None
+
+    def getnext(self):
+        return None
+
+
+class FragmentWrapper(object):
+    def __init__(self, fragment_root, obj):
+        self.root_node = fragment_root
+        self.obj = obj
+        if hasattr(self.obj, 'text'):
+            self.text = ensure_str(self.obj.text)
+        else:
+            self.text = None
+        if hasattr(self.obj, 'tail'):
+            self.tail = ensure_str(self.obj.tail)
+        else:
+            self.tail = None
+
+    def __getattr__(self, name):
+        return getattr(self.obj, name)
+
+    def getnext(self):
+        siblings = self.root_node.children
+        idx = siblings.index(self)
+        if idx < len(siblings) - 1:
+            return siblings[idx + 1]
+        else:
+            return None
+
+    def __getitem__(self, key):
+        return self.obj[key]
+
+    def __bool__(self):
+        return bool(self.obj)
+
+    def getparent(self):
+        return None
+
+    def __str__(self):
+        return str(self.obj)
+
+    def __unicode__(self):
+        return str(self.obj)
+
+    def __len__(self):
+        return len(self.obj)
+
+
+class TreeWalker(base.NonRecursiveTreeWalker):
+    def __init__(self, tree):
+        # pylint:disable=redefined-variable-type
+        if isinstance(tree, list):
+            self.fragmentChildren = set(tree)
+            tree = FragmentRoot(tree)
+        else:
+            self.fragmentChildren = set()
+            tree = Root(tree)
+        base.NonRecursiveTreeWalker.__init__(self, tree)
+        self.filter = _ihatexml.InfosetFilter()
+
+    def getNodeDetails(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            return base.TEXT, ensure_str(getattr(node, key))
+
+        elif isinstance(node, Root):
+            return (base.DOCUMENT,)
+
+        elif isinstance(node, Doctype):
+            return base.DOCTYPE, node.name, node.public_id, node.system_id
+
+        elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"):
+            return base.TEXT, ensure_str(node.obj)
+
+        elif node.tag == etree.Comment:
+            return base.COMMENT, ensure_str(node.text)
+
+        elif node.tag == etree.Entity:
+            return base.ENTITY, ensure_str(node.text)[1:-1]  # strip &;
+
+        else:
+            # This is assumed to be an ordinary element
+            match = tag_regexp.match(ensure_str(node.tag))
+            if match:
+                namespace, tag = match.groups()
+            else:
+                namespace = None
+                tag = ensure_str(node.tag)
+            attrs = {}
+            for name, value in list(node.attrib.items()):
+                name = ensure_str(name)
+                value = ensure_str(value)
+                match = tag_regexp.match(name)
+                if match:
+                    attrs[(match.group(1), match.group(2))] = value
+                else:
+                    attrs[(None, name)] = value
+            return (base.ELEMENT, namespace, self.filter.fromXmlName(tag),
+                    attrs, len(node) > 0 or node.text)
+
+    def getFirstChild(self, node):
+        assert not isinstance(node, tuple), "Text nodes have no children"
+
+        assert len(node) or node.text, "Node has no children"
+        if node.text:
+            return (node, "text")
+        else:
+            return node[0]
+
+    def getNextSibling(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            if key == "text":
+                # XXX: we cannot use a "bool(node) and node[0] or None" construct here
+                # because node[0] might evaluate to False if it has no child element
+                if len(node):
+                    return node[0]
+                else:
+                    return None
+            else:  # tail
+                return node.getnext()
+
+        return (node, "tail") if node.tail else node.getnext()
+
+    def getParentNode(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            if key == "text":
+                return node
+            # else: fallback to "normal" processing
+        elif node in self.fragmentChildren:
+            return None
+
+        return node.getparent()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..819f6e8a297d828565c9fb041f4fb04d438b303d
GIT binary patch
literal 10584
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
K#Q4NG#k2ug#YwIJ

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py
new file mode 100644
index 00000000..7483be27
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py
@@ -0,0 +1,69 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from genshi.core import QName
+from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT
+from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
+
+from . import base
+
+from ..constants import voidElements, namespaces
+
+
+class TreeWalker(base.TreeWalker):
+    def __iter__(self):
+        # Buffer the events so we can pass in the following one
+        previous = None
+        for event in self.tree:
+            if previous is not None:
+                for token in self.tokens(previous, event):
+                    yield token
+            previous = event
+
+        # Don't forget the final event!
+        if previous is not None:
+            for token in self.tokens(previous, None):
+                yield token
+
+    def tokens(self, event, next):
+        kind, data, _ = event
+        if kind == START:
+            tag, attribs = data
+            name = tag.localname
+            namespace = tag.namespace
+            converted_attribs = {}
+            for k, v in attribs:
+                if isinstance(k, QName):
+                    converted_attribs[(k.namespace, k.localname)] = v
+                else:
+                    converted_attribs[(None, k)] = v
+
+            if namespace == namespaces["html"] and name in voidElements:
+                for token in self.emptyTag(namespace, name, converted_attribs,
+                                           not next or next[0] != END or
+                                           next[1] != tag):
+                    yield token
+            else:
+                yield self.startTag(namespace, name, converted_attribs)
+
+        elif kind == END:
+            name = data.localname
+            namespace = data.namespace
+            if namespace != namespaces["html"] or name not in voidElements:
+                yield self.endTag(namespace, name)
+
+        elif kind == COMMENT:
+            yield self.comment(data)
+
+        elif kind == TEXT:
+            for token in self.text(data):
+                yield token
+
+        elif kind == DOCTYPE:
+            yield self.doctype(*data)
+
+        elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS,
+                      START_CDATA, END_CDATA, PI):
+            pass
+
+        else:
+            yield self.unknown(kind)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2cc7ef5bba12e4d562e7f0ae910597baba0fbc32
GIT binary patch
literal 2626
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
XJ5aC`gThdTNq|v<QIAQ0NsJi)VP7MJ

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py
new file mode 100644
index 00000000..847bf935
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py
@@ -0,0 +1,2 @@
+from .package_data import __version__
+from .core import *
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6d4565fdbfe38417d18f0575bb883ed590563f89
GIT binary patch
literal 291
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI$F)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObj6@
z%nZRAEDQ_`nT!k!3>qM!gqwkZAwIq=wWv5VKQBHWA_$Vv^3z~uU|=ZWVPIe=NKDR7
zOiztZNi0bW0@+ytG9@{`C{+W*LlDI|3=9nV1x1-<i6yD}Wr;=lY56%RsYS*5*@gPq
z#YX1lhJ{&1=4FN!=EXUc>E-bzDJCWc1_lP{dHNyx1(^l9nR&$}i8(pC<%yQ1ff*nn
yFpe)v%}dEI($7rEOVp2#&&<m#iI3MSs4U@NU|_Jx%}*)KNwotxyBHJ}0*nAU146_A

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py
new file mode 100644
index 00000000..98c65ead
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py
@@ -0,0 +1,118 @@
+from .core import encode, decode, alabel, ulabel, IDNAError
+import codecs
+import re
+
+_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
+
+class Codec(codecs.Codec):
+
+    def encode(self, data, errors='strict'):
+
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return "", 0
+
+        return encode(data), len(data)
+
+    def decode(self, data, errors='strict'):
+
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return u"", 0
+
+        return decode(data), len(data)
+
+class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
+    def _buffer_encode(self, data, errors, final):
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return ("", 0)
+
+        labels = _unicode_dots_re.split(data)
+        trailing_dot = u''
+        if labels:
+            if not labels[-1]:
+                trailing_dot = '.'
+                del labels[-1]
+            elif not final:
+                # Keep potentially unfinished label until the next call
+                del labels[-1]
+                if labels:
+                    trailing_dot = '.'
+
+        result = []
+        size = 0
+        for label in labels:
+            result.append(alabel(label))
+            if size:
+                size += 1
+            size += len(label)
+
+        # Join with U+002E
+        result = ".".join(result) + trailing_dot
+        size += len(trailing_dot)
+        return (result, size)
+
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
+    def _buffer_decode(self, data, errors, final):
+        if errors != 'strict':
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
+
+        if not data:
+            return (u"", 0)
+
+        # IDNA allows decoding to operate on Unicode strings, too.
+        if isinstance(data, unicode):
+            labels = _unicode_dots_re.split(data)
+        else:
+            # Must be ASCII string
+            data = str(data)
+            unicode(data, "ascii")
+            labels = data.split(".")
+
+        trailing_dot = u''
+        if labels:
+            if not labels[-1]:
+                trailing_dot = u'.'
+                del labels[-1]
+            elif not final:
+                # Keep potentially unfinished label until the next call
+                del labels[-1]
+                if labels:
+                    trailing_dot = u'.'
+
+        result = []
+        size = 0
+        for label in labels:
+            result.append(ulabel(label))
+            if size:
+                size += 1
+            size += len(label)
+
+        result = u".".join(result) + trailing_dot
+        size += len(trailing_dot)
+        return (result, size)
+
+
+class StreamWriter(Codec, codecs.StreamWriter):
+    pass
+
+class StreamReader(Codec, codecs.StreamReader):
+    pass
+
+def getregentry():
+    return codecs.CodecInfo(
+        name='idna',
+        encode=Codec().encode,
+        decode=Codec().decode,
+        incrementalencoder=IncrementalEncoder,
+        incrementaldecoder=IncrementalDecoder,
+        streamwriter=StreamWriter,
+        streamreader=StreamReader,
+    )
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d063abad73701016a52513da2df2572ef958c667
GIT binary patch
literal 4486
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py
new file mode 100644
index 00000000..4d47f336
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py
@@ -0,0 +1,12 @@
+from .core import *
+from .codec import *
+
+def ToASCII(label):
+    return encode(label)
+
+def ToUnicode(label):
+    return decode(label)
+
+def nameprep(s):
+    raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..82b2d745f7884fcf42a0aa3d731af7feaf7fcc30
GIT binary patch
literal 999
zcmZSn%*&NH<x)&C0~9bZFfceUFfbGwGcYiuFfgPrGUPBYgg{x03?V5@3@r={QA`Xe
z%wPsHLkbI+!NQQj$`Gu<#=yXk$;iOKpaCLEK!jE@hy-Df>CPb2xfmE2N*EYw7#Nxv
z8G^w|{lH`iNPlWxa(+rGgwM*rz>t%el$xUfav_)~&SGF-&@U*;EK4j&)h|md(of6J
zNl7g#*3T}~&n`AHH#aQIGBPhSv@kEusZ1}AH%T!uF)%PNNYB#`(J#m>(9O&%E=kPE
z(JfE3EDg*634w8ZS!!NNevy7=N?xLVa(-?>Vu@ZsWeGb214Br@W3aQQCkx2&AYU*r
zlIp3HRJf;tKqi2_0w(C~A5O4;Lh~{~4gz_u7~~#oJ`#XLQwk#}nwl6v2_jenq}Z=m
zhk=2?)5XtG!N|bCLLntTwOAo9zeJ(5Br_+oI8`ApF*miKD78SLpeVm2KRG`K5}U#d
z3=DqxC7!tjIjOm+c_pbSu0=)pMG#3)3MmGM2$-OEuy8OiFu<G*N}teB@zVe$!4go+
zC+8QXmVkJmfJ+WyW?*0l0&#;tTET8c5Ch?Qo80`A(wtN~a6p3G#Kp+P#L3Lb3;?+Y
B>$3m=

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py
new file mode 100644
index 00000000..104624ad
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py
@@ -0,0 +1,396 @@
+from . import idnadata
+import bisect
+import unicodedata
+import re
+import sys
+from .intranges import intranges_contain
+
+_virama_combining_class = 9
+_alabel_prefix = b'xn--'
+_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
+
+if sys.version_info[0] == 3:
+    unicode = str
+    unichr = chr
+
+class IDNAError(UnicodeError):
+    """ Base exception for all IDNA-encoding related problems """
+    pass
+
+
+class IDNABidiError(IDNAError):
+    """ Exception when bidirectional requirements are not satisfied """
+    pass
+
+
+class InvalidCodepoint(IDNAError):
+    """ Exception when a disallowed or unallocated codepoint is used """
+    pass
+
+
+class InvalidCodepointContext(IDNAError):
+    """ Exception when the codepoint is not valid in the context it is used """
+    pass
+
+
+def _combining_class(cp):
+    v = unicodedata.combining(unichr(cp))
+    if v == 0:
+        if not unicodedata.name(unichr(cp)):
+            raise ValueError("Unknown character in unicodedata")
+    return v
+
+def _is_script(cp, script):
+    return intranges_contain(ord(cp), idnadata.scripts[script])
+
+def _punycode(s):
+    return s.encode('punycode')
+
+def _unot(s):
+    return 'U+{0:04X}'.format(s)
+
+
+def valid_label_length(label):
+
+    if len(label) > 63:
+        return False
+    return True
+
+
+def valid_string_length(label, trailing_dot):
+
+    if len(label) > (254 if trailing_dot else 253):
+        return False
+    return True
+
+
+def check_bidi(label, check_ltr=False):
+
+    # Bidi rules should only be applied if string contains RTL characters
+    bidi_label = False
+    for (idx, cp) in enumerate(label, 1):
+        direction = unicodedata.bidirectional(cp)
+        if direction == '':
+            # String likely comes from a newer version of Unicode
+            raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx))
+        if direction in ['R', 'AL', 'AN']:
+            bidi_label = True
+    if not bidi_label and not check_ltr:
+        return True
+
+    # Bidi rule 1
+    direction = unicodedata.bidirectional(label[0])
+    if direction in ['R', 'AL']:
+        rtl = True
+    elif direction == 'L':
+        rtl = False
+    else:
+        raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label)))
+
+    valid_ending = False
+    number_type = False
+    for (idx, cp) in enumerate(label, 1):
+        direction = unicodedata.bidirectional(cp)
+
+        if rtl:
+            # Bidi rule 2
+            if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
+                raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx))
+            # Bidi rule 3
+            if direction in ['R', 'AL', 'EN', 'AN']:
+                valid_ending = True
+            elif direction != 'NSM':
+                valid_ending = False
+            # Bidi rule 4
+            if direction in ['AN', 'EN']:
+                if not number_type:
+                    number_type = direction
+                else:
+                    if number_type != direction:
+                        raise IDNABidiError('Can not mix numeral types in a right-to-left label')
+        else:
+            # Bidi rule 5
+            if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
+                raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx))
+            # Bidi rule 6
+            if direction in ['L', 'EN']:
+                valid_ending = True
+            elif direction != 'NSM':
+                valid_ending = False
+
+    if not valid_ending:
+        raise IDNABidiError('Label ends with illegal codepoint directionality')
+
+    return True
+
+
+def check_initial_combiner(label):
+
+    if unicodedata.category(label[0])[0] == 'M':
+        raise IDNAError('Label begins with an illegal combining character')
+    return True
+
+
+def check_hyphen_ok(label):
+
+    if label[2:4] == '--':
+        raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
+    if label[0] == '-' or label[-1] == '-':
+        raise IDNAError('Label must not start or end with a hyphen')
+    return True
+
+
+def check_nfc(label):
+
+    if unicodedata.normalize('NFC', label) != label:
+        raise IDNAError('Label must be in Normalization Form C')
+
+
+def valid_contextj(label, pos):
+
+    cp_value = ord(label[pos])
+
+    if cp_value == 0x200c:
+
+        if pos > 0:
+            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
+                return True
+
+        ok = False
+        for i in range(pos-1, -1, -1):
+            joining_type = idnadata.joining_types.get(ord(label[i]))
+            if joining_type == ord('T'):
+                continue
+            if joining_type in [ord('L'), ord('D')]:
+                ok = True
+                break
+
+        if not ok:
+            return False
+
+        ok = False
+        for i in range(pos+1, len(label)):
+            joining_type = idnadata.joining_types.get(ord(label[i]))
+            if joining_type == ord('T'):
+                continue
+            if joining_type in [ord('R'), ord('D')]:
+                ok = True
+                break
+        return ok
+
+    if cp_value == 0x200d:
+
+        if pos > 0:
+            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
+                return True
+        return False
+
+    else:
+
+        return False
+
+
+def valid_contexto(label, pos, exception=False):
+
+    cp_value = ord(label[pos])
+
+    if cp_value == 0x00b7:
+        if 0 < pos < len(label)-1:
+            if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
+                return True
+        return False
+
+    elif cp_value == 0x0375:
+        if pos < len(label)-1 and len(label) > 1:
+            return _is_script(label[pos + 1], 'Greek')
+        return False
+
+    elif cp_value == 0x05f3 or cp_value == 0x05f4:
+        if pos > 0:
+            return _is_script(label[pos - 1], 'Hebrew')
+        return False
+
+    elif cp_value == 0x30fb:
+        for cp in label:
+            if cp == u'\u30fb':
+                continue
+            if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
+                return True
+        return False
+
+    elif 0x660 <= cp_value <= 0x669:
+        for cp in label:
+            if 0x6f0 <= ord(cp) <= 0x06f9:
+                return False
+        return True
+
+    elif 0x6f0 <= cp_value <= 0x6f9:
+        for cp in label:
+            if 0x660 <= ord(cp) <= 0x0669:
+                return False
+        return True
+
+
+def check_label(label):
+
+    if isinstance(label, (bytes, bytearray)):
+        label = label.decode('utf-8')
+    if len(label) == 0:
+        raise IDNAError('Empty Label')
+
+    check_nfc(label)
+    check_hyphen_ok(label)
+    check_initial_combiner(label)
+
+    for (pos, cp) in enumerate(label):
+        cp_value = ord(cp)
+        if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
+            continue
+        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
+            try:
+                if not valid_contextj(label, pos):
+                    raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(
+                        _unot(cp_value), pos+1, repr(label)))
+            except ValueError:
+                raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format(
+                    _unot(cp_value), pos+1, repr(label)))
+        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
+            if not valid_contexto(label, pos):
+                raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
+        else:
+            raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
+
+    check_bidi(label)
+
+
+def alabel(label):
+
+    try:
+        label = label.encode('ascii')
+        ulabel(label)
+        if not valid_label_length(label):
+            raise IDNAError('Label too long')
+        return label
+    except UnicodeEncodeError:
+        pass
+
+    if not label:
+        raise IDNAError('No Input')
+
+    label = unicode(label)
+    check_label(label)
+    label = _punycode(label)
+    label = _alabel_prefix + label
+
+    if not valid_label_length(label):
+        raise IDNAError('Label too long')
+
+    return label
+
+
+def ulabel(label):
+
+    if not isinstance(label, (bytes, bytearray)):
+        try:
+            label = label.encode('ascii')
+        except UnicodeEncodeError:
+            check_label(label)
+            return label
+
+    label = label.lower()
+    if label.startswith(_alabel_prefix):
+        label = label[len(_alabel_prefix):]
+    else:
+        check_label(label)
+        return label.decode('ascii')
+
+    label = label.decode('punycode')
+    check_label(label)
+    return label
+
+
+def uts46_remap(domain, std3_rules=True, transitional=False):
+    """Re-map the characters in the string according to UTS46 processing."""
+    from .uts46data import uts46data
+    output = u""
+    try:
+        for pos, char in enumerate(domain):
+            code_point = ord(char)
+            uts46row = uts46data[code_point if code_point < 256 else
+                bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
+            status = uts46row[1]
+            replacement = uts46row[2] if len(uts46row) == 3 else None
+            if (status == "V" or
+                    (status == "D" and not transitional) or
+                    (status == "3" and not std3_rules and replacement is None)):
+                output += char
+            elif replacement is not None and (status == "M" or
+                    (status == "3" and not std3_rules) or
+                    (status == "D" and transitional)):
+                output += replacement
+            elif status != "I":
+                raise IndexError()
+        return unicodedata.normalize("NFC", output)
+    except IndexError:
+        raise InvalidCodepoint(
+            "Codepoint {0} not allowed at position {1} in {2}".format(
+            _unot(code_point), pos + 1, repr(domain)))
+
+
+def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False):
+
+    if isinstance(s, (bytes, bytearray)):
+        s = s.decode("ascii")
+    if uts46:
+        s = uts46_remap(s, std3_rules, transitional)
+    trailing_dot = False
+    result = []
+    if strict:
+        labels = s.split('.')
+    else:
+        labels = _unicode_dots_re.split(s)
+    if not labels or labels == ['']:
+        raise IDNAError('Empty domain')
+    if labels[-1] == '':
+        del labels[-1]
+        trailing_dot = True
+    for label in labels:
+        s = alabel(label)
+        if s:
+            result.append(s)
+        else:
+            raise IDNAError('Empty label')
+    if trailing_dot:
+        result.append(b'')
+    s = b'.'.join(result)
+    if not valid_string_length(s, trailing_dot):
+        raise IDNAError('Domain too long')
+    return s
+
+
+def decode(s, strict=False, uts46=False, std3_rules=False):
+
+    if isinstance(s, (bytes, bytearray)):
+        s = s.decode("ascii")
+    if uts46:
+        s = uts46_remap(s, std3_rules, False)
+    trailing_dot = False
+    result = []
+    if not strict:
+        labels = _unicode_dots_re.split(s)
+    else:
+        labels = s.split(u'.')
+    if not labels or labels == ['']:
+        raise IDNAError('Empty domain')
+    if not labels[-1]:
+        del labels[-1]
+        trailing_dot = True
+    for label in labels:
+        s = ulabel(label)
+        if s:
+            result.append(s)
+        else:
+            raise IDNAError('Empty label')
+    if trailing_dot:
+        result.append(u'')
+    return u'.'.join(result)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7c8594aa506266f5a521779ec14965373f5fcce1
GIT binary patch
literal 13098
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
Ssl%hmslX}8DatP+Dh~jBton)o

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py
new file mode 100644
index 00000000..a80c959d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py
@@ -0,0 +1,1979 @@
+# This file is automatically generated by tools/idna-data
+
+__version__ = "11.0.0"
+scripts = {
+    'Greek': (
+        0x37000000374,
+        0x37500000378,
+        0x37a0000037e,
+        0x37f00000380,
+        0x38400000385,
+        0x38600000387,
+        0x3880000038b,
+        0x38c0000038d,
+        0x38e000003a2,
+        0x3a3000003e2,
+        0x3f000000400,
+        0x1d2600001d2b,
+        0x1d5d00001d62,
+        0x1d6600001d6b,
+        0x1dbf00001dc0,
+        0x1f0000001f16,
+        0x1f1800001f1e,
+        0x1f2000001f46,
+        0x1f4800001f4e,
+        0x1f5000001f58,
+        0x1f5900001f5a,
+        0x1f5b00001f5c,
+        0x1f5d00001f5e,
+        0x1f5f00001f7e,
+        0x1f8000001fb5,
+        0x1fb600001fc5,
+        0x1fc600001fd4,
+        0x1fd600001fdc,
+        0x1fdd00001ff0,
+        0x1ff200001ff5,
+        0x1ff600001fff,
+        0x212600002127,
+        0xab650000ab66,
+        0x101400001018f,
+        0x101a0000101a1,
+        0x1d2000001d246,
+    ),
+    'Han': (
+        0x2e8000002e9a,
+        0x2e9b00002ef4,
+        0x2f0000002fd6,
+        0x300500003006,
+        0x300700003008,
+        0x30210000302a,
+        0x30380000303c,
+        0x340000004db6,
+        0x4e0000009ff0,
+        0xf9000000fa6e,
+        0xfa700000fada,
+        0x200000002a6d7,
+        0x2a7000002b735,
+        0x2b7400002b81e,
+        0x2b8200002cea2,
+        0x2ceb00002ebe1,
+        0x2f8000002fa1e,
+    ),
+    'Hebrew': (
+        0x591000005c8,
+        0x5d0000005eb,
+        0x5ef000005f5,
+        0xfb1d0000fb37,
+        0xfb380000fb3d,
+        0xfb3e0000fb3f,
+        0xfb400000fb42,
+        0xfb430000fb45,
+        0xfb460000fb50,
+    ),
+    'Hiragana': (
+        0x304100003097,
+        0x309d000030a0,
+        0x1b0010001b11f,
+        0x1f2000001f201,
+    ),
+    'Katakana': (
+        0x30a1000030fb,
+        0x30fd00003100,
+        0x31f000003200,
+        0x32d0000032ff,
+        0x330000003358,
+        0xff660000ff70,
+        0xff710000ff9e,
+        0x1b0000001b001,
+    ),
+}
+joining_types = {
+    0x600: 85,
+    0x601: 85,
+    0x602: 85,
+    0x603: 85,
+    0x604: 85,
+    0x605: 85,
+    0x608: 85,
+    0x60b: 85,
+    0x620: 68,
+    0x621: 85,
+    0x622: 82,
+    0x623: 82,
+    0x624: 82,
+    0x625: 82,
+    0x626: 68,
+    0x627: 82,
+    0x628: 68,
+    0x629: 82,
+    0x62a: 68,
+    0x62b: 68,
+    0x62c: 68,
+    0x62d: 68,
+    0x62e: 68,
+    0x62f: 82,
+    0x630: 82,
+    0x631: 82,
+    0x632: 82,
+    0x633: 68,
+    0x634: 68,
+    0x635: 68,
+    0x636: 68,
+    0x637: 68,
+    0x638: 68,
+    0x639: 68,
+    0x63a: 68,
+    0x63b: 68,
+    0x63c: 68,
+    0x63d: 68,
+    0x63e: 68,
+    0x63f: 68,
+    0x640: 67,
+    0x641: 68,
+    0x642: 68,
+    0x643: 68,
+    0x644: 68,
+    0x645: 68,
+    0x646: 68,
+    0x647: 68,
+    0x648: 82,
+    0x649: 68,
+    0x64a: 68,
+    0x66e: 68,
+    0x66f: 68,
+    0x671: 82,
+    0x672: 82,
+    0x673: 82,
+    0x674: 85,
+    0x675: 82,
+    0x676: 82,
+    0x677: 82,
+    0x678: 68,
+    0x679: 68,
+    0x67a: 68,
+    0x67b: 68,
+    0x67c: 68,
+    0x67d: 68,
+    0x67e: 68,
+    0x67f: 68,
+    0x680: 68,
+    0x681: 68,
+    0x682: 68,
+    0x683: 68,
+    0x684: 68,
+    0x685: 68,
+    0x686: 68,
+    0x687: 68,
+    0x688: 82,
+    0x689: 82,
+    0x68a: 82,
+    0x68b: 82,
+    0x68c: 82,
+    0x68d: 82,
+    0x68e: 82,
+    0x68f: 82,
+    0x690: 82,
+    0x691: 82,
+    0x692: 82,
+    0x693: 82,
+    0x694: 82,
+    0x695: 82,
+    0x696: 82,
+    0x697: 82,
+    0x698: 82,
+    0x699: 82,
+    0x69a: 68,
+    0x69b: 68,
+    0x69c: 68,
+    0x69d: 68,
+    0x69e: 68,
+    0x69f: 68,
+    0x6a0: 68,
+    0x6a1: 68,
+    0x6a2: 68,
+    0x6a3: 68,
+    0x6a4: 68,
+    0x6a5: 68,
+    0x6a6: 68,
+    0x6a7: 68,
+    0x6a8: 68,
+    0x6a9: 68,
+    0x6aa: 68,
+    0x6ab: 68,
+    0x6ac: 68,
+    0x6ad: 68,
+    0x6ae: 68,
+    0x6af: 68,
+    0x6b0: 68,
+    0x6b1: 68,
+    0x6b2: 68,
+    0x6b3: 68,
+    0x6b4: 68,
+    0x6b5: 68,
+    0x6b6: 68,
+    0x6b7: 68,
+    0x6b8: 68,
+    0x6b9: 68,
+    0x6ba: 68,
+    0x6bb: 68,
+    0x6bc: 68,
+    0x6bd: 68,
+    0x6be: 68,
+    0x6bf: 68,
+    0x6c0: 82,
+    0x6c1: 68,
+    0x6c2: 68,
+    0x6c3: 82,
+    0x6c4: 82,
+    0x6c5: 82,
+    0x6c6: 82,
+    0x6c7: 82,
+    0x6c8: 82,
+    0x6c9: 82,
+    0x6ca: 82,
+    0x6cb: 82,
+    0x6cc: 68,
+    0x6cd: 82,
+    0x6ce: 68,
+    0x6cf: 82,
+    0x6d0: 68,
+    0x6d1: 68,
+    0x6d2: 82,
+    0x6d3: 82,
+    0x6d5: 82,
+    0x6dd: 85,
+    0x6ee: 82,
+    0x6ef: 82,
+    0x6fa: 68,
+    0x6fb: 68,
+    0x6fc: 68,
+    0x6ff: 68,
+    0x70f: 84,
+    0x710: 82,
+    0x712: 68,
+    0x713: 68,
+    0x714: 68,
+    0x715: 82,
+    0x716: 82,
+    0x717: 82,
+    0x718: 82,
+    0x719: 82,
+    0x71a: 68,
+    0x71b: 68,
+    0x71c: 68,
+    0x71d: 68,
+    0x71e: 82,
+    0x71f: 68,
+    0x720: 68,
+    0x721: 68,
+    0x722: 68,
+    0x723: 68,
+    0x724: 68,
+    0x725: 68,
+    0x726: 68,
+    0x727: 68,
+    0x728: 82,
+    0x729: 68,
+    0x72a: 82,
+    0x72b: 68,
+    0x72c: 82,
+    0x72d: 68,
+    0x72e: 68,
+    0x72f: 82,
+    0x74d: 82,
+    0x74e: 68,
+    0x74f: 68,
+    0x750: 68,
+    0x751: 68,
+    0x752: 68,
+    0x753: 68,
+    0x754: 68,
+    0x755: 68,
+    0x756: 68,
+    0x757: 68,
+    0x758: 68,
+    0x759: 82,
+    0x75a: 82,
+    0x75b: 82,
+    0x75c: 68,
+    0x75d: 68,
+    0x75e: 68,
+    0x75f: 68,
+    0x760: 68,
+    0x761: 68,
+    0x762: 68,
+    0x763: 68,
+    0x764: 68,
+    0x765: 68,
+    0x766: 68,
+    0x767: 68,
+    0x768: 68,
+    0x769: 68,
+    0x76a: 68,
+    0x76b: 82,
+    0x76c: 82,
+    0x76d: 68,
+    0x76e: 68,
+    0x76f: 68,
+    0x770: 68,
+    0x771: 82,
+    0x772: 68,
+    0x773: 82,
+    0x774: 82,
+    0x775: 68,
+    0x776: 68,
+    0x777: 68,
+    0x778: 82,
+    0x779: 82,
+    0x77a: 68,
+    0x77b: 68,
+    0x77c: 68,
+    0x77d: 68,
+    0x77e: 68,
+    0x77f: 68,
+    0x7ca: 68,
+    0x7cb: 68,
+    0x7cc: 68,
+    0x7cd: 68,
+    0x7ce: 68,
+    0x7cf: 68,
+    0x7d0: 68,
+    0x7d1: 68,
+    0x7d2: 68,
+    0x7d3: 68,
+    0x7d4: 68,
+    0x7d5: 68,
+    0x7d6: 68,
+    0x7d7: 68,
+    0x7d8: 68,
+    0x7d9: 68,
+    0x7da: 68,
+    0x7db: 68,
+    0x7dc: 68,
+    0x7dd: 68,
+    0x7de: 68,
+    0x7df: 68,
+    0x7e0: 68,
+    0x7e1: 68,
+    0x7e2: 68,
+    0x7e3: 68,
+    0x7e4: 68,
+    0x7e5: 68,
+    0x7e6: 68,
+    0x7e7: 68,
+    0x7e8: 68,
+    0x7e9: 68,
+    0x7ea: 68,
+    0x7fa: 67,
+    0x840: 82,
+    0x841: 68,
+    0x842: 68,
+    0x843: 68,
+    0x844: 68,
+    0x845: 68,
+    0x846: 82,
+    0x847: 82,
+    0x848: 68,
+    0x849: 82,
+    0x84a: 68,
+    0x84b: 68,
+    0x84c: 68,
+    0x84d: 68,
+    0x84e: 68,
+    0x84f: 68,
+    0x850: 68,
+    0x851: 68,
+    0x852: 68,
+    0x853: 68,
+    0x854: 82,
+    0x855: 68,
+    0x856: 85,
+    0x857: 85,
+    0x858: 85,
+    0x860: 68,
+    0x861: 85,
+    0x862: 68,
+    0x863: 68,
+    0x864: 68,
+    0x865: 68,
+    0x866: 85,
+    0x867: 82,
+    0x868: 68,
+    0x869: 82,
+    0x86a: 82,
+    0x8a0: 68,
+    0x8a1: 68,
+    0x8a2: 68,
+    0x8a3: 68,
+    0x8a4: 68,
+    0x8a5: 68,
+    0x8a6: 68,
+    0x8a7: 68,
+    0x8a8: 68,
+    0x8a9: 68,
+    0x8aa: 82,
+    0x8ab: 82,
+    0x8ac: 82,
+    0x8ad: 85,
+    0x8ae: 82,
+    0x8af: 68,
+    0x8b0: 68,
+    0x8b1: 82,
+    0x8b2: 82,
+    0x8b3: 68,
+    0x8b4: 68,
+    0x8b6: 68,
+    0x8b7: 68,
+    0x8b8: 68,
+    0x8b9: 82,
+    0x8ba: 68,
+    0x8bb: 68,
+    0x8bc: 68,
+    0x8bd: 68,
+    0x8e2: 85,
+    0x1806: 85,
+    0x1807: 68,
+    0x180a: 67,
+    0x180e: 85,
+    0x1820: 68,
+    0x1821: 68,
+    0x1822: 68,
+    0x1823: 68,
+    0x1824: 68,
+    0x1825: 68,
+    0x1826: 68,
+    0x1827: 68,
+    0x1828: 68,
+    0x1829: 68,
+    0x182a: 68,
+    0x182b: 68,
+    0x182c: 68,
+    0x182d: 68,
+    0x182e: 68,
+    0x182f: 68,
+    0x1830: 68,
+    0x1831: 68,
+    0x1832: 68,
+    0x1833: 68,
+    0x1834: 68,
+    0x1835: 68,
+    0x1836: 68,
+    0x1837: 68,
+    0x1838: 68,
+    0x1839: 68,
+    0x183a: 68,
+    0x183b: 68,
+    0x183c: 68,
+    0x183d: 68,
+    0x183e: 68,
+    0x183f: 68,
+    0x1840: 68,
+    0x1841: 68,
+    0x1842: 68,
+    0x1843: 68,
+    0x1844: 68,
+    0x1845: 68,
+    0x1846: 68,
+    0x1847: 68,
+    0x1848: 68,
+    0x1849: 68,
+    0x184a: 68,
+    0x184b: 68,
+    0x184c: 68,
+    0x184d: 68,
+    0x184e: 68,
+    0x184f: 68,
+    0x1850: 68,
+    0x1851: 68,
+    0x1852: 68,
+    0x1853: 68,
+    0x1854: 68,
+    0x1855: 68,
+    0x1856: 68,
+    0x1857: 68,
+    0x1858: 68,
+    0x1859: 68,
+    0x185a: 68,
+    0x185b: 68,
+    0x185c: 68,
+    0x185d: 68,
+    0x185e: 68,
+    0x185f: 68,
+    0x1860: 68,
+    0x1861: 68,
+    0x1862: 68,
+    0x1863: 68,
+    0x1864: 68,
+    0x1865: 68,
+    0x1866: 68,
+    0x1867: 68,
+    0x1868: 68,
+    0x1869: 68,
+    0x186a: 68,
+    0x186b: 68,
+    0x186c: 68,
+    0x186d: 68,
+    0x186e: 68,
+    0x186f: 68,
+    0x1870: 68,
+    0x1871: 68,
+    0x1872: 68,
+    0x1873: 68,
+    0x1874: 68,
+    0x1875: 68,
+    0x1876: 68,
+    0x1877: 68,
+    0x1878: 68,
+    0x1880: 85,
+    0x1881: 85,
+    0x1882: 85,
+    0x1883: 85,
+    0x1884: 85,
+    0x1885: 84,
+    0x1886: 84,
+    0x1887: 68,
+    0x1888: 68,
+    0x1889: 68,
+    0x188a: 68,
+    0x188b: 68,
+    0x188c: 68,
+    0x188d: 68,
+    0x188e: 68,
+    0x188f: 68,
+    0x1890: 68,
+    0x1891: 68,
+    0x1892: 68,
+    0x1893: 68,
+    0x1894: 68,
+    0x1895: 68,
+    0x1896: 68,
+    0x1897: 68,
+    0x1898: 68,
+    0x1899: 68,
+    0x189a: 68,
+    0x189b: 68,
+    0x189c: 68,
+    0x189d: 68,
+    0x189e: 68,
+    0x189f: 68,
+    0x18a0: 68,
+    0x18a1: 68,
+    0x18a2: 68,
+    0x18a3: 68,
+    0x18a4: 68,
+    0x18a5: 68,
+    0x18a6: 68,
+    0x18a7: 68,
+    0x18a8: 68,
+    0x18aa: 68,
+    0x200c: 85,
+    0x200d: 67,
+    0x202f: 85,
+    0x2066: 85,
+    0x2067: 85,
+    0x2068: 85,
+    0x2069: 85,
+    0xa840: 68,
+    0xa841: 68,
+    0xa842: 68,
+    0xa843: 68,
+    0xa844: 68,
+    0xa845: 68,
+    0xa846: 68,
+    0xa847: 68,
+    0xa848: 68,
+    0xa849: 68,
+    0xa84a: 68,
+    0xa84b: 68,
+    0xa84c: 68,
+    0xa84d: 68,
+    0xa84e: 68,
+    0xa84f: 68,
+    0xa850: 68,
+    0xa851: 68,
+    0xa852: 68,
+    0xa853: 68,
+    0xa854: 68,
+    0xa855: 68,
+    0xa856: 68,
+    0xa857: 68,
+    0xa858: 68,
+    0xa859: 68,
+    0xa85a: 68,
+    0xa85b: 68,
+    0xa85c: 68,
+    0xa85d: 68,
+    0xa85e: 68,
+    0xa85f: 68,
+    0xa860: 68,
+    0xa861: 68,
+    0xa862: 68,
+    0xa863: 68,
+    0xa864: 68,
+    0xa865: 68,
+    0xa866: 68,
+    0xa867: 68,
+    0xa868: 68,
+    0xa869: 68,
+    0xa86a: 68,
+    0xa86b: 68,
+    0xa86c: 68,
+    0xa86d: 68,
+    0xa86e: 68,
+    0xa86f: 68,
+    0xa870: 68,
+    0xa871: 68,
+    0xa872: 76,
+    0xa873: 85,
+    0x10ac0: 68,
+    0x10ac1: 68,
+    0x10ac2: 68,
+    0x10ac3: 68,
+    0x10ac4: 68,
+    0x10ac5: 82,
+    0x10ac6: 85,
+    0x10ac7: 82,
+    0x10ac8: 85,
+    0x10ac9: 82,
+    0x10aca: 82,
+    0x10acb: 85,
+    0x10acc: 85,
+    0x10acd: 76,
+    0x10ace: 82,
+    0x10acf: 82,
+    0x10ad0: 82,
+    0x10ad1: 82,
+    0x10ad2: 82,
+    0x10ad3: 68,
+    0x10ad4: 68,
+    0x10ad5: 68,
+    0x10ad6: 68,
+    0x10ad7: 76,
+    0x10ad8: 68,
+    0x10ad9: 68,
+    0x10ada: 68,
+    0x10adb: 68,
+    0x10adc: 68,
+    0x10add: 82,
+    0x10ade: 68,
+    0x10adf: 68,
+    0x10ae0: 68,
+    0x10ae1: 82,
+    0x10ae2: 85,
+    0x10ae3: 85,
+    0x10ae4: 82,
+    0x10aeb: 68,
+    0x10aec: 68,
+    0x10aed: 68,
+    0x10aee: 68,
+    0x10aef: 82,
+    0x10b80: 68,
+    0x10b81: 82,
+    0x10b82: 68,
+    0x10b83: 82,
+    0x10b84: 82,
+    0x10b85: 82,
+    0x10b86: 68,
+    0x10b87: 68,
+    0x10b88: 68,
+    0x10b89: 82,
+    0x10b8a: 68,
+    0x10b8b: 68,
+    0x10b8c: 82,
+    0x10b8d: 68,
+    0x10b8e: 82,
+    0x10b8f: 82,
+    0x10b90: 68,
+    0x10b91: 82,
+    0x10ba9: 82,
+    0x10baa: 82,
+    0x10bab: 82,
+    0x10bac: 82,
+    0x10bad: 68,
+    0x10bae: 68,
+    0x10baf: 85,
+    0x10d00: 76,
+    0x10d01: 68,
+    0x10d02: 68,
+    0x10d03: 68,
+    0x10d04: 68,
+    0x10d05: 68,
+    0x10d06: 68,
+    0x10d07: 68,
+    0x10d08: 68,
+    0x10d09: 68,
+    0x10d0a: 68,
+    0x10d0b: 68,
+    0x10d0c: 68,
+    0x10d0d: 68,
+    0x10d0e: 68,
+    0x10d0f: 68,
+    0x10d10: 68,
+    0x10d11: 68,
+    0x10d12: 68,
+    0x10d13: 68,
+    0x10d14: 68,
+    0x10d15: 68,
+    0x10d16: 68,
+    0x10d17: 68,
+    0x10d18: 68,
+    0x10d19: 68,
+    0x10d1a: 68,
+    0x10d1b: 68,
+    0x10d1c: 68,
+    0x10d1d: 68,
+    0x10d1e: 68,
+    0x10d1f: 68,
+    0x10d20: 68,
+    0x10d21: 68,
+    0x10d22: 82,
+    0x10d23: 68,
+    0x10f30: 68,
+    0x10f31: 68,
+    0x10f32: 68,
+    0x10f33: 82,
+    0x10f34: 68,
+    0x10f35: 68,
+    0x10f36: 68,
+    0x10f37: 68,
+    0x10f38: 68,
+    0x10f39: 68,
+    0x10f3a: 68,
+    0x10f3b: 68,
+    0x10f3c: 68,
+    0x10f3d: 68,
+    0x10f3e: 68,
+    0x10f3f: 68,
+    0x10f40: 68,
+    0x10f41: 68,
+    0x10f42: 68,
+    0x10f43: 68,
+    0x10f44: 68,
+    0x10f45: 85,
+    0x10f51: 68,
+    0x10f52: 68,
+    0x10f53: 68,
+    0x10f54: 82,
+    0x110bd: 85,
+    0x110cd: 85,
+    0x1e900: 68,
+    0x1e901: 68,
+    0x1e902: 68,
+    0x1e903: 68,
+    0x1e904: 68,
+    0x1e905: 68,
+    0x1e906: 68,
+    0x1e907: 68,
+    0x1e908: 68,
+    0x1e909: 68,
+    0x1e90a: 68,
+    0x1e90b: 68,
+    0x1e90c: 68,
+    0x1e90d: 68,
+    0x1e90e: 68,
+    0x1e90f: 68,
+    0x1e910: 68,
+    0x1e911: 68,
+    0x1e912: 68,
+    0x1e913: 68,
+    0x1e914: 68,
+    0x1e915: 68,
+    0x1e916: 68,
+    0x1e917: 68,
+    0x1e918: 68,
+    0x1e919: 68,
+    0x1e91a: 68,
+    0x1e91b: 68,
+    0x1e91c: 68,
+    0x1e91d: 68,
+    0x1e91e: 68,
+    0x1e91f: 68,
+    0x1e920: 68,
+    0x1e921: 68,
+    0x1e922: 68,
+    0x1e923: 68,
+    0x1e924: 68,
+    0x1e925: 68,
+    0x1e926: 68,
+    0x1e927: 68,
+    0x1e928: 68,
+    0x1e929: 68,
+    0x1e92a: 68,
+    0x1e92b: 68,
+    0x1e92c: 68,
+    0x1e92d: 68,
+    0x1e92e: 68,
+    0x1e92f: 68,
+    0x1e930: 68,
+    0x1e931: 68,
+    0x1e932: 68,
+    0x1e933: 68,
+    0x1e934: 68,
+    0x1e935: 68,
+    0x1e936: 68,
+    0x1e937: 68,
+    0x1e938: 68,
+    0x1e939: 68,
+    0x1e93a: 68,
+    0x1e93b: 68,
+    0x1e93c: 68,
+    0x1e93d: 68,
+    0x1e93e: 68,
+    0x1e93f: 68,
+    0x1e940: 68,
+    0x1e941: 68,
+    0x1e942: 68,
+    0x1e943: 68,
+}
+codepoint_classes = {
+    'PVALID': (
+        0x2d0000002e,
+        0x300000003a,
+        0x610000007b,
+        0xdf000000f7,
+        0xf800000100,
+        0x10100000102,
+        0x10300000104,
+        0x10500000106,
+        0x10700000108,
+        0x1090000010a,
+        0x10b0000010c,
+        0x10d0000010e,
+        0x10f00000110,
+        0x11100000112,
+        0x11300000114,
+        0x11500000116,
+        0x11700000118,
+        0x1190000011a,
+        0x11b0000011c,
+        0x11d0000011e,
+        0x11f00000120,
+        0x12100000122,
+        0x12300000124,
+        0x12500000126,
+        0x12700000128,
+        0x1290000012a,
+        0x12b0000012c,
+        0x12d0000012e,
+        0x12f00000130,
+        0x13100000132,
+        0x13500000136,
+        0x13700000139,
+        0x13a0000013b,
+        0x13c0000013d,
+        0x13e0000013f,
+        0x14200000143,
+        0x14400000145,
+        0x14600000147,
+        0x14800000149,
+        0x14b0000014c,
+        0x14d0000014e,
+        0x14f00000150,
+        0x15100000152,
+        0x15300000154,
+        0x15500000156,
+        0x15700000158,
+        0x1590000015a,
+        0x15b0000015c,
+        0x15d0000015e,
+        0x15f00000160,
+        0x16100000162,
+        0x16300000164,
+        0x16500000166,
+        0x16700000168,
+        0x1690000016a,
+        0x16b0000016c,
+        0x16d0000016e,
+        0x16f00000170,
+        0x17100000172,
+        0x17300000174,
+        0x17500000176,
+        0x17700000178,
+        0x17a0000017b,
+        0x17c0000017d,
+        0x17e0000017f,
+        0x18000000181,
+        0x18300000184,
+        0x18500000186,
+        0x18800000189,
+        0x18c0000018e,
+        0x19200000193,
+        0x19500000196,
+        0x1990000019c,
+        0x19e0000019f,
+        0x1a1000001a2,
+        0x1a3000001a4,
+        0x1a5000001a6,
+        0x1a8000001a9,
+        0x1aa000001ac,
+        0x1ad000001ae,
+        0x1b0000001b1,
+        0x1b4000001b5,
+        0x1b6000001b7,
+        0x1b9000001bc,
+        0x1bd000001c4,
+        0x1ce000001cf,
+        0x1d0000001d1,
+        0x1d2000001d3,
+        0x1d4000001d5,
+        0x1d6000001d7,
+        0x1d8000001d9,
+        0x1da000001db,
+        0x1dc000001de,
+        0x1df000001e0,
+        0x1e1000001e2,
+        0x1e3000001e4,
+        0x1e5000001e6,
+        0x1e7000001e8,
+        0x1e9000001ea,
+        0x1eb000001ec,
+        0x1ed000001ee,
+        0x1ef000001f1,
+        0x1f5000001f6,
+        0x1f9000001fa,
+        0x1fb000001fc,
+        0x1fd000001fe,
+        0x1ff00000200,
+        0x20100000202,
+        0x20300000204,
+        0x20500000206,
+        0x20700000208,
+        0x2090000020a,
+        0x20b0000020c,
+        0x20d0000020e,
+        0x20f00000210,
+        0x21100000212,
+        0x21300000214,
+        0x21500000216,
+        0x21700000218,
+        0x2190000021a,
+        0x21b0000021c,
+        0x21d0000021e,
+        0x21f00000220,
+        0x22100000222,
+        0x22300000224,
+        0x22500000226,
+        0x22700000228,
+        0x2290000022a,
+        0x22b0000022c,
+        0x22d0000022e,
+        0x22f00000230,
+        0x23100000232,
+        0x2330000023a,
+        0x23c0000023d,
+        0x23f00000241,
+        0x24200000243,
+        0x24700000248,
+        0x2490000024a,
+        0x24b0000024c,
+        0x24d0000024e,
+        0x24f000002b0,
+        0x2b9000002c2,
+        0x2c6000002d2,
+        0x2ec000002ed,
+        0x2ee000002ef,
+        0x30000000340,
+        0x34200000343,
+        0x3460000034f,
+        0x35000000370,
+        0x37100000372,
+        0x37300000374,
+        0x37700000378,
+        0x37b0000037e,
+        0x39000000391,
+        0x3ac000003cf,
+        0x3d7000003d8,
+        0x3d9000003da,
+        0x3db000003dc,
+        0x3dd000003de,
+        0x3df000003e0,
+        0x3e1000003e2,
+        0x3e3000003e4,
+        0x3e5000003e6,
+        0x3e7000003e8,
+        0x3e9000003ea,
+        0x3eb000003ec,
+        0x3ed000003ee,
+        0x3ef000003f0,
+        0x3f3000003f4,
+        0x3f8000003f9,
+        0x3fb000003fd,
+        0x43000000460,
+        0x46100000462,
+        0x46300000464,
+        0x46500000466,
+        0x46700000468,
+        0x4690000046a,
+        0x46b0000046c,
+        0x46d0000046e,
+        0x46f00000470,
+        0x47100000472,
+        0x47300000474,
+        0x47500000476,
+        0x47700000478,
+        0x4790000047a,
+        0x47b0000047c,
+        0x47d0000047e,
+        0x47f00000480,
+        0x48100000482,
+        0x48300000488,
+        0x48b0000048c,
+        0x48d0000048e,
+        0x48f00000490,
+        0x49100000492,
+        0x49300000494,
+        0x49500000496,
+        0x49700000498,
+        0x4990000049a,
+        0x49b0000049c,
+        0x49d0000049e,
+        0x49f000004a0,
+        0x4a1000004a2,
+        0x4a3000004a4,
+        0x4a5000004a6,
+        0x4a7000004a8,
+        0x4a9000004aa,
+        0x4ab000004ac,
+        0x4ad000004ae,
+        0x4af000004b0,
+        0x4b1000004b2,
+        0x4b3000004b4,
+        0x4b5000004b6,
+        0x4b7000004b8,
+        0x4b9000004ba,
+        0x4bb000004bc,
+        0x4bd000004be,
+        0x4bf000004c0,
+        0x4c2000004c3,
+        0x4c4000004c5,
+        0x4c6000004c7,
+        0x4c8000004c9,
+        0x4ca000004cb,
+        0x4cc000004cd,
+        0x4ce000004d0,
+        0x4d1000004d2,
+        0x4d3000004d4,
+        0x4d5000004d6,
+        0x4d7000004d8,
+        0x4d9000004da,
+        0x4db000004dc,
+        0x4dd000004de,
+        0x4df000004e0,
+        0x4e1000004e2,
+        0x4e3000004e4,
+        0x4e5000004e6,
+        0x4e7000004e8,
+        0x4e9000004ea,
+        0x4eb000004ec,
+        0x4ed000004ee,
+        0x4ef000004f0,
+        0x4f1000004f2,
+        0x4f3000004f4,
+        0x4f5000004f6,
+        0x4f7000004f8,
+        0x4f9000004fa,
+        0x4fb000004fc,
+        0x4fd000004fe,
+        0x4ff00000500,
+        0x50100000502,
+        0x50300000504,
+        0x50500000506,
+        0x50700000508,
+        0x5090000050a,
+        0x50b0000050c,
+        0x50d0000050e,
+        0x50f00000510,
+        0x51100000512,
+        0x51300000514,
+        0x51500000516,
+        0x51700000518,
+        0x5190000051a,
+        0x51b0000051c,
+        0x51d0000051e,
+        0x51f00000520,
+        0x52100000522,
+        0x52300000524,
+        0x52500000526,
+        0x52700000528,
+        0x5290000052a,
+        0x52b0000052c,
+        0x52d0000052e,
+        0x52f00000530,
+        0x5590000055a,
+        0x56000000587,
+        0x58800000589,
+        0x591000005be,
+        0x5bf000005c0,
+        0x5c1000005c3,
+        0x5c4000005c6,
+        0x5c7000005c8,
+        0x5d0000005eb,
+        0x5ef000005f3,
+        0x6100000061b,
+        0x62000000640,
+        0x64100000660,
+        0x66e00000675,
+        0x679000006d4,
+        0x6d5000006dd,
+        0x6df000006e9,
+        0x6ea000006f0,
+        0x6fa00000700,
+        0x7100000074b,
+        0x74d000007b2,
+        0x7c0000007f6,
+        0x7fd000007fe,
+        0x8000000082e,
+        0x8400000085c,
+        0x8600000086b,
+        0x8a0000008b5,
+        0x8b6000008be,
+        0x8d3000008e2,
+        0x8e300000958,
+        0x96000000964,
+        0x96600000970,
+        0x97100000984,
+        0x9850000098d,
+        0x98f00000991,
+        0x993000009a9,
+        0x9aa000009b1,
+        0x9b2000009b3,
+        0x9b6000009ba,
+        0x9bc000009c5,
+        0x9c7000009c9,
+        0x9cb000009cf,
+        0x9d7000009d8,
+        0x9e0000009e4,
+        0x9e6000009f2,
+        0x9fc000009fd,
+        0x9fe000009ff,
+        0xa0100000a04,
+        0xa0500000a0b,
+        0xa0f00000a11,
+        0xa1300000a29,
+        0xa2a00000a31,
+        0xa3200000a33,
+        0xa3500000a36,
+        0xa3800000a3a,
+        0xa3c00000a3d,
+        0xa3e00000a43,
+        0xa4700000a49,
+        0xa4b00000a4e,
+        0xa5100000a52,
+        0xa5c00000a5d,
+        0xa6600000a76,
+        0xa8100000a84,
+        0xa8500000a8e,
+        0xa8f00000a92,
+        0xa9300000aa9,
+        0xaaa00000ab1,
+        0xab200000ab4,
+        0xab500000aba,
+        0xabc00000ac6,
+        0xac700000aca,
+        0xacb00000ace,
+        0xad000000ad1,
+        0xae000000ae4,
+        0xae600000af0,
+        0xaf900000b00,
+        0xb0100000b04,
+        0xb0500000b0d,
+        0xb0f00000b11,
+        0xb1300000b29,
+        0xb2a00000b31,
+        0xb3200000b34,
+        0xb3500000b3a,
+        0xb3c00000b45,
+        0xb4700000b49,
+        0xb4b00000b4e,
+        0xb5600000b58,
+        0xb5f00000b64,
+        0xb6600000b70,
+        0xb7100000b72,
+        0xb8200000b84,
+        0xb8500000b8b,
+        0xb8e00000b91,
+        0xb9200000b96,
+        0xb9900000b9b,
+        0xb9c00000b9d,
+        0xb9e00000ba0,
+        0xba300000ba5,
+        0xba800000bab,
+        0xbae00000bba,
+        0xbbe00000bc3,
+        0xbc600000bc9,
+        0xbca00000bce,
+        0xbd000000bd1,
+        0xbd700000bd8,
+        0xbe600000bf0,
+        0xc0000000c0d,
+        0xc0e00000c11,
+        0xc1200000c29,
+        0xc2a00000c3a,
+        0xc3d00000c45,
+        0xc4600000c49,
+        0xc4a00000c4e,
+        0xc5500000c57,
+        0xc5800000c5b,
+        0xc6000000c64,
+        0xc6600000c70,
+        0xc8000000c84,
+        0xc8500000c8d,
+        0xc8e00000c91,
+        0xc9200000ca9,
+        0xcaa00000cb4,
+        0xcb500000cba,
+        0xcbc00000cc5,
+        0xcc600000cc9,
+        0xcca00000cce,
+        0xcd500000cd7,
+        0xcde00000cdf,
+        0xce000000ce4,
+        0xce600000cf0,
+        0xcf100000cf3,
+        0xd0000000d04,
+        0xd0500000d0d,
+        0xd0e00000d11,
+        0xd1200000d45,
+        0xd4600000d49,
+        0xd4a00000d4f,
+        0xd5400000d58,
+        0xd5f00000d64,
+        0xd6600000d70,
+        0xd7a00000d80,
+        0xd8200000d84,
+        0xd8500000d97,
+        0xd9a00000db2,
+        0xdb300000dbc,
+        0xdbd00000dbe,
+        0xdc000000dc7,
+        0xdca00000dcb,
+        0xdcf00000dd5,
+        0xdd600000dd7,
+        0xdd800000de0,
+        0xde600000df0,
+        0xdf200000df4,
+        0xe0100000e33,
+        0xe3400000e3b,
+        0xe4000000e4f,
+        0xe5000000e5a,
+        0xe8100000e83,
+        0xe8400000e85,
+        0xe8700000e89,
+        0xe8a00000e8b,
+        0xe8d00000e8e,
+        0xe9400000e98,
+        0xe9900000ea0,
+        0xea100000ea4,
+        0xea500000ea6,
+        0xea700000ea8,
+        0xeaa00000eac,
+        0xead00000eb3,
+        0xeb400000eba,
+        0xebb00000ebe,
+        0xec000000ec5,
+        0xec600000ec7,
+        0xec800000ece,
+        0xed000000eda,
+        0xede00000ee0,
+        0xf0000000f01,
+        0xf0b00000f0c,
+        0xf1800000f1a,
+        0xf2000000f2a,
+        0xf3500000f36,
+        0xf3700000f38,
+        0xf3900000f3a,
+        0xf3e00000f43,
+        0xf4400000f48,
+        0xf4900000f4d,
+        0xf4e00000f52,
+        0xf5300000f57,
+        0xf5800000f5c,
+        0xf5d00000f69,
+        0xf6a00000f6d,
+        0xf7100000f73,
+        0xf7400000f75,
+        0xf7a00000f81,
+        0xf8200000f85,
+        0xf8600000f93,
+        0xf9400000f98,
+        0xf9900000f9d,
+        0xf9e00000fa2,
+        0xfa300000fa7,
+        0xfa800000fac,
+        0xfad00000fb9,
+        0xfba00000fbd,
+        0xfc600000fc7,
+        0x10000000104a,
+        0x10500000109e,
+        0x10d0000010fb,
+        0x10fd00001100,
+        0x120000001249,
+        0x124a0000124e,
+        0x125000001257,
+        0x125800001259,
+        0x125a0000125e,
+        0x126000001289,
+        0x128a0000128e,
+        0x1290000012b1,
+        0x12b2000012b6,
+        0x12b8000012bf,
+        0x12c0000012c1,
+        0x12c2000012c6,
+        0x12c8000012d7,
+        0x12d800001311,
+        0x131200001316,
+        0x13180000135b,
+        0x135d00001360,
+        0x138000001390,
+        0x13a0000013f6,
+        0x14010000166d,
+        0x166f00001680,
+        0x16810000169b,
+        0x16a0000016eb,
+        0x16f1000016f9,
+        0x17000000170d,
+        0x170e00001715,
+        0x172000001735,
+        0x174000001754,
+        0x17600000176d,
+        0x176e00001771,
+        0x177200001774,
+        0x1780000017b4,
+        0x17b6000017d4,
+        0x17d7000017d8,
+        0x17dc000017de,
+        0x17e0000017ea,
+        0x18100000181a,
+        0x182000001879,
+        0x1880000018ab,
+        0x18b0000018f6,
+        0x19000000191f,
+        0x19200000192c,
+        0x19300000193c,
+        0x19460000196e,
+        0x197000001975,
+        0x1980000019ac,
+        0x19b0000019ca,
+        0x19d0000019da,
+        0x1a0000001a1c,
+        0x1a2000001a5f,
+        0x1a6000001a7d,
+        0x1a7f00001a8a,
+        0x1a9000001a9a,
+        0x1aa700001aa8,
+        0x1ab000001abe,
+        0x1b0000001b4c,
+        0x1b5000001b5a,
+        0x1b6b00001b74,
+        0x1b8000001bf4,
+        0x1c0000001c38,
+        0x1c4000001c4a,
+        0x1c4d00001c7e,
+        0x1cd000001cd3,
+        0x1cd400001cfa,
+        0x1d0000001d2c,
+        0x1d2f00001d30,
+        0x1d3b00001d3c,
+        0x1d4e00001d4f,
+        0x1d6b00001d78,
+        0x1d7900001d9b,
+        0x1dc000001dfa,
+        0x1dfb00001e00,
+        0x1e0100001e02,
+        0x1e0300001e04,
+        0x1e0500001e06,
+        0x1e0700001e08,
+        0x1e0900001e0a,
+        0x1e0b00001e0c,
+        0x1e0d00001e0e,
+        0x1e0f00001e10,
+        0x1e1100001e12,
+        0x1e1300001e14,
+        0x1e1500001e16,
+        0x1e1700001e18,
+        0x1e1900001e1a,
+        0x1e1b00001e1c,
+        0x1e1d00001e1e,
+        0x1e1f00001e20,
+        0x1e2100001e22,
+        0x1e2300001e24,
+        0x1e2500001e26,
+        0x1e2700001e28,
+        0x1e2900001e2a,
+        0x1e2b00001e2c,
+        0x1e2d00001e2e,
+        0x1e2f00001e30,
+        0x1e3100001e32,
+        0x1e3300001e34,
+        0x1e3500001e36,
+        0x1e3700001e38,
+        0x1e3900001e3a,
+        0x1e3b00001e3c,
+        0x1e3d00001e3e,
+        0x1e3f00001e40,
+        0x1e4100001e42,
+        0x1e4300001e44,
+        0x1e4500001e46,
+        0x1e4700001e48,
+        0x1e4900001e4a,
+        0x1e4b00001e4c,
+        0x1e4d00001e4e,
+        0x1e4f00001e50,
+        0x1e5100001e52,
+        0x1e5300001e54,
+        0x1e5500001e56,
+        0x1e5700001e58,
+        0x1e5900001e5a,
+        0x1e5b00001e5c,
+        0x1e5d00001e5e,
+        0x1e5f00001e60,
+        0x1e6100001e62,
+        0x1e6300001e64,
+        0x1e6500001e66,
+        0x1e6700001e68,
+        0x1e6900001e6a,
+        0x1e6b00001e6c,
+        0x1e6d00001e6e,
+        0x1e6f00001e70,
+        0x1e7100001e72,
+        0x1e7300001e74,
+        0x1e7500001e76,
+        0x1e7700001e78,
+        0x1e7900001e7a,
+        0x1e7b00001e7c,
+        0x1e7d00001e7e,
+        0x1e7f00001e80,
+        0x1e8100001e82,
+        0x1e8300001e84,
+        0x1e8500001e86,
+        0x1e8700001e88,
+        0x1e8900001e8a,
+        0x1e8b00001e8c,
+        0x1e8d00001e8e,
+        0x1e8f00001e90,
+        0x1e9100001e92,
+        0x1e9300001e94,
+        0x1e9500001e9a,
+        0x1e9c00001e9e,
+        0x1e9f00001ea0,
+        0x1ea100001ea2,
+        0x1ea300001ea4,
+        0x1ea500001ea6,
+        0x1ea700001ea8,
+        0x1ea900001eaa,
+        0x1eab00001eac,
+        0x1ead00001eae,
+        0x1eaf00001eb0,
+        0x1eb100001eb2,
+        0x1eb300001eb4,
+        0x1eb500001eb6,
+        0x1eb700001eb8,
+        0x1eb900001eba,
+        0x1ebb00001ebc,
+        0x1ebd00001ebe,
+        0x1ebf00001ec0,
+        0x1ec100001ec2,
+        0x1ec300001ec4,
+        0x1ec500001ec6,
+        0x1ec700001ec8,
+        0x1ec900001eca,
+        0x1ecb00001ecc,
+        0x1ecd00001ece,
+        0x1ecf00001ed0,
+        0x1ed100001ed2,
+        0x1ed300001ed4,
+        0x1ed500001ed6,
+        0x1ed700001ed8,
+        0x1ed900001eda,
+        0x1edb00001edc,
+        0x1edd00001ede,
+        0x1edf00001ee0,
+        0x1ee100001ee2,
+        0x1ee300001ee4,
+        0x1ee500001ee6,
+        0x1ee700001ee8,
+        0x1ee900001eea,
+        0x1eeb00001eec,
+        0x1eed00001eee,
+        0x1eef00001ef0,
+        0x1ef100001ef2,
+        0x1ef300001ef4,
+        0x1ef500001ef6,
+        0x1ef700001ef8,
+        0x1ef900001efa,
+        0x1efb00001efc,
+        0x1efd00001efe,
+        0x1eff00001f08,
+        0x1f1000001f16,
+        0x1f2000001f28,
+        0x1f3000001f38,
+        0x1f4000001f46,
+        0x1f5000001f58,
+        0x1f6000001f68,
+        0x1f7000001f71,
+        0x1f7200001f73,
+        0x1f7400001f75,
+        0x1f7600001f77,
+        0x1f7800001f79,
+        0x1f7a00001f7b,
+        0x1f7c00001f7d,
+        0x1fb000001fb2,
+        0x1fb600001fb7,
+        0x1fc600001fc7,
+        0x1fd000001fd3,
+        0x1fd600001fd8,
+        0x1fe000001fe3,
+        0x1fe400001fe8,
+        0x1ff600001ff7,
+        0x214e0000214f,
+        0x218400002185,
+        0x2c3000002c5f,
+        0x2c6100002c62,
+        0x2c6500002c67,
+        0x2c6800002c69,
+        0x2c6a00002c6b,
+        0x2c6c00002c6d,
+        0x2c7100002c72,
+        0x2c7300002c75,
+        0x2c7600002c7c,
+        0x2c8100002c82,
+        0x2c8300002c84,
+        0x2c8500002c86,
+        0x2c8700002c88,
+        0x2c8900002c8a,
+        0x2c8b00002c8c,
+        0x2c8d00002c8e,
+        0x2c8f00002c90,
+        0x2c9100002c92,
+        0x2c9300002c94,
+        0x2c9500002c96,
+        0x2c9700002c98,
+        0x2c9900002c9a,
+        0x2c9b00002c9c,
+        0x2c9d00002c9e,
+        0x2c9f00002ca0,
+        0x2ca100002ca2,
+        0x2ca300002ca4,
+        0x2ca500002ca6,
+        0x2ca700002ca8,
+        0x2ca900002caa,
+        0x2cab00002cac,
+        0x2cad00002cae,
+        0x2caf00002cb0,
+        0x2cb100002cb2,
+        0x2cb300002cb4,
+        0x2cb500002cb6,
+        0x2cb700002cb8,
+        0x2cb900002cba,
+        0x2cbb00002cbc,
+        0x2cbd00002cbe,
+        0x2cbf00002cc0,
+        0x2cc100002cc2,
+        0x2cc300002cc4,
+        0x2cc500002cc6,
+        0x2cc700002cc8,
+        0x2cc900002cca,
+        0x2ccb00002ccc,
+        0x2ccd00002cce,
+        0x2ccf00002cd0,
+        0x2cd100002cd2,
+        0x2cd300002cd4,
+        0x2cd500002cd6,
+        0x2cd700002cd8,
+        0x2cd900002cda,
+        0x2cdb00002cdc,
+        0x2cdd00002cde,
+        0x2cdf00002ce0,
+        0x2ce100002ce2,
+        0x2ce300002ce5,
+        0x2cec00002ced,
+        0x2cee00002cf2,
+        0x2cf300002cf4,
+        0x2d0000002d26,
+        0x2d2700002d28,
+        0x2d2d00002d2e,
+        0x2d3000002d68,
+        0x2d7f00002d97,
+        0x2da000002da7,
+        0x2da800002daf,
+        0x2db000002db7,
+        0x2db800002dbf,
+        0x2dc000002dc7,
+        0x2dc800002dcf,
+        0x2dd000002dd7,
+        0x2dd800002ddf,
+        0x2de000002e00,
+        0x2e2f00002e30,
+        0x300500003008,
+        0x302a0000302e,
+        0x303c0000303d,
+        0x304100003097,
+        0x30990000309b,
+        0x309d0000309f,
+        0x30a1000030fb,
+        0x30fc000030ff,
+        0x310500003130,
+        0x31a0000031bb,
+        0x31f000003200,
+        0x340000004db6,
+        0x4e0000009ff0,
+        0xa0000000a48d,
+        0xa4d00000a4fe,
+        0xa5000000a60d,
+        0xa6100000a62c,
+        0xa6410000a642,
+        0xa6430000a644,
+        0xa6450000a646,
+        0xa6470000a648,
+        0xa6490000a64a,
+        0xa64b0000a64c,
+        0xa64d0000a64e,
+        0xa64f0000a650,
+        0xa6510000a652,
+        0xa6530000a654,
+        0xa6550000a656,
+        0xa6570000a658,
+        0xa6590000a65a,
+        0xa65b0000a65c,
+        0xa65d0000a65e,
+        0xa65f0000a660,
+        0xa6610000a662,
+        0xa6630000a664,
+        0xa6650000a666,
+        0xa6670000a668,
+        0xa6690000a66a,
+        0xa66b0000a66c,
+        0xa66d0000a670,
+        0xa6740000a67e,
+        0xa67f0000a680,
+        0xa6810000a682,
+        0xa6830000a684,
+        0xa6850000a686,
+        0xa6870000a688,
+        0xa6890000a68a,
+        0xa68b0000a68c,
+        0xa68d0000a68e,
+        0xa68f0000a690,
+        0xa6910000a692,
+        0xa6930000a694,
+        0xa6950000a696,
+        0xa6970000a698,
+        0xa6990000a69a,
+        0xa69b0000a69c,
+        0xa69e0000a6e6,
+        0xa6f00000a6f2,
+        0xa7170000a720,
+        0xa7230000a724,
+        0xa7250000a726,
+        0xa7270000a728,
+        0xa7290000a72a,
+        0xa72b0000a72c,
+        0xa72d0000a72e,
+        0xa72f0000a732,
+        0xa7330000a734,
+        0xa7350000a736,
+        0xa7370000a738,
+        0xa7390000a73a,
+        0xa73b0000a73c,
+        0xa73d0000a73e,
+        0xa73f0000a740,
+        0xa7410000a742,
+        0xa7430000a744,
+        0xa7450000a746,
+        0xa7470000a748,
+        0xa7490000a74a,
+        0xa74b0000a74c,
+        0xa74d0000a74e,
+        0xa74f0000a750,
+        0xa7510000a752,
+        0xa7530000a754,
+        0xa7550000a756,
+        0xa7570000a758,
+        0xa7590000a75a,
+        0xa75b0000a75c,
+        0xa75d0000a75e,
+        0xa75f0000a760,
+        0xa7610000a762,
+        0xa7630000a764,
+        0xa7650000a766,
+        0xa7670000a768,
+        0xa7690000a76a,
+        0xa76b0000a76c,
+        0xa76d0000a76e,
+        0xa76f0000a770,
+        0xa7710000a779,
+        0xa77a0000a77b,
+        0xa77c0000a77d,
+        0xa77f0000a780,
+        0xa7810000a782,
+        0xa7830000a784,
+        0xa7850000a786,
+        0xa7870000a789,
+        0xa78c0000a78d,
+        0xa78e0000a790,
+        0xa7910000a792,
+        0xa7930000a796,
+        0xa7970000a798,
+        0xa7990000a79a,
+        0xa79b0000a79c,
+        0xa79d0000a79e,
+        0xa79f0000a7a0,
+        0xa7a10000a7a2,
+        0xa7a30000a7a4,
+        0xa7a50000a7a6,
+        0xa7a70000a7a8,
+        0xa7a90000a7aa,
+        0xa7af0000a7b0,
+        0xa7b50000a7b6,
+        0xa7b70000a7b8,
+        0xa7b90000a7ba,
+        0xa7f70000a7f8,
+        0xa7fa0000a828,
+        0xa8400000a874,
+        0xa8800000a8c6,
+        0xa8d00000a8da,
+        0xa8e00000a8f8,
+        0xa8fb0000a8fc,
+        0xa8fd0000a92e,
+        0xa9300000a954,
+        0xa9800000a9c1,
+        0xa9cf0000a9da,
+        0xa9e00000a9ff,
+        0xaa000000aa37,
+        0xaa400000aa4e,
+        0xaa500000aa5a,
+        0xaa600000aa77,
+        0xaa7a0000aac3,
+        0xaadb0000aade,
+        0xaae00000aaf0,
+        0xaaf20000aaf7,
+        0xab010000ab07,
+        0xab090000ab0f,
+        0xab110000ab17,
+        0xab200000ab27,
+        0xab280000ab2f,
+        0xab300000ab5b,
+        0xab600000ab66,
+        0xabc00000abeb,
+        0xabec0000abee,
+        0xabf00000abfa,
+        0xac000000d7a4,
+        0xfa0e0000fa10,
+        0xfa110000fa12,
+        0xfa130000fa15,
+        0xfa1f0000fa20,
+        0xfa210000fa22,
+        0xfa230000fa25,
+        0xfa270000fa2a,
+        0xfb1e0000fb1f,
+        0xfe200000fe30,
+        0xfe730000fe74,
+        0x100000001000c,
+        0x1000d00010027,
+        0x100280001003b,
+        0x1003c0001003e,
+        0x1003f0001004e,
+        0x100500001005e,
+        0x10080000100fb,
+        0x101fd000101fe,
+        0x102800001029d,
+        0x102a0000102d1,
+        0x102e0000102e1,
+        0x1030000010320,
+        0x1032d00010341,
+        0x103420001034a,
+        0x103500001037b,
+        0x103800001039e,
+        0x103a0000103c4,
+        0x103c8000103d0,
+        0x104280001049e,
+        0x104a0000104aa,
+        0x104d8000104fc,
+        0x1050000010528,
+        0x1053000010564,
+        0x1060000010737,
+        0x1074000010756,
+        0x1076000010768,
+        0x1080000010806,
+        0x1080800010809,
+        0x1080a00010836,
+        0x1083700010839,
+        0x1083c0001083d,
+        0x1083f00010856,
+        0x1086000010877,
+        0x108800001089f,
+        0x108e0000108f3,
+        0x108f4000108f6,
+        0x1090000010916,
+        0x109200001093a,
+        0x10980000109b8,
+        0x109be000109c0,
+        0x10a0000010a04,
+        0x10a0500010a07,
+        0x10a0c00010a14,
+        0x10a1500010a18,
+        0x10a1900010a36,
+        0x10a3800010a3b,
+        0x10a3f00010a40,
+        0x10a6000010a7d,
+        0x10a8000010a9d,
+        0x10ac000010ac8,
+        0x10ac900010ae7,
+        0x10b0000010b36,
+        0x10b4000010b56,
+        0x10b6000010b73,
+        0x10b8000010b92,
+        0x10c0000010c49,
+        0x10cc000010cf3,
+        0x10d0000010d28,
+        0x10d3000010d3a,
+        0x10f0000010f1d,
+        0x10f2700010f28,
+        0x10f3000010f51,
+        0x1100000011047,
+        0x1106600011070,
+        0x1107f000110bb,
+        0x110d0000110e9,
+        0x110f0000110fa,
+        0x1110000011135,
+        0x1113600011140,
+        0x1114400011147,
+        0x1115000011174,
+        0x1117600011177,
+        0x11180000111c5,
+        0x111c9000111cd,
+        0x111d0000111db,
+        0x111dc000111dd,
+        0x1120000011212,
+        0x1121300011238,
+        0x1123e0001123f,
+        0x1128000011287,
+        0x1128800011289,
+        0x1128a0001128e,
+        0x1128f0001129e,
+        0x1129f000112a9,
+        0x112b0000112eb,
+        0x112f0000112fa,
+        0x1130000011304,
+        0x113050001130d,
+        0x1130f00011311,
+        0x1131300011329,
+        0x1132a00011331,
+        0x1133200011334,
+        0x113350001133a,
+        0x1133b00011345,
+        0x1134700011349,
+        0x1134b0001134e,
+        0x1135000011351,
+        0x1135700011358,
+        0x1135d00011364,
+        0x113660001136d,
+        0x1137000011375,
+        0x114000001144b,
+        0x114500001145a,
+        0x1145e0001145f,
+        0x11480000114c6,
+        0x114c7000114c8,
+        0x114d0000114da,
+        0x11580000115b6,
+        0x115b8000115c1,
+        0x115d8000115de,
+        0x1160000011641,
+        0x1164400011645,
+        0x116500001165a,
+        0x11680000116b8,
+        0x116c0000116ca,
+        0x117000001171b,
+        0x1171d0001172c,
+        0x117300001173a,
+        0x118000001183b,
+        0x118c0000118ea,
+        0x118ff00011900,
+        0x11a0000011a3f,
+        0x11a4700011a48,
+        0x11a5000011a84,
+        0x11a8600011a9a,
+        0x11a9d00011a9e,
+        0x11ac000011af9,
+        0x11c0000011c09,
+        0x11c0a00011c37,
+        0x11c3800011c41,
+        0x11c5000011c5a,
+        0x11c7200011c90,
+        0x11c9200011ca8,
+        0x11ca900011cb7,
+        0x11d0000011d07,
+        0x11d0800011d0a,
+        0x11d0b00011d37,
+        0x11d3a00011d3b,
+        0x11d3c00011d3e,
+        0x11d3f00011d48,
+        0x11d5000011d5a,
+        0x11d6000011d66,
+        0x11d6700011d69,
+        0x11d6a00011d8f,
+        0x11d9000011d92,
+        0x11d9300011d99,
+        0x11da000011daa,
+        0x11ee000011ef7,
+        0x120000001239a,
+        0x1248000012544,
+        0x130000001342f,
+        0x1440000014647,
+        0x1680000016a39,
+        0x16a4000016a5f,
+        0x16a6000016a6a,
+        0x16ad000016aee,
+        0x16af000016af5,
+        0x16b0000016b37,
+        0x16b4000016b44,
+        0x16b5000016b5a,
+        0x16b6300016b78,
+        0x16b7d00016b90,
+        0x16e6000016e80,
+        0x16f0000016f45,
+        0x16f5000016f7f,
+        0x16f8f00016fa0,
+        0x16fe000016fe2,
+        0x17000000187f2,
+        0x1880000018af3,
+        0x1b0000001b11f,
+        0x1b1700001b2fc,
+        0x1bc000001bc6b,
+        0x1bc700001bc7d,
+        0x1bc800001bc89,
+        0x1bc900001bc9a,
+        0x1bc9d0001bc9f,
+        0x1da000001da37,
+        0x1da3b0001da6d,
+        0x1da750001da76,
+        0x1da840001da85,
+        0x1da9b0001daa0,
+        0x1daa10001dab0,
+        0x1e0000001e007,
+        0x1e0080001e019,
+        0x1e01b0001e022,
+        0x1e0230001e025,
+        0x1e0260001e02b,
+        0x1e8000001e8c5,
+        0x1e8d00001e8d7,
+        0x1e9220001e94b,
+        0x1e9500001e95a,
+        0x200000002a6d7,
+        0x2a7000002b735,
+        0x2b7400002b81e,
+        0x2b8200002cea2,
+        0x2ceb00002ebe1,
+    ),
+    'CONTEXTJ': (
+        0x200c0000200e,
+    ),
+    'CONTEXTO': (
+        0xb7000000b8,
+        0x37500000376,
+        0x5f3000005f5,
+        0x6600000066a,
+        0x6f0000006fa,
+        0x30fb000030fc,
+    ),
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..70d0ef0fd46183e7a56d6d72814fffbe21b1a220
GIT binary patch
literal 35078
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py
new file mode 100644
index 00000000..fa8a7356
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py
@@ -0,0 +1,53 @@
+"""
+Given a list of integers, made up of (hopefully) a small number of long runs
+of consecutive integers, compute a representation of the form
+((start1, end1), (start2, end2) ...). Then answer the question "was x present
+in the original list?" in time O(log(# runs)).
+"""
+
+import bisect
+
+def intranges_from_list(list_):
+    """Represent a list of integers as a sequence of ranges:
+    ((start_0, end_0), (start_1, end_1), ...), such that the original
+    integers are exactly those x such that start_i <= x < end_i for some i.
+
+    Ranges are encoded as single integers (start << 32 | end), not as tuples.
+    """
+
+    sorted_list = sorted(list_)
+    ranges = []
+    last_write = -1
+    for i in range(len(sorted_list)):
+        if i+1 < len(sorted_list):
+            if sorted_list[i] == sorted_list[i+1]-1:
+                continue
+        current_range = sorted_list[last_write+1:i+1]
+        ranges.append(_encode_range(current_range[0], current_range[-1] + 1))
+        last_write = i
+
+    return tuple(ranges)
+
+def _encode_range(start, end):
+    return (start << 32) | end
+
+def _decode_range(r):
+    return (r >> 32), (r & ((1 << 32) - 1))
+
+
+def intranges_contain(int_, ranges):
+    """Determine if `int_` falls into one of the ranges in `ranges`."""
+    tuple_ = _encode_range(int_, 0)
+    pos = bisect.bisect_left(ranges, tuple_)
+    # we could be immediately ahead of a tuple (start, end)
+    # with start < int_ <= end
+    if pos > 0:
+        left, right = _decode_range(ranges[pos-1])
+        if left <= int_ < right:
+            return True
+    # or we could be immediately behind a tuple (int_, end)
+    if pos < len(ranges):
+        left, _ = _decode_range(ranges[pos])
+        if left == int_:
+            return True
+    return False
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..655f42edda022a58871ca5ed1a0799e8894ab8d8
GIT binary patch
literal 2452
zcmZSn%*&NH<x)&C0~9bZFfceUFfbHbF)%QsFfc?hFr+Xtq%bk$Ffv3jGNdpwv@kG4
zF)^gDfEmmTDXd@y3quMUn86BC9IU|(GJ}(mfq~0Cvn(}FAyFYGv$#YdKTRPsuOu}+
zwWwG}AvZB4RiU&1B&d;*Uyzzsnv+whsgS5poST@FqmWmco0M7vlFiA_OIIi=%`4{0
zPg6+F&nr$%E-lF{OGPp(IX}0cv?Ns_QK2ZcpeVICHLoPGBr`t`q`f2~RUs|ED3?n^
zqqroosKii5AvG_>P*X<%!Z!l*jWiYX^z=0K6hbmU?#(MMPc2daX)P>GEe0E<RGwI@
zP@w=do+~pCES+DJnVy-Km;?5py^;b*I5Rg@!CxaMKV3r^>~2j>J+93E|NsB@OJ-zX
zU|@q{XHXz*XJB9`VPL3XU}$D!sAXhGXJDvh0tI?4GegBBh7v}G5+;TkMv!bXBZEt9
z9YZY(Lk$Zkn8o2T*$fOtIUrRvEDVx0j4*l06eb3VY$lLgp*BNd4nrOTSP?T=H`EZt
zT2_V{CWb6#h7uNr8dgvoOM)my29S2~W+sr;j5RC_wag5K+6>_(VCBt>48a;KAP-10
zGB5<e0v$_4D<l?!;xx6eG&L_d6%-*wiFxU%#a3Jj3JMC)IEgm^M?$;-JXYc%(G(Ag
zCs4%bC={0_XDF0pB$l9rJJ=LhqEbjKN>xa$NK7utsZ=P*$S+P+s6f&Oj{f*e1shw1
z3I!WbDu~YnB@Kn*{M=N9Og%2JVL@Q$L5#{v&QD2A0ePV~GcP>{k>sFhN5RHM!PrQl
z24t3|jzV632}o^8X+chEu^!koaJ*-NqCFFo$235ZUjibE^NUJSQ%YDF7#P3-Qo_u@
zz>t%g2bN4MC`ipqDdA;cV2DozJ0c#U2&5crJj5Un7nHN&OSnOC0X8xoBmg!Atfjbw
z3uJI&aY=l6QD#YM3D_-QqmxUEic<4RAVzC|od+U{a~T*I^b3kI%Mwdc^~(~A^waWl
zQc{bG^|K50vx|+)%?%5)jLgdnEzFB^D$~p3O;Suu3=9km()08~^b0ZzbTjjcOA>Q(
zbjuShO9L}NLSP(UmYSE6U!<Rzl9#BTnO6dFpI$*_i7*2L16&|JttdYi><f^~i^V{0
z;^1LqV`O8LWE5kRVdP{KWmID1VoC-TS1=6DO*{<XtdzpYU{}M);1sL@lJ(0}U|?W?
z_z%PfhdDScfWtgBF9jk8vWNbD4+7;Pc~I<u+{VBNE+Rm21QG{(N(k;L`x*vN(d&@L
z#1O0jihGFHz{$%K<b04mPf$q%;y`=_5(3A05rhwtp}#M|=`B7b6_lSK=}igA%OIbF
zstmZ7SHerh6h?+-CQy-B!pM*XE(vRxz#_~HHO!!LGMj~=D2t(l8BwxHNH#Mv#4v#h
zN>JIx0xDctn6nuf^5Z}STs8wk9uor-BS;quLoldJWM%-BYT!Z^RFp177>8sO8>m>V
zVPF6is7pbGB}i)t8$+-LDCZX2GB7Z>q?V)><!0ukDrBZ9BxL55#3v}ECFbN5gQ}{0
zh5S5l`3I_1AW0uoTO>f333}l20UVX!>JywUz}Yw{vp6-m1f0Vm%=nztw2~kJP#A$i
zETpJ3H3$@h;Dqg#m{XhzHlYM0335ab2S_QX&;b`6@!(`%kY5Z|05S`#u_!Y=qXe8%
z;s-RP2%?k)$@zIDiJ5t7pwt2`37Gg9g_wC5r5I%x*_nhG#Ta=Q*%=|FAt(vO$EV~c
z$HxbOObOy)U|;};BRH^vq~XN?C=-A^IRH5U6d5+T`6;D2sdk_^DF&5tY)m{%oT8k}
GoGbv#`)B<C

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py
new file mode 100644
index 00000000..257e8989
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py
@@ -0,0 +1,2 @@
+__version__ = '2.8'
+
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1ead257d3602f799995165390c9fc2131e85ba6d
GIT binary patch
literal 229
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#F!Zv7>x8R{4_wS
zO1K#q7~<p0Qj3Z+^Yh~4H9#gHh~feU1_u3tqRg_yl2rY&#3KE){G623qGJ8*LjCMw
zBXe`Z!Ym{6GD8dV;+)F#@_3UJ6B7di1B3KD{Sf_v%mUrayyB9?oE+WqM9b2^43H2Q
z$Cst%rQ{dsXQt#O>K7y?XD6no#-}8fB<dAZmT)jIFxcegr<CTT+JPKd4003zB%3*1

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py b/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py
new file mode 100644
index 00000000..a68ed4c0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py
@@ -0,0 +1,8205 @@
+# This file is automatically generated by tools/idna-data
+# vim: set fileencoding=utf-8 :
+
+"""IDNA Mapping Table from UTS46."""
+
+
+__version__ = "11.0.0"
+def _seg_0():
+    return [
+    (0x0, '3'),
+    (0x1, '3'),
+    (0x2, '3'),
+    (0x3, '3'),
+    (0x4, '3'),
+    (0x5, '3'),
+    (0x6, '3'),
+    (0x7, '3'),
+    (0x8, '3'),
+    (0x9, '3'),
+    (0xA, '3'),
+    (0xB, '3'),
+    (0xC, '3'),
+    (0xD, '3'),
+    (0xE, '3'),
+    (0xF, '3'),
+    (0x10, '3'),
+    (0x11, '3'),
+    (0x12, '3'),
+    (0x13, '3'),
+    (0x14, '3'),
+    (0x15, '3'),
+    (0x16, '3'),
+    (0x17, '3'),
+    (0x18, '3'),
+    (0x19, '3'),
+    (0x1A, '3'),
+    (0x1B, '3'),
+    (0x1C, '3'),
+    (0x1D, '3'),
+    (0x1E, '3'),
+    (0x1F, '3'),
+    (0x20, '3'),
+    (0x21, '3'),
+    (0x22, '3'),
+    (0x23, '3'),
+    (0x24, '3'),
+    (0x25, '3'),
+    (0x26, '3'),
+    (0x27, '3'),
+    (0x28, '3'),
+    (0x29, '3'),
+    (0x2A, '3'),
+    (0x2B, '3'),
+    (0x2C, '3'),
+    (0x2D, 'V'),
+    (0x2E, 'V'),
+    (0x2F, '3'),
+    (0x30, 'V'),
+    (0x31, 'V'),
+    (0x32, 'V'),
+    (0x33, 'V'),
+    (0x34, 'V'),
+    (0x35, 'V'),
+    (0x36, 'V'),
+    (0x37, 'V'),
+    (0x38, 'V'),
+    (0x39, 'V'),
+    (0x3A, '3'),
+    (0x3B, '3'),
+    (0x3C, '3'),
+    (0x3D, '3'),
+    (0x3E, '3'),
+    (0x3F, '3'),
+    (0x40, '3'),
+    (0x41, 'M', u'a'),
+    (0x42, 'M', u'b'),
+    (0x43, 'M', u'c'),
+    (0x44, 'M', u'd'),
+    (0x45, 'M', u'e'),
+    (0x46, 'M', u'f'),
+    (0x47, 'M', u'g'),
+    (0x48, 'M', u'h'),
+    (0x49, 'M', u'i'),
+    (0x4A, 'M', u'j'),
+    (0x4B, 'M', u'k'),
+    (0x4C, 'M', u'l'),
+    (0x4D, 'M', u'm'),
+    (0x4E, 'M', u'n'),
+    (0x4F, 'M', u'o'),
+    (0x50, 'M', u'p'),
+    (0x51, 'M', u'q'),
+    (0x52, 'M', u'r'),
+    (0x53, 'M', u's'),
+    (0x54, 'M', u't'),
+    (0x55, 'M', u'u'),
+    (0x56, 'M', u'v'),
+    (0x57, 'M', u'w'),
+    (0x58, 'M', u'x'),
+    (0x59, 'M', u'y'),
+    (0x5A, 'M', u'z'),
+    (0x5B, '3'),
+    (0x5C, '3'),
+    (0x5D, '3'),
+    (0x5E, '3'),
+    (0x5F, '3'),
+    (0x60, '3'),
+    (0x61, 'V'),
+    (0x62, 'V'),
+    (0x63, 'V'),
+    ]
+
+def _seg_1():
+    return [
+    (0x64, 'V'),
+    (0x65, 'V'),
+    (0x66, 'V'),
+    (0x67, 'V'),
+    (0x68, 'V'),
+    (0x69, 'V'),
+    (0x6A, 'V'),
+    (0x6B, 'V'),
+    (0x6C, 'V'),
+    (0x6D, 'V'),
+    (0x6E, 'V'),
+    (0x6F, 'V'),
+    (0x70, 'V'),
+    (0x71, 'V'),
+    (0x72, 'V'),
+    (0x73, 'V'),
+    (0x74, 'V'),
+    (0x75, 'V'),
+    (0x76, 'V'),
+    (0x77, 'V'),
+    (0x78, 'V'),
+    (0x79, 'V'),
+    (0x7A, 'V'),
+    (0x7B, '3'),
+    (0x7C, '3'),
+    (0x7D, '3'),
+    (0x7E, '3'),
+    (0x7F, '3'),
+    (0x80, 'X'),
+    (0x81, 'X'),
+    (0x82, 'X'),
+    (0x83, 'X'),
+    (0x84, 'X'),
+    (0x85, 'X'),
+    (0x86, 'X'),
+    (0x87, 'X'),
+    (0x88, 'X'),
+    (0x89, 'X'),
+    (0x8A, 'X'),
+    (0x8B, 'X'),
+    (0x8C, 'X'),
+    (0x8D, 'X'),
+    (0x8E, 'X'),
+    (0x8F, 'X'),
+    (0x90, 'X'),
+    (0x91, 'X'),
+    (0x92, 'X'),
+    (0x93, 'X'),
+    (0x94, 'X'),
+    (0x95, 'X'),
+    (0x96, 'X'),
+    (0x97, 'X'),
+    (0x98, 'X'),
+    (0x99, 'X'),
+    (0x9A, 'X'),
+    (0x9B, 'X'),
+    (0x9C, 'X'),
+    (0x9D, 'X'),
+    (0x9E, 'X'),
+    (0x9F, 'X'),
+    (0xA0, '3', u' '),
+    (0xA1, 'V'),
+    (0xA2, 'V'),
+    (0xA3, 'V'),
+    (0xA4, 'V'),
+    (0xA5, 'V'),
+    (0xA6, 'V'),
+    (0xA7, 'V'),
+    (0xA8, '3', u' ̈'),
+    (0xA9, 'V'),
+    (0xAA, 'M', u'a'),
+    (0xAB, 'V'),
+    (0xAC, 'V'),
+    (0xAD, 'I'),
+    (0xAE, 'V'),
+    (0xAF, '3', u' ̄'),
+    (0xB0, 'V'),
+    (0xB1, 'V'),
+    (0xB2, 'M', u'2'),
+    (0xB3, 'M', u'3'),
+    (0xB4, '3', u' ́'),
+    (0xB5, 'M', u'μ'),
+    (0xB6, 'V'),
+    (0xB7, 'V'),
+    (0xB8, '3', u' ̧'),
+    (0xB9, 'M', u'1'),
+    (0xBA, 'M', u'o'),
+    (0xBB, 'V'),
+    (0xBC, 'M', u'1⁄4'),
+    (0xBD, 'M', u'1⁄2'),
+    (0xBE, 'M', u'3⁄4'),
+    (0xBF, 'V'),
+    (0xC0, 'M', u'à'),
+    (0xC1, 'M', u'á'),
+    (0xC2, 'M', u'â'),
+    (0xC3, 'M', u'ã'),
+    (0xC4, 'M', u'ä'),
+    (0xC5, 'M', u'å'),
+    (0xC6, 'M', u'æ'),
+    (0xC7, 'M', u'ç'),
+    ]
+
+def _seg_2():
+    return [
+    (0xC8, 'M', u'è'),
+    (0xC9, 'M', u'é'),
+    (0xCA, 'M', u'ê'),
+    (0xCB, 'M', u'ë'),
+    (0xCC, 'M', u'ì'),
+    (0xCD, 'M', u'í'),
+    (0xCE, 'M', u'î'),
+    (0xCF, 'M', u'ï'),
+    (0xD0, 'M', u'ð'),
+    (0xD1, 'M', u'ñ'),
+    (0xD2, 'M', u'ò'),
+    (0xD3, 'M', u'ó'),
+    (0xD4, 'M', u'ô'),
+    (0xD5, 'M', u'õ'),
+    (0xD6, 'M', u'ö'),
+    (0xD7, 'V'),
+    (0xD8, 'M', u'ø'),
+    (0xD9, 'M', u'ù'),
+    (0xDA, 'M', u'ú'),
+    (0xDB, 'M', u'û'),
+    (0xDC, 'M', u'ü'),
+    (0xDD, 'M', u'ý'),
+    (0xDE, 'M', u'þ'),
+    (0xDF, 'D', u'ss'),
+    (0xE0, 'V'),
+    (0xE1, 'V'),
+    (0xE2, 'V'),
+    (0xE3, 'V'),
+    (0xE4, 'V'),
+    (0xE5, 'V'),
+    (0xE6, 'V'),
+    (0xE7, 'V'),
+    (0xE8, 'V'),
+    (0xE9, 'V'),
+    (0xEA, 'V'),
+    (0xEB, 'V'),
+    (0xEC, 'V'),
+    (0xED, 'V'),
+    (0xEE, 'V'),
+    (0xEF, 'V'),
+    (0xF0, 'V'),
+    (0xF1, 'V'),
+    (0xF2, 'V'),
+    (0xF3, 'V'),
+    (0xF4, 'V'),
+    (0xF5, 'V'),
+    (0xF6, 'V'),
+    (0xF7, 'V'),
+    (0xF8, 'V'),
+    (0xF9, 'V'),
+    (0xFA, 'V'),
+    (0xFB, 'V'),
+    (0xFC, 'V'),
+    (0xFD, 'V'),
+    (0xFE, 'V'),
+    (0xFF, 'V'),
+    (0x100, 'M', u'ā'),
+    (0x101, 'V'),
+    (0x102, 'M', u'ă'),
+    (0x103, 'V'),
+    (0x104, 'M', u'ą'),
+    (0x105, 'V'),
+    (0x106, 'M', u'ć'),
+    (0x107, 'V'),
+    (0x108, 'M', u'ĉ'),
+    (0x109, 'V'),
+    (0x10A, 'M', u'ċ'),
+    (0x10B, 'V'),
+    (0x10C, 'M', u'č'),
+    (0x10D, 'V'),
+    (0x10E, 'M', u'ď'),
+    (0x10F, 'V'),
+    (0x110, 'M', u'đ'),
+    (0x111, 'V'),
+    (0x112, 'M', u'ē'),
+    (0x113, 'V'),
+    (0x114, 'M', u'ĕ'),
+    (0x115, 'V'),
+    (0x116, 'M', u'ė'),
+    (0x117, 'V'),
+    (0x118, 'M', u'ę'),
+    (0x119, 'V'),
+    (0x11A, 'M', u'ě'),
+    (0x11B, 'V'),
+    (0x11C, 'M', u'ĝ'),
+    (0x11D, 'V'),
+    (0x11E, 'M', u'ğ'),
+    (0x11F, 'V'),
+    (0x120, 'M', u'ġ'),
+    (0x121, 'V'),
+    (0x122, 'M', u'ģ'),
+    (0x123, 'V'),
+    (0x124, 'M', u'ĥ'),
+    (0x125, 'V'),
+    (0x126, 'M', u'ħ'),
+    (0x127, 'V'),
+    (0x128, 'M', u'ĩ'),
+    (0x129, 'V'),
+    (0x12A, 'M', u'ī'),
+    (0x12B, 'V'),
+    ]
+
+def _seg_3():
+    return [
+    (0x12C, 'M', u'ĭ'),
+    (0x12D, 'V'),
+    (0x12E, 'M', u'į'),
+    (0x12F, 'V'),
+    (0x130, 'M', u'i̇'),
+    (0x131, 'V'),
+    (0x132, 'M', u'ij'),
+    (0x134, 'M', u'ĵ'),
+    (0x135, 'V'),
+    (0x136, 'M', u'ķ'),
+    (0x137, 'V'),
+    (0x139, 'M', u'ĺ'),
+    (0x13A, 'V'),
+    (0x13B, 'M', u'ļ'),
+    (0x13C, 'V'),
+    (0x13D, 'M', u'ľ'),
+    (0x13E, 'V'),
+    (0x13F, 'M', u'l·'),
+    (0x141, 'M', u'ł'),
+    (0x142, 'V'),
+    (0x143, 'M', u'ń'),
+    (0x144, 'V'),
+    (0x145, 'M', u'ņ'),
+    (0x146, 'V'),
+    (0x147, 'M', u'ň'),
+    (0x148, 'V'),
+    (0x149, 'M', u'ʼn'),
+    (0x14A, 'M', u'ŋ'),
+    (0x14B, 'V'),
+    (0x14C, 'M', u'ō'),
+    (0x14D, 'V'),
+    (0x14E, 'M', u'ŏ'),
+    (0x14F, 'V'),
+    (0x150, 'M', u'ő'),
+    (0x151, 'V'),
+    (0x152, 'M', u'œ'),
+    (0x153, 'V'),
+    (0x154, 'M', u'ŕ'),
+    (0x155, 'V'),
+    (0x156, 'M', u'ŗ'),
+    (0x157, 'V'),
+    (0x158, 'M', u'ř'),
+    (0x159, 'V'),
+    (0x15A, 'M', u'ś'),
+    (0x15B, 'V'),
+    (0x15C, 'M', u'ŝ'),
+    (0x15D, 'V'),
+    (0x15E, 'M', u'ş'),
+    (0x15F, 'V'),
+    (0x160, 'M', u'š'),
+    (0x161, 'V'),
+    (0x162, 'M', u'ţ'),
+    (0x163, 'V'),
+    (0x164, 'M', u'ť'),
+    (0x165, 'V'),
+    (0x166, 'M', u'ŧ'),
+    (0x167, 'V'),
+    (0x168, 'M', u'ũ'),
+    (0x169, 'V'),
+    (0x16A, 'M', u'ū'),
+    (0x16B, 'V'),
+    (0x16C, 'M', u'ŭ'),
+    (0x16D, 'V'),
+    (0x16E, 'M', u'ů'),
+    (0x16F, 'V'),
+    (0x170, 'M', u'ű'),
+    (0x171, 'V'),
+    (0x172, 'M', u'ų'),
+    (0x173, 'V'),
+    (0x174, 'M', u'ŵ'),
+    (0x175, 'V'),
+    (0x176, 'M', u'ŷ'),
+    (0x177, 'V'),
+    (0x178, 'M', u'ÿ'),
+    (0x179, 'M', u'ź'),
+    (0x17A, 'V'),
+    (0x17B, 'M', u'ż'),
+    (0x17C, 'V'),
+    (0x17D, 'M', u'ž'),
+    (0x17E, 'V'),
+    (0x17F, 'M', u's'),
+    (0x180, 'V'),
+    (0x181, 'M', u'ɓ'),
+    (0x182, 'M', u'ƃ'),
+    (0x183, 'V'),
+    (0x184, 'M', u'ƅ'),
+    (0x185, 'V'),
+    (0x186, 'M', u'ɔ'),
+    (0x187, 'M', u'ƈ'),
+    (0x188, 'V'),
+    (0x189, 'M', u'ɖ'),
+    (0x18A, 'M', u'ɗ'),
+    (0x18B, 'M', u'ƌ'),
+    (0x18C, 'V'),
+    (0x18E, 'M', u'ǝ'),
+    (0x18F, 'M', u'ə'),
+    (0x190, 'M', u'ɛ'),
+    (0x191, 'M', u'ƒ'),
+    (0x192, 'V'),
+    (0x193, 'M', u'ɠ'),
+    ]
+
+def _seg_4():
+    return [
+    (0x194, 'M', u'ɣ'),
+    (0x195, 'V'),
+    (0x196, 'M', u'ɩ'),
+    (0x197, 'M', u'ɨ'),
+    (0x198, 'M', u'ƙ'),
+    (0x199, 'V'),
+    (0x19C, 'M', u'ɯ'),
+    (0x19D, 'M', u'ɲ'),
+    (0x19E, 'V'),
+    (0x19F, 'M', u'ɵ'),
+    (0x1A0, 'M', u'ơ'),
+    (0x1A1, 'V'),
+    (0x1A2, 'M', u'ƣ'),
+    (0x1A3, 'V'),
+    (0x1A4, 'M', u'ƥ'),
+    (0x1A5, 'V'),
+    (0x1A6, 'M', u'ʀ'),
+    (0x1A7, 'M', u'ƨ'),
+    (0x1A8, 'V'),
+    (0x1A9, 'M', u'ʃ'),
+    (0x1AA, 'V'),
+    (0x1AC, 'M', u'ƭ'),
+    (0x1AD, 'V'),
+    (0x1AE, 'M', u'ʈ'),
+    (0x1AF, 'M', u'ư'),
+    (0x1B0, 'V'),
+    (0x1B1, 'M', u'ʊ'),
+    (0x1B2, 'M', u'ʋ'),
+    (0x1B3, 'M', u'ƴ'),
+    (0x1B4, 'V'),
+    (0x1B5, 'M', u'ƶ'),
+    (0x1B6, 'V'),
+    (0x1B7, 'M', u'ʒ'),
+    (0x1B8, 'M', u'ƹ'),
+    (0x1B9, 'V'),
+    (0x1BC, 'M', u'ƽ'),
+    (0x1BD, 'V'),
+    (0x1C4, 'M', u'dž'),
+    (0x1C7, 'M', u'lj'),
+    (0x1CA, 'M', u'nj'),
+    (0x1CD, 'M', u'ǎ'),
+    (0x1CE, 'V'),
+    (0x1CF, 'M', u'ǐ'),
+    (0x1D0, 'V'),
+    (0x1D1, 'M', u'ǒ'),
+    (0x1D2, 'V'),
+    (0x1D3, 'M', u'ǔ'),
+    (0x1D4, 'V'),
+    (0x1D5, 'M', u'ǖ'),
+    (0x1D6, 'V'),
+    (0x1D7, 'M', u'ǘ'),
+    (0x1D8, 'V'),
+    (0x1D9, 'M', u'ǚ'),
+    (0x1DA, 'V'),
+    (0x1DB, 'M', u'ǜ'),
+    (0x1DC, 'V'),
+    (0x1DE, 'M', u'ǟ'),
+    (0x1DF, 'V'),
+    (0x1E0, 'M', u'ǡ'),
+    (0x1E1, 'V'),
+    (0x1E2, 'M', u'ǣ'),
+    (0x1E3, 'V'),
+    (0x1E4, 'M', u'ǥ'),
+    (0x1E5, 'V'),
+    (0x1E6, 'M', u'ǧ'),
+    (0x1E7, 'V'),
+    (0x1E8, 'M', u'ǩ'),
+    (0x1E9, 'V'),
+    (0x1EA, 'M', u'ǫ'),
+    (0x1EB, 'V'),
+    (0x1EC, 'M', u'ǭ'),
+    (0x1ED, 'V'),
+    (0x1EE, 'M', u'ǯ'),
+    (0x1EF, 'V'),
+    (0x1F1, 'M', u'dz'),
+    (0x1F4, 'M', u'ǵ'),
+    (0x1F5, 'V'),
+    (0x1F6, 'M', u'ƕ'),
+    (0x1F7, 'M', u'ƿ'),
+    (0x1F8, 'M', u'ǹ'),
+    (0x1F9, 'V'),
+    (0x1FA, 'M', u'ǻ'),
+    (0x1FB, 'V'),
+    (0x1FC, 'M', u'ǽ'),
+    (0x1FD, 'V'),
+    (0x1FE, 'M', u'ǿ'),
+    (0x1FF, 'V'),
+    (0x200, 'M', u'ȁ'),
+    (0x201, 'V'),
+    (0x202, 'M', u'ȃ'),
+    (0x203, 'V'),
+    (0x204, 'M', u'ȅ'),
+    (0x205, 'V'),
+    (0x206, 'M', u'ȇ'),
+    (0x207, 'V'),
+    (0x208, 'M', u'ȉ'),
+    (0x209, 'V'),
+    (0x20A, 'M', u'ȋ'),
+    (0x20B, 'V'),
+    (0x20C, 'M', u'ȍ'),
+    ]
+
+def _seg_5():
+    return [
+    (0x20D, 'V'),
+    (0x20E, 'M', u'ȏ'),
+    (0x20F, 'V'),
+    (0x210, 'M', u'ȑ'),
+    (0x211, 'V'),
+    (0x212, 'M', u'ȓ'),
+    (0x213, 'V'),
+    (0x214, 'M', u'ȕ'),
+    (0x215, 'V'),
+    (0x216, 'M', u'ȗ'),
+    (0x217, 'V'),
+    (0x218, 'M', u'ș'),
+    (0x219, 'V'),
+    (0x21A, 'M', u'ț'),
+    (0x21B, 'V'),
+    (0x21C, 'M', u'ȝ'),
+    (0x21D, 'V'),
+    (0x21E, 'M', u'ȟ'),
+    (0x21F, 'V'),
+    (0x220, 'M', u'ƞ'),
+    (0x221, 'V'),
+    (0x222, 'M', u'ȣ'),
+    (0x223, 'V'),
+    (0x224, 'M', u'ȥ'),
+    (0x225, 'V'),
+    (0x226, 'M', u'ȧ'),
+    (0x227, 'V'),
+    (0x228, 'M', u'ȩ'),
+    (0x229, 'V'),
+    (0x22A, 'M', u'ȫ'),
+    (0x22B, 'V'),
+    (0x22C, 'M', u'ȭ'),
+    (0x22D, 'V'),
+    (0x22E, 'M', u'ȯ'),
+    (0x22F, 'V'),
+    (0x230, 'M', u'ȱ'),
+    (0x231, 'V'),
+    (0x232, 'M', u'ȳ'),
+    (0x233, 'V'),
+    (0x23A, 'M', u'ⱥ'),
+    (0x23B, 'M', u'ȼ'),
+    (0x23C, 'V'),
+    (0x23D, 'M', u'ƚ'),
+    (0x23E, 'M', u'ⱦ'),
+    (0x23F, 'V'),
+    (0x241, 'M', u'ɂ'),
+    (0x242, 'V'),
+    (0x243, 'M', u'ƀ'),
+    (0x244, 'M', u'ʉ'),
+    (0x245, 'M', u'ʌ'),
+    (0x246, 'M', u'ɇ'),
+    (0x247, 'V'),
+    (0x248, 'M', u'ɉ'),
+    (0x249, 'V'),
+    (0x24A, 'M', u'ɋ'),
+    (0x24B, 'V'),
+    (0x24C, 'M', u'ɍ'),
+    (0x24D, 'V'),
+    (0x24E, 'M', u'ɏ'),
+    (0x24F, 'V'),
+    (0x2B0, 'M', u'h'),
+    (0x2B1, 'M', u'ɦ'),
+    (0x2B2, 'M', u'j'),
+    (0x2B3, 'M', u'r'),
+    (0x2B4, 'M', u'ɹ'),
+    (0x2B5, 'M', u'ɻ'),
+    (0x2B6, 'M', u'ʁ'),
+    (0x2B7, 'M', u'w'),
+    (0x2B8, 'M', u'y'),
+    (0x2B9, 'V'),
+    (0x2D8, '3', u' ̆'),
+    (0x2D9, '3', u' ̇'),
+    (0x2DA, '3', u' ̊'),
+    (0x2DB, '3', u' ̨'),
+    (0x2DC, '3', u' ̃'),
+    (0x2DD, '3', u' ̋'),
+    (0x2DE, 'V'),
+    (0x2E0, 'M', u'ɣ'),
+    (0x2E1, 'M', u'l'),
+    (0x2E2, 'M', u's'),
+    (0x2E3, 'M', u'x'),
+    (0x2E4, 'M', u'ʕ'),
+    (0x2E5, 'V'),
+    (0x340, 'M', u'̀'),
+    (0x341, 'M', u'́'),
+    (0x342, 'V'),
+    (0x343, 'M', u'̓'),
+    (0x344, 'M', u'̈́'),
+    (0x345, 'M', u'ι'),
+    (0x346, 'V'),
+    (0x34F, 'I'),
+    (0x350, 'V'),
+    (0x370, 'M', u'ͱ'),
+    (0x371, 'V'),
+    (0x372, 'M', u'ͳ'),
+    (0x373, 'V'),
+    (0x374, 'M', u'ʹ'),
+    (0x375, 'V'),
+    (0x376, 'M', u'ͷ'),
+    (0x377, 'V'),
+    ]
+
+def _seg_6():
+    return [
+    (0x378, 'X'),
+    (0x37A, '3', u' ι'),
+    (0x37B, 'V'),
+    (0x37E, '3', u';'),
+    (0x37F, 'M', u'ϳ'),
+    (0x380, 'X'),
+    (0x384, '3', u' ́'),
+    (0x385, '3', u' ̈́'),
+    (0x386, 'M', u'ά'),
+    (0x387, 'M', u'·'),
+    (0x388, 'M', u'έ'),
+    (0x389, 'M', u'ή'),
+    (0x38A, 'M', u'ί'),
+    (0x38B, 'X'),
+    (0x38C, 'M', u'ό'),
+    (0x38D, 'X'),
+    (0x38E, 'M', u'ύ'),
+    (0x38F, 'M', u'ώ'),
+    (0x390, 'V'),
+    (0x391, 'M', u'α'),
+    (0x392, 'M', u'β'),
+    (0x393, 'M', u'γ'),
+    (0x394, 'M', u'δ'),
+    (0x395, 'M', u'ε'),
+    (0x396, 'M', u'ζ'),
+    (0x397, 'M', u'η'),
+    (0x398, 'M', u'θ'),
+    (0x399, 'M', u'ι'),
+    (0x39A, 'M', u'κ'),
+    (0x39B, 'M', u'λ'),
+    (0x39C, 'M', u'μ'),
+    (0x39D, 'M', u'ν'),
+    (0x39E, 'M', u'ξ'),
+    (0x39F, 'M', u'ο'),
+    (0x3A0, 'M', u'π'),
+    (0x3A1, 'M', u'ρ'),
+    (0x3A2, 'X'),
+    (0x3A3, 'M', u'σ'),
+    (0x3A4, 'M', u'τ'),
+    (0x3A5, 'M', u'υ'),
+    (0x3A6, 'M', u'φ'),
+    (0x3A7, 'M', u'χ'),
+    (0x3A8, 'M', u'ψ'),
+    (0x3A9, 'M', u'ω'),
+    (0x3AA, 'M', u'ϊ'),
+    (0x3AB, 'M', u'ϋ'),
+    (0x3AC, 'V'),
+    (0x3C2, 'D', u'σ'),
+    (0x3C3, 'V'),
+    (0x3CF, 'M', u'ϗ'),
+    (0x3D0, 'M', u'β'),
+    (0x3D1, 'M', u'θ'),
+    (0x3D2, 'M', u'υ'),
+    (0x3D3, 'M', u'ύ'),
+    (0x3D4, 'M', u'ϋ'),
+    (0x3D5, 'M', u'φ'),
+    (0x3D6, 'M', u'π'),
+    (0x3D7, 'V'),
+    (0x3D8, 'M', u'ϙ'),
+    (0x3D9, 'V'),
+    (0x3DA, 'M', u'ϛ'),
+    (0x3DB, 'V'),
+    (0x3DC, 'M', u'ϝ'),
+    (0x3DD, 'V'),
+    (0x3DE, 'M', u'ϟ'),
+    (0x3DF, 'V'),
+    (0x3E0, 'M', u'ϡ'),
+    (0x3E1, 'V'),
+    (0x3E2, 'M', u'ϣ'),
+    (0x3E3, 'V'),
+    (0x3E4, 'M', u'ϥ'),
+    (0x3E5, 'V'),
+    (0x3E6, 'M', u'ϧ'),
+    (0x3E7, 'V'),
+    (0x3E8, 'M', u'ϩ'),
+    (0x3E9, 'V'),
+    (0x3EA, 'M', u'ϫ'),
+    (0x3EB, 'V'),
+    (0x3EC, 'M', u'ϭ'),
+    (0x3ED, 'V'),
+    (0x3EE, 'M', u'ϯ'),
+    (0x3EF, 'V'),
+    (0x3F0, 'M', u'κ'),
+    (0x3F1, 'M', u'ρ'),
+    (0x3F2, 'M', u'σ'),
+    (0x3F3, 'V'),
+    (0x3F4, 'M', u'θ'),
+    (0x3F5, 'M', u'ε'),
+    (0x3F6, 'V'),
+    (0x3F7, 'M', u'ϸ'),
+    (0x3F8, 'V'),
+    (0x3F9, 'M', u'σ'),
+    (0x3FA, 'M', u'ϻ'),
+    (0x3FB, 'V'),
+    (0x3FD, 'M', u'ͻ'),
+    (0x3FE, 'M', u'ͼ'),
+    (0x3FF, 'M', u'ͽ'),
+    (0x400, 'M', u'ѐ'),
+    (0x401, 'M', u'ё'),
+    (0x402, 'M', u'ђ'),
+    ]
+
+def _seg_7():
+    return [
+    (0x403, 'M', u'ѓ'),
+    (0x404, 'M', u'є'),
+    (0x405, 'M', u'ѕ'),
+    (0x406, 'M', u'і'),
+    (0x407, 'M', u'ї'),
+    (0x408, 'M', u'ј'),
+    (0x409, 'M', u'љ'),
+    (0x40A, 'M', u'њ'),
+    (0x40B, 'M', u'ћ'),
+    (0x40C, 'M', u'ќ'),
+    (0x40D, 'M', u'ѝ'),
+    (0x40E, 'M', u'ў'),
+    (0x40F, 'M', u'џ'),
+    (0x410, 'M', u'а'),
+    (0x411, 'M', u'б'),
+    (0x412, 'M', u'в'),
+    (0x413, 'M', u'г'),
+    (0x414, 'M', u'д'),
+    (0x415, 'M', u'е'),
+    (0x416, 'M', u'ж'),
+    (0x417, 'M', u'з'),
+    (0x418, 'M', u'и'),
+    (0x419, 'M', u'й'),
+    (0x41A, 'M', u'к'),
+    (0x41B, 'M', u'л'),
+    (0x41C, 'M', u'м'),
+    (0x41D, 'M', u'н'),
+    (0x41E, 'M', u'о'),
+    (0x41F, 'M', u'п'),
+    (0x420, 'M', u'р'),
+    (0x421, 'M', u'с'),
+    (0x422, 'M', u'т'),
+    (0x423, 'M', u'у'),
+    (0x424, 'M', u'ф'),
+    (0x425, 'M', u'х'),
+    (0x426, 'M', u'ц'),
+    (0x427, 'M', u'ч'),
+    (0x428, 'M', u'ш'),
+    (0x429, 'M', u'щ'),
+    (0x42A, 'M', u'ъ'),
+    (0x42B, 'M', u'ы'),
+    (0x42C, 'M', u'ь'),
+    (0x42D, 'M', u'э'),
+    (0x42E, 'M', u'ю'),
+    (0x42F, 'M', u'я'),
+    (0x430, 'V'),
+    (0x460, 'M', u'ѡ'),
+    (0x461, 'V'),
+    (0x462, 'M', u'ѣ'),
+    (0x463, 'V'),
+    (0x464, 'M', u'ѥ'),
+    (0x465, 'V'),
+    (0x466, 'M', u'ѧ'),
+    (0x467, 'V'),
+    (0x468, 'M', u'ѩ'),
+    (0x469, 'V'),
+    (0x46A, 'M', u'ѫ'),
+    (0x46B, 'V'),
+    (0x46C, 'M', u'ѭ'),
+    (0x46D, 'V'),
+    (0x46E, 'M', u'ѯ'),
+    (0x46F, 'V'),
+    (0x470, 'M', u'ѱ'),
+    (0x471, 'V'),
+    (0x472, 'M', u'ѳ'),
+    (0x473, 'V'),
+    (0x474, 'M', u'ѵ'),
+    (0x475, 'V'),
+    (0x476, 'M', u'ѷ'),
+    (0x477, 'V'),
+    (0x478, 'M', u'ѹ'),
+    (0x479, 'V'),
+    (0x47A, 'M', u'ѻ'),
+    (0x47B, 'V'),
+    (0x47C, 'M', u'ѽ'),
+    (0x47D, 'V'),
+    (0x47E, 'M', u'ѿ'),
+    (0x47F, 'V'),
+    (0x480, 'M', u'ҁ'),
+    (0x481, 'V'),
+    (0x48A, 'M', u'ҋ'),
+    (0x48B, 'V'),
+    (0x48C, 'M', u'ҍ'),
+    (0x48D, 'V'),
+    (0x48E, 'M', u'ҏ'),
+    (0x48F, 'V'),
+    (0x490, 'M', u'ґ'),
+    (0x491, 'V'),
+    (0x492, 'M', u'ғ'),
+    (0x493, 'V'),
+    (0x494, 'M', u'ҕ'),
+    (0x495, 'V'),
+    (0x496, 'M', u'җ'),
+    (0x497, 'V'),
+    (0x498, 'M', u'ҙ'),
+    (0x499, 'V'),
+    (0x49A, 'M', u'қ'),
+    (0x49B, 'V'),
+    (0x49C, 'M', u'ҝ'),
+    (0x49D, 'V'),
+    ]
+
+def _seg_8():
+    return [
+    (0x49E, 'M', u'ҟ'),
+    (0x49F, 'V'),
+    (0x4A0, 'M', u'ҡ'),
+    (0x4A1, 'V'),
+    (0x4A2, 'M', u'ң'),
+    (0x4A3, 'V'),
+    (0x4A4, 'M', u'ҥ'),
+    (0x4A5, 'V'),
+    (0x4A6, 'M', u'ҧ'),
+    (0x4A7, 'V'),
+    (0x4A8, 'M', u'ҩ'),
+    (0x4A9, 'V'),
+    (0x4AA, 'M', u'ҫ'),
+    (0x4AB, 'V'),
+    (0x4AC, 'M', u'ҭ'),
+    (0x4AD, 'V'),
+    (0x4AE, 'M', u'ү'),
+    (0x4AF, 'V'),
+    (0x4B0, 'M', u'ұ'),
+    (0x4B1, 'V'),
+    (0x4B2, 'M', u'ҳ'),
+    (0x4B3, 'V'),
+    (0x4B4, 'M', u'ҵ'),
+    (0x4B5, 'V'),
+    (0x4B6, 'M', u'ҷ'),
+    (0x4B7, 'V'),
+    (0x4B8, 'M', u'ҹ'),
+    (0x4B9, 'V'),
+    (0x4BA, 'M', u'һ'),
+    (0x4BB, 'V'),
+    (0x4BC, 'M', u'ҽ'),
+    (0x4BD, 'V'),
+    (0x4BE, 'M', u'ҿ'),
+    (0x4BF, 'V'),
+    (0x4C0, 'X'),
+    (0x4C1, 'M', u'ӂ'),
+    (0x4C2, 'V'),
+    (0x4C3, 'M', u'ӄ'),
+    (0x4C4, 'V'),
+    (0x4C5, 'M', u'ӆ'),
+    (0x4C6, 'V'),
+    (0x4C7, 'M', u'ӈ'),
+    (0x4C8, 'V'),
+    (0x4C9, 'M', u'ӊ'),
+    (0x4CA, 'V'),
+    (0x4CB, 'M', u'ӌ'),
+    (0x4CC, 'V'),
+    (0x4CD, 'M', u'ӎ'),
+    (0x4CE, 'V'),
+    (0x4D0, 'M', u'ӑ'),
+    (0x4D1, 'V'),
+    (0x4D2, 'M', u'ӓ'),
+    (0x4D3, 'V'),
+    (0x4D4, 'M', u'ӕ'),
+    (0x4D5, 'V'),
+    (0x4D6, 'M', u'ӗ'),
+    (0x4D7, 'V'),
+    (0x4D8, 'M', u'ә'),
+    (0x4D9, 'V'),
+    (0x4DA, 'M', u'ӛ'),
+    (0x4DB, 'V'),
+    (0x4DC, 'M', u'ӝ'),
+    (0x4DD, 'V'),
+    (0x4DE, 'M', u'ӟ'),
+    (0x4DF, 'V'),
+    (0x4E0, 'M', u'ӡ'),
+    (0x4E1, 'V'),
+    (0x4E2, 'M', u'ӣ'),
+    (0x4E3, 'V'),
+    (0x4E4, 'M', u'ӥ'),
+    (0x4E5, 'V'),
+    (0x4E6, 'M', u'ӧ'),
+    (0x4E7, 'V'),
+    (0x4E8, 'M', u'ө'),
+    (0x4E9, 'V'),
+    (0x4EA, 'M', u'ӫ'),
+    (0x4EB, 'V'),
+    (0x4EC, 'M', u'ӭ'),
+    (0x4ED, 'V'),
+    (0x4EE, 'M', u'ӯ'),
+    (0x4EF, 'V'),
+    (0x4F0, 'M', u'ӱ'),
+    (0x4F1, 'V'),
+    (0x4F2, 'M', u'ӳ'),
+    (0x4F3, 'V'),
+    (0x4F4, 'M', u'ӵ'),
+    (0x4F5, 'V'),
+    (0x4F6, 'M', u'ӷ'),
+    (0x4F7, 'V'),
+    (0x4F8, 'M', u'ӹ'),
+    (0x4F9, 'V'),
+    (0x4FA, 'M', u'ӻ'),
+    (0x4FB, 'V'),
+    (0x4FC, 'M', u'ӽ'),
+    (0x4FD, 'V'),
+    (0x4FE, 'M', u'ӿ'),
+    (0x4FF, 'V'),
+    (0x500, 'M', u'ԁ'),
+    (0x501, 'V'),
+    (0x502, 'M', u'ԃ'),
+    ]
+
+def _seg_9():
+    return [
+    (0x503, 'V'),
+    (0x504, 'M', u'ԅ'),
+    (0x505, 'V'),
+    (0x506, 'M', u'ԇ'),
+    (0x507, 'V'),
+    (0x508, 'M', u'ԉ'),
+    (0x509, 'V'),
+    (0x50A, 'M', u'ԋ'),
+    (0x50B, 'V'),
+    (0x50C, 'M', u'ԍ'),
+    (0x50D, 'V'),
+    (0x50E, 'M', u'ԏ'),
+    (0x50F, 'V'),
+    (0x510, 'M', u'ԑ'),
+    (0x511, 'V'),
+    (0x512, 'M', u'ԓ'),
+    (0x513, 'V'),
+    (0x514, 'M', u'ԕ'),
+    (0x515, 'V'),
+    (0x516, 'M', u'ԗ'),
+    (0x517, 'V'),
+    (0x518, 'M', u'ԙ'),
+    (0x519, 'V'),
+    (0x51A, 'M', u'ԛ'),
+    (0x51B, 'V'),
+    (0x51C, 'M', u'ԝ'),
+    (0x51D, 'V'),
+    (0x51E, 'M', u'ԟ'),
+    (0x51F, 'V'),
+    (0x520, 'M', u'ԡ'),
+    (0x521, 'V'),
+    (0x522, 'M', u'ԣ'),
+    (0x523, 'V'),
+    (0x524, 'M', u'ԥ'),
+    (0x525, 'V'),
+    (0x526, 'M', u'ԧ'),
+    (0x527, 'V'),
+    (0x528, 'M', u'ԩ'),
+    (0x529, 'V'),
+    (0x52A, 'M', u'ԫ'),
+    (0x52B, 'V'),
+    (0x52C, 'M', u'ԭ'),
+    (0x52D, 'V'),
+    (0x52E, 'M', u'ԯ'),
+    (0x52F, 'V'),
+    (0x530, 'X'),
+    (0x531, 'M', u'ա'),
+    (0x532, 'M', u'բ'),
+    (0x533, 'M', u'գ'),
+    (0x534, 'M', u'դ'),
+    (0x535, 'M', u'ե'),
+    (0x536, 'M', u'զ'),
+    (0x537, 'M', u'է'),
+    (0x538, 'M', u'ը'),
+    (0x539, 'M', u'թ'),
+    (0x53A, 'M', u'ժ'),
+    (0x53B, 'M', u'ի'),
+    (0x53C, 'M', u'լ'),
+    (0x53D, 'M', u'խ'),
+    (0x53E, 'M', u'ծ'),
+    (0x53F, 'M', u'կ'),
+    (0x540, 'M', u'հ'),
+    (0x541, 'M', u'ձ'),
+    (0x542, 'M', u'ղ'),
+    (0x543, 'M', u'ճ'),
+    (0x544, 'M', u'մ'),
+    (0x545, 'M', u'յ'),
+    (0x546, 'M', u'ն'),
+    (0x547, 'M', u'շ'),
+    (0x548, 'M', u'ո'),
+    (0x549, 'M', u'չ'),
+    (0x54A, 'M', u'պ'),
+    (0x54B, 'M', u'ջ'),
+    (0x54C, 'M', u'ռ'),
+    (0x54D, 'M', u'ս'),
+    (0x54E, 'M', u'վ'),
+    (0x54F, 'M', u'տ'),
+    (0x550, 'M', u'ր'),
+    (0x551, 'M', u'ց'),
+    (0x552, 'M', u'ւ'),
+    (0x553, 'M', u'փ'),
+    (0x554, 'M', u'ք'),
+    (0x555, 'M', u'օ'),
+    (0x556, 'M', u'ֆ'),
+    (0x557, 'X'),
+    (0x559, 'V'),
+    (0x587, 'M', u'եւ'),
+    (0x588, 'V'),
+    (0x58B, 'X'),
+    (0x58D, 'V'),
+    (0x590, 'X'),
+    (0x591, 'V'),
+    (0x5C8, 'X'),
+    (0x5D0, 'V'),
+    (0x5EB, 'X'),
+    (0x5EF, 'V'),
+    (0x5F5, 'X'),
+    (0x606, 'V'),
+    (0x61C, 'X'),
+    (0x61E, 'V'),
+    ]
+
+def _seg_10():
+    return [
+    (0x675, 'M', u'اٴ'),
+    (0x676, 'M', u'وٴ'),
+    (0x677, 'M', u'ۇٴ'),
+    (0x678, 'M', u'يٴ'),
+    (0x679, 'V'),
+    (0x6DD, 'X'),
+    (0x6DE, 'V'),
+    (0x70E, 'X'),
+    (0x710, 'V'),
+    (0x74B, 'X'),
+    (0x74D, 'V'),
+    (0x7B2, 'X'),
+    (0x7C0, 'V'),
+    (0x7FB, 'X'),
+    (0x7FD, 'V'),
+    (0x82E, 'X'),
+    (0x830, 'V'),
+    (0x83F, 'X'),
+    (0x840, 'V'),
+    (0x85C, 'X'),
+    (0x85E, 'V'),
+    (0x85F, 'X'),
+    (0x860, 'V'),
+    (0x86B, 'X'),
+    (0x8A0, 'V'),
+    (0x8B5, 'X'),
+    (0x8B6, 'V'),
+    (0x8BE, 'X'),
+    (0x8D3, 'V'),
+    (0x8E2, 'X'),
+    (0x8E3, 'V'),
+    (0x958, 'M', u'क़'),
+    (0x959, 'M', u'ख़'),
+    (0x95A, 'M', u'ग़'),
+    (0x95B, 'M', u'ज़'),
+    (0x95C, 'M', u'ड़'),
+    (0x95D, 'M', u'ढ़'),
+    (0x95E, 'M', u'फ़'),
+    (0x95F, 'M', u'य़'),
+    (0x960, 'V'),
+    (0x984, 'X'),
+    (0x985, 'V'),
+    (0x98D, 'X'),
+    (0x98F, 'V'),
+    (0x991, 'X'),
+    (0x993, 'V'),
+    (0x9A9, 'X'),
+    (0x9AA, 'V'),
+    (0x9B1, 'X'),
+    (0x9B2, 'V'),
+    (0x9B3, 'X'),
+    (0x9B6, 'V'),
+    (0x9BA, 'X'),
+    (0x9BC, 'V'),
+    (0x9C5, 'X'),
+    (0x9C7, 'V'),
+    (0x9C9, 'X'),
+    (0x9CB, 'V'),
+    (0x9CF, 'X'),
+    (0x9D7, 'V'),
+    (0x9D8, 'X'),
+    (0x9DC, 'M', u'ড়'),
+    (0x9DD, 'M', u'ঢ়'),
+    (0x9DE, 'X'),
+    (0x9DF, 'M', u'য়'),
+    (0x9E0, 'V'),
+    (0x9E4, 'X'),
+    (0x9E6, 'V'),
+    (0x9FF, 'X'),
+    (0xA01, 'V'),
+    (0xA04, 'X'),
+    (0xA05, 'V'),
+    (0xA0B, 'X'),
+    (0xA0F, 'V'),
+    (0xA11, 'X'),
+    (0xA13, 'V'),
+    (0xA29, 'X'),
+    (0xA2A, 'V'),
+    (0xA31, 'X'),
+    (0xA32, 'V'),
+    (0xA33, 'M', u'ਲ਼'),
+    (0xA34, 'X'),
+    (0xA35, 'V'),
+    (0xA36, 'M', u'ਸ਼'),
+    (0xA37, 'X'),
+    (0xA38, 'V'),
+    (0xA3A, 'X'),
+    (0xA3C, 'V'),
+    (0xA3D, 'X'),
+    (0xA3E, 'V'),
+    (0xA43, 'X'),
+    (0xA47, 'V'),
+    (0xA49, 'X'),
+    (0xA4B, 'V'),
+    (0xA4E, 'X'),
+    (0xA51, 'V'),
+    (0xA52, 'X'),
+    (0xA59, 'M', u'ਖ਼'),
+    (0xA5A, 'M', u'ਗ਼'),
+    (0xA5B, 'M', u'ਜ਼'),
+    ]
+
+def _seg_11():
+    return [
+    (0xA5C, 'V'),
+    (0xA5D, 'X'),
+    (0xA5E, 'M', u'ਫ਼'),
+    (0xA5F, 'X'),
+    (0xA66, 'V'),
+    (0xA77, 'X'),
+    (0xA81, 'V'),
+    (0xA84, 'X'),
+    (0xA85, 'V'),
+    (0xA8E, 'X'),
+    (0xA8F, 'V'),
+    (0xA92, 'X'),
+    (0xA93, 'V'),
+    (0xAA9, 'X'),
+    (0xAAA, 'V'),
+    (0xAB1, 'X'),
+    (0xAB2, 'V'),
+    (0xAB4, 'X'),
+    (0xAB5, 'V'),
+    (0xABA, 'X'),
+    (0xABC, 'V'),
+    (0xAC6, 'X'),
+    (0xAC7, 'V'),
+    (0xACA, 'X'),
+    (0xACB, 'V'),
+    (0xACE, 'X'),
+    (0xAD0, 'V'),
+    (0xAD1, 'X'),
+    (0xAE0, 'V'),
+    (0xAE4, 'X'),
+    (0xAE6, 'V'),
+    (0xAF2, 'X'),
+    (0xAF9, 'V'),
+    (0xB00, 'X'),
+    (0xB01, 'V'),
+    (0xB04, 'X'),
+    (0xB05, 'V'),
+    (0xB0D, 'X'),
+    (0xB0F, 'V'),
+    (0xB11, 'X'),
+    (0xB13, 'V'),
+    (0xB29, 'X'),
+    (0xB2A, 'V'),
+    (0xB31, 'X'),
+    (0xB32, 'V'),
+    (0xB34, 'X'),
+    (0xB35, 'V'),
+    (0xB3A, 'X'),
+    (0xB3C, 'V'),
+    (0xB45, 'X'),
+    (0xB47, 'V'),
+    (0xB49, 'X'),
+    (0xB4B, 'V'),
+    (0xB4E, 'X'),
+    (0xB56, 'V'),
+    (0xB58, 'X'),
+    (0xB5C, 'M', u'ଡ଼'),
+    (0xB5D, 'M', u'ଢ଼'),
+    (0xB5E, 'X'),
+    (0xB5F, 'V'),
+    (0xB64, 'X'),
+    (0xB66, 'V'),
+    (0xB78, 'X'),
+    (0xB82, 'V'),
+    (0xB84, 'X'),
+    (0xB85, 'V'),
+    (0xB8B, 'X'),
+    (0xB8E, 'V'),
+    (0xB91, 'X'),
+    (0xB92, 'V'),
+    (0xB96, 'X'),
+    (0xB99, 'V'),
+    (0xB9B, 'X'),
+    (0xB9C, 'V'),
+    (0xB9D, 'X'),
+    (0xB9E, 'V'),
+    (0xBA0, 'X'),
+    (0xBA3, 'V'),
+    (0xBA5, 'X'),
+    (0xBA8, 'V'),
+    (0xBAB, 'X'),
+    (0xBAE, 'V'),
+    (0xBBA, 'X'),
+    (0xBBE, 'V'),
+    (0xBC3, 'X'),
+    (0xBC6, 'V'),
+    (0xBC9, 'X'),
+    (0xBCA, 'V'),
+    (0xBCE, 'X'),
+    (0xBD0, 'V'),
+    (0xBD1, 'X'),
+    (0xBD7, 'V'),
+    (0xBD8, 'X'),
+    (0xBE6, 'V'),
+    (0xBFB, 'X'),
+    (0xC00, 'V'),
+    (0xC0D, 'X'),
+    (0xC0E, 'V'),
+    (0xC11, 'X'),
+    (0xC12, 'V'),
+    ]
+
+def _seg_12():
+    return [
+    (0xC29, 'X'),
+    (0xC2A, 'V'),
+    (0xC3A, 'X'),
+    (0xC3D, 'V'),
+    (0xC45, 'X'),
+    (0xC46, 'V'),
+    (0xC49, 'X'),
+    (0xC4A, 'V'),
+    (0xC4E, 'X'),
+    (0xC55, 'V'),
+    (0xC57, 'X'),
+    (0xC58, 'V'),
+    (0xC5B, 'X'),
+    (0xC60, 'V'),
+    (0xC64, 'X'),
+    (0xC66, 'V'),
+    (0xC70, 'X'),
+    (0xC78, 'V'),
+    (0xC8D, 'X'),
+    (0xC8E, 'V'),
+    (0xC91, 'X'),
+    (0xC92, 'V'),
+    (0xCA9, 'X'),
+    (0xCAA, 'V'),
+    (0xCB4, 'X'),
+    (0xCB5, 'V'),
+    (0xCBA, 'X'),
+    (0xCBC, 'V'),
+    (0xCC5, 'X'),
+    (0xCC6, 'V'),
+    (0xCC9, 'X'),
+    (0xCCA, 'V'),
+    (0xCCE, 'X'),
+    (0xCD5, 'V'),
+    (0xCD7, 'X'),
+    (0xCDE, 'V'),
+    (0xCDF, 'X'),
+    (0xCE0, 'V'),
+    (0xCE4, 'X'),
+    (0xCE6, 'V'),
+    (0xCF0, 'X'),
+    (0xCF1, 'V'),
+    (0xCF3, 'X'),
+    (0xD00, 'V'),
+    (0xD04, 'X'),
+    (0xD05, 'V'),
+    (0xD0D, 'X'),
+    (0xD0E, 'V'),
+    (0xD11, 'X'),
+    (0xD12, 'V'),
+    (0xD45, 'X'),
+    (0xD46, 'V'),
+    (0xD49, 'X'),
+    (0xD4A, 'V'),
+    (0xD50, 'X'),
+    (0xD54, 'V'),
+    (0xD64, 'X'),
+    (0xD66, 'V'),
+    (0xD80, 'X'),
+    (0xD82, 'V'),
+    (0xD84, 'X'),
+    (0xD85, 'V'),
+    (0xD97, 'X'),
+    (0xD9A, 'V'),
+    (0xDB2, 'X'),
+    (0xDB3, 'V'),
+    (0xDBC, 'X'),
+    (0xDBD, 'V'),
+    (0xDBE, 'X'),
+    (0xDC0, 'V'),
+    (0xDC7, 'X'),
+    (0xDCA, 'V'),
+    (0xDCB, 'X'),
+    (0xDCF, 'V'),
+    (0xDD5, 'X'),
+    (0xDD6, 'V'),
+    (0xDD7, 'X'),
+    (0xDD8, 'V'),
+    (0xDE0, 'X'),
+    (0xDE6, 'V'),
+    (0xDF0, 'X'),
+    (0xDF2, 'V'),
+    (0xDF5, 'X'),
+    (0xE01, 'V'),
+    (0xE33, 'M', u'ํา'),
+    (0xE34, 'V'),
+    (0xE3B, 'X'),
+    (0xE3F, 'V'),
+    (0xE5C, 'X'),
+    (0xE81, 'V'),
+    (0xE83, 'X'),
+    (0xE84, 'V'),
+    (0xE85, 'X'),
+    (0xE87, 'V'),
+    (0xE89, 'X'),
+    (0xE8A, 'V'),
+    (0xE8B, 'X'),
+    (0xE8D, 'V'),
+    (0xE8E, 'X'),
+    (0xE94, 'V'),
+    ]
+
+def _seg_13():
+    return [
+    (0xE98, 'X'),
+    (0xE99, 'V'),
+    (0xEA0, 'X'),
+    (0xEA1, 'V'),
+    (0xEA4, 'X'),
+    (0xEA5, 'V'),
+    (0xEA6, 'X'),
+    (0xEA7, 'V'),
+    (0xEA8, 'X'),
+    (0xEAA, 'V'),
+    (0xEAC, 'X'),
+    (0xEAD, 'V'),
+    (0xEB3, 'M', u'ໍາ'),
+    (0xEB4, 'V'),
+    (0xEBA, 'X'),
+    (0xEBB, 'V'),
+    (0xEBE, 'X'),
+    (0xEC0, 'V'),
+    (0xEC5, 'X'),
+    (0xEC6, 'V'),
+    (0xEC7, 'X'),
+    (0xEC8, 'V'),
+    (0xECE, 'X'),
+    (0xED0, 'V'),
+    (0xEDA, 'X'),
+    (0xEDC, 'M', u'ຫນ'),
+    (0xEDD, 'M', u'ຫມ'),
+    (0xEDE, 'V'),
+    (0xEE0, 'X'),
+    (0xF00, 'V'),
+    (0xF0C, 'M', u'་'),
+    (0xF0D, 'V'),
+    (0xF43, 'M', u'གྷ'),
+    (0xF44, 'V'),
+    (0xF48, 'X'),
+    (0xF49, 'V'),
+    (0xF4D, 'M', u'ཌྷ'),
+    (0xF4E, 'V'),
+    (0xF52, 'M', u'དྷ'),
+    (0xF53, 'V'),
+    (0xF57, 'M', u'བྷ'),
+    (0xF58, 'V'),
+    (0xF5C, 'M', u'ཛྷ'),
+    (0xF5D, 'V'),
+    (0xF69, 'M', u'ཀྵ'),
+    (0xF6A, 'V'),
+    (0xF6D, 'X'),
+    (0xF71, 'V'),
+    (0xF73, 'M', u'ཱི'),
+    (0xF74, 'V'),
+    (0xF75, 'M', u'ཱུ'),
+    (0xF76, 'M', u'ྲྀ'),
+    (0xF77, 'M', u'ྲཱྀ'),
+    (0xF78, 'M', u'ླྀ'),
+    (0xF79, 'M', u'ླཱྀ'),
+    (0xF7A, 'V'),
+    (0xF81, 'M', u'ཱྀ'),
+    (0xF82, 'V'),
+    (0xF93, 'M', u'ྒྷ'),
+    (0xF94, 'V'),
+    (0xF98, 'X'),
+    (0xF99, 'V'),
+    (0xF9D, 'M', u'ྜྷ'),
+    (0xF9E, 'V'),
+    (0xFA2, 'M', u'ྡྷ'),
+    (0xFA3, 'V'),
+    (0xFA7, 'M', u'ྦྷ'),
+    (0xFA8, 'V'),
+    (0xFAC, 'M', u'ྫྷ'),
+    (0xFAD, 'V'),
+    (0xFB9, 'M', u'ྐྵ'),
+    (0xFBA, 'V'),
+    (0xFBD, 'X'),
+    (0xFBE, 'V'),
+    (0xFCD, 'X'),
+    (0xFCE, 'V'),
+    (0xFDB, 'X'),
+    (0x1000, 'V'),
+    (0x10A0, 'X'),
+    (0x10C7, 'M', u'ⴧ'),
+    (0x10C8, 'X'),
+    (0x10CD, 'M', u'ⴭ'),
+    (0x10CE, 'X'),
+    (0x10D0, 'V'),
+    (0x10FC, 'M', u'ნ'),
+    (0x10FD, 'V'),
+    (0x115F, 'X'),
+    (0x1161, 'V'),
+    (0x1249, 'X'),
+    (0x124A, 'V'),
+    (0x124E, 'X'),
+    (0x1250, 'V'),
+    (0x1257, 'X'),
+    (0x1258, 'V'),
+    (0x1259, 'X'),
+    (0x125A, 'V'),
+    (0x125E, 'X'),
+    (0x1260, 'V'),
+    (0x1289, 'X'),
+    (0x128A, 'V'),
+    ]
+
+def _seg_14():
+    return [
+    (0x128E, 'X'),
+    (0x1290, 'V'),
+    (0x12B1, 'X'),
+    (0x12B2, 'V'),
+    (0x12B6, 'X'),
+    (0x12B8, 'V'),
+    (0x12BF, 'X'),
+    (0x12C0, 'V'),
+    (0x12C1, 'X'),
+    (0x12C2, 'V'),
+    (0x12C6, 'X'),
+    (0x12C8, 'V'),
+    (0x12D7, 'X'),
+    (0x12D8, 'V'),
+    (0x1311, 'X'),
+    (0x1312, 'V'),
+    (0x1316, 'X'),
+    (0x1318, 'V'),
+    (0x135B, 'X'),
+    (0x135D, 'V'),
+    (0x137D, 'X'),
+    (0x1380, 'V'),
+    (0x139A, 'X'),
+    (0x13A0, 'V'),
+    (0x13F6, 'X'),
+    (0x13F8, 'M', u'Ᏸ'),
+    (0x13F9, 'M', u'Ᏹ'),
+    (0x13FA, 'M', u'Ᏺ'),
+    (0x13FB, 'M', u'Ᏻ'),
+    (0x13FC, 'M', u'Ᏼ'),
+    (0x13FD, 'M', u'Ᏽ'),
+    (0x13FE, 'X'),
+    (0x1400, 'V'),
+    (0x1680, 'X'),
+    (0x1681, 'V'),
+    (0x169D, 'X'),
+    (0x16A0, 'V'),
+    (0x16F9, 'X'),
+    (0x1700, 'V'),
+    (0x170D, 'X'),
+    (0x170E, 'V'),
+    (0x1715, 'X'),
+    (0x1720, 'V'),
+    (0x1737, 'X'),
+    (0x1740, 'V'),
+    (0x1754, 'X'),
+    (0x1760, 'V'),
+    (0x176D, 'X'),
+    (0x176E, 'V'),
+    (0x1771, 'X'),
+    (0x1772, 'V'),
+    (0x1774, 'X'),
+    (0x1780, 'V'),
+    (0x17B4, 'X'),
+    (0x17B6, 'V'),
+    (0x17DE, 'X'),
+    (0x17E0, 'V'),
+    (0x17EA, 'X'),
+    (0x17F0, 'V'),
+    (0x17FA, 'X'),
+    (0x1800, 'V'),
+    (0x1806, 'X'),
+    (0x1807, 'V'),
+    (0x180B, 'I'),
+    (0x180E, 'X'),
+    (0x1810, 'V'),
+    (0x181A, 'X'),
+    (0x1820, 'V'),
+    (0x1879, 'X'),
+    (0x1880, 'V'),
+    (0x18AB, 'X'),
+    (0x18B0, 'V'),
+    (0x18F6, 'X'),
+    (0x1900, 'V'),
+    (0x191F, 'X'),
+    (0x1920, 'V'),
+    (0x192C, 'X'),
+    (0x1930, 'V'),
+    (0x193C, 'X'),
+    (0x1940, 'V'),
+    (0x1941, 'X'),
+    (0x1944, 'V'),
+    (0x196E, 'X'),
+    (0x1970, 'V'),
+    (0x1975, 'X'),
+    (0x1980, 'V'),
+    (0x19AC, 'X'),
+    (0x19B0, 'V'),
+    (0x19CA, 'X'),
+    (0x19D0, 'V'),
+    (0x19DB, 'X'),
+    (0x19DE, 'V'),
+    (0x1A1C, 'X'),
+    (0x1A1E, 'V'),
+    (0x1A5F, 'X'),
+    (0x1A60, 'V'),
+    (0x1A7D, 'X'),
+    (0x1A7F, 'V'),
+    (0x1A8A, 'X'),
+    (0x1A90, 'V'),
+    ]
+
+def _seg_15():
+    return [
+    (0x1A9A, 'X'),
+    (0x1AA0, 'V'),
+    (0x1AAE, 'X'),
+    (0x1AB0, 'V'),
+    (0x1ABF, 'X'),
+    (0x1B00, 'V'),
+    (0x1B4C, 'X'),
+    (0x1B50, 'V'),
+    (0x1B7D, 'X'),
+    (0x1B80, 'V'),
+    (0x1BF4, 'X'),
+    (0x1BFC, 'V'),
+    (0x1C38, 'X'),
+    (0x1C3B, 'V'),
+    (0x1C4A, 'X'),
+    (0x1C4D, 'V'),
+    (0x1C80, 'M', u'в'),
+    (0x1C81, 'M', u'д'),
+    (0x1C82, 'M', u'о'),
+    (0x1C83, 'M', u'с'),
+    (0x1C84, 'M', u'т'),
+    (0x1C86, 'M', u'ъ'),
+    (0x1C87, 'M', u'ѣ'),
+    (0x1C88, 'M', u'ꙋ'),
+    (0x1C89, 'X'),
+    (0x1CC0, 'V'),
+    (0x1CC8, 'X'),
+    (0x1CD0, 'V'),
+    (0x1CFA, 'X'),
+    (0x1D00, 'V'),
+    (0x1D2C, 'M', u'a'),
+    (0x1D2D, 'M', u'æ'),
+    (0x1D2E, 'M', u'b'),
+    (0x1D2F, 'V'),
+    (0x1D30, 'M', u'd'),
+    (0x1D31, 'M', u'e'),
+    (0x1D32, 'M', u'ǝ'),
+    (0x1D33, 'M', u'g'),
+    (0x1D34, 'M', u'h'),
+    (0x1D35, 'M', u'i'),
+    (0x1D36, 'M', u'j'),
+    (0x1D37, 'M', u'k'),
+    (0x1D38, 'M', u'l'),
+    (0x1D39, 'M', u'm'),
+    (0x1D3A, 'M', u'n'),
+    (0x1D3B, 'V'),
+    (0x1D3C, 'M', u'o'),
+    (0x1D3D, 'M', u'ȣ'),
+    (0x1D3E, 'M', u'p'),
+    (0x1D3F, 'M', u'r'),
+    (0x1D40, 'M', u't'),
+    (0x1D41, 'M', u'u'),
+    (0x1D42, 'M', u'w'),
+    (0x1D43, 'M', u'a'),
+    (0x1D44, 'M', u'ɐ'),
+    (0x1D45, 'M', u'ɑ'),
+    (0x1D46, 'M', u'ᴂ'),
+    (0x1D47, 'M', u'b'),
+    (0x1D48, 'M', u'd'),
+    (0x1D49, 'M', u'e'),
+    (0x1D4A, 'M', u'ə'),
+    (0x1D4B, 'M', u'ɛ'),
+    (0x1D4C, 'M', u'ɜ'),
+    (0x1D4D, 'M', u'g'),
+    (0x1D4E, 'V'),
+    (0x1D4F, 'M', u'k'),
+    (0x1D50, 'M', u'm'),
+    (0x1D51, 'M', u'ŋ'),
+    (0x1D52, 'M', u'o'),
+    (0x1D53, 'M', u'ɔ'),
+    (0x1D54, 'M', u'ᴖ'),
+    (0x1D55, 'M', u'ᴗ'),
+    (0x1D56, 'M', u'p'),
+    (0x1D57, 'M', u't'),
+    (0x1D58, 'M', u'u'),
+    (0x1D59, 'M', u'ᴝ'),
+    (0x1D5A, 'M', u'ɯ'),
+    (0x1D5B, 'M', u'v'),
+    (0x1D5C, 'M', u'ᴥ'),
+    (0x1D5D, 'M', u'β'),
+    (0x1D5E, 'M', u'γ'),
+    (0x1D5F, 'M', u'δ'),
+    (0x1D60, 'M', u'φ'),
+    (0x1D61, 'M', u'χ'),
+    (0x1D62, 'M', u'i'),
+    (0x1D63, 'M', u'r'),
+    (0x1D64, 'M', u'u'),
+    (0x1D65, 'M', u'v'),
+    (0x1D66, 'M', u'β'),
+    (0x1D67, 'M', u'γ'),
+    (0x1D68, 'M', u'ρ'),
+    (0x1D69, 'M', u'φ'),
+    (0x1D6A, 'M', u'χ'),
+    (0x1D6B, 'V'),
+    (0x1D78, 'M', u'н'),
+    (0x1D79, 'V'),
+    (0x1D9B, 'M', u'ɒ'),
+    (0x1D9C, 'M', u'c'),
+    (0x1D9D, 'M', u'ɕ'),
+    (0x1D9E, 'M', u'ð'),
+    ]
+
+def _seg_16():
+    return [
+    (0x1D9F, 'M', u'ɜ'),
+    (0x1DA0, 'M', u'f'),
+    (0x1DA1, 'M', u'ɟ'),
+    (0x1DA2, 'M', u'ɡ'),
+    (0x1DA3, 'M', u'ɥ'),
+    (0x1DA4, 'M', u'ɨ'),
+    (0x1DA5, 'M', u'ɩ'),
+    (0x1DA6, 'M', u'ɪ'),
+    (0x1DA7, 'M', u'ᵻ'),
+    (0x1DA8, 'M', u'ʝ'),
+    (0x1DA9, 'M', u'ɭ'),
+    (0x1DAA, 'M', u'ᶅ'),
+    (0x1DAB, 'M', u'ʟ'),
+    (0x1DAC, 'M', u'ɱ'),
+    (0x1DAD, 'M', u'ɰ'),
+    (0x1DAE, 'M', u'ɲ'),
+    (0x1DAF, 'M', u'ɳ'),
+    (0x1DB0, 'M', u'ɴ'),
+    (0x1DB1, 'M', u'ɵ'),
+    (0x1DB2, 'M', u'ɸ'),
+    (0x1DB3, 'M', u'ʂ'),
+    (0x1DB4, 'M', u'ʃ'),
+    (0x1DB5, 'M', u'ƫ'),
+    (0x1DB6, 'M', u'ʉ'),
+    (0x1DB7, 'M', u'ʊ'),
+    (0x1DB8, 'M', u'ᴜ'),
+    (0x1DB9, 'M', u'ʋ'),
+    (0x1DBA, 'M', u'ʌ'),
+    (0x1DBB, 'M', u'z'),
+    (0x1DBC, 'M', u'ʐ'),
+    (0x1DBD, 'M', u'ʑ'),
+    (0x1DBE, 'M', u'ʒ'),
+    (0x1DBF, 'M', u'θ'),
+    (0x1DC0, 'V'),
+    (0x1DFA, 'X'),
+    (0x1DFB, 'V'),
+    (0x1E00, 'M', u'ḁ'),
+    (0x1E01, 'V'),
+    (0x1E02, 'M', u'ḃ'),
+    (0x1E03, 'V'),
+    (0x1E04, 'M', u'ḅ'),
+    (0x1E05, 'V'),
+    (0x1E06, 'M', u'ḇ'),
+    (0x1E07, 'V'),
+    (0x1E08, 'M', u'ḉ'),
+    (0x1E09, 'V'),
+    (0x1E0A, 'M', u'ḋ'),
+    (0x1E0B, 'V'),
+    (0x1E0C, 'M', u'ḍ'),
+    (0x1E0D, 'V'),
+    (0x1E0E, 'M', u'ḏ'),
+    (0x1E0F, 'V'),
+    (0x1E10, 'M', u'ḑ'),
+    (0x1E11, 'V'),
+    (0x1E12, 'M', u'ḓ'),
+    (0x1E13, 'V'),
+    (0x1E14, 'M', u'ḕ'),
+    (0x1E15, 'V'),
+    (0x1E16, 'M', u'ḗ'),
+    (0x1E17, 'V'),
+    (0x1E18, 'M', u'ḙ'),
+    (0x1E19, 'V'),
+    (0x1E1A, 'M', u'ḛ'),
+    (0x1E1B, 'V'),
+    (0x1E1C, 'M', u'ḝ'),
+    (0x1E1D, 'V'),
+    (0x1E1E, 'M', u'ḟ'),
+    (0x1E1F, 'V'),
+    (0x1E20, 'M', u'ḡ'),
+    (0x1E21, 'V'),
+    (0x1E22, 'M', u'ḣ'),
+    (0x1E23, 'V'),
+    (0x1E24, 'M', u'ḥ'),
+    (0x1E25, 'V'),
+    (0x1E26, 'M', u'ḧ'),
+    (0x1E27, 'V'),
+    (0x1E28, 'M', u'ḩ'),
+    (0x1E29, 'V'),
+    (0x1E2A, 'M', u'ḫ'),
+    (0x1E2B, 'V'),
+    (0x1E2C, 'M', u'ḭ'),
+    (0x1E2D, 'V'),
+    (0x1E2E, 'M', u'ḯ'),
+    (0x1E2F, 'V'),
+    (0x1E30, 'M', u'ḱ'),
+    (0x1E31, 'V'),
+    (0x1E32, 'M', u'ḳ'),
+    (0x1E33, 'V'),
+    (0x1E34, 'M', u'ḵ'),
+    (0x1E35, 'V'),
+    (0x1E36, 'M', u'ḷ'),
+    (0x1E37, 'V'),
+    (0x1E38, 'M', u'ḹ'),
+    (0x1E39, 'V'),
+    (0x1E3A, 'M', u'ḻ'),
+    (0x1E3B, 'V'),
+    (0x1E3C, 'M', u'ḽ'),
+    (0x1E3D, 'V'),
+    (0x1E3E, 'M', u'ḿ'),
+    (0x1E3F, 'V'),
+    ]
+
+def _seg_17():
+    return [
+    (0x1E40, 'M', u'ṁ'),
+    (0x1E41, 'V'),
+    (0x1E42, 'M', u'ṃ'),
+    (0x1E43, 'V'),
+    (0x1E44, 'M', u'ṅ'),
+    (0x1E45, 'V'),
+    (0x1E46, 'M', u'ṇ'),
+    (0x1E47, 'V'),
+    (0x1E48, 'M', u'ṉ'),
+    (0x1E49, 'V'),
+    (0x1E4A, 'M', u'ṋ'),
+    (0x1E4B, 'V'),
+    (0x1E4C, 'M', u'ṍ'),
+    (0x1E4D, 'V'),
+    (0x1E4E, 'M', u'ṏ'),
+    (0x1E4F, 'V'),
+    (0x1E50, 'M', u'ṑ'),
+    (0x1E51, 'V'),
+    (0x1E52, 'M', u'ṓ'),
+    (0x1E53, 'V'),
+    (0x1E54, 'M', u'ṕ'),
+    (0x1E55, 'V'),
+    (0x1E56, 'M', u'ṗ'),
+    (0x1E57, 'V'),
+    (0x1E58, 'M', u'ṙ'),
+    (0x1E59, 'V'),
+    (0x1E5A, 'M', u'ṛ'),
+    (0x1E5B, 'V'),
+    (0x1E5C, 'M', u'ṝ'),
+    (0x1E5D, 'V'),
+    (0x1E5E, 'M', u'ṟ'),
+    (0x1E5F, 'V'),
+    (0x1E60, 'M', u'ṡ'),
+    (0x1E61, 'V'),
+    (0x1E62, 'M', u'ṣ'),
+    (0x1E63, 'V'),
+    (0x1E64, 'M', u'ṥ'),
+    (0x1E65, 'V'),
+    (0x1E66, 'M', u'ṧ'),
+    (0x1E67, 'V'),
+    (0x1E68, 'M', u'ṩ'),
+    (0x1E69, 'V'),
+    (0x1E6A, 'M', u'ṫ'),
+    (0x1E6B, 'V'),
+    (0x1E6C, 'M', u'ṭ'),
+    (0x1E6D, 'V'),
+    (0x1E6E, 'M', u'ṯ'),
+    (0x1E6F, 'V'),
+    (0x1E70, 'M', u'ṱ'),
+    (0x1E71, 'V'),
+    (0x1E72, 'M', u'ṳ'),
+    (0x1E73, 'V'),
+    (0x1E74, 'M', u'ṵ'),
+    (0x1E75, 'V'),
+    (0x1E76, 'M', u'ṷ'),
+    (0x1E77, 'V'),
+    (0x1E78, 'M', u'ṹ'),
+    (0x1E79, 'V'),
+    (0x1E7A, 'M', u'ṻ'),
+    (0x1E7B, 'V'),
+    (0x1E7C, 'M', u'ṽ'),
+    (0x1E7D, 'V'),
+    (0x1E7E, 'M', u'ṿ'),
+    (0x1E7F, 'V'),
+    (0x1E80, 'M', u'ẁ'),
+    (0x1E81, 'V'),
+    (0x1E82, 'M', u'ẃ'),
+    (0x1E83, 'V'),
+    (0x1E84, 'M', u'ẅ'),
+    (0x1E85, 'V'),
+    (0x1E86, 'M', u'ẇ'),
+    (0x1E87, 'V'),
+    (0x1E88, 'M', u'ẉ'),
+    (0x1E89, 'V'),
+    (0x1E8A, 'M', u'ẋ'),
+    (0x1E8B, 'V'),
+    (0x1E8C, 'M', u'ẍ'),
+    (0x1E8D, 'V'),
+    (0x1E8E, 'M', u'ẏ'),
+    (0x1E8F, 'V'),
+    (0x1E90, 'M', u'ẑ'),
+    (0x1E91, 'V'),
+    (0x1E92, 'M', u'ẓ'),
+    (0x1E93, 'V'),
+    (0x1E94, 'M', u'ẕ'),
+    (0x1E95, 'V'),
+    (0x1E9A, 'M', u'aʾ'),
+    (0x1E9B, 'M', u'ṡ'),
+    (0x1E9C, 'V'),
+    (0x1E9E, 'M', u'ss'),
+    (0x1E9F, 'V'),
+    (0x1EA0, 'M', u'ạ'),
+    (0x1EA1, 'V'),
+    (0x1EA2, 'M', u'ả'),
+    (0x1EA3, 'V'),
+    (0x1EA4, 'M', u'ấ'),
+    (0x1EA5, 'V'),
+    (0x1EA6, 'M', u'ầ'),
+    (0x1EA7, 'V'),
+    (0x1EA8, 'M', u'ẩ'),
+    ]
+
+def _seg_18():
+    return [
+    (0x1EA9, 'V'),
+    (0x1EAA, 'M', u'ẫ'),
+    (0x1EAB, 'V'),
+    (0x1EAC, 'M', u'ậ'),
+    (0x1EAD, 'V'),
+    (0x1EAE, 'M', u'ắ'),
+    (0x1EAF, 'V'),
+    (0x1EB0, 'M', u'ằ'),
+    (0x1EB1, 'V'),
+    (0x1EB2, 'M', u'ẳ'),
+    (0x1EB3, 'V'),
+    (0x1EB4, 'M', u'ẵ'),
+    (0x1EB5, 'V'),
+    (0x1EB6, 'M', u'ặ'),
+    (0x1EB7, 'V'),
+    (0x1EB8, 'M', u'ẹ'),
+    (0x1EB9, 'V'),
+    (0x1EBA, 'M', u'ẻ'),
+    (0x1EBB, 'V'),
+    (0x1EBC, 'M', u'ẽ'),
+    (0x1EBD, 'V'),
+    (0x1EBE, 'M', u'ế'),
+    (0x1EBF, 'V'),
+    (0x1EC0, 'M', u'ề'),
+    (0x1EC1, 'V'),
+    (0x1EC2, 'M', u'ể'),
+    (0x1EC3, 'V'),
+    (0x1EC4, 'M', u'ễ'),
+    (0x1EC5, 'V'),
+    (0x1EC6, 'M', u'ệ'),
+    (0x1EC7, 'V'),
+    (0x1EC8, 'M', u'ỉ'),
+    (0x1EC9, 'V'),
+    (0x1ECA, 'M', u'ị'),
+    (0x1ECB, 'V'),
+    (0x1ECC, 'M', u'ọ'),
+    (0x1ECD, 'V'),
+    (0x1ECE, 'M', u'ỏ'),
+    (0x1ECF, 'V'),
+    (0x1ED0, 'M', u'ố'),
+    (0x1ED1, 'V'),
+    (0x1ED2, 'M', u'ồ'),
+    (0x1ED3, 'V'),
+    (0x1ED4, 'M', u'ổ'),
+    (0x1ED5, 'V'),
+    (0x1ED6, 'M', u'ỗ'),
+    (0x1ED7, 'V'),
+    (0x1ED8, 'M', u'ộ'),
+    (0x1ED9, 'V'),
+    (0x1EDA, 'M', u'ớ'),
+    (0x1EDB, 'V'),
+    (0x1EDC, 'M', u'ờ'),
+    (0x1EDD, 'V'),
+    (0x1EDE, 'M', u'ở'),
+    (0x1EDF, 'V'),
+    (0x1EE0, 'M', u'ỡ'),
+    (0x1EE1, 'V'),
+    (0x1EE2, 'M', u'ợ'),
+    (0x1EE3, 'V'),
+    (0x1EE4, 'M', u'ụ'),
+    (0x1EE5, 'V'),
+    (0x1EE6, 'M', u'ủ'),
+    (0x1EE7, 'V'),
+    (0x1EE8, 'M', u'ứ'),
+    (0x1EE9, 'V'),
+    (0x1EEA, 'M', u'ừ'),
+    (0x1EEB, 'V'),
+    (0x1EEC, 'M', u'ử'),
+    (0x1EED, 'V'),
+    (0x1EEE, 'M', u'ữ'),
+    (0x1EEF, 'V'),
+    (0x1EF0, 'M', u'ự'),
+    (0x1EF1, 'V'),
+    (0x1EF2, 'M', u'ỳ'),
+    (0x1EF3, 'V'),
+    (0x1EF4, 'M', u'ỵ'),
+    (0x1EF5, 'V'),
+    (0x1EF6, 'M', u'ỷ'),
+    (0x1EF7, 'V'),
+    (0x1EF8, 'M', u'ỹ'),
+    (0x1EF9, 'V'),
+    (0x1EFA, 'M', u'ỻ'),
+    (0x1EFB, 'V'),
+    (0x1EFC, 'M', u'ỽ'),
+    (0x1EFD, 'V'),
+    (0x1EFE, 'M', u'ỿ'),
+    (0x1EFF, 'V'),
+    (0x1F08, 'M', u'ἀ'),
+    (0x1F09, 'M', u'ἁ'),
+    (0x1F0A, 'M', u'ἂ'),
+    (0x1F0B, 'M', u'ἃ'),
+    (0x1F0C, 'M', u'ἄ'),
+    (0x1F0D, 'M', u'ἅ'),
+    (0x1F0E, 'M', u'ἆ'),
+    (0x1F0F, 'M', u'ἇ'),
+    (0x1F10, 'V'),
+    (0x1F16, 'X'),
+    (0x1F18, 'M', u'ἐ'),
+    (0x1F19, 'M', u'ἑ'),
+    (0x1F1A, 'M', u'ἒ'),
+    ]
+
+def _seg_19():
+    return [
+    (0x1F1B, 'M', u'ἓ'),
+    (0x1F1C, 'M', u'ἔ'),
+    (0x1F1D, 'M', u'ἕ'),
+    (0x1F1E, 'X'),
+    (0x1F20, 'V'),
+    (0x1F28, 'M', u'ἠ'),
+    (0x1F29, 'M', u'ἡ'),
+    (0x1F2A, 'M', u'ἢ'),
+    (0x1F2B, 'M', u'ἣ'),
+    (0x1F2C, 'M', u'ἤ'),
+    (0x1F2D, 'M', u'ἥ'),
+    (0x1F2E, 'M', u'ἦ'),
+    (0x1F2F, 'M', u'ἧ'),
+    (0x1F30, 'V'),
+    (0x1F38, 'M', u'ἰ'),
+    (0x1F39, 'M', u'ἱ'),
+    (0x1F3A, 'M', u'ἲ'),
+    (0x1F3B, 'M', u'ἳ'),
+    (0x1F3C, 'M', u'ἴ'),
+    (0x1F3D, 'M', u'ἵ'),
+    (0x1F3E, 'M', u'ἶ'),
+    (0x1F3F, 'M', u'ἷ'),
+    (0x1F40, 'V'),
+    (0x1F46, 'X'),
+    (0x1F48, 'M', u'ὀ'),
+    (0x1F49, 'M', u'ὁ'),
+    (0x1F4A, 'M', u'ὂ'),
+    (0x1F4B, 'M', u'ὃ'),
+    (0x1F4C, 'M', u'ὄ'),
+    (0x1F4D, 'M', u'ὅ'),
+    (0x1F4E, 'X'),
+    (0x1F50, 'V'),
+    (0x1F58, 'X'),
+    (0x1F59, 'M', u'ὑ'),
+    (0x1F5A, 'X'),
+    (0x1F5B, 'M', u'ὓ'),
+    (0x1F5C, 'X'),
+    (0x1F5D, 'M', u'ὕ'),
+    (0x1F5E, 'X'),
+    (0x1F5F, 'M', u'ὗ'),
+    (0x1F60, 'V'),
+    (0x1F68, 'M', u'ὠ'),
+    (0x1F69, 'M', u'ὡ'),
+    (0x1F6A, 'M', u'ὢ'),
+    (0x1F6B, 'M', u'ὣ'),
+    (0x1F6C, 'M', u'ὤ'),
+    (0x1F6D, 'M', u'ὥ'),
+    (0x1F6E, 'M', u'ὦ'),
+    (0x1F6F, 'M', u'ὧ'),
+    (0x1F70, 'V'),
+    (0x1F71, 'M', u'ά'),
+    (0x1F72, 'V'),
+    (0x1F73, 'M', u'έ'),
+    (0x1F74, 'V'),
+    (0x1F75, 'M', u'ή'),
+    (0x1F76, 'V'),
+    (0x1F77, 'M', u'ί'),
+    (0x1F78, 'V'),
+    (0x1F79, 'M', u'ό'),
+    (0x1F7A, 'V'),
+    (0x1F7B, 'M', u'ύ'),
+    (0x1F7C, 'V'),
+    (0x1F7D, 'M', u'ώ'),
+    (0x1F7E, 'X'),
+    (0x1F80, 'M', u'ἀι'),
+    (0x1F81, 'M', u'ἁι'),
+    (0x1F82, 'M', u'ἂι'),
+    (0x1F83, 'M', u'ἃι'),
+    (0x1F84, 'M', u'ἄι'),
+    (0x1F85, 'M', u'ἅι'),
+    (0x1F86, 'M', u'ἆι'),
+    (0x1F87, 'M', u'ἇι'),
+    (0x1F88, 'M', u'ἀι'),
+    (0x1F89, 'M', u'ἁι'),
+    (0x1F8A, 'M', u'ἂι'),
+    (0x1F8B, 'M', u'ἃι'),
+    (0x1F8C, 'M', u'ἄι'),
+    (0x1F8D, 'M', u'ἅι'),
+    (0x1F8E, 'M', u'ἆι'),
+    (0x1F8F, 'M', u'ἇι'),
+    (0x1F90, 'M', u'ἠι'),
+    (0x1F91, 'M', u'ἡι'),
+    (0x1F92, 'M', u'ἢι'),
+    (0x1F93, 'M', u'ἣι'),
+    (0x1F94, 'M', u'ἤι'),
+    (0x1F95, 'M', u'ἥι'),
+    (0x1F96, 'M', u'ἦι'),
+    (0x1F97, 'M', u'ἧι'),
+    (0x1F98, 'M', u'ἠι'),
+    (0x1F99, 'M', u'ἡι'),
+    (0x1F9A, 'M', u'ἢι'),
+    (0x1F9B, 'M', u'ἣι'),
+    (0x1F9C, 'M', u'ἤι'),
+    (0x1F9D, 'M', u'ἥι'),
+    (0x1F9E, 'M', u'ἦι'),
+    (0x1F9F, 'M', u'ἧι'),
+    (0x1FA0, 'M', u'ὠι'),
+    (0x1FA1, 'M', u'ὡι'),
+    (0x1FA2, 'M', u'ὢι'),
+    (0x1FA3, 'M', u'ὣι'),
+    ]
+
+def _seg_20():
+    return [
+    (0x1FA4, 'M', u'ὤι'),
+    (0x1FA5, 'M', u'ὥι'),
+    (0x1FA6, 'M', u'ὦι'),
+    (0x1FA7, 'M', u'ὧι'),
+    (0x1FA8, 'M', u'ὠι'),
+    (0x1FA9, 'M', u'ὡι'),
+    (0x1FAA, 'M', u'ὢι'),
+    (0x1FAB, 'M', u'ὣι'),
+    (0x1FAC, 'M', u'ὤι'),
+    (0x1FAD, 'M', u'ὥι'),
+    (0x1FAE, 'M', u'ὦι'),
+    (0x1FAF, 'M', u'ὧι'),
+    (0x1FB0, 'V'),
+    (0x1FB2, 'M', u'ὰι'),
+    (0x1FB3, 'M', u'αι'),
+    (0x1FB4, 'M', u'άι'),
+    (0x1FB5, 'X'),
+    (0x1FB6, 'V'),
+    (0x1FB7, 'M', u'ᾶι'),
+    (0x1FB8, 'M', u'ᾰ'),
+    (0x1FB9, 'M', u'ᾱ'),
+    (0x1FBA, 'M', u'ὰ'),
+    (0x1FBB, 'M', u'ά'),
+    (0x1FBC, 'M', u'αι'),
+    (0x1FBD, '3', u' ̓'),
+    (0x1FBE, 'M', u'ι'),
+    (0x1FBF, '3', u' ̓'),
+    (0x1FC0, '3', u' ͂'),
+    (0x1FC1, '3', u' ̈͂'),
+    (0x1FC2, 'M', u'ὴι'),
+    (0x1FC3, 'M', u'ηι'),
+    (0x1FC4, 'M', u'ήι'),
+    (0x1FC5, 'X'),
+    (0x1FC6, 'V'),
+    (0x1FC7, 'M', u'ῆι'),
+    (0x1FC8, 'M', u'ὲ'),
+    (0x1FC9, 'M', u'έ'),
+    (0x1FCA, 'M', u'ὴ'),
+    (0x1FCB, 'M', u'ή'),
+    (0x1FCC, 'M', u'ηι'),
+    (0x1FCD, '3', u' ̓̀'),
+    (0x1FCE, '3', u' ̓́'),
+    (0x1FCF, '3', u' ̓͂'),
+    (0x1FD0, 'V'),
+    (0x1FD3, 'M', u'ΐ'),
+    (0x1FD4, 'X'),
+    (0x1FD6, 'V'),
+    (0x1FD8, 'M', u'ῐ'),
+    (0x1FD9, 'M', u'ῑ'),
+    (0x1FDA, 'M', u'ὶ'),
+    (0x1FDB, 'M', u'ί'),
+    (0x1FDC, 'X'),
+    (0x1FDD, '3', u' ̔̀'),
+    (0x1FDE, '3', u' ̔́'),
+    (0x1FDF, '3', u' ̔͂'),
+    (0x1FE0, 'V'),
+    (0x1FE3, 'M', u'ΰ'),
+    (0x1FE4, 'V'),
+    (0x1FE8, 'M', u'ῠ'),
+    (0x1FE9, 'M', u'ῡ'),
+    (0x1FEA, 'M', u'ὺ'),
+    (0x1FEB, 'M', u'ύ'),
+    (0x1FEC, 'M', u'ῥ'),
+    (0x1FED, '3', u' ̈̀'),
+    (0x1FEE, '3', u' ̈́'),
+    (0x1FEF, '3', u'`'),
+    (0x1FF0, 'X'),
+    (0x1FF2, 'M', u'ὼι'),
+    (0x1FF3, 'M', u'ωι'),
+    (0x1FF4, 'M', u'ώι'),
+    (0x1FF5, 'X'),
+    (0x1FF6, 'V'),
+    (0x1FF7, 'M', u'ῶι'),
+    (0x1FF8, 'M', u'ὸ'),
+    (0x1FF9, 'M', u'ό'),
+    (0x1FFA, 'M', u'ὼ'),
+    (0x1FFB, 'M', u'ώ'),
+    (0x1FFC, 'M', u'ωι'),
+    (0x1FFD, '3', u' ́'),
+    (0x1FFE, '3', u' ̔'),
+    (0x1FFF, 'X'),
+    (0x2000, '3', u' '),
+    (0x200B, 'I'),
+    (0x200C, 'D', u''),
+    (0x200E, 'X'),
+    (0x2010, 'V'),
+    (0x2011, 'M', u'‐'),
+    (0x2012, 'V'),
+    (0x2017, '3', u' ̳'),
+    (0x2018, 'V'),
+    (0x2024, 'X'),
+    (0x2027, 'V'),
+    (0x2028, 'X'),
+    (0x202F, '3', u' '),
+    (0x2030, 'V'),
+    (0x2033, 'M', u'′′'),
+    (0x2034, 'M', u'′′′'),
+    (0x2035, 'V'),
+    (0x2036, 'M', u'‵‵'),
+    (0x2037, 'M', u'‵‵‵'),
+    ]
+
+def _seg_21():
+    return [
+    (0x2038, 'V'),
+    (0x203C, '3', u'!!'),
+    (0x203D, 'V'),
+    (0x203E, '3', u' ̅'),
+    (0x203F, 'V'),
+    (0x2047, '3', u'??'),
+    (0x2048, '3', u'?!'),
+    (0x2049, '3', u'!?'),
+    (0x204A, 'V'),
+    (0x2057, 'M', u'′′′′'),
+    (0x2058, 'V'),
+    (0x205F, '3', u' '),
+    (0x2060, 'I'),
+    (0x2061, 'X'),
+    (0x2064, 'I'),
+    (0x2065, 'X'),
+    (0x2070, 'M', u'0'),
+    (0x2071, 'M', u'i'),
+    (0x2072, 'X'),
+    (0x2074, 'M', u'4'),
+    (0x2075, 'M', u'5'),
+    (0x2076, 'M', u'6'),
+    (0x2077, 'M', u'7'),
+    (0x2078, 'M', u'8'),
+    (0x2079, 'M', u'9'),
+    (0x207A, '3', u'+'),
+    (0x207B, 'M', u'−'),
+    (0x207C, '3', u'='),
+    (0x207D, '3', u'('),
+    (0x207E, '3', u')'),
+    (0x207F, 'M', u'n'),
+    (0x2080, 'M', u'0'),
+    (0x2081, 'M', u'1'),
+    (0x2082, 'M', u'2'),
+    (0x2083, 'M', u'3'),
+    (0x2084, 'M', u'4'),
+    (0x2085, 'M', u'5'),
+    (0x2086, 'M', u'6'),
+    (0x2087, 'M', u'7'),
+    (0x2088, 'M', u'8'),
+    (0x2089, 'M', u'9'),
+    (0x208A, '3', u'+'),
+    (0x208B, 'M', u'−'),
+    (0x208C, '3', u'='),
+    (0x208D, '3', u'('),
+    (0x208E, '3', u')'),
+    (0x208F, 'X'),
+    (0x2090, 'M', u'a'),
+    (0x2091, 'M', u'e'),
+    (0x2092, 'M', u'o'),
+    (0x2093, 'M', u'x'),
+    (0x2094, 'M', u'ə'),
+    (0x2095, 'M', u'h'),
+    (0x2096, 'M', u'k'),
+    (0x2097, 'M', u'l'),
+    (0x2098, 'M', u'm'),
+    (0x2099, 'M', u'n'),
+    (0x209A, 'M', u'p'),
+    (0x209B, 'M', u's'),
+    (0x209C, 'M', u't'),
+    (0x209D, 'X'),
+    (0x20A0, 'V'),
+    (0x20A8, 'M', u'rs'),
+    (0x20A9, 'V'),
+    (0x20C0, 'X'),
+    (0x20D0, 'V'),
+    (0x20F1, 'X'),
+    (0x2100, '3', u'a/c'),
+    (0x2101, '3', u'a/s'),
+    (0x2102, 'M', u'c'),
+    (0x2103, 'M', u'°c'),
+    (0x2104, 'V'),
+    (0x2105, '3', u'c/o'),
+    (0x2106, '3', u'c/u'),
+    (0x2107, 'M', u'ɛ'),
+    (0x2108, 'V'),
+    (0x2109, 'M', u'°f'),
+    (0x210A, 'M', u'g'),
+    (0x210B, 'M', u'h'),
+    (0x210F, 'M', u'ħ'),
+    (0x2110, 'M', u'i'),
+    (0x2112, 'M', u'l'),
+    (0x2114, 'V'),
+    (0x2115, 'M', u'n'),
+    (0x2116, 'M', u'no'),
+    (0x2117, 'V'),
+    (0x2119, 'M', u'p'),
+    (0x211A, 'M', u'q'),
+    (0x211B, 'M', u'r'),
+    (0x211E, 'V'),
+    (0x2120, 'M', u'sm'),
+    (0x2121, 'M', u'tel'),
+    (0x2122, 'M', u'tm'),
+    (0x2123, 'V'),
+    (0x2124, 'M', u'z'),
+    (0x2125, 'V'),
+    (0x2126, 'M', u'ω'),
+    (0x2127, 'V'),
+    (0x2128, 'M', u'z'),
+    (0x2129, 'V'),
+    ]
+
+def _seg_22():
+    return [
+    (0x212A, 'M', u'k'),
+    (0x212B, 'M', u'å'),
+    (0x212C, 'M', u'b'),
+    (0x212D, 'M', u'c'),
+    (0x212E, 'V'),
+    (0x212F, 'M', u'e'),
+    (0x2131, 'M', u'f'),
+    (0x2132, 'X'),
+    (0x2133, 'M', u'm'),
+    (0x2134, 'M', u'o'),
+    (0x2135, 'M', u'א'),
+    (0x2136, 'M', u'ב'),
+    (0x2137, 'M', u'ג'),
+    (0x2138, 'M', u'ד'),
+    (0x2139, 'M', u'i'),
+    (0x213A, 'V'),
+    (0x213B, 'M', u'fax'),
+    (0x213C, 'M', u'π'),
+    (0x213D, 'M', u'γ'),
+    (0x213F, 'M', u'π'),
+    (0x2140, 'M', u'∑'),
+    (0x2141, 'V'),
+    (0x2145, 'M', u'd'),
+    (0x2147, 'M', u'e'),
+    (0x2148, 'M', u'i'),
+    (0x2149, 'M', u'j'),
+    (0x214A, 'V'),
+    (0x2150, 'M', u'1⁄7'),
+    (0x2151, 'M', u'1⁄9'),
+    (0x2152, 'M', u'1⁄10'),
+    (0x2153, 'M', u'1⁄3'),
+    (0x2154, 'M', u'2⁄3'),
+    (0x2155, 'M', u'1⁄5'),
+    (0x2156, 'M', u'2⁄5'),
+    (0x2157, 'M', u'3⁄5'),
+    (0x2158, 'M', u'4⁄5'),
+    (0x2159, 'M', u'1⁄6'),
+    (0x215A, 'M', u'5⁄6'),
+    (0x215B, 'M', u'1⁄8'),
+    (0x215C, 'M', u'3⁄8'),
+    (0x215D, 'M', u'5⁄8'),
+    (0x215E, 'M', u'7⁄8'),
+    (0x215F, 'M', u'1⁄'),
+    (0x2160, 'M', u'i'),
+    (0x2161, 'M', u'ii'),
+    (0x2162, 'M', u'iii'),
+    (0x2163, 'M', u'iv'),
+    (0x2164, 'M', u'v'),
+    (0x2165, 'M', u'vi'),
+    (0x2166, 'M', u'vii'),
+    (0x2167, 'M', u'viii'),
+    (0x2168, 'M', u'ix'),
+    (0x2169, 'M', u'x'),
+    (0x216A, 'M', u'xi'),
+    (0x216B, 'M', u'xii'),
+    (0x216C, 'M', u'l'),
+    (0x216D, 'M', u'c'),
+    (0x216E, 'M', u'd'),
+    (0x216F, 'M', u'm'),
+    (0x2170, 'M', u'i'),
+    (0x2171, 'M', u'ii'),
+    (0x2172, 'M', u'iii'),
+    (0x2173, 'M', u'iv'),
+    (0x2174, 'M', u'v'),
+    (0x2175, 'M', u'vi'),
+    (0x2176, 'M', u'vii'),
+    (0x2177, 'M', u'viii'),
+    (0x2178, 'M', u'ix'),
+    (0x2179, 'M', u'x'),
+    (0x217A, 'M', u'xi'),
+    (0x217B, 'M', u'xii'),
+    (0x217C, 'M', u'l'),
+    (0x217D, 'M', u'c'),
+    (0x217E, 'M', u'd'),
+    (0x217F, 'M', u'm'),
+    (0x2180, 'V'),
+    (0x2183, 'X'),
+    (0x2184, 'V'),
+    (0x2189, 'M', u'0⁄3'),
+    (0x218A, 'V'),
+    (0x218C, 'X'),
+    (0x2190, 'V'),
+    (0x222C, 'M', u'∫∫'),
+    (0x222D, 'M', u'∫∫∫'),
+    (0x222E, 'V'),
+    (0x222F, 'M', u'∮∮'),
+    (0x2230, 'M', u'∮∮∮'),
+    (0x2231, 'V'),
+    (0x2260, '3'),
+    (0x2261, 'V'),
+    (0x226E, '3'),
+    (0x2270, 'V'),
+    (0x2329, 'M', u'〈'),
+    (0x232A, 'M', u'〉'),
+    (0x232B, 'V'),
+    (0x2427, 'X'),
+    (0x2440, 'V'),
+    (0x244B, 'X'),
+    (0x2460, 'M', u'1'),
+    (0x2461, 'M', u'2'),
+    ]
+
+def _seg_23():
+    return [
+    (0x2462, 'M', u'3'),
+    (0x2463, 'M', u'4'),
+    (0x2464, 'M', u'5'),
+    (0x2465, 'M', u'6'),
+    (0x2466, 'M', u'7'),
+    (0x2467, 'M', u'8'),
+    (0x2468, 'M', u'9'),
+    (0x2469, 'M', u'10'),
+    (0x246A, 'M', u'11'),
+    (0x246B, 'M', u'12'),
+    (0x246C, 'M', u'13'),
+    (0x246D, 'M', u'14'),
+    (0x246E, 'M', u'15'),
+    (0x246F, 'M', u'16'),
+    (0x2470, 'M', u'17'),
+    (0x2471, 'M', u'18'),
+    (0x2472, 'M', u'19'),
+    (0x2473, 'M', u'20'),
+    (0x2474, '3', u'(1)'),
+    (0x2475, '3', u'(2)'),
+    (0x2476, '3', u'(3)'),
+    (0x2477, '3', u'(4)'),
+    (0x2478, '3', u'(5)'),
+    (0x2479, '3', u'(6)'),
+    (0x247A, '3', u'(7)'),
+    (0x247B, '3', u'(8)'),
+    (0x247C, '3', u'(9)'),
+    (0x247D, '3', u'(10)'),
+    (0x247E, '3', u'(11)'),
+    (0x247F, '3', u'(12)'),
+    (0x2480, '3', u'(13)'),
+    (0x2481, '3', u'(14)'),
+    (0x2482, '3', u'(15)'),
+    (0x2483, '3', u'(16)'),
+    (0x2484, '3', u'(17)'),
+    (0x2485, '3', u'(18)'),
+    (0x2486, '3', u'(19)'),
+    (0x2487, '3', u'(20)'),
+    (0x2488, 'X'),
+    (0x249C, '3', u'(a)'),
+    (0x249D, '3', u'(b)'),
+    (0x249E, '3', u'(c)'),
+    (0x249F, '3', u'(d)'),
+    (0x24A0, '3', u'(e)'),
+    (0x24A1, '3', u'(f)'),
+    (0x24A2, '3', u'(g)'),
+    (0x24A3, '3', u'(h)'),
+    (0x24A4, '3', u'(i)'),
+    (0x24A5, '3', u'(j)'),
+    (0x24A6, '3', u'(k)'),
+    (0x24A7, '3', u'(l)'),
+    (0x24A8, '3', u'(m)'),
+    (0x24A9, '3', u'(n)'),
+    (0x24AA, '3', u'(o)'),
+    (0x24AB, '3', u'(p)'),
+    (0x24AC, '3', u'(q)'),
+    (0x24AD, '3', u'(r)'),
+    (0x24AE, '3', u'(s)'),
+    (0x24AF, '3', u'(t)'),
+    (0x24B0, '3', u'(u)'),
+    (0x24B1, '3', u'(v)'),
+    (0x24B2, '3', u'(w)'),
+    (0x24B3, '3', u'(x)'),
+    (0x24B4, '3', u'(y)'),
+    (0x24B5, '3', u'(z)'),
+    (0x24B6, 'M', u'a'),
+    (0x24B7, 'M', u'b'),
+    (0x24B8, 'M', u'c'),
+    (0x24B9, 'M', u'd'),
+    (0x24BA, 'M', u'e'),
+    (0x24BB, 'M', u'f'),
+    (0x24BC, 'M', u'g'),
+    (0x24BD, 'M', u'h'),
+    (0x24BE, 'M', u'i'),
+    (0x24BF, 'M', u'j'),
+    (0x24C0, 'M', u'k'),
+    (0x24C1, 'M', u'l'),
+    (0x24C2, 'M', u'm'),
+    (0x24C3, 'M', u'n'),
+    (0x24C4, 'M', u'o'),
+    (0x24C5, 'M', u'p'),
+    (0x24C6, 'M', u'q'),
+    (0x24C7, 'M', u'r'),
+    (0x24C8, 'M', u's'),
+    (0x24C9, 'M', u't'),
+    (0x24CA, 'M', u'u'),
+    (0x24CB, 'M', u'v'),
+    (0x24CC, 'M', u'w'),
+    (0x24CD, 'M', u'x'),
+    (0x24CE, 'M', u'y'),
+    (0x24CF, 'M', u'z'),
+    (0x24D0, 'M', u'a'),
+    (0x24D1, 'M', u'b'),
+    (0x24D2, 'M', u'c'),
+    (0x24D3, 'M', u'd'),
+    (0x24D4, 'M', u'e'),
+    (0x24D5, 'M', u'f'),
+    (0x24D6, 'M', u'g'),
+    (0x24D7, 'M', u'h'),
+    (0x24D8, 'M', u'i'),
+    ]
+
+def _seg_24():
+    return [
+    (0x24D9, 'M', u'j'),
+    (0x24DA, 'M', u'k'),
+    (0x24DB, 'M', u'l'),
+    (0x24DC, 'M', u'm'),
+    (0x24DD, 'M', u'n'),
+    (0x24DE, 'M', u'o'),
+    (0x24DF, 'M', u'p'),
+    (0x24E0, 'M', u'q'),
+    (0x24E1, 'M', u'r'),
+    (0x24E2, 'M', u's'),
+    (0x24E3, 'M', u't'),
+    (0x24E4, 'M', u'u'),
+    (0x24E5, 'M', u'v'),
+    (0x24E6, 'M', u'w'),
+    (0x24E7, 'M', u'x'),
+    (0x24E8, 'M', u'y'),
+    (0x24E9, 'M', u'z'),
+    (0x24EA, 'M', u'0'),
+    (0x24EB, 'V'),
+    (0x2A0C, 'M', u'∫∫∫∫'),
+    (0x2A0D, 'V'),
+    (0x2A74, '3', u'::='),
+    (0x2A75, '3', u'=='),
+    (0x2A76, '3', u'==='),
+    (0x2A77, 'V'),
+    (0x2ADC, 'M', u'⫝̸'),
+    (0x2ADD, 'V'),
+    (0x2B74, 'X'),
+    (0x2B76, 'V'),
+    (0x2B96, 'X'),
+    (0x2B98, 'V'),
+    (0x2BC9, 'X'),
+    (0x2BCA, 'V'),
+    (0x2BFF, 'X'),
+    (0x2C00, 'M', u'ⰰ'),
+    (0x2C01, 'M', u'ⰱ'),
+    (0x2C02, 'M', u'ⰲ'),
+    (0x2C03, 'M', u'ⰳ'),
+    (0x2C04, 'M', u'ⰴ'),
+    (0x2C05, 'M', u'ⰵ'),
+    (0x2C06, 'M', u'ⰶ'),
+    (0x2C07, 'M', u'ⰷ'),
+    (0x2C08, 'M', u'ⰸ'),
+    (0x2C09, 'M', u'ⰹ'),
+    (0x2C0A, 'M', u'ⰺ'),
+    (0x2C0B, 'M', u'ⰻ'),
+    (0x2C0C, 'M', u'ⰼ'),
+    (0x2C0D, 'M', u'ⰽ'),
+    (0x2C0E, 'M', u'ⰾ'),
+    (0x2C0F, 'M', u'ⰿ'),
+    (0x2C10, 'M', u'ⱀ'),
+    (0x2C11, 'M', u'ⱁ'),
+    (0x2C12, 'M', u'ⱂ'),
+    (0x2C13, 'M', u'ⱃ'),
+    (0x2C14, 'M', u'ⱄ'),
+    (0x2C15, 'M', u'ⱅ'),
+    (0x2C16, 'M', u'ⱆ'),
+    (0x2C17, 'M', u'ⱇ'),
+    (0x2C18, 'M', u'ⱈ'),
+    (0x2C19, 'M', u'ⱉ'),
+    (0x2C1A, 'M', u'ⱊ'),
+    (0x2C1B, 'M', u'ⱋ'),
+    (0x2C1C, 'M', u'ⱌ'),
+    (0x2C1D, 'M', u'ⱍ'),
+    (0x2C1E, 'M', u'ⱎ'),
+    (0x2C1F, 'M', u'ⱏ'),
+    (0x2C20, 'M', u'ⱐ'),
+    (0x2C21, 'M', u'ⱑ'),
+    (0x2C22, 'M', u'ⱒ'),
+    (0x2C23, 'M', u'ⱓ'),
+    (0x2C24, 'M', u'ⱔ'),
+    (0x2C25, 'M', u'ⱕ'),
+    (0x2C26, 'M', u'ⱖ'),
+    (0x2C27, 'M', u'ⱗ'),
+    (0x2C28, 'M', u'ⱘ'),
+    (0x2C29, 'M', u'ⱙ'),
+    (0x2C2A, 'M', u'ⱚ'),
+    (0x2C2B, 'M', u'ⱛ'),
+    (0x2C2C, 'M', u'ⱜ'),
+    (0x2C2D, 'M', u'ⱝ'),
+    (0x2C2E, 'M', u'ⱞ'),
+    (0x2C2F, 'X'),
+    (0x2C30, 'V'),
+    (0x2C5F, 'X'),
+    (0x2C60, 'M', u'ⱡ'),
+    (0x2C61, 'V'),
+    (0x2C62, 'M', u'ɫ'),
+    (0x2C63, 'M', u'ᵽ'),
+    (0x2C64, 'M', u'ɽ'),
+    (0x2C65, 'V'),
+    (0x2C67, 'M', u'ⱨ'),
+    (0x2C68, 'V'),
+    (0x2C69, 'M', u'ⱪ'),
+    (0x2C6A, 'V'),
+    (0x2C6B, 'M', u'ⱬ'),
+    (0x2C6C, 'V'),
+    (0x2C6D, 'M', u'ɑ'),
+    (0x2C6E, 'M', u'ɱ'),
+    (0x2C6F, 'M', u'ɐ'),
+    (0x2C70, 'M', u'ɒ'),
+    ]
+
+def _seg_25():
+    return [
+    (0x2C71, 'V'),
+    (0x2C72, 'M', u'ⱳ'),
+    (0x2C73, 'V'),
+    (0x2C75, 'M', u'ⱶ'),
+    (0x2C76, 'V'),
+    (0x2C7C, 'M', u'j'),
+    (0x2C7D, 'M', u'v'),
+    (0x2C7E, 'M', u'ȿ'),
+    (0x2C7F, 'M', u'ɀ'),
+    (0x2C80, 'M', u'ⲁ'),
+    (0x2C81, 'V'),
+    (0x2C82, 'M', u'ⲃ'),
+    (0x2C83, 'V'),
+    (0x2C84, 'M', u'ⲅ'),
+    (0x2C85, 'V'),
+    (0x2C86, 'M', u'ⲇ'),
+    (0x2C87, 'V'),
+    (0x2C88, 'M', u'ⲉ'),
+    (0x2C89, 'V'),
+    (0x2C8A, 'M', u'ⲋ'),
+    (0x2C8B, 'V'),
+    (0x2C8C, 'M', u'ⲍ'),
+    (0x2C8D, 'V'),
+    (0x2C8E, 'M', u'ⲏ'),
+    (0x2C8F, 'V'),
+    (0x2C90, 'M', u'ⲑ'),
+    (0x2C91, 'V'),
+    (0x2C92, 'M', u'ⲓ'),
+    (0x2C93, 'V'),
+    (0x2C94, 'M', u'ⲕ'),
+    (0x2C95, 'V'),
+    (0x2C96, 'M', u'ⲗ'),
+    (0x2C97, 'V'),
+    (0x2C98, 'M', u'ⲙ'),
+    (0x2C99, 'V'),
+    (0x2C9A, 'M', u'ⲛ'),
+    (0x2C9B, 'V'),
+    (0x2C9C, 'M', u'ⲝ'),
+    (0x2C9D, 'V'),
+    (0x2C9E, 'M', u'ⲟ'),
+    (0x2C9F, 'V'),
+    (0x2CA0, 'M', u'ⲡ'),
+    (0x2CA1, 'V'),
+    (0x2CA2, 'M', u'ⲣ'),
+    (0x2CA3, 'V'),
+    (0x2CA4, 'M', u'ⲥ'),
+    (0x2CA5, 'V'),
+    (0x2CA6, 'M', u'ⲧ'),
+    (0x2CA7, 'V'),
+    (0x2CA8, 'M', u'ⲩ'),
+    (0x2CA9, 'V'),
+    (0x2CAA, 'M', u'ⲫ'),
+    (0x2CAB, 'V'),
+    (0x2CAC, 'M', u'ⲭ'),
+    (0x2CAD, 'V'),
+    (0x2CAE, 'M', u'ⲯ'),
+    (0x2CAF, 'V'),
+    (0x2CB0, 'M', u'ⲱ'),
+    (0x2CB1, 'V'),
+    (0x2CB2, 'M', u'ⲳ'),
+    (0x2CB3, 'V'),
+    (0x2CB4, 'M', u'ⲵ'),
+    (0x2CB5, 'V'),
+    (0x2CB6, 'M', u'ⲷ'),
+    (0x2CB7, 'V'),
+    (0x2CB8, 'M', u'ⲹ'),
+    (0x2CB9, 'V'),
+    (0x2CBA, 'M', u'ⲻ'),
+    (0x2CBB, 'V'),
+    (0x2CBC, 'M', u'ⲽ'),
+    (0x2CBD, 'V'),
+    (0x2CBE, 'M', u'ⲿ'),
+    (0x2CBF, 'V'),
+    (0x2CC0, 'M', u'ⳁ'),
+    (0x2CC1, 'V'),
+    (0x2CC2, 'M', u'ⳃ'),
+    (0x2CC3, 'V'),
+    (0x2CC4, 'M', u'ⳅ'),
+    (0x2CC5, 'V'),
+    (0x2CC6, 'M', u'ⳇ'),
+    (0x2CC7, 'V'),
+    (0x2CC8, 'M', u'ⳉ'),
+    (0x2CC9, 'V'),
+    (0x2CCA, 'M', u'ⳋ'),
+    (0x2CCB, 'V'),
+    (0x2CCC, 'M', u'ⳍ'),
+    (0x2CCD, 'V'),
+    (0x2CCE, 'M', u'ⳏ'),
+    (0x2CCF, 'V'),
+    (0x2CD0, 'M', u'ⳑ'),
+    (0x2CD1, 'V'),
+    (0x2CD2, 'M', u'ⳓ'),
+    (0x2CD3, 'V'),
+    (0x2CD4, 'M', u'ⳕ'),
+    (0x2CD5, 'V'),
+    (0x2CD6, 'M', u'ⳗ'),
+    (0x2CD7, 'V'),
+    (0x2CD8, 'M', u'ⳙ'),
+    (0x2CD9, 'V'),
+    (0x2CDA, 'M', u'ⳛ'),
+    ]
+
+def _seg_26():
+    return [
+    (0x2CDB, 'V'),
+    (0x2CDC, 'M', u'ⳝ'),
+    (0x2CDD, 'V'),
+    (0x2CDE, 'M', u'ⳟ'),
+    (0x2CDF, 'V'),
+    (0x2CE0, 'M', u'ⳡ'),
+    (0x2CE1, 'V'),
+    (0x2CE2, 'M', u'ⳣ'),
+    (0x2CE3, 'V'),
+    (0x2CEB, 'M', u'ⳬ'),
+    (0x2CEC, 'V'),
+    (0x2CED, 'M', u'ⳮ'),
+    (0x2CEE, 'V'),
+    (0x2CF2, 'M', u'ⳳ'),
+    (0x2CF3, 'V'),
+    (0x2CF4, 'X'),
+    (0x2CF9, 'V'),
+    (0x2D26, 'X'),
+    (0x2D27, 'V'),
+    (0x2D28, 'X'),
+    (0x2D2D, 'V'),
+    (0x2D2E, 'X'),
+    (0x2D30, 'V'),
+    (0x2D68, 'X'),
+    (0x2D6F, 'M', u'ⵡ'),
+    (0x2D70, 'V'),
+    (0x2D71, 'X'),
+    (0x2D7F, 'V'),
+    (0x2D97, 'X'),
+    (0x2DA0, 'V'),
+    (0x2DA7, 'X'),
+    (0x2DA8, 'V'),
+    (0x2DAF, 'X'),
+    (0x2DB0, 'V'),
+    (0x2DB7, 'X'),
+    (0x2DB8, 'V'),
+    (0x2DBF, 'X'),
+    (0x2DC0, 'V'),
+    (0x2DC7, 'X'),
+    (0x2DC8, 'V'),
+    (0x2DCF, 'X'),
+    (0x2DD0, 'V'),
+    (0x2DD7, 'X'),
+    (0x2DD8, 'V'),
+    (0x2DDF, 'X'),
+    (0x2DE0, 'V'),
+    (0x2E4F, 'X'),
+    (0x2E80, 'V'),
+    (0x2E9A, 'X'),
+    (0x2E9B, 'V'),
+    (0x2E9F, 'M', u'母'),
+    (0x2EA0, 'V'),
+    (0x2EF3, 'M', u'龟'),
+    (0x2EF4, 'X'),
+    (0x2F00, 'M', u'一'),
+    (0x2F01, 'M', u'丨'),
+    (0x2F02, 'M', u'丶'),
+    (0x2F03, 'M', u'丿'),
+    (0x2F04, 'M', u'乙'),
+    (0x2F05, 'M', u'亅'),
+    (0x2F06, 'M', u'二'),
+    (0x2F07, 'M', u'亠'),
+    (0x2F08, 'M', u'人'),
+    (0x2F09, 'M', u'儿'),
+    (0x2F0A, 'M', u'入'),
+    (0x2F0B, 'M', u'八'),
+    (0x2F0C, 'M', u'冂'),
+    (0x2F0D, 'M', u'冖'),
+    (0x2F0E, 'M', u'冫'),
+    (0x2F0F, 'M', u'几'),
+    (0x2F10, 'M', u'凵'),
+    (0x2F11, 'M', u'刀'),
+    (0x2F12, 'M', u'力'),
+    (0x2F13, 'M', u'勹'),
+    (0x2F14, 'M', u'匕'),
+    (0x2F15, 'M', u'匚'),
+    (0x2F16, 'M', u'匸'),
+    (0x2F17, 'M', u'十'),
+    (0x2F18, 'M', u'卜'),
+    (0x2F19, 'M', u'卩'),
+    (0x2F1A, 'M', u'厂'),
+    (0x2F1B, 'M', u'厶'),
+    (0x2F1C, 'M', u'又'),
+    (0x2F1D, 'M', u'口'),
+    (0x2F1E, 'M', u'囗'),
+    (0x2F1F, 'M', u'土'),
+    (0x2F20, 'M', u'士'),
+    (0x2F21, 'M', u'夂'),
+    (0x2F22, 'M', u'夊'),
+    (0x2F23, 'M', u'夕'),
+    (0x2F24, 'M', u'大'),
+    (0x2F25, 'M', u'女'),
+    (0x2F26, 'M', u'子'),
+    (0x2F27, 'M', u'宀'),
+    (0x2F28, 'M', u'寸'),
+    (0x2F29, 'M', u'小'),
+    (0x2F2A, 'M', u'尢'),
+    (0x2F2B, 'M', u'尸'),
+    (0x2F2C, 'M', u'屮'),
+    (0x2F2D, 'M', u'山'),
+    ]
+
+def _seg_27():
+    return [
+    (0x2F2E, 'M', u'巛'),
+    (0x2F2F, 'M', u'工'),
+    (0x2F30, 'M', u'己'),
+    (0x2F31, 'M', u'巾'),
+    (0x2F32, 'M', u'干'),
+    (0x2F33, 'M', u'幺'),
+    (0x2F34, 'M', u'广'),
+    (0x2F35, 'M', u'廴'),
+    (0x2F36, 'M', u'廾'),
+    (0x2F37, 'M', u'弋'),
+    (0x2F38, 'M', u'弓'),
+    (0x2F39, 'M', u'彐'),
+    (0x2F3A, 'M', u'彡'),
+    (0x2F3B, 'M', u'彳'),
+    (0x2F3C, 'M', u'心'),
+    (0x2F3D, 'M', u'戈'),
+    (0x2F3E, 'M', u'戶'),
+    (0x2F3F, 'M', u'手'),
+    (0x2F40, 'M', u'支'),
+    (0x2F41, 'M', u'攴'),
+    (0x2F42, 'M', u'文'),
+    (0x2F43, 'M', u'斗'),
+    (0x2F44, 'M', u'斤'),
+    (0x2F45, 'M', u'方'),
+    (0x2F46, 'M', u'无'),
+    (0x2F47, 'M', u'日'),
+    (0x2F48, 'M', u'曰'),
+    (0x2F49, 'M', u'月'),
+    (0x2F4A, 'M', u'木'),
+    (0x2F4B, 'M', u'欠'),
+    (0x2F4C, 'M', u'止'),
+    (0x2F4D, 'M', u'歹'),
+    (0x2F4E, 'M', u'殳'),
+    (0x2F4F, 'M', u'毋'),
+    (0x2F50, 'M', u'比'),
+    (0x2F51, 'M', u'毛'),
+    (0x2F52, 'M', u'氏'),
+    (0x2F53, 'M', u'气'),
+    (0x2F54, 'M', u'水'),
+    (0x2F55, 'M', u'火'),
+    (0x2F56, 'M', u'爪'),
+    (0x2F57, 'M', u'父'),
+    (0x2F58, 'M', u'爻'),
+    (0x2F59, 'M', u'爿'),
+    (0x2F5A, 'M', u'片'),
+    (0x2F5B, 'M', u'牙'),
+    (0x2F5C, 'M', u'牛'),
+    (0x2F5D, 'M', u'犬'),
+    (0x2F5E, 'M', u'玄'),
+    (0x2F5F, 'M', u'玉'),
+    (0x2F60, 'M', u'瓜'),
+    (0x2F61, 'M', u'瓦'),
+    (0x2F62, 'M', u'甘'),
+    (0x2F63, 'M', u'生'),
+    (0x2F64, 'M', u'用'),
+    (0x2F65, 'M', u'田'),
+    (0x2F66, 'M', u'疋'),
+    (0x2F67, 'M', u'疒'),
+    (0x2F68, 'M', u'癶'),
+    (0x2F69, 'M', u'白'),
+    (0x2F6A, 'M', u'皮'),
+    (0x2F6B, 'M', u'皿'),
+    (0x2F6C, 'M', u'目'),
+    (0x2F6D, 'M', u'矛'),
+    (0x2F6E, 'M', u'矢'),
+    (0x2F6F, 'M', u'石'),
+    (0x2F70, 'M', u'示'),
+    (0x2F71, 'M', u'禸'),
+    (0x2F72, 'M', u'禾'),
+    (0x2F73, 'M', u'穴'),
+    (0x2F74, 'M', u'立'),
+    (0x2F75, 'M', u'竹'),
+    (0x2F76, 'M', u'米'),
+    (0x2F77, 'M', u'糸'),
+    (0x2F78, 'M', u'缶'),
+    (0x2F79, 'M', u'网'),
+    (0x2F7A, 'M', u'羊'),
+    (0x2F7B, 'M', u'羽'),
+    (0x2F7C, 'M', u'老'),
+    (0x2F7D, 'M', u'而'),
+    (0x2F7E, 'M', u'耒'),
+    (0x2F7F, 'M', u'耳'),
+    (0x2F80, 'M', u'聿'),
+    (0x2F81, 'M', u'肉'),
+    (0x2F82, 'M', u'臣'),
+    (0x2F83, 'M', u'自'),
+    (0x2F84, 'M', u'至'),
+    (0x2F85, 'M', u'臼'),
+    (0x2F86, 'M', u'舌'),
+    (0x2F87, 'M', u'舛'),
+    (0x2F88, 'M', u'舟'),
+    (0x2F89, 'M', u'艮'),
+    (0x2F8A, 'M', u'色'),
+    (0x2F8B, 'M', u'艸'),
+    (0x2F8C, 'M', u'虍'),
+    (0x2F8D, 'M', u'虫'),
+    (0x2F8E, 'M', u'血'),
+    (0x2F8F, 'M', u'行'),
+    (0x2F90, 'M', u'衣'),
+    (0x2F91, 'M', u'襾'),
+    ]
+
+def _seg_28():
+    return [
+    (0x2F92, 'M', u'見'),
+    (0x2F93, 'M', u'角'),
+    (0x2F94, 'M', u'言'),
+    (0x2F95, 'M', u'谷'),
+    (0x2F96, 'M', u'豆'),
+    (0x2F97, 'M', u'豕'),
+    (0x2F98, 'M', u'豸'),
+    (0x2F99, 'M', u'貝'),
+    (0x2F9A, 'M', u'赤'),
+    (0x2F9B, 'M', u'走'),
+    (0x2F9C, 'M', u'足'),
+    (0x2F9D, 'M', u'身'),
+    (0x2F9E, 'M', u'車'),
+    (0x2F9F, 'M', u'辛'),
+    (0x2FA0, 'M', u'辰'),
+    (0x2FA1, 'M', u'辵'),
+    (0x2FA2, 'M', u'邑'),
+    (0x2FA3, 'M', u'酉'),
+    (0x2FA4, 'M', u'釆'),
+    (0x2FA5, 'M', u'里'),
+    (0x2FA6, 'M', u'金'),
+    (0x2FA7, 'M', u'長'),
+    (0x2FA8, 'M', u'門'),
+    (0x2FA9, 'M', u'阜'),
+    (0x2FAA, 'M', u'隶'),
+    (0x2FAB, 'M', u'隹'),
+    (0x2FAC, 'M', u'雨'),
+    (0x2FAD, 'M', u'靑'),
+    (0x2FAE, 'M', u'非'),
+    (0x2FAF, 'M', u'面'),
+    (0x2FB0, 'M', u'革'),
+    (0x2FB1, 'M', u'韋'),
+    (0x2FB2, 'M', u'韭'),
+    (0x2FB3, 'M', u'音'),
+    (0x2FB4, 'M', u'頁'),
+    (0x2FB5, 'M', u'風'),
+    (0x2FB6, 'M', u'飛'),
+    (0x2FB7, 'M', u'食'),
+    (0x2FB8, 'M', u'首'),
+    (0x2FB9, 'M', u'香'),
+    (0x2FBA, 'M', u'馬'),
+    (0x2FBB, 'M', u'骨'),
+    (0x2FBC, 'M', u'高'),
+    (0x2FBD, 'M', u'髟'),
+    (0x2FBE, 'M', u'鬥'),
+    (0x2FBF, 'M', u'鬯'),
+    (0x2FC0, 'M', u'鬲'),
+    (0x2FC1, 'M', u'鬼'),
+    (0x2FC2, 'M', u'魚'),
+    (0x2FC3, 'M', u'鳥'),
+    (0x2FC4, 'M', u'鹵'),
+    (0x2FC5, 'M', u'鹿'),
+    (0x2FC6, 'M', u'麥'),
+    (0x2FC7, 'M', u'麻'),
+    (0x2FC8, 'M', u'黃'),
+    (0x2FC9, 'M', u'黍'),
+    (0x2FCA, 'M', u'黑'),
+    (0x2FCB, 'M', u'黹'),
+    (0x2FCC, 'M', u'黽'),
+    (0x2FCD, 'M', u'鼎'),
+    (0x2FCE, 'M', u'鼓'),
+    (0x2FCF, 'M', u'鼠'),
+    (0x2FD0, 'M', u'鼻'),
+    (0x2FD1, 'M', u'齊'),
+    (0x2FD2, 'M', u'齒'),
+    (0x2FD3, 'M', u'龍'),
+    (0x2FD4, 'M', u'龜'),
+    (0x2FD5, 'M', u'龠'),
+    (0x2FD6, 'X'),
+    (0x3000, '3', u' '),
+    (0x3001, 'V'),
+    (0x3002, 'M', u'.'),
+    (0x3003, 'V'),
+    (0x3036, 'M', u'〒'),
+    (0x3037, 'V'),
+    (0x3038, 'M', u'十'),
+    (0x3039, 'M', u'卄'),
+    (0x303A, 'M', u'卅'),
+    (0x303B, 'V'),
+    (0x3040, 'X'),
+    (0x3041, 'V'),
+    (0x3097, 'X'),
+    (0x3099, 'V'),
+    (0x309B, '3', u' ゙'),
+    (0x309C, '3', u' ゚'),
+    (0x309D, 'V'),
+    (0x309F, 'M', u'より'),
+    (0x30A0, 'V'),
+    (0x30FF, 'M', u'コト'),
+    (0x3100, 'X'),
+    (0x3105, 'V'),
+    (0x3130, 'X'),
+    (0x3131, 'M', u'ᄀ'),
+    (0x3132, 'M', u'ᄁ'),
+    (0x3133, 'M', u'ᆪ'),
+    (0x3134, 'M', u'ᄂ'),
+    (0x3135, 'M', u'ᆬ'),
+    (0x3136, 'M', u'ᆭ'),
+    (0x3137, 'M', u'ᄃ'),
+    (0x3138, 'M', u'ᄄ'),
+    ]
+
+def _seg_29():
+    return [
+    (0x3139, 'M', u'ᄅ'),
+    (0x313A, 'M', u'ᆰ'),
+    (0x313B, 'M', u'ᆱ'),
+    (0x313C, 'M', u'ᆲ'),
+    (0x313D, 'M', u'ᆳ'),
+    (0x313E, 'M', u'ᆴ'),
+    (0x313F, 'M', u'ᆵ'),
+    (0x3140, 'M', u'ᄚ'),
+    (0x3141, 'M', u'ᄆ'),
+    (0x3142, 'M', u'ᄇ'),
+    (0x3143, 'M', u'ᄈ'),
+    (0x3144, 'M', u'ᄡ'),
+    (0x3145, 'M', u'ᄉ'),
+    (0x3146, 'M', u'ᄊ'),
+    (0x3147, 'M', u'ᄋ'),
+    (0x3148, 'M', u'ᄌ'),
+    (0x3149, 'M', u'ᄍ'),
+    (0x314A, 'M', u'ᄎ'),
+    (0x314B, 'M', u'ᄏ'),
+    (0x314C, 'M', u'ᄐ'),
+    (0x314D, 'M', u'ᄑ'),
+    (0x314E, 'M', u'ᄒ'),
+    (0x314F, 'M', u'ᅡ'),
+    (0x3150, 'M', u'ᅢ'),
+    (0x3151, 'M', u'ᅣ'),
+    (0x3152, 'M', u'ᅤ'),
+    (0x3153, 'M', u'ᅥ'),
+    (0x3154, 'M', u'ᅦ'),
+    (0x3155, 'M', u'ᅧ'),
+    (0x3156, 'M', u'ᅨ'),
+    (0x3157, 'M', u'ᅩ'),
+    (0x3158, 'M', u'ᅪ'),
+    (0x3159, 'M', u'ᅫ'),
+    (0x315A, 'M', u'ᅬ'),
+    (0x315B, 'M', u'ᅭ'),
+    (0x315C, 'M', u'ᅮ'),
+    (0x315D, 'M', u'ᅯ'),
+    (0x315E, 'M', u'ᅰ'),
+    (0x315F, 'M', u'ᅱ'),
+    (0x3160, 'M', u'ᅲ'),
+    (0x3161, 'M', u'ᅳ'),
+    (0x3162, 'M', u'ᅴ'),
+    (0x3163, 'M', u'ᅵ'),
+    (0x3164, 'X'),
+    (0x3165, 'M', u'ᄔ'),
+    (0x3166, 'M', u'ᄕ'),
+    (0x3167, 'M', u'ᇇ'),
+    (0x3168, 'M', u'ᇈ'),
+    (0x3169, 'M', u'ᇌ'),
+    (0x316A, 'M', u'ᇎ'),
+    (0x316B, 'M', u'ᇓ'),
+    (0x316C, 'M', u'ᇗ'),
+    (0x316D, 'M', u'ᇙ'),
+    (0x316E, 'M', u'ᄜ'),
+    (0x316F, 'M', u'ᇝ'),
+    (0x3170, 'M', u'ᇟ'),
+    (0x3171, 'M', u'ᄝ'),
+    (0x3172, 'M', u'ᄞ'),
+    (0x3173, 'M', u'ᄠ'),
+    (0x3174, 'M', u'ᄢ'),
+    (0x3175, 'M', u'ᄣ'),
+    (0x3176, 'M', u'ᄧ'),
+    (0x3177, 'M', u'ᄩ'),
+    (0x3178, 'M', u'ᄫ'),
+    (0x3179, 'M', u'ᄬ'),
+    (0x317A, 'M', u'ᄭ'),
+    (0x317B, 'M', u'ᄮ'),
+    (0x317C, 'M', u'ᄯ'),
+    (0x317D, 'M', u'ᄲ'),
+    (0x317E, 'M', u'ᄶ'),
+    (0x317F, 'M', u'ᅀ'),
+    (0x3180, 'M', u'ᅇ'),
+    (0x3181, 'M', u'ᅌ'),
+    (0x3182, 'M', u'ᇱ'),
+    (0x3183, 'M', u'ᇲ'),
+    (0x3184, 'M', u'ᅗ'),
+    (0x3185, 'M', u'ᅘ'),
+    (0x3186, 'M', u'ᅙ'),
+    (0x3187, 'M', u'ᆄ'),
+    (0x3188, 'M', u'ᆅ'),
+    (0x3189, 'M', u'ᆈ'),
+    (0x318A, 'M', u'ᆑ'),
+    (0x318B, 'M', u'ᆒ'),
+    (0x318C, 'M', u'ᆔ'),
+    (0x318D, 'M', u'ᆞ'),
+    (0x318E, 'M', u'ᆡ'),
+    (0x318F, 'X'),
+    (0x3190, 'V'),
+    (0x3192, 'M', u'一'),
+    (0x3193, 'M', u'二'),
+    (0x3194, 'M', u'三'),
+    (0x3195, 'M', u'四'),
+    (0x3196, 'M', u'上'),
+    (0x3197, 'M', u'中'),
+    (0x3198, 'M', u'下'),
+    (0x3199, 'M', u'甲'),
+    (0x319A, 'M', u'乙'),
+    (0x319B, 'M', u'丙'),
+    (0x319C, 'M', u'丁'),
+    (0x319D, 'M', u'天'),
+    ]
+
+def _seg_30():
+    return [
+    (0x319E, 'M', u'地'),
+    (0x319F, 'M', u'人'),
+    (0x31A0, 'V'),
+    (0x31BB, 'X'),
+    (0x31C0, 'V'),
+    (0x31E4, 'X'),
+    (0x31F0, 'V'),
+    (0x3200, '3', u'(ᄀ)'),
+    (0x3201, '3', u'(ᄂ)'),
+    (0x3202, '3', u'(ᄃ)'),
+    (0x3203, '3', u'(ᄅ)'),
+    (0x3204, '3', u'(ᄆ)'),
+    (0x3205, '3', u'(ᄇ)'),
+    (0x3206, '3', u'(ᄉ)'),
+    (0x3207, '3', u'(ᄋ)'),
+    (0x3208, '3', u'(ᄌ)'),
+    (0x3209, '3', u'(ᄎ)'),
+    (0x320A, '3', u'(ᄏ)'),
+    (0x320B, '3', u'(ᄐ)'),
+    (0x320C, '3', u'(ᄑ)'),
+    (0x320D, '3', u'(ᄒ)'),
+    (0x320E, '3', u'(가)'),
+    (0x320F, '3', u'(나)'),
+    (0x3210, '3', u'(다)'),
+    (0x3211, '3', u'(라)'),
+    (0x3212, '3', u'(마)'),
+    (0x3213, '3', u'(바)'),
+    (0x3214, '3', u'(사)'),
+    (0x3215, '3', u'(아)'),
+    (0x3216, '3', u'(자)'),
+    (0x3217, '3', u'(차)'),
+    (0x3218, '3', u'(카)'),
+    (0x3219, '3', u'(타)'),
+    (0x321A, '3', u'(파)'),
+    (0x321B, '3', u'(하)'),
+    (0x321C, '3', u'(주)'),
+    (0x321D, '3', u'(오전)'),
+    (0x321E, '3', u'(오후)'),
+    (0x321F, 'X'),
+    (0x3220, '3', u'(一)'),
+    (0x3221, '3', u'(二)'),
+    (0x3222, '3', u'(三)'),
+    (0x3223, '3', u'(四)'),
+    (0x3224, '3', u'(五)'),
+    (0x3225, '3', u'(六)'),
+    (0x3226, '3', u'(七)'),
+    (0x3227, '3', u'(八)'),
+    (0x3228, '3', u'(九)'),
+    (0x3229, '3', u'(十)'),
+    (0x322A, '3', u'(月)'),
+    (0x322B, '3', u'(火)'),
+    (0x322C, '3', u'(水)'),
+    (0x322D, '3', u'(木)'),
+    (0x322E, '3', u'(金)'),
+    (0x322F, '3', u'(土)'),
+    (0x3230, '3', u'(日)'),
+    (0x3231, '3', u'(株)'),
+    (0x3232, '3', u'(有)'),
+    (0x3233, '3', u'(社)'),
+    (0x3234, '3', u'(名)'),
+    (0x3235, '3', u'(特)'),
+    (0x3236, '3', u'(財)'),
+    (0x3237, '3', u'(祝)'),
+    (0x3238, '3', u'(労)'),
+    (0x3239, '3', u'(代)'),
+    (0x323A, '3', u'(呼)'),
+    (0x323B, '3', u'(学)'),
+    (0x323C, '3', u'(監)'),
+    (0x323D, '3', u'(企)'),
+    (0x323E, '3', u'(資)'),
+    (0x323F, '3', u'(協)'),
+    (0x3240, '3', u'(祭)'),
+    (0x3241, '3', u'(休)'),
+    (0x3242, '3', u'(自)'),
+    (0x3243, '3', u'(至)'),
+    (0x3244, 'M', u'問'),
+    (0x3245, 'M', u'幼'),
+    (0x3246, 'M', u'文'),
+    (0x3247, 'M', u'箏'),
+    (0x3248, 'V'),
+    (0x3250, 'M', u'pte'),
+    (0x3251, 'M', u'21'),
+    (0x3252, 'M', u'22'),
+    (0x3253, 'M', u'23'),
+    (0x3254, 'M', u'24'),
+    (0x3255, 'M', u'25'),
+    (0x3256, 'M', u'26'),
+    (0x3257, 'M', u'27'),
+    (0x3258, 'M', u'28'),
+    (0x3259, 'M', u'29'),
+    (0x325A, 'M', u'30'),
+    (0x325B, 'M', u'31'),
+    (0x325C, 'M', u'32'),
+    (0x325D, 'M', u'33'),
+    (0x325E, 'M', u'34'),
+    (0x325F, 'M', u'35'),
+    (0x3260, 'M', u'ᄀ'),
+    (0x3261, 'M', u'ᄂ'),
+    (0x3262, 'M', u'ᄃ'),
+    (0x3263, 'M', u'ᄅ'),
+    ]
+
+def _seg_31():
+    return [
+    (0x3264, 'M', u'ᄆ'),
+    (0x3265, 'M', u'ᄇ'),
+    (0x3266, 'M', u'ᄉ'),
+    (0x3267, 'M', u'ᄋ'),
+    (0x3268, 'M', u'ᄌ'),
+    (0x3269, 'M', u'ᄎ'),
+    (0x326A, 'M', u'ᄏ'),
+    (0x326B, 'M', u'ᄐ'),
+    (0x326C, 'M', u'ᄑ'),
+    (0x326D, 'M', u'ᄒ'),
+    (0x326E, 'M', u'가'),
+    (0x326F, 'M', u'나'),
+    (0x3270, 'M', u'다'),
+    (0x3271, 'M', u'라'),
+    (0x3272, 'M', u'마'),
+    (0x3273, 'M', u'바'),
+    (0x3274, 'M', u'사'),
+    (0x3275, 'M', u'아'),
+    (0x3276, 'M', u'자'),
+    (0x3277, 'M', u'차'),
+    (0x3278, 'M', u'카'),
+    (0x3279, 'M', u'타'),
+    (0x327A, 'M', u'파'),
+    (0x327B, 'M', u'하'),
+    (0x327C, 'M', u'참고'),
+    (0x327D, 'M', u'주의'),
+    (0x327E, 'M', u'우'),
+    (0x327F, 'V'),
+    (0x3280, 'M', u'一'),
+    (0x3281, 'M', u'二'),
+    (0x3282, 'M', u'三'),
+    (0x3283, 'M', u'四'),
+    (0x3284, 'M', u'五'),
+    (0x3285, 'M', u'六'),
+    (0x3286, 'M', u'七'),
+    (0x3287, 'M', u'八'),
+    (0x3288, 'M', u'九'),
+    (0x3289, 'M', u'十'),
+    (0x328A, 'M', u'月'),
+    (0x328B, 'M', u'火'),
+    (0x328C, 'M', u'水'),
+    (0x328D, 'M', u'木'),
+    (0x328E, 'M', u'金'),
+    (0x328F, 'M', u'土'),
+    (0x3290, 'M', u'日'),
+    (0x3291, 'M', u'株'),
+    (0x3292, 'M', u'有'),
+    (0x3293, 'M', u'社'),
+    (0x3294, 'M', u'名'),
+    (0x3295, 'M', u'特'),
+    (0x3296, 'M', u'財'),
+    (0x3297, 'M', u'祝'),
+    (0x3298, 'M', u'労'),
+    (0x3299, 'M', u'秘'),
+    (0x329A, 'M', u'男'),
+    (0x329B, 'M', u'女'),
+    (0x329C, 'M', u'適'),
+    (0x329D, 'M', u'優'),
+    (0x329E, 'M', u'印'),
+    (0x329F, 'M', u'注'),
+    (0x32A0, 'M', u'項'),
+    (0x32A1, 'M', u'休'),
+    (0x32A2, 'M', u'写'),
+    (0x32A3, 'M', u'正'),
+    (0x32A4, 'M', u'上'),
+    (0x32A5, 'M', u'中'),
+    (0x32A6, 'M', u'下'),
+    (0x32A7, 'M', u'左'),
+    (0x32A8, 'M', u'右'),
+    (0x32A9, 'M', u'医'),
+    (0x32AA, 'M', u'宗'),
+    (0x32AB, 'M', u'学'),
+    (0x32AC, 'M', u'監'),
+    (0x32AD, 'M', u'企'),
+    (0x32AE, 'M', u'資'),
+    (0x32AF, 'M', u'協'),
+    (0x32B0, 'M', u'夜'),
+    (0x32B1, 'M', u'36'),
+    (0x32B2, 'M', u'37'),
+    (0x32B3, 'M', u'38'),
+    (0x32B4, 'M', u'39'),
+    (0x32B5, 'M', u'40'),
+    (0x32B6, 'M', u'41'),
+    (0x32B7, 'M', u'42'),
+    (0x32B8, 'M', u'43'),
+    (0x32B9, 'M', u'44'),
+    (0x32BA, 'M', u'45'),
+    (0x32BB, 'M', u'46'),
+    (0x32BC, 'M', u'47'),
+    (0x32BD, 'M', u'48'),
+    (0x32BE, 'M', u'49'),
+    (0x32BF, 'M', u'50'),
+    (0x32C0, 'M', u'1月'),
+    (0x32C1, 'M', u'2月'),
+    (0x32C2, 'M', u'3月'),
+    (0x32C3, 'M', u'4月'),
+    (0x32C4, 'M', u'5月'),
+    (0x32C5, 'M', u'6月'),
+    (0x32C6, 'M', u'7月'),
+    (0x32C7, 'M', u'8月'),
+    ]
+
+def _seg_32():
+    return [
+    (0x32C8, 'M', u'9月'),
+    (0x32C9, 'M', u'10月'),
+    (0x32CA, 'M', u'11月'),
+    (0x32CB, 'M', u'12月'),
+    (0x32CC, 'M', u'hg'),
+    (0x32CD, 'M', u'erg'),
+    (0x32CE, 'M', u'ev'),
+    (0x32CF, 'M', u'ltd'),
+    (0x32D0, 'M', u'ア'),
+    (0x32D1, 'M', u'イ'),
+    (0x32D2, 'M', u'ウ'),
+    (0x32D3, 'M', u'エ'),
+    (0x32D4, 'M', u'オ'),
+    (0x32D5, 'M', u'カ'),
+    (0x32D6, 'M', u'キ'),
+    (0x32D7, 'M', u'ク'),
+    (0x32D8, 'M', u'ケ'),
+    (0x32D9, 'M', u'コ'),
+    (0x32DA, 'M', u'サ'),
+    (0x32DB, 'M', u'シ'),
+    (0x32DC, 'M', u'ス'),
+    (0x32DD, 'M', u'セ'),
+    (0x32DE, 'M', u'ソ'),
+    (0x32DF, 'M', u'タ'),
+    (0x32E0, 'M', u'チ'),
+    (0x32E1, 'M', u'ツ'),
+    (0x32E2, 'M', u'テ'),
+    (0x32E3, 'M', u'ト'),
+    (0x32E4, 'M', u'ナ'),
+    (0x32E5, 'M', u'ニ'),
+    (0x32E6, 'M', u'ヌ'),
+    (0x32E7, 'M', u'ネ'),
+    (0x32E8, 'M', u'ノ'),
+    (0x32E9, 'M', u'ハ'),
+    (0x32EA, 'M', u'ヒ'),
+    (0x32EB, 'M', u'フ'),
+    (0x32EC, 'M', u'ヘ'),
+    (0x32ED, 'M', u'ホ'),
+    (0x32EE, 'M', u'マ'),
+    (0x32EF, 'M', u'ミ'),
+    (0x32F0, 'M', u'ム'),
+    (0x32F1, 'M', u'メ'),
+    (0x32F2, 'M', u'モ'),
+    (0x32F3, 'M', u'ヤ'),
+    (0x32F4, 'M', u'ユ'),
+    (0x32F5, 'M', u'ヨ'),
+    (0x32F6, 'M', u'ラ'),
+    (0x32F7, 'M', u'リ'),
+    (0x32F8, 'M', u'ル'),
+    (0x32F9, 'M', u'レ'),
+    (0x32FA, 'M', u'ロ'),
+    (0x32FB, 'M', u'ワ'),
+    (0x32FC, 'M', u'ヰ'),
+    (0x32FD, 'M', u'ヱ'),
+    (0x32FE, 'M', u'ヲ'),
+    (0x32FF, 'X'),
+    (0x3300, 'M', u'アパート'),
+    (0x3301, 'M', u'アルファ'),
+    (0x3302, 'M', u'アンペア'),
+    (0x3303, 'M', u'アール'),
+    (0x3304, 'M', u'イニング'),
+    (0x3305, 'M', u'インチ'),
+    (0x3306, 'M', u'ウォン'),
+    (0x3307, 'M', u'エスクード'),
+    (0x3308, 'M', u'エーカー'),
+    (0x3309, 'M', u'オンス'),
+    (0x330A, 'M', u'オーム'),
+    (0x330B, 'M', u'カイリ'),
+    (0x330C, 'M', u'カラット'),
+    (0x330D, 'M', u'カロリー'),
+    (0x330E, 'M', u'ガロン'),
+    (0x330F, 'M', u'ガンマ'),
+    (0x3310, 'M', u'ギガ'),
+    (0x3311, 'M', u'ギニー'),
+    (0x3312, 'M', u'キュリー'),
+    (0x3313, 'M', u'ギルダー'),
+    (0x3314, 'M', u'キロ'),
+    (0x3315, 'M', u'キログラム'),
+    (0x3316, 'M', u'キロメートル'),
+    (0x3317, 'M', u'キロワット'),
+    (0x3318, 'M', u'グラム'),
+    (0x3319, 'M', u'グラムトン'),
+    (0x331A, 'M', u'クルゼイロ'),
+    (0x331B, 'M', u'クローネ'),
+    (0x331C, 'M', u'ケース'),
+    (0x331D, 'M', u'コルナ'),
+    (0x331E, 'M', u'コーポ'),
+    (0x331F, 'M', u'サイクル'),
+    (0x3320, 'M', u'サンチーム'),
+    (0x3321, 'M', u'シリング'),
+    (0x3322, 'M', u'センチ'),
+    (0x3323, 'M', u'セント'),
+    (0x3324, 'M', u'ダース'),
+    (0x3325, 'M', u'デシ'),
+    (0x3326, 'M', u'ドル'),
+    (0x3327, 'M', u'トン'),
+    (0x3328, 'M', u'ナノ'),
+    (0x3329, 'M', u'ノット'),
+    (0x332A, 'M', u'ハイツ'),
+    (0x332B, 'M', u'パーセント'),
+    ]
+
+def _seg_33():
+    return [
+    (0x332C, 'M', u'パーツ'),
+    (0x332D, 'M', u'バーレル'),
+    (0x332E, 'M', u'ピアストル'),
+    (0x332F, 'M', u'ピクル'),
+    (0x3330, 'M', u'ピコ'),
+    (0x3331, 'M', u'ビル'),
+    (0x3332, 'M', u'ファラッド'),
+    (0x3333, 'M', u'フィート'),
+    (0x3334, 'M', u'ブッシェル'),
+    (0x3335, 'M', u'フラン'),
+    (0x3336, 'M', u'ヘクタール'),
+    (0x3337, 'M', u'ペソ'),
+    (0x3338, 'M', u'ペニヒ'),
+    (0x3339, 'M', u'ヘルツ'),
+    (0x333A, 'M', u'ペンス'),
+    (0x333B, 'M', u'ページ'),
+    (0x333C, 'M', u'ベータ'),
+    (0x333D, 'M', u'ポイント'),
+    (0x333E, 'M', u'ボルト'),
+    (0x333F, 'M', u'ホン'),
+    (0x3340, 'M', u'ポンド'),
+    (0x3341, 'M', u'ホール'),
+    (0x3342, 'M', u'ホーン'),
+    (0x3343, 'M', u'マイクロ'),
+    (0x3344, 'M', u'マイル'),
+    (0x3345, 'M', u'マッハ'),
+    (0x3346, 'M', u'マルク'),
+    (0x3347, 'M', u'マンション'),
+    (0x3348, 'M', u'ミクロン'),
+    (0x3349, 'M', u'ミリ'),
+    (0x334A, 'M', u'ミリバール'),
+    (0x334B, 'M', u'メガ'),
+    (0x334C, 'M', u'メガトン'),
+    (0x334D, 'M', u'メートル'),
+    (0x334E, 'M', u'ヤード'),
+    (0x334F, 'M', u'ヤール'),
+    (0x3350, 'M', u'ユアン'),
+    (0x3351, 'M', u'リットル'),
+    (0x3352, 'M', u'リラ'),
+    (0x3353, 'M', u'ルピー'),
+    (0x3354, 'M', u'ルーブル'),
+    (0x3355, 'M', u'レム'),
+    (0x3356, 'M', u'レントゲン'),
+    (0x3357, 'M', u'ワット'),
+    (0x3358, 'M', u'0点'),
+    (0x3359, 'M', u'1点'),
+    (0x335A, 'M', u'2点'),
+    (0x335B, 'M', u'3点'),
+    (0x335C, 'M', u'4点'),
+    (0x335D, 'M', u'5点'),
+    (0x335E, 'M', u'6点'),
+    (0x335F, 'M', u'7点'),
+    (0x3360, 'M', u'8点'),
+    (0x3361, 'M', u'9点'),
+    (0x3362, 'M', u'10点'),
+    (0x3363, 'M', u'11点'),
+    (0x3364, 'M', u'12点'),
+    (0x3365, 'M', u'13点'),
+    (0x3366, 'M', u'14点'),
+    (0x3367, 'M', u'15点'),
+    (0x3368, 'M', u'16点'),
+    (0x3369, 'M', u'17点'),
+    (0x336A, 'M', u'18点'),
+    (0x336B, 'M', u'19点'),
+    (0x336C, 'M', u'20点'),
+    (0x336D, 'M', u'21点'),
+    (0x336E, 'M', u'22点'),
+    (0x336F, 'M', u'23点'),
+    (0x3370, 'M', u'24点'),
+    (0x3371, 'M', u'hpa'),
+    (0x3372, 'M', u'da'),
+    (0x3373, 'M', u'au'),
+    (0x3374, 'M', u'bar'),
+    (0x3375, 'M', u'ov'),
+    (0x3376, 'M', u'pc'),
+    (0x3377, 'M', u'dm'),
+    (0x3378, 'M', u'dm2'),
+    (0x3379, 'M', u'dm3'),
+    (0x337A, 'M', u'iu'),
+    (0x337B, 'M', u'平成'),
+    (0x337C, 'M', u'昭和'),
+    (0x337D, 'M', u'大正'),
+    (0x337E, 'M', u'明治'),
+    (0x337F, 'M', u'株式会社'),
+    (0x3380, 'M', u'pa'),
+    (0x3381, 'M', u'na'),
+    (0x3382, 'M', u'μa'),
+    (0x3383, 'M', u'ma'),
+    (0x3384, 'M', u'ka'),
+    (0x3385, 'M', u'kb'),
+    (0x3386, 'M', u'mb'),
+    (0x3387, 'M', u'gb'),
+    (0x3388, 'M', u'cal'),
+    (0x3389, 'M', u'kcal'),
+    (0x338A, 'M', u'pf'),
+    (0x338B, 'M', u'nf'),
+    (0x338C, 'M', u'μf'),
+    (0x338D, 'M', u'μg'),
+    (0x338E, 'M', u'mg'),
+    (0x338F, 'M', u'kg'),
+    ]
+
+def _seg_34():
+    return [
+    (0x3390, 'M', u'hz'),
+    (0x3391, 'M', u'khz'),
+    (0x3392, 'M', u'mhz'),
+    (0x3393, 'M', u'ghz'),
+    (0x3394, 'M', u'thz'),
+    (0x3395, 'M', u'μl'),
+    (0x3396, 'M', u'ml'),
+    (0x3397, 'M', u'dl'),
+    (0x3398, 'M', u'kl'),
+    (0x3399, 'M', u'fm'),
+    (0x339A, 'M', u'nm'),
+    (0x339B, 'M', u'μm'),
+    (0x339C, 'M', u'mm'),
+    (0x339D, 'M', u'cm'),
+    (0x339E, 'M', u'km'),
+    (0x339F, 'M', u'mm2'),
+    (0x33A0, 'M', u'cm2'),
+    (0x33A1, 'M', u'm2'),
+    (0x33A2, 'M', u'km2'),
+    (0x33A3, 'M', u'mm3'),
+    (0x33A4, 'M', u'cm3'),
+    (0x33A5, 'M', u'm3'),
+    (0x33A6, 'M', u'km3'),
+    (0x33A7, 'M', u'm∕s'),
+    (0x33A8, 'M', u'm∕s2'),
+    (0x33A9, 'M', u'pa'),
+    (0x33AA, 'M', u'kpa'),
+    (0x33AB, 'M', u'mpa'),
+    (0x33AC, 'M', u'gpa'),
+    (0x33AD, 'M', u'rad'),
+    (0x33AE, 'M', u'rad∕s'),
+    (0x33AF, 'M', u'rad∕s2'),
+    (0x33B0, 'M', u'ps'),
+    (0x33B1, 'M', u'ns'),
+    (0x33B2, 'M', u'μs'),
+    (0x33B3, 'M', u'ms'),
+    (0x33B4, 'M', u'pv'),
+    (0x33B5, 'M', u'nv'),
+    (0x33B6, 'M', u'μv'),
+    (0x33B7, 'M', u'mv'),
+    (0x33B8, 'M', u'kv'),
+    (0x33B9, 'M', u'mv'),
+    (0x33BA, 'M', u'pw'),
+    (0x33BB, 'M', u'nw'),
+    (0x33BC, 'M', u'μw'),
+    (0x33BD, 'M', u'mw'),
+    (0x33BE, 'M', u'kw'),
+    (0x33BF, 'M', u'mw'),
+    (0x33C0, 'M', u'kω'),
+    (0x33C1, 'M', u'mω'),
+    (0x33C2, 'X'),
+    (0x33C3, 'M', u'bq'),
+    (0x33C4, 'M', u'cc'),
+    (0x33C5, 'M', u'cd'),
+    (0x33C6, 'M', u'c∕kg'),
+    (0x33C7, 'X'),
+    (0x33C8, 'M', u'db'),
+    (0x33C9, 'M', u'gy'),
+    (0x33CA, 'M', u'ha'),
+    (0x33CB, 'M', u'hp'),
+    (0x33CC, 'M', u'in'),
+    (0x33CD, 'M', u'kk'),
+    (0x33CE, 'M', u'km'),
+    (0x33CF, 'M', u'kt'),
+    (0x33D0, 'M', u'lm'),
+    (0x33D1, 'M', u'ln'),
+    (0x33D2, 'M', u'log'),
+    (0x33D3, 'M', u'lx'),
+    (0x33D4, 'M', u'mb'),
+    (0x33D5, 'M', u'mil'),
+    (0x33D6, 'M', u'mol'),
+    (0x33D7, 'M', u'ph'),
+    (0x33D8, 'X'),
+    (0x33D9, 'M', u'ppm'),
+    (0x33DA, 'M', u'pr'),
+    (0x33DB, 'M', u'sr'),
+    (0x33DC, 'M', u'sv'),
+    (0x33DD, 'M', u'wb'),
+    (0x33DE, 'M', u'v∕m'),
+    (0x33DF, 'M', u'a∕m'),
+    (0x33E0, 'M', u'1日'),
+    (0x33E1, 'M', u'2日'),
+    (0x33E2, 'M', u'3日'),
+    (0x33E3, 'M', u'4日'),
+    (0x33E4, 'M', u'5日'),
+    (0x33E5, 'M', u'6日'),
+    (0x33E6, 'M', u'7日'),
+    (0x33E7, 'M', u'8日'),
+    (0x33E8, 'M', u'9日'),
+    (0x33E9, 'M', u'10日'),
+    (0x33EA, 'M', u'11日'),
+    (0x33EB, 'M', u'12日'),
+    (0x33EC, 'M', u'13日'),
+    (0x33ED, 'M', u'14日'),
+    (0x33EE, 'M', u'15日'),
+    (0x33EF, 'M', u'16日'),
+    (0x33F0, 'M', u'17日'),
+    (0x33F1, 'M', u'18日'),
+    (0x33F2, 'M', u'19日'),
+    (0x33F3, 'M', u'20日'),
+    ]
+
+def _seg_35():
+    return [
+    (0x33F4, 'M', u'21日'),
+    (0x33F5, 'M', u'22日'),
+    (0x33F6, 'M', u'23日'),
+    (0x33F7, 'M', u'24日'),
+    (0x33F8, 'M', u'25日'),
+    (0x33F9, 'M', u'26日'),
+    (0x33FA, 'M', u'27日'),
+    (0x33FB, 'M', u'28日'),
+    (0x33FC, 'M', u'29日'),
+    (0x33FD, 'M', u'30日'),
+    (0x33FE, 'M', u'31日'),
+    (0x33FF, 'M', u'gal'),
+    (0x3400, 'V'),
+    (0x4DB6, 'X'),
+    (0x4DC0, 'V'),
+    (0x9FF0, 'X'),
+    (0xA000, 'V'),
+    (0xA48D, 'X'),
+    (0xA490, 'V'),
+    (0xA4C7, 'X'),
+    (0xA4D0, 'V'),
+    (0xA62C, 'X'),
+    (0xA640, 'M', u'ꙁ'),
+    (0xA641, 'V'),
+    (0xA642, 'M', u'ꙃ'),
+    (0xA643, 'V'),
+    (0xA644, 'M', u'ꙅ'),
+    (0xA645, 'V'),
+    (0xA646, 'M', u'ꙇ'),
+    (0xA647, 'V'),
+    (0xA648, 'M', u'ꙉ'),
+    (0xA649, 'V'),
+    (0xA64A, 'M', u'ꙋ'),
+    (0xA64B, 'V'),
+    (0xA64C, 'M', u'ꙍ'),
+    (0xA64D, 'V'),
+    (0xA64E, 'M', u'ꙏ'),
+    (0xA64F, 'V'),
+    (0xA650, 'M', u'ꙑ'),
+    (0xA651, 'V'),
+    (0xA652, 'M', u'ꙓ'),
+    (0xA653, 'V'),
+    (0xA654, 'M', u'ꙕ'),
+    (0xA655, 'V'),
+    (0xA656, 'M', u'ꙗ'),
+    (0xA657, 'V'),
+    (0xA658, 'M', u'ꙙ'),
+    (0xA659, 'V'),
+    (0xA65A, 'M', u'ꙛ'),
+    (0xA65B, 'V'),
+    (0xA65C, 'M', u'ꙝ'),
+    (0xA65D, 'V'),
+    (0xA65E, 'M', u'ꙟ'),
+    (0xA65F, 'V'),
+    (0xA660, 'M', u'ꙡ'),
+    (0xA661, 'V'),
+    (0xA662, 'M', u'ꙣ'),
+    (0xA663, 'V'),
+    (0xA664, 'M', u'ꙥ'),
+    (0xA665, 'V'),
+    (0xA666, 'M', u'ꙧ'),
+    (0xA667, 'V'),
+    (0xA668, 'M', u'ꙩ'),
+    (0xA669, 'V'),
+    (0xA66A, 'M', u'ꙫ'),
+    (0xA66B, 'V'),
+    (0xA66C, 'M', u'ꙭ'),
+    (0xA66D, 'V'),
+    (0xA680, 'M', u'ꚁ'),
+    (0xA681, 'V'),
+    (0xA682, 'M', u'ꚃ'),
+    (0xA683, 'V'),
+    (0xA684, 'M', u'ꚅ'),
+    (0xA685, 'V'),
+    (0xA686, 'M', u'ꚇ'),
+    (0xA687, 'V'),
+    (0xA688, 'M', u'ꚉ'),
+    (0xA689, 'V'),
+    (0xA68A, 'M', u'ꚋ'),
+    (0xA68B, 'V'),
+    (0xA68C, 'M', u'ꚍ'),
+    (0xA68D, 'V'),
+    (0xA68E, 'M', u'ꚏ'),
+    (0xA68F, 'V'),
+    (0xA690, 'M', u'ꚑ'),
+    (0xA691, 'V'),
+    (0xA692, 'M', u'ꚓ'),
+    (0xA693, 'V'),
+    (0xA694, 'M', u'ꚕ'),
+    (0xA695, 'V'),
+    (0xA696, 'M', u'ꚗ'),
+    (0xA697, 'V'),
+    (0xA698, 'M', u'ꚙ'),
+    (0xA699, 'V'),
+    (0xA69A, 'M', u'ꚛ'),
+    (0xA69B, 'V'),
+    (0xA69C, 'M', u'ъ'),
+    (0xA69D, 'M', u'ь'),
+    (0xA69E, 'V'),
+    (0xA6F8, 'X'),
+    ]
+
+def _seg_36():
+    return [
+    (0xA700, 'V'),
+    (0xA722, 'M', u'ꜣ'),
+    (0xA723, 'V'),
+    (0xA724, 'M', u'ꜥ'),
+    (0xA725, 'V'),
+    (0xA726, 'M', u'ꜧ'),
+    (0xA727, 'V'),
+    (0xA728, 'M', u'ꜩ'),
+    (0xA729, 'V'),
+    (0xA72A, 'M', u'ꜫ'),
+    (0xA72B, 'V'),
+    (0xA72C, 'M', u'ꜭ'),
+    (0xA72D, 'V'),
+    (0xA72E, 'M', u'ꜯ'),
+    (0xA72F, 'V'),
+    (0xA732, 'M', u'ꜳ'),
+    (0xA733, 'V'),
+    (0xA734, 'M', u'ꜵ'),
+    (0xA735, 'V'),
+    (0xA736, 'M', u'ꜷ'),
+    (0xA737, 'V'),
+    (0xA738, 'M', u'ꜹ'),
+    (0xA739, 'V'),
+    (0xA73A, 'M', u'ꜻ'),
+    (0xA73B, 'V'),
+    (0xA73C, 'M', u'ꜽ'),
+    (0xA73D, 'V'),
+    (0xA73E, 'M', u'ꜿ'),
+    (0xA73F, 'V'),
+    (0xA740, 'M', u'ꝁ'),
+    (0xA741, 'V'),
+    (0xA742, 'M', u'ꝃ'),
+    (0xA743, 'V'),
+    (0xA744, 'M', u'ꝅ'),
+    (0xA745, 'V'),
+    (0xA746, 'M', u'ꝇ'),
+    (0xA747, 'V'),
+    (0xA748, 'M', u'ꝉ'),
+    (0xA749, 'V'),
+    (0xA74A, 'M', u'ꝋ'),
+    (0xA74B, 'V'),
+    (0xA74C, 'M', u'ꝍ'),
+    (0xA74D, 'V'),
+    (0xA74E, 'M', u'ꝏ'),
+    (0xA74F, 'V'),
+    (0xA750, 'M', u'ꝑ'),
+    (0xA751, 'V'),
+    (0xA752, 'M', u'ꝓ'),
+    (0xA753, 'V'),
+    (0xA754, 'M', u'ꝕ'),
+    (0xA755, 'V'),
+    (0xA756, 'M', u'ꝗ'),
+    (0xA757, 'V'),
+    (0xA758, 'M', u'ꝙ'),
+    (0xA759, 'V'),
+    (0xA75A, 'M', u'ꝛ'),
+    (0xA75B, 'V'),
+    (0xA75C, 'M', u'ꝝ'),
+    (0xA75D, 'V'),
+    (0xA75E, 'M', u'ꝟ'),
+    (0xA75F, 'V'),
+    (0xA760, 'M', u'ꝡ'),
+    (0xA761, 'V'),
+    (0xA762, 'M', u'ꝣ'),
+    (0xA763, 'V'),
+    (0xA764, 'M', u'ꝥ'),
+    (0xA765, 'V'),
+    (0xA766, 'M', u'ꝧ'),
+    (0xA767, 'V'),
+    (0xA768, 'M', u'ꝩ'),
+    (0xA769, 'V'),
+    (0xA76A, 'M', u'ꝫ'),
+    (0xA76B, 'V'),
+    (0xA76C, 'M', u'ꝭ'),
+    (0xA76D, 'V'),
+    (0xA76E, 'M', u'ꝯ'),
+    (0xA76F, 'V'),
+    (0xA770, 'M', u'ꝯ'),
+    (0xA771, 'V'),
+    (0xA779, 'M', u'ꝺ'),
+    (0xA77A, 'V'),
+    (0xA77B, 'M', u'ꝼ'),
+    (0xA77C, 'V'),
+    (0xA77D, 'M', u'ᵹ'),
+    (0xA77E, 'M', u'ꝿ'),
+    (0xA77F, 'V'),
+    (0xA780, 'M', u'ꞁ'),
+    (0xA781, 'V'),
+    (0xA782, 'M', u'ꞃ'),
+    (0xA783, 'V'),
+    (0xA784, 'M', u'ꞅ'),
+    (0xA785, 'V'),
+    (0xA786, 'M', u'ꞇ'),
+    (0xA787, 'V'),
+    (0xA78B, 'M', u'ꞌ'),
+    (0xA78C, 'V'),
+    (0xA78D, 'M', u'ɥ'),
+    (0xA78E, 'V'),
+    (0xA790, 'M', u'ꞑ'),
+    (0xA791, 'V'),
+    ]
+
+def _seg_37():
+    return [
+    (0xA792, 'M', u'ꞓ'),
+    (0xA793, 'V'),
+    (0xA796, 'M', u'ꞗ'),
+    (0xA797, 'V'),
+    (0xA798, 'M', u'ꞙ'),
+    (0xA799, 'V'),
+    (0xA79A, 'M', u'ꞛ'),
+    (0xA79B, 'V'),
+    (0xA79C, 'M', u'ꞝ'),
+    (0xA79D, 'V'),
+    (0xA79E, 'M', u'ꞟ'),
+    (0xA79F, 'V'),
+    (0xA7A0, 'M', u'ꞡ'),
+    (0xA7A1, 'V'),
+    (0xA7A2, 'M', u'ꞣ'),
+    (0xA7A3, 'V'),
+    (0xA7A4, 'M', u'ꞥ'),
+    (0xA7A5, 'V'),
+    (0xA7A6, 'M', u'ꞧ'),
+    (0xA7A7, 'V'),
+    (0xA7A8, 'M', u'ꞩ'),
+    (0xA7A9, 'V'),
+    (0xA7AA, 'M', u'ɦ'),
+    (0xA7AB, 'M', u'ɜ'),
+    (0xA7AC, 'M', u'ɡ'),
+    (0xA7AD, 'M', u'ɬ'),
+    (0xA7AE, 'M', u'ɪ'),
+    (0xA7AF, 'V'),
+    (0xA7B0, 'M', u'ʞ'),
+    (0xA7B1, 'M', u'ʇ'),
+    (0xA7B2, 'M', u'ʝ'),
+    (0xA7B3, 'M', u'ꭓ'),
+    (0xA7B4, 'M', u'ꞵ'),
+    (0xA7B5, 'V'),
+    (0xA7B6, 'M', u'ꞷ'),
+    (0xA7B7, 'V'),
+    (0xA7B8, 'X'),
+    (0xA7B9, 'V'),
+    (0xA7BA, 'X'),
+    (0xA7F7, 'V'),
+    (0xA7F8, 'M', u'ħ'),
+    (0xA7F9, 'M', u'œ'),
+    (0xA7FA, 'V'),
+    (0xA82C, 'X'),
+    (0xA830, 'V'),
+    (0xA83A, 'X'),
+    (0xA840, 'V'),
+    (0xA878, 'X'),
+    (0xA880, 'V'),
+    (0xA8C6, 'X'),
+    (0xA8CE, 'V'),
+    (0xA8DA, 'X'),
+    (0xA8E0, 'V'),
+    (0xA954, 'X'),
+    (0xA95F, 'V'),
+    (0xA97D, 'X'),
+    (0xA980, 'V'),
+    (0xA9CE, 'X'),
+    (0xA9CF, 'V'),
+    (0xA9DA, 'X'),
+    (0xA9DE, 'V'),
+    (0xA9FF, 'X'),
+    (0xAA00, 'V'),
+    (0xAA37, 'X'),
+    (0xAA40, 'V'),
+    (0xAA4E, 'X'),
+    (0xAA50, 'V'),
+    (0xAA5A, 'X'),
+    (0xAA5C, 'V'),
+    (0xAAC3, 'X'),
+    (0xAADB, 'V'),
+    (0xAAF7, 'X'),
+    (0xAB01, 'V'),
+    (0xAB07, 'X'),
+    (0xAB09, 'V'),
+    (0xAB0F, 'X'),
+    (0xAB11, 'V'),
+    (0xAB17, 'X'),
+    (0xAB20, 'V'),
+    (0xAB27, 'X'),
+    (0xAB28, 'V'),
+    (0xAB2F, 'X'),
+    (0xAB30, 'V'),
+    (0xAB5C, 'M', u'ꜧ'),
+    (0xAB5D, 'M', u'ꬷ'),
+    (0xAB5E, 'M', u'ɫ'),
+    (0xAB5F, 'M', u'ꭒ'),
+    (0xAB60, 'V'),
+    (0xAB66, 'X'),
+    (0xAB70, 'M', u'Ꭰ'),
+    (0xAB71, 'M', u'Ꭱ'),
+    (0xAB72, 'M', u'Ꭲ'),
+    (0xAB73, 'M', u'Ꭳ'),
+    (0xAB74, 'M', u'Ꭴ'),
+    (0xAB75, 'M', u'Ꭵ'),
+    (0xAB76, 'M', u'Ꭶ'),
+    (0xAB77, 'M', u'Ꭷ'),
+    (0xAB78, 'M', u'Ꭸ'),
+    (0xAB79, 'M', u'Ꭹ'),
+    (0xAB7A, 'M', u'Ꭺ'),
+    ]
+
+def _seg_38():
+    return [
+    (0xAB7B, 'M', u'Ꭻ'),
+    (0xAB7C, 'M', u'Ꭼ'),
+    (0xAB7D, 'M', u'Ꭽ'),
+    (0xAB7E, 'M', u'Ꭾ'),
+    (0xAB7F, 'M', u'Ꭿ'),
+    (0xAB80, 'M', u'Ꮀ'),
+    (0xAB81, 'M', u'Ꮁ'),
+    (0xAB82, 'M', u'Ꮂ'),
+    (0xAB83, 'M', u'Ꮃ'),
+    (0xAB84, 'M', u'Ꮄ'),
+    (0xAB85, 'M', u'Ꮅ'),
+    (0xAB86, 'M', u'Ꮆ'),
+    (0xAB87, 'M', u'Ꮇ'),
+    (0xAB88, 'M', u'Ꮈ'),
+    (0xAB89, 'M', u'Ꮉ'),
+    (0xAB8A, 'M', u'Ꮊ'),
+    (0xAB8B, 'M', u'Ꮋ'),
+    (0xAB8C, 'M', u'Ꮌ'),
+    (0xAB8D, 'M', u'Ꮍ'),
+    (0xAB8E, 'M', u'Ꮎ'),
+    (0xAB8F, 'M', u'Ꮏ'),
+    (0xAB90, 'M', u'Ꮐ'),
+    (0xAB91, 'M', u'Ꮑ'),
+    (0xAB92, 'M', u'Ꮒ'),
+    (0xAB93, 'M', u'Ꮓ'),
+    (0xAB94, 'M', u'Ꮔ'),
+    (0xAB95, 'M', u'Ꮕ'),
+    (0xAB96, 'M', u'Ꮖ'),
+    (0xAB97, 'M', u'Ꮗ'),
+    (0xAB98, 'M', u'Ꮘ'),
+    (0xAB99, 'M', u'Ꮙ'),
+    (0xAB9A, 'M', u'Ꮚ'),
+    (0xAB9B, 'M', u'Ꮛ'),
+    (0xAB9C, 'M', u'Ꮜ'),
+    (0xAB9D, 'M', u'Ꮝ'),
+    (0xAB9E, 'M', u'Ꮞ'),
+    (0xAB9F, 'M', u'Ꮟ'),
+    (0xABA0, 'M', u'Ꮠ'),
+    (0xABA1, 'M', u'Ꮡ'),
+    (0xABA2, 'M', u'Ꮢ'),
+    (0xABA3, 'M', u'Ꮣ'),
+    (0xABA4, 'M', u'Ꮤ'),
+    (0xABA5, 'M', u'Ꮥ'),
+    (0xABA6, 'M', u'Ꮦ'),
+    (0xABA7, 'M', u'Ꮧ'),
+    (0xABA8, 'M', u'Ꮨ'),
+    (0xABA9, 'M', u'Ꮩ'),
+    (0xABAA, 'M', u'Ꮪ'),
+    (0xABAB, 'M', u'Ꮫ'),
+    (0xABAC, 'M', u'Ꮬ'),
+    (0xABAD, 'M', u'Ꮭ'),
+    (0xABAE, 'M', u'Ꮮ'),
+    (0xABAF, 'M', u'Ꮯ'),
+    (0xABB0, 'M', u'Ꮰ'),
+    (0xABB1, 'M', u'Ꮱ'),
+    (0xABB2, 'M', u'Ꮲ'),
+    (0xABB3, 'M', u'Ꮳ'),
+    (0xABB4, 'M', u'Ꮴ'),
+    (0xABB5, 'M', u'Ꮵ'),
+    (0xABB6, 'M', u'Ꮶ'),
+    (0xABB7, 'M', u'Ꮷ'),
+    (0xABB8, 'M', u'Ꮸ'),
+    (0xABB9, 'M', u'Ꮹ'),
+    (0xABBA, 'M', u'Ꮺ'),
+    (0xABBB, 'M', u'Ꮻ'),
+    (0xABBC, 'M', u'Ꮼ'),
+    (0xABBD, 'M', u'Ꮽ'),
+    (0xABBE, 'M', u'Ꮾ'),
+    (0xABBF, 'M', u'Ꮿ'),
+    (0xABC0, 'V'),
+    (0xABEE, 'X'),
+    (0xABF0, 'V'),
+    (0xABFA, 'X'),
+    (0xAC00, 'V'),
+    (0xD7A4, 'X'),
+    (0xD7B0, 'V'),
+    (0xD7C7, 'X'),
+    (0xD7CB, 'V'),
+    (0xD7FC, 'X'),
+    (0xF900, 'M', u'豈'),
+    (0xF901, 'M', u'更'),
+    (0xF902, 'M', u'車'),
+    (0xF903, 'M', u'賈'),
+    (0xF904, 'M', u'滑'),
+    (0xF905, 'M', u'串'),
+    (0xF906, 'M', u'句'),
+    (0xF907, 'M', u'龜'),
+    (0xF909, 'M', u'契'),
+    (0xF90A, 'M', u'金'),
+    (0xF90B, 'M', u'喇'),
+    (0xF90C, 'M', u'奈'),
+    (0xF90D, 'M', u'懶'),
+    (0xF90E, 'M', u'癩'),
+    (0xF90F, 'M', u'羅'),
+    (0xF910, 'M', u'蘿'),
+    (0xF911, 'M', u'螺'),
+    (0xF912, 'M', u'裸'),
+    (0xF913, 'M', u'邏'),
+    (0xF914, 'M', u'樂'),
+    (0xF915, 'M', u'洛'),
+    ]
+
+def _seg_39():
+    return [
+    (0xF916, 'M', u'烙'),
+    (0xF917, 'M', u'珞'),
+    (0xF918, 'M', u'落'),
+    (0xF919, 'M', u'酪'),
+    (0xF91A, 'M', u'駱'),
+    (0xF91B, 'M', u'亂'),
+    (0xF91C, 'M', u'卵'),
+    (0xF91D, 'M', u'欄'),
+    (0xF91E, 'M', u'爛'),
+    (0xF91F, 'M', u'蘭'),
+    (0xF920, 'M', u'鸞'),
+    (0xF921, 'M', u'嵐'),
+    (0xF922, 'M', u'濫'),
+    (0xF923, 'M', u'藍'),
+    (0xF924, 'M', u'襤'),
+    (0xF925, 'M', u'拉'),
+    (0xF926, 'M', u'臘'),
+    (0xF927, 'M', u'蠟'),
+    (0xF928, 'M', u'廊'),
+    (0xF929, 'M', u'朗'),
+    (0xF92A, 'M', u'浪'),
+    (0xF92B, 'M', u'狼'),
+    (0xF92C, 'M', u'郎'),
+    (0xF92D, 'M', u'來'),
+    (0xF92E, 'M', u'冷'),
+    (0xF92F, 'M', u'勞'),
+    (0xF930, 'M', u'擄'),
+    (0xF931, 'M', u'櫓'),
+    (0xF932, 'M', u'爐'),
+    (0xF933, 'M', u'盧'),
+    (0xF934, 'M', u'老'),
+    (0xF935, 'M', u'蘆'),
+    (0xF936, 'M', u'虜'),
+    (0xF937, 'M', u'路'),
+    (0xF938, 'M', u'露'),
+    (0xF939, 'M', u'魯'),
+    (0xF93A, 'M', u'鷺'),
+    (0xF93B, 'M', u'碌'),
+    (0xF93C, 'M', u'祿'),
+    (0xF93D, 'M', u'綠'),
+    (0xF93E, 'M', u'菉'),
+    (0xF93F, 'M', u'錄'),
+    (0xF940, 'M', u'鹿'),
+    (0xF941, 'M', u'論'),
+    (0xF942, 'M', u'壟'),
+    (0xF943, 'M', u'弄'),
+    (0xF944, 'M', u'籠'),
+    (0xF945, 'M', u'聾'),
+    (0xF946, 'M', u'牢'),
+    (0xF947, 'M', u'磊'),
+    (0xF948, 'M', u'賂'),
+    (0xF949, 'M', u'雷'),
+    (0xF94A, 'M', u'壘'),
+    (0xF94B, 'M', u'屢'),
+    (0xF94C, 'M', u'樓'),
+    (0xF94D, 'M', u'淚'),
+    (0xF94E, 'M', u'漏'),
+    (0xF94F, 'M', u'累'),
+    (0xF950, 'M', u'縷'),
+    (0xF951, 'M', u'陋'),
+    (0xF952, 'M', u'勒'),
+    (0xF953, 'M', u'肋'),
+    (0xF954, 'M', u'凜'),
+    (0xF955, 'M', u'凌'),
+    (0xF956, 'M', u'稜'),
+    (0xF957, 'M', u'綾'),
+    (0xF958, 'M', u'菱'),
+    (0xF959, 'M', u'陵'),
+    (0xF95A, 'M', u'讀'),
+    (0xF95B, 'M', u'拏'),
+    (0xF95C, 'M', u'樂'),
+    (0xF95D, 'M', u'諾'),
+    (0xF95E, 'M', u'丹'),
+    (0xF95F, 'M', u'寧'),
+    (0xF960, 'M', u'怒'),
+    (0xF961, 'M', u'率'),
+    (0xF962, 'M', u'異'),
+    (0xF963, 'M', u'北'),
+    (0xF964, 'M', u'磻'),
+    (0xF965, 'M', u'便'),
+    (0xF966, 'M', u'復'),
+    (0xF967, 'M', u'不'),
+    (0xF968, 'M', u'泌'),
+    (0xF969, 'M', u'數'),
+    (0xF96A, 'M', u'索'),
+    (0xF96B, 'M', u'參'),
+    (0xF96C, 'M', u'塞'),
+    (0xF96D, 'M', u'省'),
+    (0xF96E, 'M', u'葉'),
+    (0xF96F, 'M', u'說'),
+    (0xF970, 'M', u'殺'),
+    (0xF971, 'M', u'辰'),
+    (0xF972, 'M', u'沈'),
+    (0xF973, 'M', u'拾'),
+    (0xF974, 'M', u'若'),
+    (0xF975, 'M', u'掠'),
+    (0xF976, 'M', u'略'),
+    (0xF977, 'M', u'亮'),
+    (0xF978, 'M', u'兩'),
+    (0xF979, 'M', u'凉'),
+    ]
+
+def _seg_40():
+    return [
+    (0xF97A, 'M', u'梁'),
+    (0xF97B, 'M', u'糧'),
+    (0xF97C, 'M', u'良'),
+    (0xF97D, 'M', u'諒'),
+    (0xF97E, 'M', u'量'),
+    (0xF97F, 'M', u'勵'),
+    (0xF980, 'M', u'呂'),
+    (0xF981, 'M', u'女'),
+    (0xF982, 'M', u'廬'),
+    (0xF983, 'M', u'旅'),
+    (0xF984, 'M', u'濾'),
+    (0xF985, 'M', u'礪'),
+    (0xF986, 'M', u'閭'),
+    (0xF987, 'M', u'驪'),
+    (0xF988, 'M', u'麗'),
+    (0xF989, 'M', u'黎'),
+    (0xF98A, 'M', u'力'),
+    (0xF98B, 'M', u'曆'),
+    (0xF98C, 'M', u'歷'),
+    (0xF98D, 'M', u'轢'),
+    (0xF98E, 'M', u'年'),
+    (0xF98F, 'M', u'憐'),
+    (0xF990, 'M', u'戀'),
+    (0xF991, 'M', u'撚'),
+    (0xF992, 'M', u'漣'),
+    (0xF993, 'M', u'煉'),
+    (0xF994, 'M', u'璉'),
+    (0xF995, 'M', u'秊'),
+    (0xF996, 'M', u'練'),
+    (0xF997, 'M', u'聯'),
+    (0xF998, 'M', u'輦'),
+    (0xF999, 'M', u'蓮'),
+    (0xF99A, 'M', u'連'),
+    (0xF99B, 'M', u'鍊'),
+    (0xF99C, 'M', u'列'),
+    (0xF99D, 'M', u'劣'),
+    (0xF99E, 'M', u'咽'),
+    (0xF99F, 'M', u'烈'),
+    (0xF9A0, 'M', u'裂'),
+    (0xF9A1, 'M', u'說'),
+    (0xF9A2, 'M', u'廉'),
+    (0xF9A3, 'M', u'念'),
+    (0xF9A4, 'M', u'捻'),
+    (0xF9A5, 'M', u'殮'),
+    (0xF9A6, 'M', u'簾'),
+    (0xF9A7, 'M', u'獵'),
+    (0xF9A8, 'M', u'令'),
+    (0xF9A9, 'M', u'囹'),
+    (0xF9AA, 'M', u'寧'),
+    (0xF9AB, 'M', u'嶺'),
+    (0xF9AC, 'M', u'怜'),
+    (0xF9AD, 'M', u'玲'),
+    (0xF9AE, 'M', u'瑩'),
+    (0xF9AF, 'M', u'羚'),
+    (0xF9B0, 'M', u'聆'),
+    (0xF9B1, 'M', u'鈴'),
+    (0xF9B2, 'M', u'零'),
+    (0xF9B3, 'M', u'靈'),
+    (0xF9B4, 'M', u'領'),
+    (0xF9B5, 'M', u'例'),
+    (0xF9B6, 'M', u'禮'),
+    (0xF9B7, 'M', u'醴'),
+    (0xF9B8, 'M', u'隸'),
+    (0xF9B9, 'M', u'惡'),
+    (0xF9BA, 'M', u'了'),
+    (0xF9BB, 'M', u'僚'),
+    (0xF9BC, 'M', u'寮'),
+    (0xF9BD, 'M', u'尿'),
+    (0xF9BE, 'M', u'料'),
+    (0xF9BF, 'M', u'樂'),
+    (0xF9C0, 'M', u'燎'),
+    (0xF9C1, 'M', u'療'),
+    (0xF9C2, 'M', u'蓼'),
+    (0xF9C3, 'M', u'遼'),
+    (0xF9C4, 'M', u'龍'),
+    (0xF9C5, 'M', u'暈'),
+    (0xF9C6, 'M', u'阮'),
+    (0xF9C7, 'M', u'劉'),
+    (0xF9C8, 'M', u'杻'),
+    (0xF9C9, 'M', u'柳'),
+    (0xF9CA, 'M', u'流'),
+    (0xF9CB, 'M', u'溜'),
+    (0xF9CC, 'M', u'琉'),
+    (0xF9CD, 'M', u'留'),
+    (0xF9CE, 'M', u'硫'),
+    (0xF9CF, 'M', u'紐'),
+    (0xF9D0, 'M', u'類'),
+    (0xF9D1, 'M', u'六'),
+    (0xF9D2, 'M', u'戮'),
+    (0xF9D3, 'M', u'陸'),
+    (0xF9D4, 'M', u'倫'),
+    (0xF9D5, 'M', u'崙'),
+    (0xF9D6, 'M', u'淪'),
+    (0xF9D7, 'M', u'輪'),
+    (0xF9D8, 'M', u'律'),
+    (0xF9D9, 'M', u'慄'),
+    (0xF9DA, 'M', u'栗'),
+    (0xF9DB, 'M', u'率'),
+    (0xF9DC, 'M', u'隆'),
+    (0xF9DD, 'M', u'利'),
+    ]
+
+def _seg_41():
+    return [
+    (0xF9DE, 'M', u'吏'),
+    (0xF9DF, 'M', u'履'),
+    (0xF9E0, 'M', u'易'),
+    (0xF9E1, 'M', u'李'),
+    (0xF9E2, 'M', u'梨'),
+    (0xF9E3, 'M', u'泥'),
+    (0xF9E4, 'M', u'理'),
+    (0xF9E5, 'M', u'痢'),
+    (0xF9E6, 'M', u'罹'),
+    (0xF9E7, 'M', u'裏'),
+    (0xF9E8, 'M', u'裡'),
+    (0xF9E9, 'M', u'里'),
+    (0xF9EA, 'M', u'離'),
+    (0xF9EB, 'M', u'匿'),
+    (0xF9EC, 'M', u'溺'),
+    (0xF9ED, 'M', u'吝'),
+    (0xF9EE, 'M', u'燐'),
+    (0xF9EF, 'M', u'璘'),
+    (0xF9F0, 'M', u'藺'),
+    (0xF9F1, 'M', u'隣'),
+    (0xF9F2, 'M', u'鱗'),
+    (0xF9F3, 'M', u'麟'),
+    (0xF9F4, 'M', u'林'),
+    (0xF9F5, 'M', u'淋'),
+    (0xF9F6, 'M', u'臨'),
+    (0xF9F7, 'M', u'立'),
+    (0xF9F8, 'M', u'笠'),
+    (0xF9F9, 'M', u'粒'),
+    (0xF9FA, 'M', u'狀'),
+    (0xF9FB, 'M', u'炙'),
+    (0xF9FC, 'M', u'識'),
+    (0xF9FD, 'M', u'什'),
+    (0xF9FE, 'M', u'茶'),
+    (0xF9FF, 'M', u'刺'),
+    (0xFA00, 'M', u'切'),
+    (0xFA01, 'M', u'度'),
+    (0xFA02, 'M', u'拓'),
+    (0xFA03, 'M', u'糖'),
+    (0xFA04, 'M', u'宅'),
+    (0xFA05, 'M', u'洞'),
+    (0xFA06, 'M', u'暴'),
+    (0xFA07, 'M', u'輻'),
+    (0xFA08, 'M', u'行'),
+    (0xFA09, 'M', u'降'),
+    (0xFA0A, 'M', u'見'),
+    (0xFA0B, 'M', u'廓'),
+    (0xFA0C, 'M', u'兀'),
+    (0xFA0D, 'M', u'嗀'),
+    (0xFA0E, 'V'),
+    (0xFA10, 'M', u'塚'),
+    (0xFA11, 'V'),
+    (0xFA12, 'M', u'晴'),
+    (0xFA13, 'V'),
+    (0xFA15, 'M', u'凞'),
+    (0xFA16, 'M', u'猪'),
+    (0xFA17, 'M', u'益'),
+    (0xFA18, 'M', u'礼'),
+    (0xFA19, 'M', u'神'),
+    (0xFA1A, 'M', u'祥'),
+    (0xFA1B, 'M', u'福'),
+    (0xFA1C, 'M', u'靖'),
+    (0xFA1D, 'M', u'精'),
+    (0xFA1E, 'M', u'羽'),
+    (0xFA1F, 'V'),
+    (0xFA20, 'M', u'蘒'),
+    (0xFA21, 'V'),
+    (0xFA22, 'M', u'諸'),
+    (0xFA23, 'V'),
+    (0xFA25, 'M', u'逸'),
+    (0xFA26, 'M', u'都'),
+    (0xFA27, 'V'),
+    (0xFA2A, 'M', u'飯'),
+    (0xFA2B, 'M', u'飼'),
+    (0xFA2C, 'M', u'館'),
+    (0xFA2D, 'M', u'鶴'),
+    (0xFA2E, 'M', u'郞'),
+    (0xFA2F, 'M', u'隷'),
+    (0xFA30, 'M', u'侮'),
+    (0xFA31, 'M', u'僧'),
+    (0xFA32, 'M', u'免'),
+    (0xFA33, 'M', u'勉'),
+    (0xFA34, 'M', u'勤'),
+    (0xFA35, 'M', u'卑'),
+    (0xFA36, 'M', u'喝'),
+    (0xFA37, 'M', u'嘆'),
+    (0xFA38, 'M', u'器'),
+    (0xFA39, 'M', u'塀'),
+    (0xFA3A, 'M', u'墨'),
+    (0xFA3B, 'M', u'層'),
+    (0xFA3C, 'M', u'屮'),
+    (0xFA3D, 'M', u'悔'),
+    (0xFA3E, 'M', u'慨'),
+    (0xFA3F, 'M', u'憎'),
+    (0xFA40, 'M', u'懲'),
+    (0xFA41, 'M', u'敏'),
+    (0xFA42, 'M', u'既'),
+    (0xFA43, 'M', u'暑'),
+    (0xFA44, 'M', u'梅'),
+    (0xFA45, 'M', u'海'),
+    (0xFA46, 'M', u'渚'),
+    ]
+
+def _seg_42():
+    return [
+    (0xFA47, 'M', u'漢'),
+    (0xFA48, 'M', u'煮'),
+    (0xFA49, 'M', u'爫'),
+    (0xFA4A, 'M', u'琢'),
+    (0xFA4B, 'M', u'碑'),
+    (0xFA4C, 'M', u'社'),
+    (0xFA4D, 'M', u'祉'),
+    (0xFA4E, 'M', u'祈'),
+    (0xFA4F, 'M', u'祐'),
+    (0xFA50, 'M', u'祖'),
+    (0xFA51, 'M', u'祝'),
+    (0xFA52, 'M', u'禍'),
+    (0xFA53, 'M', u'禎'),
+    (0xFA54, 'M', u'穀'),
+    (0xFA55, 'M', u'突'),
+    (0xFA56, 'M', u'節'),
+    (0xFA57, 'M', u'練'),
+    (0xFA58, 'M', u'縉'),
+    (0xFA59, 'M', u'繁'),
+    (0xFA5A, 'M', u'署'),
+    (0xFA5B, 'M', u'者'),
+    (0xFA5C, 'M', u'臭'),
+    (0xFA5D, 'M', u'艹'),
+    (0xFA5F, 'M', u'著'),
+    (0xFA60, 'M', u'褐'),
+    (0xFA61, 'M', u'視'),
+    (0xFA62, 'M', u'謁'),
+    (0xFA63, 'M', u'謹'),
+    (0xFA64, 'M', u'賓'),
+    (0xFA65, 'M', u'贈'),
+    (0xFA66, 'M', u'辶'),
+    (0xFA67, 'M', u'逸'),
+    (0xFA68, 'M', u'難'),
+    (0xFA69, 'M', u'響'),
+    (0xFA6A, 'M', u'頻'),
+    (0xFA6B, 'M', u'恵'),
+    (0xFA6C, 'M', u'𤋮'),
+    (0xFA6D, 'M', u'舘'),
+    (0xFA6E, 'X'),
+    (0xFA70, 'M', u'並'),
+    (0xFA71, 'M', u'况'),
+    (0xFA72, 'M', u'全'),
+    (0xFA73, 'M', u'侀'),
+    (0xFA74, 'M', u'充'),
+    (0xFA75, 'M', u'冀'),
+    (0xFA76, 'M', u'勇'),
+    (0xFA77, 'M', u'勺'),
+    (0xFA78, 'M', u'喝'),
+    (0xFA79, 'M', u'啕'),
+    (0xFA7A, 'M', u'喙'),
+    (0xFA7B, 'M', u'嗢'),
+    (0xFA7C, 'M', u'塚'),
+    (0xFA7D, 'M', u'墳'),
+    (0xFA7E, 'M', u'奄'),
+    (0xFA7F, 'M', u'奔'),
+    (0xFA80, 'M', u'婢'),
+    (0xFA81, 'M', u'嬨'),
+    (0xFA82, 'M', u'廒'),
+    (0xFA83, 'M', u'廙'),
+    (0xFA84, 'M', u'彩'),
+    (0xFA85, 'M', u'徭'),
+    (0xFA86, 'M', u'惘'),
+    (0xFA87, 'M', u'慎'),
+    (0xFA88, 'M', u'愈'),
+    (0xFA89, 'M', u'憎'),
+    (0xFA8A, 'M', u'慠'),
+    (0xFA8B, 'M', u'懲'),
+    (0xFA8C, 'M', u'戴'),
+    (0xFA8D, 'M', u'揄'),
+    (0xFA8E, 'M', u'搜'),
+    (0xFA8F, 'M', u'摒'),
+    (0xFA90, 'M', u'敖'),
+    (0xFA91, 'M', u'晴'),
+    (0xFA92, 'M', u'朗'),
+    (0xFA93, 'M', u'望'),
+    (0xFA94, 'M', u'杖'),
+    (0xFA95, 'M', u'歹'),
+    (0xFA96, 'M', u'殺'),
+    (0xFA97, 'M', u'流'),
+    (0xFA98, 'M', u'滛'),
+    (0xFA99, 'M', u'滋'),
+    (0xFA9A, 'M', u'漢'),
+    (0xFA9B, 'M', u'瀞'),
+    (0xFA9C, 'M', u'煮'),
+    (0xFA9D, 'M', u'瞧'),
+    (0xFA9E, 'M', u'爵'),
+    (0xFA9F, 'M', u'犯'),
+    (0xFAA0, 'M', u'猪'),
+    (0xFAA1, 'M', u'瑱'),
+    (0xFAA2, 'M', u'甆'),
+    (0xFAA3, 'M', u'画'),
+    (0xFAA4, 'M', u'瘝'),
+    (0xFAA5, 'M', u'瘟'),
+    (0xFAA6, 'M', u'益'),
+    (0xFAA7, 'M', u'盛'),
+    (0xFAA8, 'M', u'直'),
+    (0xFAA9, 'M', u'睊'),
+    (0xFAAA, 'M', u'着'),
+    (0xFAAB, 'M', u'磌'),
+    (0xFAAC, 'M', u'窱'),
+    ]
+
+def _seg_43():
+    return [
+    (0xFAAD, 'M', u'節'),
+    (0xFAAE, 'M', u'类'),
+    (0xFAAF, 'M', u'絛'),
+    (0xFAB0, 'M', u'練'),
+    (0xFAB1, 'M', u'缾'),
+    (0xFAB2, 'M', u'者'),
+    (0xFAB3, 'M', u'荒'),
+    (0xFAB4, 'M', u'華'),
+    (0xFAB5, 'M', u'蝹'),
+    (0xFAB6, 'M', u'襁'),
+    (0xFAB7, 'M', u'覆'),
+    (0xFAB8, 'M', u'視'),
+    (0xFAB9, 'M', u'調'),
+    (0xFABA, 'M', u'諸'),
+    (0xFABB, 'M', u'請'),
+    (0xFABC, 'M', u'謁'),
+    (0xFABD, 'M', u'諾'),
+    (0xFABE, 'M', u'諭'),
+    (0xFABF, 'M', u'謹'),
+    (0xFAC0, 'M', u'變'),
+    (0xFAC1, 'M', u'贈'),
+    (0xFAC2, 'M', u'輸'),
+    (0xFAC3, 'M', u'遲'),
+    (0xFAC4, 'M', u'醙'),
+    (0xFAC5, 'M', u'鉶'),
+    (0xFAC6, 'M', u'陼'),
+    (0xFAC7, 'M', u'難'),
+    (0xFAC8, 'M', u'靖'),
+    (0xFAC9, 'M', u'韛'),
+    (0xFACA, 'M', u'響'),
+    (0xFACB, 'M', u'頋'),
+    (0xFACC, 'M', u'頻'),
+    (0xFACD, 'M', u'鬒'),
+    (0xFACE, 'M', u'龜'),
+    (0xFACF, 'M', u'𢡊'),
+    (0xFAD0, 'M', u'𢡄'),
+    (0xFAD1, 'M', u'𣏕'),
+    (0xFAD2, 'M', u'㮝'),
+    (0xFAD3, 'M', u'䀘'),
+    (0xFAD4, 'M', u'䀹'),
+    (0xFAD5, 'M', u'𥉉'),
+    (0xFAD6, 'M', u'𥳐'),
+    (0xFAD7, 'M', u'𧻓'),
+    (0xFAD8, 'M', u'齃'),
+    (0xFAD9, 'M', u'龎'),
+    (0xFADA, 'X'),
+    (0xFB00, 'M', u'ff'),
+    (0xFB01, 'M', u'fi'),
+    (0xFB02, 'M', u'fl'),
+    (0xFB03, 'M', u'ffi'),
+    (0xFB04, 'M', u'ffl'),
+    (0xFB05, 'M', u'st'),
+    (0xFB07, 'X'),
+    (0xFB13, 'M', u'մն'),
+    (0xFB14, 'M', u'մե'),
+    (0xFB15, 'M', u'մի'),
+    (0xFB16, 'M', u'վն'),
+    (0xFB17, 'M', u'մխ'),
+    (0xFB18, 'X'),
+    (0xFB1D, 'M', u'יִ'),
+    (0xFB1E, 'V'),
+    (0xFB1F, 'M', u'ײַ'),
+    (0xFB20, 'M', u'ע'),
+    (0xFB21, 'M', u'א'),
+    (0xFB22, 'M', u'ד'),
+    (0xFB23, 'M', u'ה'),
+    (0xFB24, 'M', u'כ'),
+    (0xFB25, 'M', u'ל'),
+    (0xFB26, 'M', u'ם'),
+    (0xFB27, 'M', u'ר'),
+    (0xFB28, 'M', u'ת'),
+    (0xFB29, '3', u'+'),
+    (0xFB2A, 'M', u'שׁ'),
+    (0xFB2B, 'M', u'שׂ'),
+    (0xFB2C, 'M', u'שּׁ'),
+    (0xFB2D, 'M', u'שּׂ'),
+    (0xFB2E, 'M', u'אַ'),
+    (0xFB2F, 'M', u'אָ'),
+    (0xFB30, 'M', u'אּ'),
+    (0xFB31, 'M', u'בּ'),
+    (0xFB32, 'M', u'גּ'),
+    (0xFB33, 'M', u'דּ'),
+    (0xFB34, 'M', u'הּ'),
+    (0xFB35, 'M', u'וּ'),
+    (0xFB36, 'M', u'זּ'),
+    (0xFB37, 'X'),
+    (0xFB38, 'M', u'טּ'),
+    (0xFB39, 'M', u'יּ'),
+    (0xFB3A, 'M', u'ךּ'),
+    (0xFB3B, 'M', u'כּ'),
+    (0xFB3C, 'M', u'לּ'),
+    (0xFB3D, 'X'),
+    (0xFB3E, 'M', u'מּ'),
+    (0xFB3F, 'X'),
+    (0xFB40, 'M', u'נּ'),
+    (0xFB41, 'M', u'סּ'),
+    (0xFB42, 'X'),
+    (0xFB43, 'M', u'ףּ'),
+    (0xFB44, 'M', u'פּ'),
+    (0xFB45, 'X'),
+    ]
+
+def _seg_44():
+    return [
+    (0xFB46, 'M', u'צּ'),
+    (0xFB47, 'M', u'קּ'),
+    (0xFB48, 'M', u'רּ'),
+    (0xFB49, 'M', u'שּ'),
+    (0xFB4A, 'M', u'תּ'),
+    (0xFB4B, 'M', u'וֹ'),
+    (0xFB4C, 'M', u'בֿ'),
+    (0xFB4D, 'M', u'כֿ'),
+    (0xFB4E, 'M', u'פֿ'),
+    (0xFB4F, 'M', u'אל'),
+    (0xFB50, 'M', u'ٱ'),
+    (0xFB52, 'M', u'ٻ'),
+    (0xFB56, 'M', u'پ'),
+    (0xFB5A, 'M', u'ڀ'),
+    (0xFB5E, 'M', u'ٺ'),
+    (0xFB62, 'M', u'ٿ'),
+    (0xFB66, 'M', u'ٹ'),
+    (0xFB6A, 'M', u'ڤ'),
+    (0xFB6E, 'M', u'ڦ'),
+    (0xFB72, 'M', u'ڄ'),
+    (0xFB76, 'M', u'ڃ'),
+    (0xFB7A, 'M', u'چ'),
+    (0xFB7E, 'M', u'ڇ'),
+    (0xFB82, 'M', u'ڍ'),
+    (0xFB84, 'M', u'ڌ'),
+    (0xFB86, 'M', u'ڎ'),
+    (0xFB88, 'M', u'ڈ'),
+    (0xFB8A, 'M', u'ژ'),
+    (0xFB8C, 'M', u'ڑ'),
+    (0xFB8E, 'M', u'ک'),
+    (0xFB92, 'M', u'گ'),
+    (0xFB96, 'M', u'ڳ'),
+    (0xFB9A, 'M', u'ڱ'),
+    (0xFB9E, 'M', u'ں'),
+    (0xFBA0, 'M', u'ڻ'),
+    (0xFBA4, 'M', u'ۀ'),
+    (0xFBA6, 'M', u'ہ'),
+    (0xFBAA, 'M', u'ھ'),
+    (0xFBAE, 'M', u'ے'),
+    (0xFBB0, 'M', u'ۓ'),
+    (0xFBB2, 'V'),
+    (0xFBC2, 'X'),
+    (0xFBD3, 'M', u'ڭ'),
+    (0xFBD7, 'M', u'ۇ'),
+    (0xFBD9, 'M', u'ۆ'),
+    (0xFBDB, 'M', u'ۈ'),
+    (0xFBDD, 'M', u'ۇٴ'),
+    (0xFBDE, 'M', u'ۋ'),
+    (0xFBE0, 'M', u'ۅ'),
+    (0xFBE2, 'M', u'ۉ'),
+    (0xFBE4, 'M', u'ې'),
+    (0xFBE8, 'M', u'ى'),
+    (0xFBEA, 'M', u'ئا'),
+    (0xFBEC, 'M', u'ئە'),
+    (0xFBEE, 'M', u'ئو'),
+    (0xFBF0, 'M', u'ئۇ'),
+    (0xFBF2, 'M', u'ئۆ'),
+    (0xFBF4, 'M', u'ئۈ'),
+    (0xFBF6, 'M', u'ئې'),
+    (0xFBF9, 'M', u'ئى'),
+    (0xFBFC, 'M', u'ی'),
+    (0xFC00, 'M', u'ئج'),
+    (0xFC01, 'M', u'ئح'),
+    (0xFC02, 'M', u'ئم'),
+    (0xFC03, 'M', u'ئى'),
+    (0xFC04, 'M', u'ئي'),
+    (0xFC05, 'M', u'بج'),
+    (0xFC06, 'M', u'بح'),
+    (0xFC07, 'M', u'بخ'),
+    (0xFC08, 'M', u'بم'),
+    (0xFC09, 'M', u'بى'),
+    (0xFC0A, 'M', u'بي'),
+    (0xFC0B, 'M', u'تج'),
+    (0xFC0C, 'M', u'تح'),
+    (0xFC0D, 'M', u'تخ'),
+    (0xFC0E, 'M', u'تم'),
+    (0xFC0F, 'M', u'تى'),
+    (0xFC10, 'M', u'تي'),
+    (0xFC11, 'M', u'ثج'),
+    (0xFC12, 'M', u'ثم'),
+    (0xFC13, 'M', u'ثى'),
+    (0xFC14, 'M', u'ثي'),
+    (0xFC15, 'M', u'جح'),
+    (0xFC16, 'M', u'جم'),
+    (0xFC17, 'M', u'حج'),
+    (0xFC18, 'M', u'حم'),
+    (0xFC19, 'M', u'خج'),
+    (0xFC1A, 'M', u'خح'),
+    (0xFC1B, 'M', u'خم'),
+    (0xFC1C, 'M', u'سج'),
+    (0xFC1D, 'M', u'سح'),
+    (0xFC1E, 'M', u'سخ'),
+    (0xFC1F, 'M', u'سم'),
+    (0xFC20, 'M', u'صح'),
+    (0xFC21, 'M', u'صم'),
+    (0xFC22, 'M', u'ضج'),
+    (0xFC23, 'M', u'ضح'),
+    (0xFC24, 'M', u'ضخ'),
+    (0xFC25, 'M', u'ضم'),
+    (0xFC26, 'M', u'طح'),
+    ]
+
+def _seg_45():
+    return [
+    (0xFC27, 'M', u'طم'),
+    (0xFC28, 'M', u'ظم'),
+    (0xFC29, 'M', u'عج'),
+    (0xFC2A, 'M', u'عم'),
+    (0xFC2B, 'M', u'غج'),
+    (0xFC2C, 'M', u'غم'),
+    (0xFC2D, 'M', u'فج'),
+    (0xFC2E, 'M', u'فح'),
+    (0xFC2F, 'M', u'فخ'),
+    (0xFC30, 'M', u'فم'),
+    (0xFC31, 'M', u'فى'),
+    (0xFC32, 'M', u'في'),
+    (0xFC33, 'M', u'قح'),
+    (0xFC34, 'M', u'قم'),
+    (0xFC35, 'M', u'قى'),
+    (0xFC36, 'M', u'قي'),
+    (0xFC37, 'M', u'كا'),
+    (0xFC38, 'M', u'كج'),
+    (0xFC39, 'M', u'كح'),
+    (0xFC3A, 'M', u'كخ'),
+    (0xFC3B, 'M', u'كل'),
+    (0xFC3C, 'M', u'كم'),
+    (0xFC3D, 'M', u'كى'),
+    (0xFC3E, 'M', u'كي'),
+    (0xFC3F, 'M', u'لج'),
+    (0xFC40, 'M', u'لح'),
+    (0xFC41, 'M', u'لخ'),
+    (0xFC42, 'M', u'لم'),
+    (0xFC43, 'M', u'لى'),
+    (0xFC44, 'M', u'لي'),
+    (0xFC45, 'M', u'مج'),
+    (0xFC46, 'M', u'مح'),
+    (0xFC47, 'M', u'مخ'),
+    (0xFC48, 'M', u'مم'),
+    (0xFC49, 'M', u'مى'),
+    (0xFC4A, 'M', u'مي'),
+    (0xFC4B, 'M', u'نج'),
+    (0xFC4C, 'M', u'نح'),
+    (0xFC4D, 'M', u'نخ'),
+    (0xFC4E, 'M', u'نم'),
+    (0xFC4F, 'M', u'نى'),
+    (0xFC50, 'M', u'ني'),
+    (0xFC51, 'M', u'هج'),
+    (0xFC52, 'M', u'هم'),
+    (0xFC53, 'M', u'هى'),
+    (0xFC54, 'M', u'هي'),
+    (0xFC55, 'M', u'يج'),
+    (0xFC56, 'M', u'يح'),
+    (0xFC57, 'M', u'يخ'),
+    (0xFC58, 'M', u'يم'),
+    (0xFC59, 'M', u'يى'),
+    (0xFC5A, 'M', u'يي'),
+    (0xFC5B, 'M', u'ذٰ'),
+    (0xFC5C, 'M', u'رٰ'),
+    (0xFC5D, 'M', u'ىٰ'),
+    (0xFC5E, '3', u' ٌّ'),
+    (0xFC5F, '3', u' ٍّ'),
+    (0xFC60, '3', u' َّ'),
+    (0xFC61, '3', u' ُّ'),
+    (0xFC62, '3', u' ِّ'),
+    (0xFC63, '3', u' ّٰ'),
+    (0xFC64, 'M', u'ئر'),
+    (0xFC65, 'M', u'ئز'),
+    (0xFC66, 'M', u'ئم'),
+    (0xFC67, 'M', u'ئن'),
+    (0xFC68, 'M', u'ئى'),
+    (0xFC69, 'M', u'ئي'),
+    (0xFC6A, 'M', u'بر'),
+    (0xFC6B, 'M', u'بز'),
+    (0xFC6C, 'M', u'بم'),
+    (0xFC6D, 'M', u'بن'),
+    (0xFC6E, 'M', u'بى'),
+    (0xFC6F, 'M', u'بي'),
+    (0xFC70, 'M', u'تر'),
+    (0xFC71, 'M', u'تز'),
+    (0xFC72, 'M', u'تم'),
+    (0xFC73, 'M', u'تن'),
+    (0xFC74, 'M', u'تى'),
+    (0xFC75, 'M', u'تي'),
+    (0xFC76, 'M', u'ثر'),
+    (0xFC77, 'M', u'ثز'),
+    (0xFC78, 'M', u'ثم'),
+    (0xFC79, 'M', u'ثن'),
+    (0xFC7A, 'M', u'ثى'),
+    (0xFC7B, 'M', u'ثي'),
+    (0xFC7C, 'M', u'فى'),
+    (0xFC7D, 'M', u'في'),
+    (0xFC7E, 'M', u'قى'),
+    (0xFC7F, 'M', u'قي'),
+    (0xFC80, 'M', u'كا'),
+    (0xFC81, 'M', u'كل'),
+    (0xFC82, 'M', u'كم'),
+    (0xFC83, 'M', u'كى'),
+    (0xFC84, 'M', u'كي'),
+    (0xFC85, 'M', u'لم'),
+    (0xFC86, 'M', u'لى'),
+    (0xFC87, 'M', u'لي'),
+    (0xFC88, 'M', u'ما'),
+    (0xFC89, 'M', u'مم'),
+    (0xFC8A, 'M', u'نر'),
+    ]
+
+def _seg_46():
+    return [
+    (0xFC8B, 'M', u'نز'),
+    (0xFC8C, 'M', u'نم'),
+    (0xFC8D, 'M', u'نن'),
+    (0xFC8E, 'M', u'نى'),
+    (0xFC8F, 'M', u'ني'),
+    (0xFC90, 'M', u'ىٰ'),
+    (0xFC91, 'M', u'ير'),
+    (0xFC92, 'M', u'يز'),
+    (0xFC93, 'M', u'يم'),
+    (0xFC94, 'M', u'ين'),
+    (0xFC95, 'M', u'يى'),
+    (0xFC96, 'M', u'يي'),
+    (0xFC97, 'M', u'ئج'),
+    (0xFC98, 'M', u'ئح'),
+    (0xFC99, 'M', u'ئخ'),
+    (0xFC9A, 'M', u'ئم'),
+    (0xFC9B, 'M', u'ئه'),
+    (0xFC9C, 'M', u'بج'),
+    (0xFC9D, 'M', u'بح'),
+    (0xFC9E, 'M', u'بخ'),
+    (0xFC9F, 'M', u'بم'),
+    (0xFCA0, 'M', u'به'),
+    (0xFCA1, 'M', u'تج'),
+    (0xFCA2, 'M', u'تح'),
+    (0xFCA3, 'M', u'تخ'),
+    (0xFCA4, 'M', u'تم'),
+    (0xFCA5, 'M', u'ته'),
+    (0xFCA6, 'M', u'ثم'),
+    (0xFCA7, 'M', u'جح'),
+    (0xFCA8, 'M', u'جم'),
+    (0xFCA9, 'M', u'حج'),
+    (0xFCAA, 'M', u'حم'),
+    (0xFCAB, 'M', u'خج'),
+    (0xFCAC, 'M', u'خم'),
+    (0xFCAD, 'M', u'سج'),
+    (0xFCAE, 'M', u'سح'),
+    (0xFCAF, 'M', u'سخ'),
+    (0xFCB0, 'M', u'سم'),
+    (0xFCB1, 'M', u'صح'),
+    (0xFCB2, 'M', u'صخ'),
+    (0xFCB3, 'M', u'صم'),
+    (0xFCB4, 'M', u'ضج'),
+    (0xFCB5, 'M', u'ضح'),
+    (0xFCB6, 'M', u'ضخ'),
+    (0xFCB7, 'M', u'ضم'),
+    (0xFCB8, 'M', u'طح'),
+    (0xFCB9, 'M', u'ظم'),
+    (0xFCBA, 'M', u'عج'),
+    (0xFCBB, 'M', u'عم'),
+    (0xFCBC, 'M', u'غج'),
+    (0xFCBD, 'M', u'غم'),
+    (0xFCBE, 'M', u'فج'),
+    (0xFCBF, 'M', u'فح'),
+    (0xFCC0, 'M', u'فخ'),
+    (0xFCC1, 'M', u'فم'),
+    (0xFCC2, 'M', u'قح'),
+    (0xFCC3, 'M', u'قم'),
+    (0xFCC4, 'M', u'كج'),
+    (0xFCC5, 'M', u'كح'),
+    (0xFCC6, 'M', u'كخ'),
+    (0xFCC7, 'M', u'كل'),
+    (0xFCC8, 'M', u'كم'),
+    (0xFCC9, 'M', u'لج'),
+    (0xFCCA, 'M', u'لح'),
+    (0xFCCB, 'M', u'لخ'),
+    (0xFCCC, 'M', u'لم'),
+    (0xFCCD, 'M', u'له'),
+    (0xFCCE, 'M', u'مج'),
+    (0xFCCF, 'M', u'مح'),
+    (0xFCD0, 'M', u'مخ'),
+    (0xFCD1, 'M', u'مم'),
+    (0xFCD2, 'M', u'نج'),
+    (0xFCD3, 'M', u'نح'),
+    (0xFCD4, 'M', u'نخ'),
+    (0xFCD5, 'M', u'نم'),
+    (0xFCD6, 'M', u'نه'),
+    (0xFCD7, 'M', u'هج'),
+    (0xFCD8, 'M', u'هم'),
+    (0xFCD9, 'M', u'هٰ'),
+    (0xFCDA, 'M', u'يج'),
+    (0xFCDB, 'M', u'يح'),
+    (0xFCDC, 'M', u'يخ'),
+    (0xFCDD, 'M', u'يم'),
+    (0xFCDE, 'M', u'يه'),
+    (0xFCDF, 'M', u'ئم'),
+    (0xFCE0, 'M', u'ئه'),
+    (0xFCE1, 'M', u'بم'),
+    (0xFCE2, 'M', u'به'),
+    (0xFCE3, 'M', u'تم'),
+    (0xFCE4, 'M', u'ته'),
+    (0xFCE5, 'M', u'ثم'),
+    (0xFCE6, 'M', u'ثه'),
+    (0xFCE7, 'M', u'سم'),
+    (0xFCE8, 'M', u'سه'),
+    (0xFCE9, 'M', u'شم'),
+    (0xFCEA, 'M', u'شه'),
+    (0xFCEB, 'M', u'كل'),
+    (0xFCEC, 'M', u'كم'),
+    (0xFCED, 'M', u'لم'),
+    (0xFCEE, 'M', u'نم'),
+    ]
+
+def _seg_47():
+    return [
+    (0xFCEF, 'M', u'نه'),
+    (0xFCF0, 'M', u'يم'),
+    (0xFCF1, 'M', u'يه'),
+    (0xFCF2, 'M', u'ـَّ'),
+    (0xFCF3, 'M', u'ـُّ'),
+    (0xFCF4, 'M', u'ـِّ'),
+    (0xFCF5, 'M', u'طى'),
+    (0xFCF6, 'M', u'طي'),
+    (0xFCF7, 'M', u'عى'),
+    (0xFCF8, 'M', u'عي'),
+    (0xFCF9, 'M', u'غى'),
+    (0xFCFA, 'M', u'غي'),
+    (0xFCFB, 'M', u'سى'),
+    (0xFCFC, 'M', u'سي'),
+    (0xFCFD, 'M', u'شى'),
+    (0xFCFE, 'M', u'شي'),
+    (0xFCFF, 'M', u'حى'),
+    (0xFD00, 'M', u'حي'),
+    (0xFD01, 'M', u'جى'),
+    (0xFD02, 'M', u'جي'),
+    (0xFD03, 'M', u'خى'),
+    (0xFD04, 'M', u'خي'),
+    (0xFD05, 'M', u'صى'),
+    (0xFD06, 'M', u'صي'),
+    (0xFD07, 'M', u'ضى'),
+    (0xFD08, 'M', u'ضي'),
+    (0xFD09, 'M', u'شج'),
+    (0xFD0A, 'M', u'شح'),
+    (0xFD0B, 'M', u'شخ'),
+    (0xFD0C, 'M', u'شم'),
+    (0xFD0D, 'M', u'شر'),
+    (0xFD0E, 'M', u'سر'),
+    (0xFD0F, 'M', u'صر'),
+    (0xFD10, 'M', u'ضر'),
+    (0xFD11, 'M', u'طى'),
+    (0xFD12, 'M', u'طي'),
+    (0xFD13, 'M', u'عى'),
+    (0xFD14, 'M', u'عي'),
+    (0xFD15, 'M', u'غى'),
+    (0xFD16, 'M', u'غي'),
+    (0xFD17, 'M', u'سى'),
+    (0xFD18, 'M', u'سي'),
+    (0xFD19, 'M', u'شى'),
+    (0xFD1A, 'M', u'شي'),
+    (0xFD1B, 'M', u'حى'),
+    (0xFD1C, 'M', u'حي'),
+    (0xFD1D, 'M', u'جى'),
+    (0xFD1E, 'M', u'جي'),
+    (0xFD1F, 'M', u'خى'),
+    (0xFD20, 'M', u'خي'),
+    (0xFD21, 'M', u'صى'),
+    (0xFD22, 'M', u'صي'),
+    (0xFD23, 'M', u'ضى'),
+    (0xFD24, 'M', u'ضي'),
+    (0xFD25, 'M', u'شج'),
+    (0xFD26, 'M', u'شح'),
+    (0xFD27, 'M', u'شخ'),
+    (0xFD28, 'M', u'شم'),
+    (0xFD29, 'M', u'شر'),
+    (0xFD2A, 'M', u'سر'),
+    (0xFD2B, 'M', u'صر'),
+    (0xFD2C, 'M', u'ضر'),
+    (0xFD2D, 'M', u'شج'),
+    (0xFD2E, 'M', u'شح'),
+    (0xFD2F, 'M', u'شخ'),
+    (0xFD30, 'M', u'شم'),
+    (0xFD31, 'M', u'سه'),
+    (0xFD32, 'M', u'شه'),
+    (0xFD33, 'M', u'طم'),
+    (0xFD34, 'M', u'سج'),
+    (0xFD35, 'M', u'سح'),
+    (0xFD36, 'M', u'سخ'),
+    (0xFD37, 'M', u'شج'),
+    (0xFD38, 'M', u'شح'),
+    (0xFD39, 'M', u'شخ'),
+    (0xFD3A, 'M', u'طم'),
+    (0xFD3B, 'M', u'ظم'),
+    (0xFD3C, 'M', u'اً'),
+    (0xFD3E, 'V'),
+    (0xFD40, 'X'),
+    (0xFD50, 'M', u'تجم'),
+    (0xFD51, 'M', u'تحج'),
+    (0xFD53, 'M', u'تحم'),
+    (0xFD54, 'M', u'تخم'),
+    (0xFD55, 'M', u'تمج'),
+    (0xFD56, 'M', u'تمح'),
+    (0xFD57, 'M', u'تمخ'),
+    (0xFD58, 'M', u'جمح'),
+    (0xFD5A, 'M', u'حمي'),
+    (0xFD5B, 'M', u'حمى'),
+    (0xFD5C, 'M', u'سحج'),
+    (0xFD5D, 'M', u'سجح'),
+    (0xFD5E, 'M', u'سجى'),
+    (0xFD5F, 'M', u'سمح'),
+    (0xFD61, 'M', u'سمج'),
+    (0xFD62, 'M', u'سمم'),
+    (0xFD64, 'M', u'صحح'),
+    (0xFD66, 'M', u'صمم'),
+    (0xFD67, 'M', u'شحم'),
+    (0xFD69, 'M', u'شجي'),
+    ]
+
+def _seg_48():
+    return [
+    (0xFD6A, 'M', u'شمخ'),
+    (0xFD6C, 'M', u'شمم'),
+    (0xFD6E, 'M', u'ضحى'),
+    (0xFD6F, 'M', u'ضخم'),
+    (0xFD71, 'M', u'طمح'),
+    (0xFD73, 'M', u'طمم'),
+    (0xFD74, 'M', u'طمي'),
+    (0xFD75, 'M', u'عجم'),
+    (0xFD76, 'M', u'عمم'),
+    (0xFD78, 'M', u'عمى'),
+    (0xFD79, 'M', u'غمم'),
+    (0xFD7A, 'M', u'غمي'),
+    (0xFD7B, 'M', u'غمى'),
+    (0xFD7C, 'M', u'فخم'),
+    (0xFD7E, 'M', u'قمح'),
+    (0xFD7F, 'M', u'قمم'),
+    (0xFD80, 'M', u'لحم'),
+    (0xFD81, 'M', u'لحي'),
+    (0xFD82, 'M', u'لحى'),
+    (0xFD83, 'M', u'لجج'),
+    (0xFD85, 'M', u'لخم'),
+    (0xFD87, 'M', u'لمح'),
+    (0xFD89, 'M', u'محج'),
+    (0xFD8A, 'M', u'محم'),
+    (0xFD8B, 'M', u'محي'),
+    (0xFD8C, 'M', u'مجح'),
+    (0xFD8D, 'M', u'مجم'),
+    (0xFD8E, 'M', u'مخج'),
+    (0xFD8F, 'M', u'مخم'),
+    (0xFD90, 'X'),
+    (0xFD92, 'M', u'مجخ'),
+    (0xFD93, 'M', u'همج'),
+    (0xFD94, 'M', u'همم'),
+    (0xFD95, 'M', u'نحم'),
+    (0xFD96, 'M', u'نحى'),
+    (0xFD97, 'M', u'نجم'),
+    (0xFD99, 'M', u'نجى'),
+    (0xFD9A, 'M', u'نمي'),
+    (0xFD9B, 'M', u'نمى'),
+    (0xFD9C, 'M', u'يمم'),
+    (0xFD9E, 'M', u'بخي'),
+    (0xFD9F, 'M', u'تجي'),
+    (0xFDA0, 'M', u'تجى'),
+    (0xFDA1, 'M', u'تخي'),
+    (0xFDA2, 'M', u'تخى'),
+    (0xFDA3, 'M', u'تمي'),
+    (0xFDA4, 'M', u'تمى'),
+    (0xFDA5, 'M', u'جمي'),
+    (0xFDA6, 'M', u'جحى'),
+    (0xFDA7, 'M', u'جمى'),
+    (0xFDA8, 'M', u'سخى'),
+    (0xFDA9, 'M', u'صحي'),
+    (0xFDAA, 'M', u'شحي'),
+    (0xFDAB, 'M', u'ضحي'),
+    (0xFDAC, 'M', u'لجي'),
+    (0xFDAD, 'M', u'لمي'),
+    (0xFDAE, 'M', u'يحي'),
+    (0xFDAF, 'M', u'يجي'),
+    (0xFDB0, 'M', u'يمي'),
+    (0xFDB1, 'M', u'ممي'),
+    (0xFDB2, 'M', u'قمي'),
+    (0xFDB3, 'M', u'نحي'),
+    (0xFDB4, 'M', u'قمح'),
+    (0xFDB5, 'M', u'لحم'),
+    (0xFDB6, 'M', u'عمي'),
+    (0xFDB7, 'M', u'كمي'),
+    (0xFDB8, 'M', u'نجح'),
+    (0xFDB9, 'M', u'مخي'),
+    (0xFDBA, 'M', u'لجم'),
+    (0xFDBB, 'M', u'كمم'),
+    (0xFDBC, 'M', u'لجم'),
+    (0xFDBD, 'M', u'نجح'),
+    (0xFDBE, 'M', u'جحي'),
+    (0xFDBF, 'M', u'حجي'),
+    (0xFDC0, 'M', u'مجي'),
+    (0xFDC1, 'M', u'فمي'),
+    (0xFDC2, 'M', u'بحي'),
+    (0xFDC3, 'M', u'كمم'),
+    (0xFDC4, 'M', u'عجم'),
+    (0xFDC5, 'M', u'صمم'),
+    (0xFDC6, 'M', u'سخي'),
+    (0xFDC7, 'M', u'نجي'),
+    (0xFDC8, 'X'),
+    (0xFDF0, 'M', u'صلے'),
+    (0xFDF1, 'M', u'قلے'),
+    (0xFDF2, 'M', u'الله'),
+    (0xFDF3, 'M', u'اكبر'),
+    (0xFDF4, 'M', u'محمد'),
+    (0xFDF5, 'M', u'صلعم'),
+    (0xFDF6, 'M', u'رسول'),
+    (0xFDF7, 'M', u'عليه'),
+    (0xFDF8, 'M', u'وسلم'),
+    (0xFDF9, 'M', u'صلى'),
+    (0xFDFA, '3', u'صلى الله عليه وسلم'),
+    (0xFDFB, '3', u'جل جلاله'),
+    (0xFDFC, 'M', u'ریال'),
+    (0xFDFD, 'V'),
+    (0xFDFE, 'X'),
+    (0xFE00, 'I'),
+    (0xFE10, '3', u','),
+    ]
+
+def _seg_49():
+    return [
+    (0xFE11, 'M', u'、'),
+    (0xFE12, 'X'),
+    (0xFE13, '3', u':'),
+    (0xFE14, '3', u';'),
+    (0xFE15, '3', u'!'),
+    (0xFE16, '3', u'?'),
+    (0xFE17, 'M', u'〖'),
+    (0xFE18, 'M', u'〗'),
+    (0xFE19, 'X'),
+    (0xFE20, 'V'),
+    (0xFE30, 'X'),
+    (0xFE31, 'M', u'—'),
+    (0xFE32, 'M', u'–'),
+    (0xFE33, '3', u'_'),
+    (0xFE35, '3', u'('),
+    (0xFE36, '3', u')'),
+    (0xFE37, '3', u'{'),
+    (0xFE38, '3', u'}'),
+    (0xFE39, 'M', u'〔'),
+    (0xFE3A, 'M', u'〕'),
+    (0xFE3B, 'M', u'【'),
+    (0xFE3C, 'M', u'】'),
+    (0xFE3D, 'M', u'《'),
+    (0xFE3E, 'M', u'》'),
+    (0xFE3F, 'M', u'〈'),
+    (0xFE40, 'M', u'〉'),
+    (0xFE41, 'M', u'「'),
+    (0xFE42, 'M', u'」'),
+    (0xFE43, 'M', u'『'),
+    (0xFE44, 'M', u'』'),
+    (0xFE45, 'V'),
+    (0xFE47, '3', u'['),
+    (0xFE48, '3', u']'),
+    (0xFE49, '3', u' ̅'),
+    (0xFE4D, '3', u'_'),
+    (0xFE50, '3', u','),
+    (0xFE51, 'M', u'、'),
+    (0xFE52, 'X'),
+    (0xFE54, '3', u';'),
+    (0xFE55, '3', u':'),
+    (0xFE56, '3', u'?'),
+    (0xFE57, '3', u'!'),
+    (0xFE58, 'M', u'—'),
+    (0xFE59, '3', u'('),
+    (0xFE5A, '3', u')'),
+    (0xFE5B, '3', u'{'),
+    (0xFE5C, '3', u'}'),
+    (0xFE5D, 'M', u'〔'),
+    (0xFE5E, 'M', u'〕'),
+    (0xFE5F, '3', u'#'),
+    (0xFE60, '3', u'&'),
+    (0xFE61, '3', u'*'),
+    (0xFE62, '3', u'+'),
+    (0xFE63, 'M', u'-'),
+    (0xFE64, '3', u'<'),
+    (0xFE65, '3', u'>'),
+    (0xFE66, '3', u'='),
+    (0xFE67, 'X'),
+    (0xFE68, '3', u'\\'),
+    (0xFE69, '3', u'$'),
+    (0xFE6A, '3', u'%'),
+    (0xFE6B, '3', u'@'),
+    (0xFE6C, 'X'),
+    (0xFE70, '3', u' ً'),
+    (0xFE71, 'M', u'ـً'),
+    (0xFE72, '3', u' ٌ'),
+    (0xFE73, 'V'),
+    (0xFE74, '3', u' ٍ'),
+    (0xFE75, 'X'),
+    (0xFE76, '3', u' َ'),
+    (0xFE77, 'M', u'ـَ'),
+    (0xFE78, '3', u' ُ'),
+    (0xFE79, 'M', u'ـُ'),
+    (0xFE7A, '3', u' ِ'),
+    (0xFE7B, 'M', u'ـِ'),
+    (0xFE7C, '3', u' ّ'),
+    (0xFE7D, 'M', u'ـّ'),
+    (0xFE7E, '3', u' ْ'),
+    (0xFE7F, 'M', u'ـْ'),
+    (0xFE80, 'M', u'ء'),
+    (0xFE81, 'M', u'آ'),
+    (0xFE83, 'M', u'أ'),
+    (0xFE85, 'M', u'ؤ'),
+    (0xFE87, 'M', u'إ'),
+    (0xFE89, 'M', u'ئ'),
+    (0xFE8D, 'M', u'ا'),
+    (0xFE8F, 'M', u'ب'),
+    (0xFE93, 'M', u'ة'),
+    (0xFE95, 'M', u'ت'),
+    (0xFE99, 'M', u'ث'),
+    (0xFE9D, 'M', u'ج'),
+    (0xFEA1, 'M', u'ح'),
+    (0xFEA5, 'M', u'خ'),
+    (0xFEA9, 'M', u'د'),
+    (0xFEAB, 'M', u'ذ'),
+    (0xFEAD, 'M', u'ر'),
+    (0xFEAF, 'M', u'ز'),
+    (0xFEB1, 'M', u'س'),
+    (0xFEB5, 'M', u'ش'),
+    (0xFEB9, 'M', u'ص'),
+    ]
+
+def _seg_50():
+    return [
+    (0xFEBD, 'M', u'ض'),
+    (0xFEC1, 'M', u'ط'),
+    (0xFEC5, 'M', u'ظ'),
+    (0xFEC9, 'M', u'ع'),
+    (0xFECD, 'M', u'غ'),
+    (0xFED1, 'M', u'ف'),
+    (0xFED5, 'M', u'ق'),
+    (0xFED9, 'M', u'ك'),
+    (0xFEDD, 'M', u'ل'),
+    (0xFEE1, 'M', u'م'),
+    (0xFEE5, 'M', u'ن'),
+    (0xFEE9, 'M', u'ه'),
+    (0xFEED, 'M', u'و'),
+    (0xFEEF, 'M', u'ى'),
+    (0xFEF1, 'M', u'ي'),
+    (0xFEF5, 'M', u'لآ'),
+    (0xFEF7, 'M', u'لأ'),
+    (0xFEF9, 'M', u'لإ'),
+    (0xFEFB, 'M', u'لا'),
+    (0xFEFD, 'X'),
+    (0xFEFF, 'I'),
+    (0xFF00, 'X'),
+    (0xFF01, '3', u'!'),
+    (0xFF02, '3', u'"'),
+    (0xFF03, '3', u'#'),
+    (0xFF04, '3', u'$'),
+    (0xFF05, '3', u'%'),
+    (0xFF06, '3', u'&'),
+    (0xFF07, '3', u'\''),
+    (0xFF08, '3', u'('),
+    (0xFF09, '3', u')'),
+    (0xFF0A, '3', u'*'),
+    (0xFF0B, '3', u'+'),
+    (0xFF0C, '3', u','),
+    (0xFF0D, 'M', u'-'),
+    (0xFF0E, 'M', u'.'),
+    (0xFF0F, '3', u'/'),
+    (0xFF10, 'M', u'0'),
+    (0xFF11, 'M', u'1'),
+    (0xFF12, 'M', u'2'),
+    (0xFF13, 'M', u'3'),
+    (0xFF14, 'M', u'4'),
+    (0xFF15, 'M', u'5'),
+    (0xFF16, 'M', u'6'),
+    (0xFF17, 'M', u'7'),
+    (0xFF18, 'M', u'8'),
+    (0xFF19, 'M', u'9'),
+    (0xFF1A, '3', u':'),
+    (0xFF1B, '3', u';'),
+    (0xFF1C, '3', u'<'),
+    (0xFF1D, '3', u'='),
+    (0xFF1E, '3', u'>'),
+    (0xFF1F, '3', u'?'),
+    (0xFF20, '3', u'@'),
+    (0xFF21, 'M', u'a'),
+    (0xFF22, 'M', u'b'),
+    (0xFF23, 'M', u'c'),
+    (0xFF24, 'M', u'd'),
+    (0xFF25, 'M', u'e'),
+    (0xFF26, 'M', u'f'),
+    (0xFF27, 'M', u'g'),
+    (0xFF28, 'M', u'h'),
+    (0xFF29, 'M', u'i'),
+    (0xFF2A, 'M', u'j'),
+    (0xFF2B, 'M', u'k'),
+    (0xFF2C, 'M', u'l'),
+    (0xFF2D, 'M', u'm'),
+    (0xFF2E, 'M', u'n'),
+    (0xFF2F, 'M', u'o'),
+    (0xFF30, 'M', u'p'),
+    (0xFF31, 'M', u'q'),
+    (0xFF32, 'M', u'r'),
+    (0xFF33, 'M', u's'),
+    (0xFF34, 'M', u't'),
+    (0xFF35, 'M', u'u'),
+    (0xFF36, 'M', u'v'),
+    (0xFF37, 'M', u'w'),
+    (0xFF38, 'M', u'x'),
+    (0xFF39, 'M', u'y'),
+    (0xFF3A, 'M', u'z'),
+    (0xFF3B, '3', u'['),
+    (0xFF3C, '3', u'\\'),
+    (0xFF3D, '3', u']'),
+    (0xFF3E, '3', u'^'),
+    (0xFF3F, '3', u'_'),
+    (0xFF40, '3', u'`'),
+    (0xFF41, 'M', u'a'),
+    (0xFF42, 'M', u'b'),
+    (0xFF43, 'M', u'c'),
+    (0xFF44, 'M', u'd'),
+    (0xFF45, 'M', u'e'),
+    (0xFF46, 'M', u'f'),
+    (0xFF47, 'M', u'g'),
+    (0xFF48, 'M', u'h'),
+    (0xFF49, 'M', u'i'),
+    (0xFF4A, 'M', u'j'),
+    (0xFF4B, 'M', u'k'),
+    (0xFF4C, 'M', u'l'),
+    (0xFF4D, 'M', u'm'),
+    (0xFF4E, 'M', u'n'),
+    ]
+
+def _seg_51():
+    return [
+    (0xFF4F, 'M', u'o'),
+    (0xFF50, 'M', u'p'),
+    (0xFF51, 'M', u'q'),
+    (0xFF52, 'M', u'r'),
+    (0xFF53, 'M', u's'),
+    (0xFF54, 'M', u't'),
+    (0xFF55, 'M', u'u'),
+    (0xFF56, 'M', u'v'),
+    (0xFF57, 'M', u'w'),
+    (0xFF58, 'M', u'x'),
+    (0xFF59, 'M', u'y'),
+    (0xFF5A, 'M', u'z'),
+    (0xFF5B, '3', u'{'),
+    (0xFF5C, '3', u'|'),
+    (0xFF5D, '3', u'}'),
+    (0xFF5E, '3', u'~'),
+    (0xFF5F, 'M', u'⦅'),
+    (0xFF60, 'M', u'⦆'),
+    (0xFF61, 'M', u'.'),
+    (0xFF62, 'M', u'「'),
+    (0xFF63, 'M', u'」'),
+    (0xFF64, 'M', u'、'),
+    (0xFF65, 'M', u'・'),
+    (0xFF66, 'M', u'ヲ'),
+    (0xFF67, 'M', u'ァ'),
+    (0xFF68, 'M', u'ィ'),
+    (0xFF69, 'M', u'ゥ'),
+    (0xFF6A, 'M', u'ェ'),
+    (0xFF6B, 'M', u'ォ'),
+    (0xFF6C, 'M', u'ャ'),
+    (0xFF6D, 'M', u'ュ'),
+    (0xFF6E, 'M', u'ョ'),
+    (0xFF6F, 'M', u'ッ'),
+    (0xFF70, 'M', u'ー'),
+    (0xFF71, 'M', u'ア'),
+    (0xFF72, 'M', u'イ'),
+    (0xFF73, 'M', u'ウ'),
+    (0xFF74, 'M', u'エ'),
+    (0xFF75, 'M', u'オ'),
+    (0xFF76, 'M', u'カ'),
+    (0xFF77, 'M', u'キ'),
+    (0xFF78, 'M', u'ク'),
+    (0xFF79, 'M', u'ケ'),
+    (0xFF7A, 'M', u'コ'),
+    (0xFF7B, 'M', u'サ'),
+    (0xFF7C, 'M', u'シ'),
+    (0xFF7D, 'M', u'ス'),
+    (0xFF7E, 'M', u'セ'),
+    (0xFF7F, 'M', u'ソ'),
+    (0xFF80, 'M', u'タ'),
+    (0xFF81, 'M', u'チ'),
+    (0xFF82, 'M', u'ツ'),
+    (0xFF83, 'M', u'テ'),
+    (0xFF84, 'M', u'ト'),
+    (0xFF85, 'M', u'ナ'),
+    (0xFF86, 'M', u'ニ'),
+    (0xFF87, 'M', u'ヌ'),
+    (0xFF88, 'M', u'ネ'),
+    (0xFF89, 'M', u'ノ'),
+    (0xFF8A, 'M', u'ハ'),
+    (0xFF8B, 'M', u'ヒ'),
+    (0xFF8C, 'M', u'フ'),
+    (0xFF8D, 'M', u'ヘ'),
+    (0xFF8E, 'M', u'ホ'),
+    (0xFF8F, 'M', u'マ'),
+    (0xFF90, 'M', u'ミ'),
+    (0xFF91, 'M', u'ム'),
+    (0xFF92, 'M', u'メ'),
+    (0xFF93, 'M', u'モ'),
+    (0xFF94, 'M', u'ヤ'),
+    (0xFF95, 'M', u'ユ'),
+    (0xFF96, 'M', u'ヨ'),
+    (0xFF97, 'M', u'ラ'),
+    (0xFF98, 'M', u'リ'),
+    (0xFF99, 'M', u'ル'),
+    (0xFF9A, 'M', u'レ'),
+    (0xFF9B, 'M', u'ロ'),
+    (0xFF9C, 'M', u'ワ'),
+    (0xFF9D, 'M', u'ン'),
+    (0xFF9E, 'M', u'゙'),
+    (0xFF9F, 'M', u'゚'),
+    (0xFFA0, 'X'),
+    (0xFFA1, 'M', u'ᄀ'),
+    (0xFFA2, 'M', u'ᄁ'),
+    (0xFFA3, 'M', u'ᆪ'),
+    (0xFFA4, 'M', u'ᄂ'),
+    (0xFFA5, 'M', u'ᆬ'),
+    (0xFFA6, 'M', u'ᆭ'),
+    (0xFFA7, 'M', u'ᄃ'),
+    (0xFFA8, 'M', u'ᄄ'),
+    (0xFFA9, 'M', u'ᄅ'),
+    (0xFFAA, 'M', u'ᆰ'),
+    (0xFFAB, 'M', u'ᆱ'),
+    (0xFFAC, 'M', u'ᆲ'),
+    (0xFFAD, 'M', u'ᆳ'),
+    (0xFFAE, 'M', u'ᆴ'),
+    (0xFFAF, 'M', u'ᆵ'),
+    (0xFFB0, 'M', u'ᄚ'),
+    (0xFFB1, 'M', u'ᄆ'),
+    (0xFFB2, 'M', u'ᄇ'),
+    ]
+
+def _seg_52():
+    return [
+    (0xFFB3, 'M', u'ᄈ'),
+    (0xFFB4, 'M', u'ᄡ'),
+    (0xFFB5, 'M', u'ᄉ'),
+    (0xFFB6, 'M', u'ᄊ'),
+    (0xFFB7, 'M', u'ᄋ'),
+    (0xFFB8, 'M', u'ᄌ'),
+    (0xFFB9, 'M', u'ᄍ'),
+    (0xFFBA, 'M', u'ᄎ'),
+    (0xFFBB, 'M', u'ᄏ'),
+    (0xFFBC, 'M', u'ᄐ'),
+    (0xFFBD, 'M', u'ᄑ'),
+    (0xFFBE, 'M', u'ᄒ'),
+    (0xFFBF, 'X'),
+    (0xFFC2, 'M', u'ᅡ'),
+    (0xFFC3, 'M', u'ᅢ'),
+    (0xFFC4, 'M', u'ᅣ'),
+    (0xFFC5, 'M', u'ᅤ'),
+    (0xFFC6, 'M', u'ᅥ'),
+    (0xFFC7, 'M', u'ᅦ'),
+    (0xFFC8, 'X'),
+    (0xFFCA, 'M', u'ᅧ'),
+    (0xFFCB, 'M', u'ᅨ'),
+    (0xFFCC, 'M', u'ᅩ'),
+    (0xFFCD, 'M', u'ᅪ'),
+    (0xFFCE, 'M', u'ᅫ'),
+    (0xFFCF, 'M', u'ᅬ'),
+    (0xFFD0, 'X'),
+    (0xFFD2, 'M', u'ᅭ'),
+    (0xFFD3, 'M', u'ᅮ'),
+    (0xFFD4, 'M', u'ᅯ'),
+    (0xFFD5, 'M', u'ᅰ'),
+    (0xFFD6, 'M', u'ᅱ'),
+    (0xFFD7, 'M', u'ᅲ'),
+    (0xFFD8, 'X'),
+    (0xFFDA, 'M', u'ᅳ'),
+    (0xFFDB, 'M', u'ᅴ'),
+    (0xFFDC, 'M', u'ᅵ'),
+    (0xFFDD, 'X'),
+    (0xFFE0, 'M', u'¢'),
+    (0xFFE1, 'M', u'£'),
+    (0xFFE2, 'M', u'¬'),
+    (0xFFE3, '3', u' ̄'),
+    (0xFFE4, 'M', u'¦'),
+    (0xFFE5, 'M', u'¥'),
+    (0xFFE6, 'M', u'₩'),
+    (0xFFE7, 'X'),
+    (0xFFE8, 'M', u'│'),
+    (0xFFE9, 'M', u'←'),
+    (0xFFEA, 'M', u'↑'),
+    (0xFFEB, 'M', u'→'),
+    (0xFFEC, 'M', u'↓'),
+    (0xFFED, 'M', u'■'),
+    (0xFFEE, 'M', u'○'),
+    (0xFFEF, 'X'),
+    (0x10000, 'V'),
+    (0x1000C, 'X'),
+    (0x1000D, 'V'),
+    (0x10027, 'X'),
+    (0x10028, 'V'),
+    (0x1003B, 'X'),
+    (0x1003C, 'V'),
+    (0x1003E, 'X'),
+    (0x1003F, 'V'),
+    (0x1004E, 'X'),
+    (0x10050, 'V'),
+    (0x1005E, 'X'),
+    (0x10080, 'V'),
+    (0x100FB, 'X'),
+    (0x10100, 'V'),
+    (0x10103, 'X'),
+    (0x10107, 'V'),
+    (0x10134, 'X'),
+    (0x10137, 'V'),
+    (0x1018F, 'X'),
+    (0x10190, 'V'),
+    (0x1019C, 'X'),
+    (0x101A0, 'V'),
+    (0x101A1, 'X'),
+    (0x101D0, 'V'),
+    (0x101FE, 'X'),
+    (0x10280, 'V'),
+    (0x1029D, 'X'),
+    (0x102A0, 'V'),
+    (0x102D1, 'X'),
+    (0x102E0, 'V'),
+    (0x102FC, 'X'),
+    (0x10300, 'V'),
+    (0x10324, 'X'),
+    (0x1032D, 'V'),
+    (0x1034B, 'X'),
+    (0x10350, 'V'),
+    (0x1037B, 'X'),
+    (0x10380, 'V'),
+    (0x1039E, 'X'),
+    (0x1039F, 'V'),
+    (0x103C4, 'X'),
+    (0x103C8, 'V'),
+    (0x103D6, 'X'),
+    (0x10400, 'M', u'𐐨'),
+    (0x10401, 'M', u'𐐩'),
+    ]
+
+def _seg_53():
+    return [
+    (0x10402, 'M', u'𐐪'),
+    (0x10403, 'M', u'𐐫'),
+    (0x10404, 'M', u'𐐬'),
+    (0x10405, 'M', u'𐐭'),
+    (0x10406, 'M', u'𐐮'),
+    (0x10407, 'M', u'𐐯'),
+    (0x10408, 'M', u'𐐰'),
+    (0x10409, 'M', u'𐐱'),
+    (0x1040A, 'M', u'𐐲'),
+    (0x1040B, 'M', u'𐐳'),
+    (0x1040C, 'M', u'𐐴'),
+    (0x1040D, 'M', u'𐐵'),
+    (0x1040E, 'M', u'𐐶'),
+    (0x1040F, 'M', u'𐐷'),
+    (0x10410, 'M', u'𐐸'),
+    (0x10411, 'M', u'𐐹'),
+    (0x10412, 'M', u'𐐺'),
+    (0x10413, 'M', u'𐐻'),
+    (0x10414, 'M', u'𐐼'),
+    (0x10415, 'M', u'𐐽'),
+    (0x10416, 'M', u'𐐾'),
+    (0x10417, 'M', u'𐐿'),
+    (0x10418, 'M', u'𐑀'),
+    (0x10419, 'M', u'𐑁'),
+    (0x1041A, 'M', u'𐑂'),
+    (0x1041B, 'M', u'𐑃'),
+    (0x1041C, 'M', u'𐑄'),
+    (0x1041D, 'M', u'𐑅'),
+    (0x1041E, 'M', u'𐑆'),
+    (0x1041F, 'M', u'𐑇'),
+    (0x10420, 'M', u'𐑈'),
+    (0x10421, 'M', u'𐑉'),
+    (0x10422, 'M', u'𐑊'),
+    (0x10423, 'M', u'𐑋'),
+    (0x10424, 'M', u'𐑌'),
+    (0x10425, 'M', u'𐑍'),
+    (0x10426, 'M', u'𐑎'),
+    (0x10427, 'M', u'𐑏'),
+    (0x10428, 'V'),
+    (0x1049E, 'X'),
+    (0x104A0, 'V'),
+    (0x104AA, 'X'),
+    (0x104B0, 'M', u'𐓘'),
+    (0x104B1, 'M', u'𐓙'),
+    (0x104B2, 'M', u'𐓚'),
+    (0x104B3, 'M', u'𐓛'),
+    (0x104B4, 'M', u'𐓜'),
+    (0x104B5, 'M', u'𐓝'),
+    (0x104B6, 'M', u'𐓞'),
+    (0x104B7, 'M', u'𐓟'),
+    (0x104B8, 'M', u'𐓠'),
+    (0x104B9, 'M', u'𐓡'),
+    (0x104BA, 'M', u'𐓢'),
+    (0x104BB, 'M', u'𐓣'),
+    (0x104BC, 'M', u'𐓤'),
+    (0x104BD, 'M', u'𐓥'),
+    (0x104BE, 'M', u'𐓦'),
+    (0x104BF, 'M', u'𐓧'),
+    (0x104C0, 'M', u'𐓨'),
+    (0x104C1, 'M', u'𐓩'),
+    (0x104C2, 'M', u'𐓪'),
+    (0x104C3, 'M', u'𐓫'),
+    (0x104C4, 'M', u'𐓬'),
+    (0x104C5, 'M', u'𐓭'),
+    (0x104C6, 'M', u'𐓮'),
+    (0x104C7, 'M', u'𐓯'),
+    (0x104C8, 'M', u'𐓰'),
+    (0x104C9, 'M', u'𐓱'),
+    (0x104CA, 'M', u'𐓲'),
+    (0x104CB, 'M', u'𐓳'),
+    (0x104CC, 'M', u'𐓴'),
+    (0x104CD, 'M', u'𐓵'),
+    (0x104CE, 'M', u'𐓶'),
+    (0x104CF, 'M', u'𐓷'),
+    (0x104D0, 'M', u'𐓸'),
+    (0x104D1, 'M', u'𐓹'),
+    (0x104D2, 'M', u'𐓺'),
+    (0x104D3, 'M', u'𐓻'),
+    (0x104D4, 'X'),
+    (0x104D8, 'V'),
+    (0x104FC, 'X'),
+    (0x10500, 'V'),
+    (0x10528, 'X'),
+    (0x10530, 'V'),
+    (0x10564, 'X'),
+    (0x1056F, 'V'),
+    (0x10570, 'X'),
+    (0x10600, 'V'),
+    (0x10737, 'X'),
+    (0x10740, 'V'),
+    (0x10756, 'X'),
+    (0x10760, 'V'),
+    (0x10768, 'X'),
+    (0x10800, 'V'),
+    (0x10806, 'X'),
+    (0x10808, 'V'),
+    (0x10809, 'X'),
+    (0x1080A, 'V'),
+    (0x10836, 'X'),
+    (0x10837, 'V'),
+    ]
+
+def _seg_54():
+    return [
+    (0x10839, 'X'),
+    (0x1083C, 'V'),
+    (0x1083D, 'X'),
+    (0x1083F, 'V'),
+    (0x10856, 'X'),
+    (0x10857, 'V'),
+    (0x1089F, 'X'),
+    (0x108A7, 'V'),
+    (0x108B0, 'X'),
+    (0x108E0, 'V'),
+    (0x108F3, 'X'),
+    (0x108F4, 'V'),
+    (0x108F6, 'X'),
+    (0x108FB, 'V'),
+    (0x1091C, 'X'),
+    (0x1091F, 'V'),
+    (0x1093A, 'X'),
+    (0x1093F, 'V'),
+    (0x10940, 'X'),
+    (0x10980, 'V'),
+    (0x109B8, 'X'),
+    (0x109BC, 'V'),
+    (0x109D0, 'X'),
+    (0x109D2, 'V'),
+    (0x10A04, 'X'),
+    (0x10A05, 'V'),
+    (0x10A07, 'X'),
+    (0x10A0C, 'V'),
+    (0x10A14, 'X'),
+    (0x10A15, 'V'),
+    (0x10A18, 'X'),
+    (0x10A19, 'V'),
+    (0x10A36, 'X'),
+    (0x10A38, 'V'),
+    (0x10A3B, 'X'),
+    (0x10A3F, 'V'),
+    (0x10A49, 'X'),
+    (0x10A50, 'V'),
+    (0x10A59, 'X'),
+    (0x10A60, 'V'),
+    (0x10AA0, 'X'),
+    (0x10AC0, 'V'),
+    (0x10AE7, 'X'),
+    (0x10AEB, 'V'),
+    (0x10AF7, 'X'),
+    (0x10B00, 'V'),
+    (0x10B36, 'X'),
+    (0x10B39, 'V'),
+    (0x10B56, 'X'),
+    (0x10B58, 'V'),
+    (0x10B73, 'X'),
+    (0x10B78, 'V'),
+    (0x10B92, 'X'),
+    (0x10B99, 'V'),
+    (0x10B9D, 'X'),
+    (0x10BA9, 'V'),
+    (0x10BB0, 'X'),
+    (0x10C00, 'V'),
+    (0x10C49, 'X'),
+    (0x10C80, 'M', u'𐳀'),
+    (0x10C81, 'M', u'𐳁'),
+    (0x10C82, 'M', u'𐳂'),
+    (0x10C83, 'M', u'𐳃'),
+    (0x10C84, 'M', u'𐳄'),
+    (0x10C85, 'M', u'𐳅'),
+    (0x10C86, 'M', u'𐳆'),
+    (0x10C87, 'M', u'𐳇'),
+    (0x10C88, 'M', u'𐳈'),
+    (0x10C89, 'M', u'𐳉'),
+    (0x10C8A, 'M', u'𐳊'),
+    (0x10C8B, 'M', u'𐳋'),
+    (0x10C8C, 'M', u'𐳌'),
+    (0x10C8D, 'M', u'𐳍'),
+    (0x10C8E, 'M', u'𐳎'),
+    (0x10C8F, 'M', u'𐳏'),
+    (0x10C90, 'M', u'𐳐'),
+    (0x10C91, 'M', u'𐳑'),
+    (0x10C92, 'M', u'𐳒'),
+    (0x10C93, 'M', u'𐳓'),
+    (0x10C94, 'M', u'𐳔'),
+    (0x10C95, 'M', u'𐳕'),
+    (0x10C96, 'M', u'𐳖'),
+    (0x10C97, 'M', u'𐳗'),
+    (0x10C98, 'M', u'𐳘'),
+    (0x10C99, 'M', u'𐳙'),
+    (0x10C9A, 'M', u'𐳚'),
+    (0x10C9B, 'M', u'𐳛'),
+    (0x10C9C, 'M', u'𐳜'),
+    (0x10C9D, 'M', u'𐳝'),
+    (0x10C9E, 'M', u'𐳞'),
+    (0x10C9F, 'M', u'𐳟'),
+    (0x10CA0, 'M', u'𐳠'),
+    (0x10CA1, 'M', u'𐳡'),
+    (0x10CA2, 'M', u'𐳢'),
+    (0x10CA3, 'M', u'𐳣'),
+    (0x10CA4, 'M', u'𐳤'),
+    (0x10CA5, 'M', u'𐳥'),
+    (0x10CA6, 'M', u'𐳦'),
+    (0x10CA7, 'M', u'𐳧'),
+    (0x10CA8, 'M', u'𐳨'),
+    ]
+
+def _seg_55():
+    return [
+    (0x10CA9, 'M', u'𐳩'),
+    (0x10CAA, 'M', u'𐳪'),
+    (0x10CAB, 'M', u'𐳫'),
+    (0x10CAC, 'M', u'𐳬'),
+    (0x10CAD, 'M', u'𐳭'),
+    (0x10CAE, 'M', u'𐳮'),
+    (0x10CAF, 'M', u'𐳯'),
+    (0x10CB0, 'M', u'𐳰'),
+    (0x10CB1, 'M', u'𐳱'),
+    (0x10CB2, 'M', u'𐳲'),
+    (0x10CB3, 'X'),
+    (0x10CC0, 'V'),
+    (0x10CF3, 'X'),
+    (0x10CFA, 'V'),
+    (0x10D28, 'X'),
+    (0x10D30, 'V'),
+    (0x10D3A, 'X'),
+    (0x10E60, 'V'),
+    (0x10E7F, 'X'),
+    (0x10F00, 'V'),
+    (0x10F28, 'X'),
+    (0x10F30, 'V'),
+    (0x10F5A, 'X'),
+    (0x11000, 'V'),
+    (0x1104E, 'X'),
+    (0x11052, 'V'),
+    (0x11070, 'X'),
+    (0x1107F, 'V'),
+    (0x110BD, 'X'),
+    (0x110BE, 'V'),
+    (0x110C2, 'X'),
+    (0x110D0, 'V'),
+    (0x110E9, 'X'),
+    (0x110F0, 'V'),
+    (0x110FA, 'X'),
+    (0x11100, 'V'),
+    (0x11135, 'X'),
+    (0x11136, 'V'),
+    (0x11147, 'X'),
+    (0x11150, 'V'),
+    (0x11177, 'X'),
+    (0x11180, 'V'),
+    (0x111CE, 'X'),
+    (0x111D0, 'V'),
+    (0x111E0, 'X'),
+    (0x111E1, 'V'),
+    (0x111F5, 'X'),
+    (0x11200, 'V'),
+    (0x11212, 'X'),
+    (0x11213, 'V'),
+    (0x1123F, 'X'),
+    (0x11280, 'V'),
+    (0x11287, 'X'),
+    (0x11288, 'V'),
+    (0x11289, 'X'),
+    (0x1128A, 'V'),
+    (0x1128E, 'X'),
+    (0x1128F, 'V'),
+    (0x1129E, 'X'),
+    (0x1129F, 'V'),
+    (0x112AA, 'X'),
+    (0x112B0, 'V'),
+    (0x112EB, 'X'),
+    (0x112F0, 'V'),
+    (0x112FA, 'X'),
+    (0x11300, 'V'),
+    (0x11304, 'X'),
+    (0x11305, 'V'),
+    (0x1130D, 'X'),
+    (0x1130F, 'V'),
+    (0x11311, 'X'),
+    (0x11313, 'V'),
+    (0x11329, 'X'),
+    (0x1132A, 'V'),
+    (0x11331, 'X'),
+    (0x11332, 'V'),
+    (0x11334, 'X'),
+    (0x11335, 'V'),
+    (0x1133A, 'X'),
+    (0x1133B, 'V'),
+    (0x11345, 'X'),
+    (0x11347, 'V'),
+    (0x11349, 'X'),
+    (0x1134B, 'V'),
+    (0x1134E, 'X'),
+    (0x11350, 'V'),
+    (0x11351, 'X'),
+    (0x11357, 'V'),
+    (0x11358, 'X'),
+    (0x1135D, 'V'),
+    (0x11364, 'X'),
+    (0x11366, 'V'),
+    (0x1136D, 'X'),
+    (0x11370, 'V'),
+    (0x11375, 'X'),
+    (0x11400, 'V'),
+    (0x1145A, 'X'),
+    (0x1145B, 'V'),
+    (0x1145C, 'X'),
+    (0x1145D, 'V'),
+    ]
+
+def _seg_56():
+    return [
+    (0x1145F, 'X'),
+    (0x11480, 'V'),
+    (0x114C8, 'X'),
+    (0x114D0, 'V'),
+    (0x114DA, 'X'),
+    (0x11580, 'V'),
+    (0x115B6, 'X'),
+    (0x115B8, 'V'),
+    (0x115DE, 'X'),
+    (0x11600, 'V'),
+    (0x11645, 'X'),
+    (0x11650, 'V'),
+    (0x1165A, 'X'),
+    (0x11660, 'V'),
+    (0x1166D, 'X'),
+    (0x11680, 'V'),
+    (0x116B8, 'X'),
+    (0x116C0, 'V'),
+    (0x116CA, 'X'),
+    (0x11700, 'V'),
+    (0x1171B, 'X'),
+    (0x1171D, 'V'),
+    (0x1172C, 'X'),
+    (0x11730, 'V'),
+    (0x11740, 'X'),
+    (0x11800, 'V'),
+    (0x1183C, 'X'),
+    (0x118A0, 'M', u'𑣀'),
+    (0x118A1, 'M', u'𑣁'),
+    (0x118A2, 'M', u'𑣂'),
+    (0x118A3, 'M', u'𑣃'),
+    (0x118A4, 'M', u'𑣄'),
+    (0x118A5, 'M', u'𑣅'),
+    (0x118A6, 'M', u'𑣆'),
+    (0x118A7, 'M', u'𑣇'),
+    (0x118A8, 'M', u'𑣈'),
+    (0x118A9, 'M', u'𑣉'),
+    (0x118AA, 'M', u'𑣊'),
+    (0x118AB, 'M', u'𑣋'),
+    (0x118AC, 'M', u'𑣌'),
+    (0x118AD, 'M', u'𑣍'),
+    (0x118AE, 'M', u'𑣎'),
+    (0x118AF, 'M', u'𑣏'),
+    (0x118B0, 'M', u'𑣐'),
+    (0x118B1, 'M', u'𑣑'),
+    (0x118B2, 'M', u'𑣒'),
+    (0x118B3, 'M', u'𑣓'),
+    (0x118B4, 'M', u'𑣔'),
+    (0x118B5, 'M', u'𑣕'),
+    (0x118B6, 'M', u'𑣖'),
+    (0x118B7, 'M', u'𑣗'),
+    (0x118B8, 'M', u'𑣘'),
+    (0x118B9, 'M', u'𑣙'),
+    (0x118BA, 'M', u'𑣚'),
+    (0x118BB, 'M', u'𑣛'),
+    (0x118BC, 'M', u'𑣜'),
+    (0x118BD, 'M', u'𑣝'),
+    (0x118BE, 'M', u'𑣞'),
+    (0x118BF, 'M', u'𑣟'),
+    (0x118C0, 'V'),
+    (0x118F3, 'X'),
+    (0x118FF, 'V'),
+    (0x11900, 'X'),
+    (0x11A00, 'V'),
+    (0x11A48, 'X'),
+    (0x11A50, 'V'),
+    (0x11A84, 'X'),
+    (0x11A86, 'V'),
+    (0x11AA3, 'X'),
+    (0x11AC0, 'V'),
+    (0x11AF9, 'X'),
+    (0x11C00, 'V'),
+    (0x11C09, 'X'),
+    (0x11C0A, 'V'),
+    (0x11C37, 'X'),
+    (0x11C38, 'V'),
+    (0x11C46, 'X'),
+    (0x11C50, 'V'),
+    (0x11C6D, 'X'),
+    (0x11C70, 'V'),
+    (0x11C90, 'X'),
+    (0x11C92, 'V'),
+    (0x11CA8, 'X'),
+    (0x11CA9, 'V'),
+    (0x11CB7, 'X'),
+    (0x11D00, 'V'),
+    (0x11D07, 'X'),
+    (0x11D08, 'V'),
+    (0x11D0A, 'X'),
+    (0x11D0B, 'V'),
+    (0x11D37, 'X'),
+    (0x11D3A, 'V'),
+    (0x11D3B, 'X'),
+    (0x11D3C, 'V'),
+    (0x11D3E, 'X'),
+    (0x11D3F, 'V'),
+    (0x11D48, 'X'),
+    (0x11D50, 'V'),
+    (0x11D5A, 'X'),
+    (0x11D60, 'V'),
+    ]
+
+def _seg_57():
+    return [
+    (0x11D66, 'X'),
+    (0x11D67, 'V'),
+    (0x11D69, 'X'),
+    (0x11D6A, 'V'),
+    (0x11D8F, 'X'),
+    (0x11D90, 'V'),
+    (0x11D92, 'X'),
+    (0x11D93, 'V'),
+    (0x11D99, 'X'),
+    (0x11DA0, 'V'),
+    (0x11DAA, 'X'),
+    (0x11EE0, 'V'),
+    (0x11EF9, 'X'),
+    (0x12000, 'V'),
+    (0x1239A, 'X'),
+    (0x12400, 'V'),
+    (0x1246F, 'X'),
+    (0x12470, 'V'),
+    (0x12475, 'X'),
+    (0x12480, 'V'),
+    (0x12544, 'X'),
+    (0x13000, 'V'),
+    (0x1342F, 'X'),
+    (0x14400, 'V'),
+    (0x14647, 'X'),
+    (0x16800, 'V'),
+    (0x16A39, 'X'),
+    (0x16A40, 'V'),
+    (0x16A5F, 'X'),
+    (0x16A60, 'V'),
+    (0x16A6A, 'X'),
+    (0x16A6E, 'V'),
+    (0x16A70, 'X'),
+    (0x16AD0, 'V'),
+    (0x16AEE, 'X'),
+    (0x16AF0, 'V'),
+    (0x16AF6, 'X'),
+    (0x16B00, 'V'),
+    (0x16B46, 'X'),
+    (0x16B50, 'V'),
+    (0x16B5A, 'X'),
+    (0x16B5B, 'V'),
+    (0x16B62, 'X'),
+    (0x16B63, 'V'),
+    (0x16B78, 'X'),
+    (0x16B7D, 'V'),
+    (0x16B90, 'X'),
+    (0x16E60, 'V'),
+    (0x16E9B, 'X'),
+    (0x16F00, 'V'),
+    (0x16F45, 'X'),
+    (0x16F50, 'V'),
+    (0x16F7F, 'X'),
+    (0x16F8F, 'V'),
+    (0x16FA0, 'X'),
+    (0x16FE0, 'V'),
+    (0x16FE2, 'X'),
+    (0x17000, 'V'),
+    (0x187F2, 'X'),
+    (0x18800, 'V'),
+    (0x18AF3, 'X'),
+    (0x1B000, 'V'),
+    (0x1B11F, 'X'),
+    (0x1B170, 'V'),
+    (0x1B2FC, 'X'),
+    (0x1BC00, 'V'),
+    (0x1BC6B, 'X'),
+    (0x1BC70, 'V'),
+    (0x1BC7D, 'X'),
+    (0x1BC80, 'V'),
+    (0x1BC89, 'X'),
+    (0x1BC90, 'V'),
+    (0x1BC9A, 'X'),
+    (0x1BC9C, 'V'),
+    (0x1BCA0, 'I'),
+    (0x1BCA4, 'X'),
+    (0x1D000, 'V'),
+    (0x1D0F6, 'X'),
+    (0x1D100, 'V'),
+    (0x1D127, 'X'),
+    (0x1D129, 'V'),
+    (0x1D15E, 'M', u'𝅗𝅥'),
+    (0x1D15F, 'M', u'𝅘𝅥'),
+    (0x1D160, 'M', u'𝅘𝅥𝅮'),
+    (0x1D161, 'M', u'𝅘𝅥𝅯'),
+    (0x1D162, 'M', u'𝅘𝅥𝅰'),
+    (0x1D163, 'M', u'𝅘𝅥𝅱'),
+    (0x1D164, 'M', u'𝅘𝅥𝅲'),
+    (0x1D165, 'V'),
+    (0x1D173, 'X'),
+    (0x1D17B, 'V'),
+    (0x1D1BB, 'M', u'𝆹𝅥'),
+    (0x1D1BC, 'M', u'𝆺𝅥'),
+    (0x1D1BD, 'M', u'𝆹𝅥𝅮'),
+    (0x1D1BE, 'M', u'𝆺𝅥𝅮'),
+    (0x1D1BF, 'M', u'𝆹𝅥𝅯'),
+    (0x1D1C0, 'M', u'𝆺𝅥𝅯'),
+    (0x1D1C1, 'V'),
+    (0x1D1E9, 'X'),
+    (0x1D200, 'V'),
+    ]
+
+def _seg_58():
+    return [
+    (0x1D246, 'X'),
+    (0x1D2E0, 'V'),
+    (0x1D2F4, 'X'),
+    (0x1D300, 'V'),
+    (0x1D357, 'X'),
+    (0x1D360, 'V'),
+    (0x1D379, 'X'),
+    (0x1D400, 'M', u'a'),
+    (0x1D401, 'M', u'b'),
+    (0x1D402, 'M', u'c'),
+    (0x1D403, 'M', u'd'),
+    (0x1D404, 'M', u'e'),
+    (0x1D405, 'M', u'f'),
+    (0x1D406, 'M', u'g'),
+    (0x1D407, 'M', u'h'),
+    (0x1D408, 'M', u'i'),
+    (0x1D409, 'M', u'j'),
+    (0x1D40A, 'M', u'k'),
+    (0x1D40B, 'M', u'l'),
+    (0x1D40C, 'M', u'm'),
+    (0x1D40D, 'M', u'n'),
+    (0x1D40E, 'M', u'o'),
+    (0x1D40F, 'M', u'p'),
+    (0x1D410, 'M', u'q'),
+    (0x1D411, 'M', u'r'),
+    (0x1D412, 'M', u's'),
+    (0x1D413, 'M', u't'),
+    (0x1D414, 'M', u'u'),
+    (0x1D415, 'M', u'v'),
+    (0x1D416, 'M', u'w'),
+    (0x1D417, 'M', u'x'),
+    (0x1D418, 'M', u'y'),
+    (0x1D419, 'M', u'z'),
+    (0x1D41A, 'M', u'a'),
+    (0x1D41B, 'M', u'b'),
+    (0x1D41C, 'M', u'c'),
+    (0x1D41D, 'M', u'd'),
+    (0x1D41E, 'M', u'e'),
+    (0x1D41F, 'M', u'f'),
+    (0x1D420, 'M', u'g'),
+    (0x1D421, 'M', u'h'),
+    (0x1D422, 'M', u'i'),
+    (0x1D423, 'M', u'j'),
+    (0x1D424, 'M', u'k'),
+    (0x1D425, 'M', u'l'),
+    (0x1D426, 'M', u'm'),
+    (0x1D427, 'M', u'n'),
+    (0x1D428, 'M', u'o'),
+    (0x1D429, 'M', u'p'),
+    (0x1D42A, 'M', u'q'),
+    (0x1D42B, 'M', u'r'),
+    (0x1D42C, 'M', u's'),
+    (0x1D42D, 'M', u't'),
+    (0x1D42E, 'M', u'u'),
+    (0x1D42F, 'M', u'v'),
+    (0x1D430, 'M', u'w'),
+    (0x1D431, 'M', u'x'),
+    (0x1D432, 'M', u'y'),
+    (0x1D433, 'M', u'z'),
+    (0x1D434, 'M', u'a'),
+    (0x1D435, 'M', u'b'),
+    (0x1D436, 'M', u'c'),
+    (0x1D437, 'M', u'd'),
+    (0x1D438, 'M', u'e'),
+    (0x1D439, 'M', u'f'),
+    (0x1D43A, 'M', u'g'),
+    (0x1D43B, 'M', u'h'),
+    (0x1D43C, 'M', u'i'),
+    (0x1D43D, 'M', u'j'),
+    (0x1D43E, 'M', u'k'),
+    (0x1D43F, 'M', u'l'),
+    (0x1D440, 'M', u'm'),
+    (0x1D441, 'M', u'n'),
+    (0x1D442, 'M', u'o'),
+    (0x1D443, 'M', u'p'),
+    (0x1D444, 'M', u'q'),
+    (0x1D445, 'M', u'r'),
+    (0x1D446, 'M', u's'),
+    (0x1D447, 'M', u't'),
+    (0x1D448, 'M', u'u'),
+    (0x1D449, 'M', u'v'),
+    (0x1D44A, 'M', u'w'),
+    (0x1D44B, 'M', u'x'),
+    (0x1D44C, 'M', u'y'),
+    (0x1D44D, 'M', u'z'),
+    (0x1D44E, 'M', u'a'),
+    (0x1D44F, 'M', u'b'),
+    (0x1D450, 'M', u'c'),
+    (0x1D451, 'M', u'd'),
+    (0x1D452, 'M', u'e'),
+    (0x1D453, 'M', u'f'),
+    (0x1D454, 'M', u'g'),
+    (0x1D455, 'X'),
+    (0x1D456, 'M', u'i'),
+    (0x1D457, 'M', u'j'),
+    (0x1D458, 'M', u'k'),
+    (0x1D459, 'M', u'l'),
+    (0x1D45A, 'M', u'm'),
+    (0x1D45B, 'M', u'n'),
+    (0x1D45C, 'M', u'o'),
+    ]
+
+def _seg_59():
+    return [
+    (0x1D45D, 'M', u'p'),
+    (0x1D45E, 'M', u'q'),
+    (0x1D45F, 'M', u'r'),
+    (0x1D460, 'M', u's'),
+    (0x1D461, 'M', u't'),
+    (0x1D462, 'M', u'u'),
+    (0x1D463, 'M', u'v'),
+    (0x1D464, 'M', u'w'),
+    (0x1D465, 'M', u'x'),
+    (0x1D466, 'M', u'y'),
+    (0x1D467, 'M', u'z'),
+    (0x1D468, 'M', u'a'),
+    (0x1D469, 'M', u'b'),
+    (0x1D46A, 'M', u'c'),
+    (0x1D46B, 'M', u'd'),
+    (0x1D46C, 'M', u'e'),
+    (0x1D46D, 'M', u'f'),
+    (0x1D46E, 'M', u'g'),
+    (0x1D46F, 'M', u'h'),
+    (0x1D470, 'M', u'i'),
+    (0x1D471, 'M', u'j'),
+    (0x1D472, 'M', u'k'),
+    (0x1D473, 'M', u'l'),
+    (0x1D474, 'M', u'm'),
+    (0x1D475, 'M', u'n'),
+    (0x1D476, 'M', u'o'),
+    (0x1D477, 'M', u'p'),
+    (0x1D478, 'M', u'q'),
+    (0x1D479, 'M', u'r'),
+    (0x1D47A, 'M', u's'),
+    (0x1D47B, 'M', u't'),
+    (0x1D47C, 'M', u'u'),
+    (0x1D47D, 'M', u'v'),
+    (0x1D47E, 'M', u'w'),
+    (0x1D47F, 'M', u'x'),
+    (0x1D480, 'M', u'y'),
+    (0x1D481, 'M', u'z'),
+    (0x1D482, 'M', u'a'),
+    (0x1D483, 'M', u'b'),
+    (0x1D484, 'M', u'c'),
+    (0x1D485, 'M', u'd'),
+    (0x1D486, 'M', u'e'),
+    (0x1D487, 'M', u'f'),
+    (0x1D488, 'M', u'g'),
+    (0x1D489, 'M', u'h'),
+    (0x1D48A, 'M', u'i'),
+    (0x1D48B, 'M', u'j'),
+    (0x1D48C, 'M', u'k'),
+    (0x1D48D, 'M', u'l'),
+    (0x1D48E, 'M', u'm'),
+    (0x1D48F, 'M', u'n'),
+    (0x1D490, 'M', u'o'),
+    (0x1D491, 'M', u'p'),
+    (0x1D492, 'M', u'q'),
+    (0x1D493, 'M', u'r'),
+    (0x1D494, 'M', u's'),
+    (0x1D495, 'M', u't'),
+    (0x1D496, 'M', u'u'),
+    (0x1D497, 'M', u'v'),
+    (0x1D498, 'M', u'w'),
+    (0x1D499, 'M', u'x'),
+    (0x1D49A, 'M', u'y'),
+    (0x1D49B, 'M', u'z'),
+    (0x1D49C, 'M', u'a'),
+    (0x1D49D, 'X'),
+    (0x1D49E, 'M', u'c'),
+    (0x1D49F, 'M', u'd'),
+    (0x1D4A0, 'X'),
+    (0x1D4A2, 'M', u'g'),
+    (0x1D4A3, 'X'),
+    (0x1D4A5, 'M', u'j'),
+    (0x1D4A6, 'M', u'k'),
+    (0x1D4A7, 'X'),
+    (0x1D4A9, 'M', u'n'),
+    (0x1D4AA, 'M', u'o'),
+    (0x1D4AB, 'M', u'p'),
+    (0x1D4AC, 'M', u'q'),
+    (0x1D4AD, 'X'),
+    (0x1D4AE, 'M', u's'),
+    (0x1D4AF, 'M', u't'),
+    (0x1D4B0, 'M', u'u'),
+    (0x1D4B1, 'M', u'v'),
+    (0x1D4B2, 'M', u'w'),
+    (0x1D4B3, 'M', u'x'),
+    (0x1D4B4, 'M', u'y'),
+    (0x1D4B5, 'M', u'z'),
+    (0x1D4B6, 'M', u'a'),
+    (0x1D4B7, 'M', u'b'),
+    (0x1D4B8, 'M', u'c'),
+    (0x1D4B9, 'M', u'd'),
+    (0x1D4BA, 'X'),
+    (0x1D4BB, 'M', u'f'),
+    (0x1D4BC, 'X'),
+    (0x1D4BD, 'M', u'h'),
+    (0x1D4BE, 'M', u'i'),
+    (0x1D4BF, 'M', u'j'),
+    (0x1D4C0, 'M', u'k'),
+    (0x1D4C1, 'M', u'l'),
+    (0x1D4C2, 'M', u'm'),
+    (0x1D4C3, 'M', u'n'),
+    ]
+
+def _seg_60():
+    return [
+    (0x1D4C4, 'X'),
+    (0x1D4C5, 'M', u'p'),
+    (0x1D4C6, 'M', u'q'),
+    (0x1D4C7, 'M', u'r'),
+    (0x1D4C8, 'M', u's'),
+    (0x1D4C9, 'M', u't'),
+    (0x1D4CA, 'M', u'u'),
+    (0x1D4CB, 'M', u'v'),
+    (0x1D4CC, 'M', u'w'),
+    (0x1D4CD, 'M', u'x'),
+    (0x1D4CE, 'M', u'y'),
+    (0x1D4CF, 'M', u'z'),
+    (0x1D4D0, 'M', u'a'),
+    (0x1D4D1, 'M', u'b'),
+    (0x1D4D2, 'M', u'c'),
+    (0x1D4D3, 'M', u'd'),
+    (0x1D4D4, 'M', u'e'),
+    (0x1D4D5, 'M', u'f'),
+    (0x1D4D6, 'M', u'g'),
+    (0x1D4D7, 'M', u'h'),
+    (0x1D4D8, 'M', u'i'),
+    (0x1D4D9, 'M', u'j'),
+    (0x1D4DA, 'M', u'k'),
+    (0x1D4DB, 'M', u'l'),
+    (0x1D4DC, 'M', u'm'),
+    (0x1D4DD, 'M', u'n'),
+    (0x1D4DE, 'M', u'o'),
+    (0x1D4DF, 'M', u'p'),
+    (0x1D4E0, 'M', u'q'),
+    (0x1D4E1, 'M', u'r'),
+    (0x1D4E2, 'M', u's'),
+    (0x1D4E3, 'M', u't'),
+    (0x1D4E4, 'M', u'u'),
+    (0x1D4E5, 'M', u'v'),
+    (0x1D4E6, 'M', u'w'),
+    (0x1D4E7, 'M', u'x'),
+    (0x1D4E8, 'M', u'y'),
+    (0x1D4E9, 'M', u'z'),
+    (0x1D4EA, 'M', u'a'),
+    (0x1D4EB, 'M', u'b'),
+    (0x1D4EC, 'M', u'c'),
+    (0x1D4ED, 'M', u'd'),
+    (0x1D4EE, 'M', u'e'),
+    (0x1D4EF, 'M', u'f'),
+    (0x1D4F0, 'M', u'g'),
+    (0x1D4F1, 'M', u'h'),
+    (0x1D4F2, 'M', u'i'),
+    (0x1D4F3, 'M', u'j'),
+    (0x1D4F4, 'M', u'k'),
+    (0x1D4F5, 'M', u'l'),
+    (0x1D4F6, 'M', u'm'),
+    (0x1D4F7, 'M', u'n'),
+    (0x1D4F8, 'M', u'o'),
+    (0x1D4F9, 'M', u'p'),
+    (0x1D4FA, 'M', u'q'),
+    (0x1D4FB, 'M', u'r'),
+    (0x1D4FC, 'M', u's'),
+    (0x1D4FD, 'M', u't'),
+    (0x1D4FE, 'M', u'u'),
+    (0x1D4FF, 'M', u'v'),
+    (0x1D500, 'M', u'w'),
+    (0x1D501, 'M', u'x'),
+    (0x1D502, 'M', u'y'),
+    (0x1D503, 'M', u'z'),
+    (0x1D504, 'M', u'a'),
+    (0x1D505, 'M', u'b'),
+    (0x1D506, 'X'),
+    (0x1D507, 'M', u'd'),
+    (0x1D508, 'M', u'e'),
+    (0x1D509, 'M', u'f'),
+    (0x1D50A, 'M', u'g'),
+    (0x1D50B, 'X'),
+    (0x1D50D, 'M', u'j'),
+    (0x1D50E, 'M', u'k'),
+    (0x1D50F, 'M', u'l'),
+    (0x1D510, 'M', u'm'),
+    (0x1D511, 'M', u'n'),
+    (0x1D512, 'M', u'o'),
+    (0x1D513, 'M', u'p'),
+    (0x1D514, 'M', u'q'),
+    (0x1D515, 'X'),
+    (0x1D516, 'M', u's'),
+    (0x1D517, 'M', u't'),
+    (0x1D518, 'M', u'u'),
+    (0x1D519, 'M', u'v'),
+    (0x1D51A, 'M', u'w'),
+    (0x1D51B, 'M', u'x'),
+    (0x1D51C, 'M', u'y'),
+    (0x1D51D, 'X'),
+    (0x1D51E, 'M', u'a'),
+    (0x1D51F, 'M', u'b'),
+    (0x1D520, 'M', u'c'),
+    (0x1D521, 'M', u'd'),
+    (0x1D522, 'M', u'e'),
+    (0x1D523, 'M', u'f'),
+    (0x1D524, 'M', u'g'),
+    (0x1D525, 'M', u'h'),
+    (0x1D526, 'M', u'i'),
+    (0x1D527, 'M', u'j'),
+    (0x1D528, 'M', u'k'),
+    ]
+
+def _seg_61():
+    return [
+    (0x1D529, 'M', u'l'),
+    (0x1D52A, 'M', u'm'),
+    (0x1D52B, 'M', u'n'),
+    (0x1D52C, 'M', u'o'),
+    (0x1D52D, 'M', u'p'),
+    (0x1D52E, 'M', u'q'),
+    (0x1D52F, 'M', u'r'),
+    (0x1D530, 'M', u's'),
+    (0x1D531, 'M', u't'),
+    (0x1D532, 'M', u'u'),
+    (0x1D533, 'M', u'v'),
+    (0x1D534, 'M', u'w'),
+    (0x1D535, 'M', u'x'),
+    (0x1D536, 'M', u'y'),
+    (0x1D537, 'M', u'z'),
+    (0x1D538, 'M', u'a'),
+    (0x1D539, 'M', u'b'),
+    (0x1D53A, 'X'),
+    (0x1D53B, 'M', u'd'),
+    (0x1D53C, 'M', u'e'),
+    (0x1D53D, 'M', u'f'),
+    (0x1D53E, 'M', u'g'),
+    (0x1D53F, 'X'),
+    (0x1D540, 'M', u'i'),
+    (0x1D541, 'M', u'j'),
+    (0x1D542, 'M', u'k'),
+    (0x1D543, 'M', u'l'),
+    (0x1D544, 'M', u'm'),
+    (0x1D545, 'X'),
+    (0x1D546, 'M', u'o'),
+    (0x1D547, 'X'),
+    (0x1D54A, 'M', u's'),
+    (0x1D54B, 'M', u't'),
+    (0x1D54C, 'M', u'u'),
+    (0x1D54D, 'M', u'v'),
+    (0x1D54E, 'M', u'w'),
+    (0x1D54F, 'M', u'x'),
+    (0x1D550, 'M', u'y'),
+    (0x1D551, 'X'),
+    (0x1D552, 'M', u'a'),
+    (0x1D553, 'M', u'b'),
+    (0x1D554, 'M', u'c'),
+    (0x1D555, 'M', u'd'),
+    (0x1D556, 'M', u'e'),
+    (0x1D557, 'M', u'f'),
+    (0x1D558, 'M', u'g'),
+    (0x1D559, 'M', u'h'),
+    (0x1D55A, 'M', u'i'),
+    (0x1D55B, 'M', u'j'),
+    (0x1D55C, 'M', u'k'),
+    (0x1D55D, 'M', u'l'),
+    (0x1D55E, 'M', u'm'),
+    (0x1D55F, 'M', u'n'),
+    (0x1D560, 'M', u'o'),
+    (0x1D561, 'M', u'p'),
+    (0x1D562, 'M', u'q'),
+    (0x1D563, 'M', u'r'),
+    (0x1D564, 'M', u's'),
+    (0x1D565, 'M', u't'),
+    (0x1D566, 'M', u'u'),
+    (0x1D567, 'M', u'v'),
+    (0x1D568, 'M', u'w'),
+    (0x1D569, 'M', u'x'),
+    (0x1D56A, 'M', u'y'),
+    (0x1D56B, 'M', u'z'),
+    (0x1D56C, 'M', u'a'),
+    (0x1D56D, 'M', u'b'),
+    (0x1D56E, 'M', u'c'),
+    (0x1D56F, 'M', u'd'),
+    (0x1D570, 'M', u'e'),
+    (0x1D571, 'M', u'f'),
+    (0x1D572, 'M', u'g'),
+    (0x1D573, 'M', u'h'),
+    (0x1D574, 'M', u'i'),
+    (0x1D575, 'M', u'j'),
+    (0x1D576, 'M', u'k'),
+    (0x1D577, 'M', u'l'),
+    (0x1D578, 'M', u'm'),
+    (0x1D579, 'M', u'n'),
+    (0x1D57A, 'M', u'o'),
+    (0x1D57B, 'M', u'p'),
+    (0x1D57C, 'M', u'q'),
+    (0x1D57D, 'M', u'r'),
+    (0x1D57E, 'M', u's'),
+    (0x1D57F, 'M', u't'),
+    (0x1D580, 'M', u'u'),
+    (0x1D581, 'M', u'v'),
+    (0x1D582, 'M', u'w'),
+    (0x1D583, 'M', u'x'),
+    (0x1D584, 'M', u'y'),
+    (0x1D585, 'M', u'z'),
+    (0x1D586, 'M', u'a'),
+    (0x1D587, 'M', u'b'),
+    (0x1D588, 'M', u'c'),
+    (0x1D589, 'M', u'd'),
+    (0x1D58A, 'M', u'e'),
+    (0x1D58B, 'M', u'f'),
+    (0x1D58C, 'M', u'g'),
+    (0x1D58D, 'M', u'h'),
+    (0x1D58E, 'M', u'i'),
+    ]
+
+def _seg_62():
+    return [
+    (0x1D58F, 'M', u'j'),
+    (0x1D590, 'M', u'k'),
+    (0x1D591, 'M', u'l'),
+    (0x1D592, 'M', u'm'),
+    (0x1D593, 'M', u'n'),
+    (0x1D594, 'M', u'o'),
+    (0x1D595, 'M', u'p'),
+    (0x1D596, 'M', u'q'),
+    (0x1D597, 'M', u'r'),
+    (0x1D598, 'M', u's'),
+    (0x1D599, 'M', u't'),
+    (0x1D59A, 'M', u'u'),
+    (0x1D59B, 'M', u'v'),
+    (0x1D59C, 'M', u'w'),
+    (0x1D59D, 'M', u'x'),
+    (0x1D59E, 'M', u'y'),
+    (0x1D59F, 'M', u'z'),
+    (0x1D5A0, 'M', u'a'),
+    (0x1D5A1, 'M', u'b'),
+    (0x1D5A2, 'M', u'c'),
+    (0x1D5A3, 'M', u'd'),
+    (0x1D5A4, 'M', u'e'),
+    (0x1D5A5, 'M', u'f'),
+    (0x1D5A6, 'M', u'g'),
+    (0x1D5A7, 'M', u'h'),
+    (0x1D5A8, 'M', u'i'),
+    (0x1D5A9, 'M', u'j'),
+    (0x1D5AA, 'M', u'k'),
+    (0x1D5AB, 'M', u'l'),
+    (0x1D5AC, 'M', u'm'),
+    (0x1D5AD, 'M', u'n'),
+    (0x1D5AE, 'M', u'o'),
+    (0x1D5AF, 'M', u'p'),
+    (0x1D5B0, 'M', u'q'),
+    (0x1D5B1, 'M', u'r'),
+    (0x1D5B2, 'M', u's'),
+    (0x1D5B3, 'M', u't'),
+    (0x1D5B4, 'M', u'u'),
+    (0x1D5B5, 'M', u'v'),
+    (0x1D5B6, 'M', u'w'),
+    (0x1D5B7, 'M', u'x'),
+    (0x1D5B8, 'M', u'y'),
+    (0x1D5B9, 'M', u'z'),
+    (0x1D5BA, 'M', u'a'),
+    (0x1D5BB, 'M', u'b'),
+    (0x1D5BC, 'M', u'c'),
+    (0x1D5BD, 'M', u'd'),
+    (0x1D5BE, 'M', u'e'),
+    (0x1D5BF, 'M', u'f'),
+    (0x1D5C0, 'M', u'g'),
+    (0x1D5C1, 'M', u'h'),
+    (0x1D5C2, 'M', u'i'),
+    (0x1D5C3, 'M', u'j'),
+    (0x1D5C4, 'M', u'k'),
+    (0x1D5C5, 'M', u'l'),
+    (0x1D5C6, 'M', u'm'),
+    (0x1D5C7, 'M', u'n'),
+    (0x1D5C8, 'M', u'o'),
+    (0x1D5C9, 'M', u'p'),
+    (0x1D5CA, 'M', u'q'),
+    (0x1D5CB, 'M', u'r'),
+    (0x1D5CC, 'M', u's'),
+    (0x1D5CD, 'M', u't'),
+    (0x1D5CE, 'M', u'u'),
+    (0x1D5CF, 'M', u'v'),
+    (0x1D5D0, 'M', u'w'),
+    (0x1D5D1, 'M', u'x'),
+    (0x1D5D2, 'M', u'y'),
+    (0x1D5D3, 'M', u'z'),
+    (0x1D5D4, 'M', u'a'),
+    (0x1D5D5, 'M', u'b'),
+    (0x1D5D6, 'M', u'c'),
+    (0x1D5D7, 'M', u'd'),
+    (0x1D5D8, 'M', u'e'),
+    (0x1D5D9, 'M', u'f'),
+    (0x1D5DA, 'M', u'g'),
+    (0x1D5DB, 'M', u'h'),
+    (0x1D5DC, 'M', u'i'),
+    (0x1D5DD, 'M', u'j'),
+    (0x1D5DE, 'M', u'k'),
+    (0x1D5DF, 'M', u'l'),
+    (0x1D5E0, 'M', u'm'),
+    (0x1D5E1, 'M', u'n'),
+    (0x1D5E2, 'M', u'o'),
+    (0x1D5E3, 'M', u'p'),
+    (0x1D5E4, 'M', u'q'),
+    (0x1D5E5, 'M', u'r'),
+    (0x1D5E6, 'M', u's'),
+    (0x1D5E7, 'M', u't'),
+    (0x1D5E8, 'M', u'u'),
+    (0x1D5E9, 'M', u'v'),
+    (0x1D5EA, 'M', u'w'),
+    (0x1D5EB, 'M', u'x'),
+    (0x1D5EC, 'M', u'y'),
+    (0x1D5ED, 'M', u'z'),
+    (0x1D5EE, 'M', u'a'),
+    (0x1D5EF, 'M', u'b'),
+    (0x1D5F0, 'M', u'c'),
+    (0x1D5F1, 'M', u'd'),
+    (0x1D5F2, 'M', u'e'),
+    ]
+
+def _seg_63():
+    return [
+    (0x1D5F3, 'M', u'f'),
+    (0x1D5F4, 'M', u'g'),
+    (0x1D5F5, 'M', u'h'),
+    (0x1D5F6, 'M', u'i'),
+    (0x1D5F7, 'M', u'j'),
+    (0x1D5F8, 'M', u'k'),
+    (0x1D5F9, 'M', u'l'),
+    (0x1D5FA, 'M', u'm'),
+    (0x1D5FB, 'M', u'n'),
+    (0x1D5FC, 'M', u'o'),
+    (0x1D5FD, 'M', u'p'),
+    (0x1D5FE, 'M', u'q'),
+    (0x1D5FF, 'M', u'r'),
+    (0x1D600, 'M', u's'),
+    (0x1D601, 'M', u't'),
+    (0x1D602, 'M', u'u'),
+    (0x1D603, 'M', u'v'),
+    (0x1D604, 'M', u'w'),
+    (0x1D605, 'M', u'x'),
+    (0x1D606, 'M', u'y'),
+    (0x1D607, 'M', u'z'),
+    (0x1D608, 'M', u'a'),
+    (0x1D609, 'M', u'b'),
+    (0x1D60A, 'M', u'c'),
+    (0x1D60B, 'M', u'd'),
+    (0x1D60C, 'M', u'e'),
+    (0x1D60D, 'M', u'f'),
+    (0x1D60E, 'M', u'g'),
+    (0x1D60F, 'M', u'h'),
+    (0x1D610, 'M', u'i'),
+    (0x1D611, 'M', u'j'),
+    (0x1D612, 'M', u'k'),
+    (0x1D613, 'M', u'l'),
+    (0x1D614, 'M', u'm'),
+    (0x1D615, 'M', u'n'),
+    (0x1D616, 'M', u'o'),
+    (0x1D617, 'M', u'p'),
+    (0x1D618, 'M', u'q'),
+    (0x1D619, 'M', u'r'),
+    (0x1D61A, 'M', u's'),
+    (0x1D61B, 'M', u't'),
+    (0x1D61C, 'M', u'u'),
+    (0x1D61D, 'M', u'v'),
+    (0x1D61E, 'M', u'w'),
+    (0x1D61F, 'M', u'x'),
+    (0x1D620, 'M', u'y'),
+    (0x1D621, 'M', u'z'),
+    (0x1D622, 'M', u'a'),
+    (0x1D623, 'M', u'b'),
+    (0x1D624, 'M', u'c'),
+    (0x1D625, 'M', u'd'),
+    (0x1D626, 'M', u'e'),
+    (0x1D627, 'M', u'f'),
+    (0x1D628, 'M', u'g'),
+    (0x1D629, 'M', u'h'),
+    (0x1D62A, 'M', u'i'),
+    (0x1D62B, 'M', u'j'),
+    (0x1D62C, 'M', u'k'),
+    (0x1D62D, 'M', u'l'),
+    (0x1D62E, 'M', u'm'),
+    (0x1D62F, 'M', u'n'),
+    (0x1D630, 'M', u'o'),
+    (0x1D631, 'M', u'p'),
+    (0x1D632, 'M', u'q'),
+    (0x1D633, 'M', u'r'),
+    (0x1D634, 'M', u's'),
+    (0x1D635, 'M', u't'),
+    (0x1D636, 'M', u'u'),
+    (0x1D637, 'M', u'v'),
+    (0x1D638, 'M', u'w'),
+    (0x1D639, 'M', u'x'),
+    (0x1D63A, 'M', u'y'),
+    (0x1D63B, 'M', u'z'),
+    (0x1D63C, 'M', u'a'),
+    (0x1D63D, 'M', u'b'),
+    (0x1D63E, 'M', u'c'),
+    (0x1D63F, 'M', u'd'),
+    (0x1D640, 'M', u'e'),
+    (0x1D641, 'M', u'f'),
+    (0x1D642, 'M', u'g'),
+    (0x1D643, 'M', u'h'),
+    (0x1D644, 'M', u'i'),
+    (0x1D645, 'M', u'j'),
+    (0x1D646, 'M', u'k'),
+    (0x1D647, 'M', u'l'),
+    (0x1D648, 'M', u'm'),
+    (0x1D649, 'M', u'n'),
+    (0x1D64A, 'M', u'o'),
+    (0x1D64B, 'M', u'p'),
+    (0x1D64C, 'M', u'q'),
+    (0x1D64D, 'M', u'r'),
+    (0x1D64E, 'M', u's'),
+    (0x1D64F, 'M', u't'),
+    (0x1D650, 'M', u'u'),
+    (0x1D651, 'M', u'v'),
+    (0x1D652, 'M', u'w'),
+    (0x1D653, 'M', u'x'),
+    (0x1D654, 'M', u'y'),
+    (0x1D655, 'M', u'z'),
+    (0x1D656, 'M', u'a'),
+    ]
+
+def _seg_64():
+    return [
+    (0x1D657, 'M', u'b'),
+    (0x1D658, 'M', u'c'),
+    (0x1D659, 'M', u'd'),
+    (0x1D65A, 'M', u'e'),
+    (0x1D65B, 'M', u'f'),
+    (0x1D65C, 'M', u'g'),
+    (0x1D65D, 'M', u'h'),
+    (0x1D65E, 'M', u'i'),
+    (0x1D65F, 'M', u'j'),
+    (0x1D660, 'M', u'k'),
+    (0x1D661, 'M', u'l'),
+    (0x1D662, 'M', u'm'),
+    (0x1D663, 'M', u'n'),
+    (0x1D664, 'M', u'o'),
+    (0x1D665, 'M', u'p'),
+    (0x1D666, 'M', u'q'),
+    (0x1D667, 'M', u'r'),
+    (0x1D668, 'M', u's'),
+    (0x1D669, 'M', u't'),
+    (0x1D66A, 'M', u'u'),
+    (0x1D66B, 'M', u'v'),
+    (0x1D66C, 'M', u'w'),
+    (0x1D66D, 'M', u'x'),
+    (0x1D66E, 'M', u'y'),
+    (0x1D66F, 'M', u'z'),
+    (0x1D670, 'M', u'a'),
+    (0x1D671, 'M', u'b'),
+    (0x1D672, 'M', u'c'),
+    (0x1D673, 'M', u'd'),
+    (0x1D674, 'M', u'e'),
+    (0x1D675, 'M', u'f'),
+    (0x1D676, 'M', u'g'),
+    (0x1D677, 'M', u'h'),
+    (0x1D678, 'M', u'i'),
+    (0x1D679, 'M', u'j'),
+    (0x1D67A, 'M', u'k'),
+    (0x1D67B, 'M', u'l'),
+    (0x1D67C, 'M', u'm'),
+    (0x1D67D, 'M', u'n'),
+    (0x1D67E, 'M', u'o'),
+    (0x1D67F, 'M', u'p'),
+    (0x1D680, 'M', u'q'),
+    (0x1D681, 'M', u'r'),
+    (0x1D682, 'M', u's'),
+    (0x1D683, 'M', u't'),
+    (0x1D684, 'M', u'u'),
+    (0x1D685, 'M', u'v'),
+    (0x1D686, 'M', u'w'),
+    (0x1D687, 'M', u'x'),
+    (0x1D688, 'M', u'y'),
+    (0x1D689, 'M', u'z'),
+    (0x1D68A, 'M', u'a'),
+    (0x1D68B, 'M', u'b'),
+    (0x1D68C, 'M', u'c'),
+    (0x1D68D, 'M', u'd'),
+    (0x1D68E, 'M', u'e'),
+    (0x1D68F, 'M', u'f'),
+    (0x1D690, 'M', u'g'),
+    (0x1D691, 'M', u'h'),
+    (0x1D692, 'M', u'i'),
+    (0x1D693, 'M', u'j'),
+    (0x1D694, 'M', u'k'),
+    (0x1D695, 'M', u'l'),
+    (0x1D696, 'M', u'm'),
+    (0x1D697, 'M', u'n'),
+    (0x1D698, 'M', u'o'),
+    (0x1D699, 'M', u'p'),
+    (0x1D69A, 'M', u'q'),
+    (0x1D69B, 'M', u'r'),
+    (0x1D69C, 'M', u's'),
+    (0x1D69D, 'M', u't'),
+    (0x1D69E, 'M', u'u'),
+    (0x1D69F, 'M', u'v'),
+    (0x1D6A0, 'M', u'w'),
+    (0x1D6A1, 'M', u'x'),
+    (0x1D6A2, 'M', u'y'),
+    (0x1D6A3, 'M', u'z'),
+    (0x1D6A4, 'M', u'ı'),
+    (0x1D6A5, 'M', u'ȷ'),
+    (0x1D6A6, 'X'),
+    (0x1D6A8, 'M', u'α'),
+    (0x1D6A9, 'M', u'β'),
+    (0x1D6AA, 'M', u'γ'),
+    (0x1D6AB, 'M', u'δ'),
+    (0x1D6AC, 'M', u'ε'),
+    (0x1D6AD, 'M', u'ζ'),
+    (0x1D6AE, 'M', u'η'),
+    (0x1D6AF, 'M', u'θ'),
+    (0x1D6B0, 'M', u'ι'),
+    (0x1D6B1, 'M', u'κ'),
+    (0x1D6B2, 'M', u'λ'),
+    (0x1D6B3, 'M', u'μ'),
+    (0x1D6B4, 'M', u'ν'),
+    (0x1D6B5, 'M', u'ξ'),
+    (0x1D6B6, 'M', u'ο'),
+    (0x1D6B7, 'M', u'π'),
+    (0x1D6B8, 'M', u'ρ'),
+    (0x1D6B9, 'M', u'θ'),
+    (0x1D6BA, 'M', u'σ'),
+    (0x1D6BB, 'M', u'τ'),
+    ]
+
+def _seg_65():
+    return [
+    (0x1D6BC, 'M', u'υ'),
+    (0x1D6BD, 'M', u'φ'),
+    (0x1D6BE, 'M', u'χ'),
+    (0x1D6BF, 'M', u'ψ'),
+    (0x1D6C0, 'M', u'ω'),
+    (0x1D6C1, 'M', u'∇'),
+    (0x1D6C2, 'M', u'α'),
+    (0x1D6C3, 'M', u'β'),
+    (0x1D6C4, 'M', u'γ'),
+    (0x1D6C5, 'M', u'δ'),
+    (0x1D6C6, 'M', u'ε'),
+    (0x1D6C7, 'M', u'ζ'),
+    (0x1D6C8, 'M', u'η'),
+    (0x1D6C9, 'M', u'θ'),
+    (0x1D6CA, 'M', u'ι'),
+    (0x1D6CB, 'M', u'κ'),
+    (0x1D6CC, 'M', u'λ'),
+    (0x1D6CD, 'M', u'μ'),
+    (0x1D6CE, 'M', u'ν'),
+    (0x1D6CF, 'M', u'ξ'),
+    (0x1D6D0, 'M', u'ο'),
+    (0x1D6D1, 'M', u'π'),
+    (0x1D6D2, 'M', u'ρ'),
+    (0x1D6D3, 'M', u'σ'),
+    (0x1D6D5, 'M', u'τ'),
+    (0x1D6D6, 'M', u'υ'),
+    (0x1D6D7, 'M', u'φ'),
+    (0x1D6D8, 'M', u'χ'),
+    (0x1D6D9, 'M', u'ψ'),
+    (0x1D6DA, 'M', u'ω'),
+    (0x1D6DB, 'M', u'∂'),
+    (0x1D6DC, 'M', u'ε'),
+    (0x1D6DD, 'M', u'θ'),
+    (0x1D6DE, 'M', u'κ'),
+    (0x1D6DF, 'M', u'φ'),
+    (0x1D6E0, 'M', u'ρ'),
+    (0x1D6E1, 'M', u'π'),
+    (0x1D6E2, 'M', u'α'),
+    (0x1D6E3, 'M', u'β'),
+    (0x1D6E4, 'M', u'γ'),
+    (0x1D6E5, 'M', u'δ'),
+    (0x1D6E6, 'M', u'ε'),
+    (0x1D6E7, 'M', u'ζ'),
+    (0x1D6E8, 'M', u'η'),
+    (0x1D6E9, 'M', u'θ'),
+    (0x1D6EA, 'M', u'ι'),
+    (0x1D6EB, 'M', u'κ'),
+    (0x1D6EC, 'M', u'λ'),
+    (0x1D6ED, 'M', u'μ'),
+    (0x1D6EE, 'M', u'ν'),
+    (0x1D6EF, 'M', u'ξ'),
+    (0x1D6F0, 'M', u'ο'),
+    (0x1D6F1, 'M', u'π'),
+    (0x1D6F2, 'M', u'ρ'),
+    (0x1D6F3, 'M', u'θ'),
+    (0x1D6F4, 'M', u'σ'),
+    (0x1D6F5, 'M', u'τ'),
+    (0x1D6F6, 'M', u'υ'),
+    (0x1D6F7, 'M', u'φ'),
+    (0x1D6F8, 'M', u'χ'),
+    (0x1D6F9, 'M', u'ψ'),
+    (0x1D6FA, 'M', u'ω'),
+    (0x1D6FB, 'M', u'∇'),
+    (0x1D6FC, 'M', u'α'),
+    (0x1D6FD, 'M', u'β'),
+    (0x1D6FE, 'M', u'γ'),
+    (0x1D6FF, 'M', u'δ'),
+    (0x1D700, 'M', u'ε'),
+    (0x1D701, 'M', u'ζ'),
+    (0x1D702, 'M', u'η'),
+    (0x1D703, 'M', u'θ'),
+    (0x1D704, 'M', u'ι'),
+    (0x1D705, 'M', u'κ'),
+    (0x1D706, 'M', u'λ'),
+    (0x1D707, 'M', u'μ'),
+    (0x1D708, 'M', u'ν'),
+    (0x1D709, 'M', u'ξ'),
+    (0x1D70A, 'M', u'ο'),
+    (0x1D70B, 'M', u'π'),
+    (0x1D70C, 'M', u'ρ'),
+    (0x1D70D, 'M', u'σ'),
+    (0x1D70F, 'M', u'τ'),
+    (0x1D710, 'M', u'υ'),
+    (0x1D711, 'M', u'φ'),
+    (0x1D712, 'M', u'χ'),
+    (0x1D713, 'M', u'ψ'),
+    (0x1D714, 'M', u'ω'),
+    (0x1D715, 'M', u'∂'),
+    (0x1D716, 'M', u'ε'),
+    (0x1D717, 'M', u'θ'),
+    (0x1D718, 'M', u'κ'),
+    (0x1D719, 'M', u'φ'),
+    (0x1D71A, 'M', u'ρ'),
+    (0x1D71B, 'M', u'π'),
+    (0x1D71C, 'M', u'α'),
+    (0x1D71D, 'M', u'β'),
+    (0x1D71E, 'M', u'γ'),
+    (0x1D71F, 'M', u'δ'),
+    (0x1D720, 'M', u'ε'),
+    (0x1D721, 'M', u'ζ'),
+    ]
+
+def _seg_66():
+    return [
+    (0x1D722, 'M', u'η'),
+    (0x1D723, 'M', u'θ'),
+    (0x1D724, 'M', u'ι'),
+    (0x1D725, 'M', u'κ'),
+    (0x1D726, 'M', u'λ'),
+    (0x1D727, 'M', u'μ'),
+    (0x1D728, 'M', u'ν'),
+    (0x1D729, 'M', u'ξ'),
+    (0x1D72A, 'M', u'ο'),
+    (0x1D72B, 'M', u'π'),
+    (0x1D72C, 'M', u'ρ'),
+    (0x1D72D, 'M', u'θ'),
+    (0x1D72E, 'M', u'σ'),
+    (0x1D72F, 'M', u'τ'),
+    (0x1D730, 'M', u'υ'),
+    (0x1D731, 'M', u'φ'),
+    (0x1D732, 'M', u'χ'),
+    (0x1D733, 'M', u'ψ'),
+    (0x1D734, 'M', u'ω'),
+    (0x1D735, 'M', u'∇'),
+    (0x1D736, 'M', u'α'),
+    (0x1D737, 'M', u'β'),
+    (0x1D738, 'M', u'γ'),
+    (0x1D739, 'M', u'δ'),
+    (0x1D73A, 'M', u'ε'),
+    (0x1D73B, 'M', u'ζ'),
+    (0x1D73C, 'M', u'η'),
+    (0x1D73D, 'M', u'θ'),
+    (0x1D73E, 'M', u'ι'),
+    (0x1D73F, 'M', u'κ'),
+    (0x1D740, 'M', u'λ'),
+    (0x1D741, 'M', u'μ'),
+    (0x1D742, 'M', u'ν'),
+    (0x1D743, 'M', u'ξ'),
+    (0x1D744, 'M', u'ο'),
+    (0x1D745, 'M', u'π'),
+    (0x1D746, 'M', u'ρ'),
+    (0x1D747, 'M', u'σ'),
+    (0x1D749, 'M', u'τ'),
+    (0x1D74A, 'M', u'υ'),
+    (0x1D74B, 'M', u'φ'),
+    (0x1D74C, 'M', u'χ'),
+    (0x1D74D, 'M', u'ψ'),
+    (0x1D74E, 'M', u'ω'),
+    (0x1D74F, 'M', u'∂'),
+    (0x1D750, 'M', u'ε'),
+    (0x1D751, 'M', u'θ'),
+    (0x1D752, 'M', u'κ'),
+    (0x1D753, 'M', u'φ'),
+    (0x1D754, 'M', u'ρ'),
+    (0x1D755, 'M', u'π'),
+    (0x1D756, 'M', u'α'),
+    (0x1D757, 'M', u'β'),
+    (0x1D758, 'M', u'γ'),
+    (0x1D759, 'M', u'δ'),
+    (0x1D75A, 'M', u'ε'),
+    (0x1D75B, 'M', u'ζ'),
+    (0x1D75C, 'M', u'η'),
+    (0x1D75D, 'M', u'θ'),
+    (0x1D75E, 'M', u'ι'),
+    (0x1D75F, 'M', u'κ'),
+    (0x1D760, 'M', u'λ'),
+    (0x1D761, 'M', u'μ'),
+    (0x1D762, 'M', u'ν'),
+    (0x1D763, 'M', u'ξ'),
+    (0x1D764, 'M', u'ο'),
+    (0x1D765, 'M', u'π'),
+    (0x1D766, 'M', u'ρ'),
+    (0x1D767, 'M', u'θ'),
+    (0x1D768, 'M', u'σ'),
+    (0x1D769, 'M', u'τ'),
+    (0x1D76A, 'M', u'υ'),
+    (0x1D76B, 'M', u'φ'),
+    (0x1D76C, 'M', u'χ'),
+    (0x1D76D, 'M', u'ψ'),
+    (0x1D76E, 'M', u'ω'),
+    (0x1D76F, 'M', u'∇'),
+    (0x1D770, 'M', u'α'),
+    (0x1D771, 'M', u'β'),
+    (0x1D772, 'M', u'γ'),
+    (0x1D773, 'M', u'δ'),
+    (0x1D774, 'M', u'ε'),
+    (0x1D775, 'M', u'ζ'),
+    (0x1D776, 'M', u'η'),
+    (0x1D777, 'M', u'θ'),
+    (0x1D778, 'M', u'ι'),
+    (0x1D779, 'M', u'κ'),
+    (0x1D77A, 'M', u'λ'),
+    (0x1D77B, 'M', u'μ'),
+    (0x1D77C, 'M', u'ν'),
+    (0x1D77D, 'M', u'ξ'),
+    (0x1D77E, 'M', u'ο'),
+    (0x1D77F, 'M', u'π'),
+    (0x1D780, 'M', u'ρ'),
+    (0x1D781, 'M', u'σ'),
+    (0x1D783, 'M', u'τ'),
+    (0x1D784, 'M', u'υ'),
+    (0x1D785, 'M', u'φ'),
+    (0x1D786, 'M', u'χ'),
+    (0x1D787, 'M', u'ψ'),
+    ]
+
+def _seg_67():
+    return [
+    (0x1D788, 'M', u'ω'),
+    (0x1D789, 'M', u'∂'),
+    (0x1D78A, 'M', u'ε'),
+    (0x1D78B, 'M', u'θ'),
+    (0x1D78C, 'M', u'κ'),
+    (0x1D78D, 'M', u'φ'),
+    (0x1D78E, 'M', u'ρ'),
+    (0x1D78F, 'M', u'π'),
+    (0x1D790, 'M', u'α'),
+    (0x1D791, 'M', u'β'),
+    (0x1D792, 'M', u'γ'),
+    (0x1D793, 'M', u'δ'),
+    (0x1D794, 'M', u'ε'),
+    (0x1D795, 'M', u'ζ'),
+    (0x1D796, 'M', u'η'),
+    (0x1D797, 'M', u'θ'),
+    (0x1D798, 'M', u'ι'),
+    (0x1D799, 'M', u'κ'),
+    (0x1D79A, 'M', u'λ'),
+    (0x1D79B, 'M', u'μ'),
+    (0x1D79C, 'M', u'ν'),
+    (0x1D79D, 'M', u'ξ'),
+    (0x1D79E, 'M', u'ο'),
+    (0x1D79F, 'M', u'π'),
+    (0x1D7A0, 'M', u'ρ'),
+    (0x1D7A1, 'M', u'θ'),
+    (0x1D7A2, 'M', u'σ'),
+    (0x1D7A3, 'M', u'τ'),
+    (0x1D7A4, 'M', u'υ'),
+    (0x1D7A5, 'M', u'φ'),
+    (0x1D7A6, 'M', u'χ'),
+    (0x1D7A7, 'M', u'ψ'),
+    (0x1D7A8, 'M', u'ω'),
+    (0x1D7A9, 'M', u'∇'),
+    (0x1D7AA, 'M', u'α'),
+    (0x1D7AB, 'M', u'β'),
+    (0x1D7AC, 'M', u'γ'),
+    (0x1D7AD, 'M', u'δ'),
+    (0x1D7AE, 'M', u'ε'),
+    (0x1D7AF, 'M', u'ζ'),
+    (0x1D7B0, 'M', u'η'),
+    (0x1D7B1, 'M', u'θ'),
+    (0x1D7B2, 'M', u'ι'),
+    (0x1D7B3, 'M', u'κ'),
+    (0x1D7B4, 'M', u'λ'),
+    (0x1D7B5, 'M', u'μ'),
+    (0x1D7B6, 'M', u'ν'),
+    (0x1D7B7, 'M', u'ξ'),
+    (0x1D7B8, 'M', u'ο'),
+    (0x1D7B9, 'M', u'π'),
+    (0x1D7BA, 'M', u'ρ'),
+    (0x1D7BB, 'M', u'σ'),
+    (0x1D7BD, 'M', u'τ'),
+    (0x1D7BE, 'M', u'υ'),
+    (0x1D7BF, 'M', u'φ'),
+    (0x1D7C0, 'M', u'χ'),
+    (0x1D7C1, 'M', u'ψ'),
+    (0x1D7C2, 'M', u'ω'),
+    (0x1D7C3, 'M', u'∂'),
+    (0x1D7C4, 'M', u'ε'),
+    (0x1D7C5, 'M', u'θ'),
+    (0x1D7C6, 'M', u'κ'),
+    (0x1D7C7, 'M', u'φ'),
+    (0x1D7C8, 'M', u'ρ'),
+    (0x1D7C9, 'M', u'π'),
+    (0x1D7CA, 'M', u'ϝ'),
+    (0x1D7CC, 'X'),
+    (0x1D7CE, 'M', u'0'),
+    (0x1D7CF, 'M', u'1'),
+    (0x1D7D0, 'M', u'2'),
+    (0x1D7D1, 'M', u'3'),
+    (0x1D7D2, 'M', u'4'),
+    (0x1D7D3, 'M', u'5'),
+    (0x1D7D4, 'M', u'6'),
+    (0x1D7D5, 'M', u'7'),
+    (0x1D7D6, 'M', u'8'),
+    (0x1D7D7, 'M', u'9'),
+    (0x1D7D8, 'M', u'0'),
+    (0x1D7D9, 'M', u'1'),
+    (0x1D7DA, 'M', u'2'),
+    (0x1D7DB, 'M', u'3'),
+    (0x1D7DC, 'M', u'4'),
+    (0x1D7DD, 'M', u'5'),
+    (0x1D7DE, 'M', u'6'),
+    (0x1D7DF, 'M', u'7'),
+    (0x1D7E0, 'M', u'8'),
+    (0x1D7E1, 'M', u'9'),
+    (0x1D7E2, 'M', u'0'),
+    (0x1D7E3, 'M', u'1'),
+    (0x1D7E4, 'M', u'2'),
+    (0x1D7E5, 'M', u'3'),
+    (0x1D7E6, 'M', u'4'),
+    (0x1D7E7, 'M', u'5'),
+    (0x1D7E8, 'M', u'6'),
+    (0x1D7E9, 'M', u'7'),
+    (0x1D7EA, 'M', u'8'),
+    (0x1D7EB, 'M', u'9'),
+    (0x1D7EC, 'M', u'0'),
+    (0x1D7ED, 'M', u'1'),
+    (0x1D7EE, 'M', u'2'),
+    ]
+
+def _seg_68():
+    return [
+    (0x1D7EF, 'M', u'3'),
+    (0x1D7F0, 'M', u'4'),
+    (0x1D7F1, 'M', u'5'),
+    (0x1D7F2, 'M', u'6'),
+    (0x1D7F3, 'M', u'7'),
+    (0x1D7F4, 'M', u'8'),
+    (0x1D7F5, 'M', u'9'),
+    (0x1D7F6, 'M', u'0'),
+    (0x1D7F7, 'M', u'1'),
+    (0x1D7F8, 'M', u'2'),
+    (0x1D7F9, 'M', u'3'),
+    (0x1D7FA, 'M', u'4'),
+    (0x1D7FB, 'M', u'5'),
+    (0x1D7FC, 'M', u'6'),
+    (0x1D7FD, 'M', u'7'),
+    (0x1D7FE, 'M', u'8'),
+    (0x1D7FF, 'M', u'9'),
+    (0x1D800, 'V'),
+    (0x1DA8C, 'X'),
+    (0x1DA9B, 'V'),
+    (0x1DAA0, 'X'),
+    (0x1DAA1, 'V'),
+    (0x1DAB0, 'X'),
+    (0x1E000, 'V'),
+    (0x1E007, 'X'),
+    (0x1E008, 'V'),
+    (0x1E019, 'X'),
+    (0x1E01B, 'V'),
+    (0x1E022, 'X'),
+    (0x1E023, 'V'),
+    (0x1E025, 'X'),
+    (0x1E026, 'V'),
+    (0x1E02B, 'X'),
+    (0x1E800, 'V'),
+    (0x1E8C5, 'X'),
+    (0x1E8C7, 'V'),
+    (0x1E8D7, 'X'),
+    (0x1E900, 'M', u'𞤢'),
+    (0x1E901, 'M', u'𞤣'),
+    (0x1E902, 'M', u'𞤤'),
+    (0x1E903, 'M', u'𞤥'),
+    (0x1E904, 'M', u'𞤦'),
+    (0x1E905, 'M', u'𞤧'),
+    (0x1E906, 'M', u'𞤨'),
+    (0x1E907, 'M', u'𞤩'),
+    (0x1E908, 'M', u'𞤪'),
+    (0x1E909, 'M', u'𞤫'),
+    (0x1E90A, 'M', u'𞤬'),
+    (0x1E90B, 'M', u'𞤭'),
+    (0x1E90C, 'M', u'𞤮'),
+    (0x1E90D, 'M', u'𞤯'),
+    (0x1E90E, 'M', u'𞤰'),
+    (0x1E90F, 'M', u'𞤱'),
+    (0x1E910, 'M', u'𞤲'),
+    (0x1E911, 'M', u'𞤳'),
+    (0x1E912, 'M', u'𞤴'),
+    (0x1E913, 'M', u'𞤵'),
+    (0x1E914, 'M', u'𞤶'),
+    (0x1E915, 'M', u'𞤷'),
+    (0x1E916, 'M', u'𞤸'),
+    (0x1E917, 'M', u'𞤹'),
+    (0x1E918, 'M', u'𞤺'),
+    (0x1E919, 'M', u'𞤻'),
+    (0x1E91A, 'M', u'𞤼'),
+    (0x1E91B, 'M', u'𞤽'),
+    (0x1E91C, 'M', u'𞤾'),
+    (0x1E91D, 'M', u'𞤿'),
+    (0x1E91E, 'M', u'𞥀'),
+    (0x1E91F, 'M', u'𞥁'),
+    (0x1E920, 'M', u'𞥂'),
+    (0x1E921, 'M', u'𞥃'),
+    (0x1E922, 'V'),
+    (0x1E94B, 'X'),
+    (0x1E950, 'V'),
+    (0x1E95A, 'X'),
+    (0x1E95E, 'V'),
+    (0x1E960, 'X'),
+    (0x1EC71, 'V'),
+    (0x1ECB5, 'X'),
+    (0x1EE00, 'M', u'ا'),
+    (0x1EE01, 'M', u'ب'),
+    (0x1EE02, 'M', u'ج'),
+    (0x1EE03, 'M', u'د'),
+    (0x1EE04, 'X'),
+    (0x1EE05, 'M', u'و'),
+    (0x1EE06, 'M', u'ز'),
+    (0x1EE07, 'M', u'ح'),
+    (0x1EE08, 'M', u'ط'),
+    (0x1EE09, 'M', u'ي'),
+    (0x1EE0A, 'M', u'ك'),
+    (0x1EE0B, 'M', u'ل'),
+    (0x1EE0C, 'M', u'م'),
+    (0x1EE0D, 'M', u'ن'),
+    (0x1EE0E, 'M', u'س'),
+    (0x1EE0F, 'M', u'ع'),
+    (0x1EE10, 'M', u'ف'),
+    (0x1EE11, 'M', u'ص'),
+    (0x1EE12, 'M', u'ق'),
+    (0x1EE13, 'M', u'ر'),
+    (0x1EE14, 'M', u'ش'),
+    ]
+
+def _seg_69():
+    return [
+    (0x1EE15, 'M', u'ت'),
+    (0x1EE16, 'M', u'ث'),
+    (0x1EE17, 'M', u'خ'),
+    (0x1EE18, 'M', u'ذ'),
+    (0x1EE19, 'M', u'ض'),
+    (0x1EE1A, 'M', u'ظ'),
+    (0x1EE1B, 'M', u'غ'),
+    (0x1EE1C, 'M', u'ٮ'),
+    (0x1EE1D, 'M', u'ں'),
+    (0x1EE1E, 'M', u'ڡ'),
+    (0x1EE1F, 'M', u'ٯ'),
+    (0x1EE20, 'X'),
+    (0x1EE21, 'M', u'ب'),
+    (0x1EE22, 'M', u'ج'),
+    (0x1EE23, 'X'),
+    (0x1EE24, 'M', u'ه'),
+    (0x1EE25, 'X'),
+    (0x1EE27, 'M', u'ح'),
+    (0x1EE28, 'X'),
+    (0x1EE29, 'M', u'ي'),
+    (0x1EE2A, 'M', u'ك'),
+    (0x1EE2B, 'M', u'ل'),
+    (0x1EE2C, 'M', u'م'),
+    (0x1EE2D, 'M', u'ن'),
+    (0x1EE2E, 'M', u'س'),
+    (0x1EE2F, 'M', u'ع'),
+    (0x1EE30, 'M', u'ف'),
+    (0x1EE31, 'M', u'ص'),
+    (0x1EE32, 'M', u'ق'),
+    (0x1EE33, 'X'),
+    (0x1EE34, 'M', u'ش'),
+    (0x1EE35, 'M', u'ت'),
+    (0x1EE36, 'M', u'ث'),
+    (0x1EE37, 'M', u'خ'),
+    (0x1EE38, 'X'),
+    (0x1EE39, 'M', u'ض'),
+    (0x1EE3A, 'X'),
+    (0x1EE3B, 'M', u'غ'),
+    (0x1EE3C, 'X'),
+    (0x1EE42, 'M', u'ج'),
+    (0x1EE43, 'X'),
+    (0x1EE47, 'M', u'ح'),
+    (0x1EE48, 'X'),
+    (0x1EE49, 'M', u'ي'),
+    (0x1EE4A, 'X'),
+    (0x1EE4B, 'M', u'ل'),
+    (0x1EE4C, 'X'),
+    (0x1EE4D, 'M', u'ن'),
+    (0x1EE4E, 'M', u'س'),
+    (0x1EE4F, 'M', u'ع'),
+    (0x1EE50, 'X'),
+    (0x1EE51, 'M', u'ص'),
+    (0x1EE52, 'M', u'ق'),
+    (0x1EE53, 'X'),
+    (0x1EE54, 'M', u'ش'),
+    (0x1EE55, 'X'),
+    (0x1EE57, 'M', u'خ'),
+    (0x1EE58, 'X'),
+    (0x1EE59, 'M', u'ض'),
+    (0x1EE5A, 'X'),
+    (0x1EE5B, 'M', u'غ'),
+    (0x1EE5C, 'X'),
+    (0x1EE5D, 'M', u'ں'),
+    (0x1EE5E, 'X'),
+    (0x1EE5F, 'M', u'ٯ'),
+    (0x1EE60, 'X'),
+    (0x1EE61, 'M', u'ب'),
+    (0x1EE62, 'M', u'ج'),
+    (0x1EE63, 'X'),
+    (0x1EE64, 'M', u'ه'),
+    (0x1EE65, 'X'),
+    (0x1EE67, 'M', u'ح'),
+    (0x1EE68, 'M', u'ط'),
+    (0x1EE69, 'M', u'ي'),
+    (0x1EE6A, 'M', u'ك'),
+    (0x1EE6B, 'X'),
+    (0x1EE6C, 'M', u'م'),
+    (0x1EE6D, 'M', u'ن'),
+    (0x1EE6E, 'M', u'س'),
+    (0x1EE6F, 'M', u'ع'),
+    (0x1EE70, 'M', u'ف'),
+    (0x1EE71, 'M', u'ص'),
+    (0x1EE72, 'M', u'ق'),
+    (0x1EE73, 'X'),
+    (0x1EE74, 'M', u'ش'),
+    (0x1EE75, 'M', u'ت'),
+    (0x1EE76, 'M', u'ث'),
+    (0x1EE77, 'M', u'خ'),
+    (0x1EE78, 'X'),
+    (0x1EE79, 'M', u'ض'),
+    (0x1EE7A, 'M', u'ظ'),
+    (0x1EE7B, 'M', u'غ'),
+    (0x1EE7C, 'M', u'ٮ'),
+    (0x1EE7D, 'X'),
+    (0x1EE7E, 'M', u'ڡ'),
+    (0x1EE7F, 'X'),
+    (0x1EE80, 'M', u'ا'),
+    (0x1EE81, 'M', u'ب'),
+    (0x1EE82, 'M', u'ج'),
+    (0x1EE83, 'M', u'د'),
+    ]
+
+def _seg_70():
+    return [
+    (0x1EE84, 'M', u'ه'),
+    (0x1EE85, 'M', u'و'),
+    (0x1EE86, 'M', u'ز'),
+    (0x1EE87, 'M', u'ح'),
+    (0x1EE88, 'M', u'ط'),
+    (0x1EE89, 'M', u'ي'),
+    (0x1EE8A, 'X'),
+    (0x1EE8B, 'M', u'ل'),
+    (0x1EE8C, 'M', u'م'),
+    (0x1EE8D, 'M', u'ن'),
+    (0x1EE8E, 'M', u'س'),
+    (0x1EE8F, 'M', u'ع'),
+    (0x1EE90, 'M', u'ف'),
+    (0x1EE91, 'M', u'ص'),
+    (0x1EE92, 'M', u'ق'),
+    (0x1EE93, 'M', u'ر'),
+    (0x1EE94, 'M', u'ش'),
+    (0x1EE95, 'M', u'ت'),
+    (0x1EE96, 'M', u'ث'),
+    (0x1EE97, 'M', u'خ'),
+    (0x1EE98, 'M', u'ذ'),
+    (0x1EE99, 'M', u'ض'),
+    (0x1EE9A, 'M', u'ظ'),
+    (0x1EE9B, 'M', u'غ'),
+    (0x1EE9C, 'X'),
+    (0x1EEA1, 'M', u'ب'),
+    (0x1EEA2, 'M', u'ج'),
+    (0x1EEA3, 'M', u'د'),
+    (0x1EEA4, 'X'),
+    (0x1EEA5, 'M', u'و'),
+    (0x1EEA6, 'M', u'ز'),
+    (0x1EEA7, 'M', u'ح'),
+    (0x1EEA8, 'M', u'ط'),
+    (0x1EEA9, 'M', u'ي'),
+    (0x1EEAA, 'X'),
+    (0x1EEAB, 'M', u'ل'),
+    (0x1EEAC, 'M', u'م'),
+    (0x1EEAD, 'M', u'ن'),
+    (0x1EEAE, 'M', u'س'),
+    (0x1EEAF, 'M', u'ع'),
+    (0x1EEB0, 'M', u'ف'),
+    (0x1EEB1, 'M', u'ص'),
+    (0x1EEB2, 'M', u'ق'),
+    (0x1EEB3, 'M', u'ر'),
+    (0x1EEB4, 'M', u'ش'),
+    (0x1EEB5, 'M', u'ت'),
+    (0x1EEB6, 'M', u'ث'),
+    (0x1EEB7, 'M', u'خ'),
+    (0x1EEB8, 'M', u'ذ'),
+    (0x1EEB9, 'M', u'ض'),
+    (0x1EEBA, 'M', u'ظ'),
+    (0x1EEBB, 'M', u'غ'),
+    (0x1EEBC, 'X'),
+    (0x1EEF0, 'V'),
+    (0x1EEF2, 'X'),
+    (0x1F000, 'V'),
+    (0x1F02C, 'X'),
+    (0x1F030, 'V'),
+    (0x1F094, 'X'),
+    (0x1F0A0, 'V'),
+    (0x1F0AF, 'X'),
+    (0x1F0B1, 'V'),
+    (0x1F0C0, 'X'),
+    (0x1F0C1, 'V'),
+    (0x1F0D0, 'X'),
+    (0x1F0D1, 'V'),
+    (0x1F0F6, 'X'),
+    (0x1F101, '3', u'0,'),
+    (0x1F102, '3', u'1,'),
+    (0x1F103, '3', u'2,'),
+    (0x1F104, '3', u'3,'),
+    (0x1F105, '3', u'4,'),
+    (0x1F106, '3', u'5,'),
+    (0x1F107, '3', u'6,'),
+    (0x1F108, '3', u'7,'),
+    (0x1F109, '3', u'8,'),
+    (0x1F10A, '3', u'9,'),
+    (0x1F10B, 'V'),
+    (0x1F10D, 'X'),
+    (0x1F110, '3', u'(a)'),
+    (0x1F111, '3', u'(b)'),
+    (0x1F112, '3', u'(c)'),
+    (0x1F113, '3', u'(d)'),
+    (0x1F114, '3', u'(e)'),
+    (0x1F115, '3', u'(f)'),
+    (0x1F116, '3', u'(g)'),
+    (0x1F117, '3', u'(h)'),
+    (0x1F118, '3', u'(i)'),
+    (0x1F119, '3', u'(j)'),
+    (0x1F11A, '3', u'(k)'),
+    (0x1F11B, '3', u'(l)'),
+    (0x1F11C, '3', u'(m)'),
+    (0x1F11D, '3', u'(n)'),
+    (0x1F11E, '3', u'(o)'),
+    (0x1F11F, '3', u'(p)'),
+    (0x1F120, '3', u'(q)'),
+    (0x1F121, '3', u'(r)'),
+    (0x1F122, '3', u'(s)'),
+    (0x1F123, '3', u'(t)'),
+    (0x1F124, '3', u'(u)'),
+    ]
+
+def _seg_71():
+    return [
+    (0x1F125, '3', u'(v)'),
+    (0x1F126, '3', u'(w)'),
+    (0x1F127, '3', u'(x)'),
+    (0x1F128, '3', u'(y)'),
+    (0x1F129, '3', u'(z)'),
+    (0x1F12A, 'M', u'〔s〕'),
+    (0x1F12B, 'M', u'c'),
+    (0x1F12C, 'M', u'r'),
+    (0x1F12D, 'M', u'cd'),
+    (0x1F12E, 'M', u'wz'),
+    (0x1F12F, 'V'),
+    (0x1F130, 'M', u'a'),
+    (0x1F131, 'M', u'b'),
+    (0x1F132, 'M', u'c'),
+    (0x1F133, 'M', u'd'),
+    (0x1F134, 'M', u'e'),
+    (0x1F135, 'M', u'f'),
+    (0x1F136, 'M', u'g'),
+    (0x1F137, 'M', u'h'),
+    (0x1F138, 'M', u'i'),
+    (0x1F139, 'M', u'j'),
+    (0x1F13A, 'M', u'k'),
+    (0x1F13B, 'M', u'l'),
+    (0x1F13C, 'M', u'm'),
+    (0x1F13D, 'M', u'n'),
+    (0x1F13E, 'M', u'o'),
+    (0x1F13F, 'M', u'p'),
+    (0x1F140, 'M', u'q'),
+    (0x1F141, 'M', u'r'),
+    (0x1F142, 'M', u's'),
+    (0x1F143, 'M', u't'),
+    (0x1F144, 'M', u'u'),
+    (0x1F145, 'M', u'v'),
+    (0x1F146, 'M', u'w'),
+    (0x1F147, 'M', u'x'),
+    (0x1F148, 'M', u'y'),
+    (0x1F149, 'M', u'z'),
+    (0x1F14A, 'M', u'hv'),
+    (0x1F14B, 'M', u'mv'),
+    (0x1F14C, 'M', u'sd'),
+    (0x1F14D, 'M', u'ss'),
+    (0x1F14E, 'M', u'ppv'),
+    (0x1F14F, 'M', u'wc'),
+    (0x1F150, 'V'),
+    (0x1F16A, 'M', u'mc'),
+    (0x1F16B, 'M', u'md'),
+    (0x1F16C, 'X'),
+    (0x1F170, 'V'),
+    (0x1F190, 'M', u'dj'),
+    (0x1F191, 'V'),
+    (0x1F1AD, 'X'),
+    (0x1F1E6, 'V'),
+    (0x1F200, 'M', u'ほか'),
+    (0x1F201, 'M', u'ココ'),
+    (0x1F202, 'M', u'サ'),
+    (0x1F203, 'X'),
+    (0x1F210, 'M', u'手'),
+    (0x1F211, 'M', u'字'),
+    (0x1F212, 'M', u'双'),
+    (0x1F213, 'M', u'デ'),
+    (0x1F214, 'M', u'二'),
+    (0x1F215, 'M', u'多'),
+    (0x1F216, 'M', u'解'),
+    (0x1F217, 'M', u'天'),
+    (0x1F218, 'M', u'交'),
+    (0x1F219, 'M', u'映'),
+    (0x1F21A, 'M', u'無'),
+    (0x1F21B, 'M', u'料'),
+    (0x1F21C, 'M', u'前'),
+    (0x1F21D, 'M', u'後'),
+    (0x1F21E, 'M', u'再'),
+    (0x1F21F, 'M', u'新'),
+    (0x1F220, 'M', u'初'),
+    (0x1F221, 'M', u'終'),
+    (0x1F222, 'M', u'生'),
+    (0x1F223, 'M', u'販'),
+    (0x1F224, 'M', u'声'),
+    (0x1F225, 'M', u'吹'),
+    (0x1F226, 'M', u'演'),
+    (0x1F227, 'M', u'投'),
+    (0x1F228, 'M', u'捕'),
+    (0x1F229, 'M', u'一'),
+    (0x1F22A, 'M', u'三'),
+    (0x1F22B, 'M', u'遊'),
+    (0x1F22C, 'M', u'左'),
+    (0x1F22D, 'M', u'中'),
+    (0x1F22E, 'M', u'右'),
+    (0x1F22F, 'M', u'指'),
+    (0x1F230, 'M', u'走'),
+    (0x1F231, 'M', u'打'),
+    (0x1F232, 'M', u'禁'),
+    (0x1F233, 'M', u'空'),
+    (0x1F234, 'M', u'合'),
+    (0x1F235, 'M', u'満'),
+    (0x1F236, 'M', u'有'),
+    (0x1F237, 'M', u'月'),
+    (0x1F238, 'M', u'申'),
+    (0x1F239, 'M', u'割'),
+    (0x1F23A, 'M', u'営'),
+    (0x1F23B, 'M', u'配'),
+    ]
+
+def _seg_72():
+    return [
+    (0x1F23C, 'X'),
+    (0x1F240, 'M', u'〔本〕'),
+    (0x1F241, 'M', u'〔三〕'),
+    (0x1F242, 'M', u'〔二〕'),
+    (0x1F243, 'M', u'〔安〕'),
+    (0x1F244, 'M', u'〔点〕'),
+    (0x1F245, 'M', u'〔打〕'),
+    (0x1F246, 'M', u'〔盗〕'),
+    (0x1F247, 'M', u'〔勝〕'),
+    (0x1F248, 'M', u'〔敗〕'),
+    (0x1F249, 'X'),
+    (0x1F250, 'M', u'得'),
+    (0x1F251, 'M', u'可'),
+    (0x1F252, 'X'),
+    (0x1F260, 'V'),
+    (0x1F266, 'X'),
+    (0x1F300, 'V'),
+    (0x1F6D5, 'X'),
+    (0x1F6E0, 'V'),
+    (0x1F6ED, 'X'),
+    (0x1F6F0, 'V'),
+    (0x1F6FA, 'X'),
+    (0x1F700, 'V'),
+    (0x1F774, 'X'),
+    (0x1F780, 'V'),
+    (0x1F7D9, 'X'),
+    (0x1F800, 'V'),
+    (0x1F80C, 'X'),
+    (0x1F810, 'V'),
+    (0x1F848, 'X'),
+    (0x1F850, 'V'),
+    (0x1F85A, 'X'),
+    (0x1F860, 'V'),
+    (0x1F888, 'X'),
+    (0x1F890, 'V'),
+    (0x1F8AE, 'X'),
+    (0x1F900, 'V'),
+    (0x1F90C, 'X'),
+    (0x1F910, 'V'),
+    (0x1F93F, 'X'),
+    (0x1F940, 'V'),
+    (0x1F971, 'X'),
+    (0x1F973, 'V'),
+    (0x1F977, 'X'),
+    (0x1F97A, 'V'),
+    (0x1F97B, 'X'),
+    (0x1F97C, 'V'),
+    (0x1F9A3, 'X'),
+    (0x1F9B0, 'V'),
+    (0x1F9BA, 'X'),
+    (0x1F9C0, 'V'),
+    (0x1F9C3, 'X'),
+    (0x1F9D0, 'V'),
+    (0x1FA00, 'X'),
+    (0x1FA60, 'V'),
+    (0x1FA6E, 'X'),
+    (0x20000, 'V'),
+    (0x2A6D7, 'X'),
+    (0x2A700, 'V'),
+    (0x2B735, 'X'),
+    (0x2B740, 'V'),
+    (0x2B81E, 'X'),
+    (0x2B820, 'V'),
+    (0x2CEA2, 'X'),
+    (0x2CEB0, 'V'),
+    (0x2EBE1, 'X'),
+    (0x2F800, 'M', u'丽'),
+    (0x2F801, 'M', u'丸'),
+    (0x2F802, 'M', u'乁'),
+    (0x2F803, 'M', u'𠄢'),
+    (0x2F804, 'M', u'你'),
+    (0x2F805, 'M', u'侮'),
+    (0x2F806, 'M', u'侻'),
+    (0x2F807, 'M', u'倂'),
+    (0x2F808, 'M', u'偺'),
+    (0x2F809, 'M', u'備'),
+    (0x2F80A, 'M', u'僧'),
+    (0x2F80B, 'M', u'像'),
+    (0x2F80C, 'M', u'㒞'),
+    (0x2F80D, 'M', u'𠘺'),
+    (0x2F80E, 'M', u'免'),
+    (0x2F80F, 'M', u'兔'),
+    (0x2F810, 'M', u'兤'),
+    (0x2F811, 'M', u'具'),
+    (0x2F812, 'M', u'𠔜'),
+    (0x2F813, 'M', u'㒹'),
+    (0x2F814, 'M', u'內'),
+    (0x2F815, 'M', u'再'),
+    (0x2F816, 'M', u'𠕋'),
+    (0x2F817, 'M', u'冗'),
+    (0x2F818, 'M', u'冤'),
+    (0x2F819, 'M', u'仌'),
+    (0x2F81A, 'M', u'冬'),
+    (0x2F81B, 'M', u'况'),
+    (0x2F81C, 'M', u'𩇟'),
+    (0x2F81D, 'M', u'凵'),
+    (0x2F81E, 'M', u'刃'),
+    (0x2F81F, 'M', u'㓟'),
+    (0x2F820, 'M', u'刻'),
+    (0x2F821, 'M', u'剆'),
+    ]
+
+def _seg_73():
+    return [
+    (0x2F822, 'M', u'割'),
+    (0x2F823, 'M', u'剷'),
+    (0x2F824, 'M', u'㔕'),
+    (0x2F825, 'M', u'勇'),
+    (0x2F826, 'M', u'勉'),
+    (0x2F827, 'M', u'勤'),
+    (0x2F828, 'M', u'勺'),
+    (0x2F829, 'M', u'包'),
+    (0x2F82A, 'M', u'匆'),
+    (0x2F82B, 'M', u'北'),
+    (0x2F82C, 'M', u'卉'),
+    (0x2F82D, 'M', u'卑'),
+    (0x2F82E, 'M', u'博'),
+    (0x2F82F, 'M', u'即'),
+    (0x2F830, 'M', u'卽'),
+    (0x2F831, 'M', u'卿'),
+    (0x2F834, 'M', u'𠨬'),
+    (0x2F835, 'M', u'灰'),
+    (0x2F836, 'M', u'及'),
+    (0x2F837, 'M', u'叟'),
+    (0x2F838, 'M', u'𠭣'),
+    (0x2F839, 'M', u'叫'),
+    (0x2F83A, 'M', u'叱'),
+    (0x2F83B, 'M', u'吆'),
+    (0x2F83C, 'M', u'咞'),
+    (0x2F83D, 'M', u'吸'),
+    (0x2F83E, 'M', u'呈'),
+    (0x2F83F, 'M', u'周'),
+    (0x2F840, 'M', u'咢'),
+    (0x2F841, 'M', u'哶'),
+    (0x2F842, 'M', u'唐'),
+    (0x2F843, 'M', u'啓'),
+    (0x2F844, 'M', u'啣'),
+    (0x2F845, 'M', u'善'),
+    (0x2F847, 'M', u'喙'),
+    (0x2F848, 'M', u'喫'),
+    (0x2F849, 'M', u'喳'),
+    (0x2F84A, 'M', u'嗂'),
+    (0x2F84B, 'M', u'圖'),
+    (0x2F84C, 'M', u'嘆'),
+    (0x2F84D, 'M', u'圗'),
+    (0x2F84E, 'M', u'噑'),
+    (0x2F84F, 'M', u'噴'),
+    (0x2F850, 'M', u'切'),
+    (0x2F851, 'M', u'壮'),
+    (0x2F852, 'M', u'城'),
+    (0x2F853, 'M', u'埴'),
+    (0x2F854, 'M', u'堍'),
+    (0x2F855, 'M', u'型'),
+    (0x2F856, 'M', u'堲'),
+    (0x2F857, 'M', u'報'),
+    (0x2F858, 'M', u'墬'),
+    (0x2F859, 'M', u'𡓤'),
+    (0x2F85A, 'M', u'売'),
+    (0x2F85B, 'M', u'壷'),
+    (0x2F85C, 'M', u'夆'),
+    (0x2F85D, 'M', u'多'),
+    (0x2F85E, 'M', u'夢'),
+    (0x2F85F, 'M', u'奢'),
+    (0x2F860, 'M', u'𡚨'),
+    (0x2F861, 'M', u'𡛪'),
+    (0x2F862, 'M', u'姬'),
+    (0x2F863, 'M', u'娛'),
+    (0x2F864, 'M', u'娧'),
+    (0x2F865, 'M', u'姘'),
+    (0x2F866, 'M', u'婦'),
+    (0x2F867, 'M', u'㛮'),
+    (0x2F868, 'X'),
+    (0x2F869, 'M', u'嬈'),
+    (0x2F86A, 'M', u'嬾'),
+    (0x2F86C, 'M', u'𡧈'),
+    (0x2F86D, 'M', u'寃'),
+    (0x2F86E, 'M', u'寘'),
+    (0x2F86F, 'M', u'寧'),
+    (0x2F870, 'M', u'寳'),
+    (0x2F871, 'M', u'𡬘'),
+    (0x2F872, 'M', u'寿'),
+    (0x2F873, 'M', u'将'),
+    (0x2F874, 'X'),
+    (0x2F875, 'M', u'尢'),
+    (0x2F876, 'M', u'㞁'),
+    (0x2F877, 'M', u'屠'),
+    (0x2F878, 'M', u'屮'),
+    (0x2F879, 'M', u'峀'),
+    (0x2F87A, 'M', u'岍'),
+    (0x2F87B, 'M', u'𡷤'),
+    (0x2F87C, 'M', u'嵃'),
+    (0x2F87D, 'M', u'𡷦'),
+    (0x2F87E, 'M', u'嵮'),
+    (0x2F87F, 'M', u'嵫'),
+    (0x2F880, 'M', u'嵼'),
+    (0x2F881, 'M', u'巡'),
+    (0x2F882, 'M', u'巢'),
+    (0x2F883, 'M', u'㠯'),
+    (0x2F884, 'M', u'巽'),
+    (0x2F885, 'M', u'帨'),
+    (0x2F886, 'M', u'帽'),
+    (0x2F887, 'M', u'幩'),
+    (0x2F888, 'M', u'㡢'),
+    (0x2F889, 'M', u'𢆃'),
+    ]
+
+def _seg_74():
+    return [
+    (0x2F88A, 'M', u'㡼'),
+    (0x2F88B, 'M', u'庰'),
+    (0x2F88C, 'M', u'庳'),
+    (0x2F88D, 'M', u'庶'),
+    (0x2F88E, 'M', u'廊'),
+    (0x2F88F, 'M', u'𪎒'),
+    (0x2F890, 'M', u'廾'),
+    (0x2F891, 'M', u'𢌱'),
+    (0x2F893, 'M', u'舁'),
+    (0x2F894, 'M', u'弢'),
+    (0x2F896, 'M', u'㣇'),
+    (0x2F897, 'M', u'𣊸'),
+    (0x2F898, 'M', u'𦇚'),
+    (0x2F899, 'M', u'形'),
+    (0x2F89A, 'M', u'彫'),
+    (0x2F89B, 'M', u'㣣'),
+    (0x2F89C, 'M', u'徚'),
+    (0x2F89D, 'M', u'忍'),
+    (0x2F89E, 'M', u'志'),
+    (0x2F89F, 'M', u'忹'),
+    (0x2F8A0, 'M', u'悁'),
+    (0x2F8A1, 'M', u'㤺'),
+    (0x2F8A2, 'M', u'㤜'),
+    (0x2F8A3, 'M', u'悔'),
+    (0x2F8A4, 'M', u'𢛔'),
+    (0x2F8A5, 'M', u'惇'),
+    (0x2F8A6, 'M', u'慈'),
+    (0x2F8A7, 'M', u'慌'),
+    (0x2F8A8, 'M', u'慎'),
+    (0x2F8A9, 'M', u'慌'),
+    (0x2F8AA, 'M', u'慺'),
+    (0x2F8AB, 'M', u'憎'),
+    (0x2F8AC, 'M', u'憲'),
+    (0x2F8AD, 'M', u'憤'),
+    (0x2F8AE, 'M', u'憯'),
+    (0x2F8AF, 'M', u'懞'),
+    (0x2F8B0, 'M', u'懲'),
+    (0x2F8B1, 'M', u'懶'),
+    (0x2F8B2, 'M', u'成'),
+    (0x2F8B3, 'M', u'戛'),
+    (0x2F8B4, 'M', u'扝'),
+    (0x2F8B5, 'M', u'抱'),
+    (0x2F8B6, 'M', u'拔'),
+    (0x2F8B7, 'M', u'捐'),
+    (0x2F8B8, 'M', u'𢬌'),
+    (0x2F8B9, 'M', u'挽'),
+    (0x2F8BA, 'M', u'拼'),
+    (0x2F8BB, 'M', u'捨'),
+    (0x2F8BC, 'M', u'掃'),
+    (0x2F8BD, 'M', u'揤'),
+    (0x2F8BE, 'M', u'𢯱'),
+    (0x2F8BF, 'M', u'搢'),
+    (0x2F8C0, 'M', u'揅'),
+    (0x2F8C1, 'M', u'掩'),
+    (0x2F8C2, 'M', u'㨮'),
+    (0x2F8C3, 'M', u'摩'),
+    (0x2F8C4, 'M', u'摾'),
+    (0x2F8C5, 'M', u'撝'),
+    (0x2F8C6, 'M', u'摷'),
+    (0x2F8C7, 'M', u'㩬'),
+    (0x2F8C8, 'M', u'敏'),
+    (0x2F8C9, 'M', u'敬'),
+    (0x2F8CA, 'M', u'𣀊'),
+    (0x2F8CB, 'M', u'旣'),
+    (0x2F8CC, 'M', u'書'),
+    (0x2F8CD, 'M', u'晉'),
+    (0x2F8CE, 'M', u'㬙'),
+    (0x2F8CF, 'M', u'暑'),
+    (0x2F8D0, 'M', u'㬈'),
+    (0x2F8D1, 'M', u'㫤'),
+    (0x2F8D2, 'M', u'冒'),
+    (0x2F8D3, 'M', u'冕'),
+    (0x2F8D4, 'M', u'最'),
+    (0x2F8D5, 'M', u'暜'),
+    (0x2F8D6, 'M', u'肭'),
+    (0x2F8D7, 'M', u'䏙'),
+    (0x2F8D8, 'M', u'朗'),
+    (0x2F8D9, 'M', u'望'),
+    (0x2F8DA, 'M', u'朡'),
+    (0x2F8DB, 'M', u'杞'),
+    (0x2F8DC, 'M', u'杓'),
+    (0x2F8DD, 'M', u'𣏃'),
+    (0x2F8DE, 'M', u'㭉'),
+    (0x2F8DF, 'M', u'柺'),
+    (0x2F8E0, 'M', u'枅'),
+    (0x2F8E1, 'M', u'桒'),
+    (0x2F8E2, 'M', u'梅'),
+    (0x2F8E3, 'M', u'𣑭'),
+    (0x2F8E4, 'M', u'梎'),
+    (0x2F8E5, 'M', u'栟'),
+    (0x2F8E6, 'M', u'椔'),
+    (0x2F8E7, 'M', u'㮝'),
+    (0x2F8E8, 'M', u'楂'),
+    (0x2F8E9, 'M', u'榣'),
+    (0x2F8EA, 'M', u'槪'),
+    (0x2F8EB, 'M', u'檨'),
+    (0x2F8EC, 'M', u'𣚣'),
+    (0x2F8ED, 'M', u'櫛'),
+    (0x2F8EE, 'M', u'㰘'),
+    (0x2F8EF, 'M', u'次'),
+    ]
+
+def _seg_75():
+    return [
+    (0x2F8F0, 'M', u'𣢧'),
+    (0x2F8F1, 'M', u'歔'),
+    (0x2F8F2, 'M', u'㱎'),
+    (0x2F8F3, 'M', u'歲'),
+    (0x2F8F4, 'M', u'殟'),
+    (0x2F8F5, 'M', u'殺'),
+    (0x2F8F6, 'M', u'殻'),
+    (0x2F8F7, 'M', u'𣪍'),
+    (0x2F8F8, 'M', u'𡴋'),
+    (0x2F8F9, 'M', u'𣫺'),
+    (0x2F8FA, 'M', u'汎'),
+    (0x2F8FB, 'M', u'𣲼'),
+    (0x2F8FC, 'M', u'沿'),
+    (0x2F8FD, 'M', u'泍'),
+    (0x2F8FE, 'M', u'汧'),
+    (0x2F8FF, 'M', u'洖'),
+    (0x2F900, 'M', u'派'),
+    (0x2F901, 'M', u'海'),
+    (0x2F902, 'M', u'流'),
+    (0x2F903, 'M', u'浩'),
+    (0x2F904, 'M', u'浸'),
+    (0x2F905, 'M', u'涅'),
+    (0x2F906, 'M', u'𣴞'),
+    (0x2F907, 'M', u'洴'),
+    (0x2F908, 'M', u'港'),
+    (0x2F909, 'M', u'湮'),
+    (0x2F90A, 'M', u'㴳'),
+    (0x2F90B, 'M', u'滋'),
+    (0x2F90C, 'M', u'滇'),
+    (0x2F90D, 'M', u'𣻑'),
+    (0x2F90E, 'M', u'淹'),
+    (0x2F90F, 'M', u'潮'),
+    (0x2F910, 'M', u'𣽞'),
+    (0x2F911, 'M', u'𣾎'),
+    (0x2F912, 'M', u'濆'),
+    (0x2F913, 'M', u'瀹'),
+    (0x2F914, 'M', u'瀞'),
+    (0x2F915, 'M', u'瀛'),
+    (0x2F916, 'M', u'㶖'),
+    (0x2F917, 'M', u'灊'),
+    (0x2F918, 'M', u'災'),
+    (0x2F919, 'M', u'灷'),
+    (0x2F91A, 'M', u'炭'),
+    (0x2F91B, 'M', u'𠔥'),
+    (0x2F91C, 'M', u'煅'),
+    (0x2F91D, 'M', u'𤉣'),
+    (0x2F91E, 'M', u'熜'),
+    (0x2F91F, 'X'),
+    (0x2F920, 'M', u'爨'),
+    (0x2F921, 'M', u'爵'),
+    (0x2F922, 'M', u'牐'),
+    (0x2F923, 'M', u'𤘈'),
+    (0x2F924, 'M', u'犀'),
+    (0x2F925, 'M', u'犕'),
+    (0x2F926, 'M', u'𤜵'),
+    (0x2F927, 'M', u'𤠔'),
+    (0x2F928, 'M', u'獺'),
+    (0x2F929, 'M', u'王'),
+    (0x2F92A, 'M', u'㺬'),
+    (0x2F92B, 'M', u'玥'),
+    (0x2F92C, 'M', u'㺸'),
+    (0x2F92E, 'M', u'瑇'),
+    (0x2F92F, 'M', u'瑜'),
+    (0x2F930, 'M', u'瑱'),
+    (0x2F931, 'M', u'璅'),
+    (0x2F932, 'M', u'瓊'),
+    (0x2F933, 'M', u'㼛'),
+    (0x2F934, 'M', u'甤'),
+    (0x2F935, 'M', u'𤰶'),
+    (0x2F936, 'M', u'甾'),
+    (0x2F937, 'M', u'𤲒'),
+    (0x2F938, 'M', u'異'),
+    (0x2F939, 'M', u'𢆟'),
+    (0x2F93A, 'M', u'瘐'),
+    (0x2F93B, 'M', u'𤾡'),
+    (0x2F93C, 'M', u'𤾸'),
+    (0x2F93D, 'M', u'𥁄'),
+    (0x2F93E, 'M', u'㿼'),
+    (0x2F93F, 'M', u'䀈'),
+    (0x2F940, 'M', u'直'),
+    (0x2F941, 'M', u'𥃳'),
+    (0x2F942, 'M', u'𥃲'),
+    (0x2F943, 'M', u'𥄙'),
+    (0x2F944, 'M', u'𥄳'),
+    (0x2F945, 'M', u'眞'),
+    (0x2F946, 'M', u'真'),
+    (0x2F948, 'M', u'睊'),
+    (0x2F949, 'M', u'䀹'),
+    (0x2F94A, 'M', u'瞋'),
+    (0x2F94B, 'M', u'䁆'),
+    (0x2F94C, 'M', u'䂖'),
+    (0x2F94D, 'M', u'𥐝'),
+    (0x2F94E, 'M', u'硎'),
+    (0x2F94F, 'M', u'碌'),
+    (0x2F950, 'M', u'磌'),
+    (0x2F951, 'M', u'䃣'),
+    (0x2F952, 'M', u'𥘦'),
+    (0x2F953, 'M', u'祖'),
+    (0x2F954, 'M', u'𥚚'),
+    (0x2F955, 'M', u'𥛅'),
+    ]
+
+def _seg_76():
+    return [
+    (0x2F956, 'M', u'福'),
+    (0x2F957, 'M', u'秫'),
+    (0x2F958, 'M', u'䄯'),
+    (0x2F959, 'M', u'穀'),
+    (0x2F95A, 'M', u'穊'),
+    (0x2F95B, 'M', u'穏'),
+    (0x2F95C, 'M', u'𥥼'),
+    (0x2F95D, 'M', u'𥪧'),
+    (0x2F95F, 'X'),
+    (0x2F960, 'M', u'䈂'),
+    (0x2F961, 'M', u'𥮫'),
+    (0x2F962, 'M', u'篆'),
+    (0x2F963, 'M', u'築'),
+    (0x2F964, 'M', u'䈧'),
+    (0x2F965, 'M', u'𥲀'),
+    (0x2F966, 'M', u'糒'),
+    (0x2F967, 'M', u'䊠'),
+    (0x2F968, 'M', u'糨'),
+    (0x2F969, 'M', u'糣'),
+    (0x2F96A, 'M', u'紀'),
+    (0x2F96B, 'M', u'𥾆'),
+    (0x2F96C, 'M', u'絣'),
+    (0x2F96D, 'M', u'䌁'),
+    (0x2F96E, 'M', u'緇'),
+    (0x2F96F, 'M', u'縂'),
+    (0x2F970, 'M', u'繅'),
+    (0x2F971, 'M', u'䌴'),
+    (0x2F972, 'M', u'𦈨'),
+    (0x2F973, 'M', u'𦉇'),
+    (0x2F974, 'M', u'䍙'),
+    (0x2F975, 'M', u'𦋙'),
+    (0x2F976, 'M', u'罺'),
+    (0x2F977, 'M', u'𦌾'),
+    (0x2F978, 'M', u'羕'),
+    (0x2F979, 'M', u'翺'),
+    (0x2F97A, 'M', u'者'),
+    (0x2F97B, 'M', u'𦓚'),
+    (0x2F97C, 'M', u'𦔣'),
+    (0x2F97D, 'M', u'聠'),
+    (0x2F97E, 'M', u'𦖨'),
+    (0x2F97F, 'M', u'聰'),
+    (0x2F980, 'M', u'𣍟'),
+    (0x2F981, 'M', u'䏕'),
+    (0x2F982, 'M', u'育'),
+    (0x2F983, 'M', u'脃'),
+    (0x2F984, 'M', u'䐋'),
+    (0x2F985, 'M', u'脾'),
+    (0x2F986, 'M', u'媵'),
+    (0x2F987, 'M', u'𦞧'),
+    (0x2F988, 'M', u'𦞵'),
+    (0x2F989, 'M', u'𣎓'),
+    (0x2F98A, 'M', u'𣎜'),
+    (0x2F98B, 'M', u'舁'),
+    (0x2F98C, 'M', u'舄'),
+    (0x2F98D, 'M', u'辞'),
+    (0x2F98E, 'M', u'䑫'),
+    (0x2F98F, 'M', u'芑'),
+    (0x2F990, 'M', u'芋'),
+    (0x2F991, 'M', u'芝'),
+    (0x2F992, 'M', u'劳'),
+    (0x2F993, 'M', u'花'),
+    (0x2F994, 'M', u'芳'),
+    (0x2F995, 'M', u'芽'),
+    (0x2F996, 'M', u'苦'),
+    (0x2F997, 'M', u'𦬼'),
+    (0x2F998, 'M', u'若'),
+    (0x2F999, 'M', u'茝'),
+    (0x2F99A, 'M', u'荣'),
+    (0x2F99B, 'M', u'莭'),
+    (0x2F99C, 'M', u'茣'),
+    (0x2F99D, 'M', u'莽'),
+    (0x2F99E, 'M', u'菧'),
+    (0x2F99F, 'M', u'著'),
+    (0x2F9A0, 'M', u'荓'),
+    (0x2F9A1, 'M', u'菊'),
+    (0x2F9A2, 'M', u'菌'),
+    (0x2F9A3, 'M', u'菜'),
+    (0x2F9A4, 'M', u'𦰶'),
+    (0x2F9A5, 'M', u'𦵫'),
+    (0x2F9A6, 'M', u'𦳕'),
+    (0x2F9A7, 'M', u'䔫'),
+    (0x2F9A8, 'M', u'蓱'),
+    (0x2F9A9, 'M', u'蓳'),
+    (0x2F9AA, 'M', u'蔖'),
+    (0x2F9AB, 'M', u'𧏊'),
+    (0x2F9AC, 'M', u'蕤'),
+    (0x2F9AD, 'M', u'𦼬'),
+    (0x2F9AE, 'M', u'䕝'),
+    (0x2F9AF, 'M', u'䕡'),
+    (0x2F9B0, 'M', u'𦾱'),
+    (0x2F9B1, 'M', u'𧃒'),
+    (0x2F9B2, 'M', u'䕫'),
+    (0x2F9B3, 'M', u'虐'),
+    (0x2F9B4, 'M', u'虜'),
+    (0x2F9B5, 'M', u'虧'),
+    (0x2F9B6, 'M', u'虩'),
+    (0x2F9B7, 'M', u'蚩'),
+    (0x2F9B8, 'M', u'蚈'),
+    (0x2F9B9, 'M', u'蜎'),
+    (0x2F9BA, 'M', u'蛢'),
+    ]
+
+def _seg_77():
+    return [
+    (0x2F9BB, 'M', u'蝹'),
+    (0x2F9BC, 'M', u'蜨'),
+    (0x2F9BD, 'M', u'蝫'),
+    (0x2F9BE, 'M', u'螆'),
+    (0x2F9BF, 'X'),
+    (0x2F9C0, 'M', u'蟡'),
+    (0x2F9C1, 'M', u'蠁'),
+    (0x2F9C2, 'M', u'䗹'),
+    (0x2F9C3, 'M', u'衠'),
+    (0x2F9C4, 'M', u'衣'),
+    (0x2F9C5, 'M', u'𧙧'),
+    (0x2F9C6, 'M', u'裗'),
+    (0x2F9C7, 'M', u'裞'),
+    (0x2F9C8, 'M', u'䘵'),
+    (0x2F9C9, 'M', u'裺'),
+    (0x2F9CA, 'M', u'㒻'),
+    (0x2F9CB, 'M', u'𧢮'),
+    (0x2F9CC, 'M', u'𧥦'),
+    (0x2F9CD, 'M', u'䚾'),
+    (0x2F9CE, 'M', u'䛇'),
+    (0x2F9CF, 'M', u'誠'),
+    (0x2F9D0, 'M', u'諭'),
+    (0x2F9D1, 'M', u'變'),
+    (0x2F9D2, 'M', u'豕'),
+    (0x2F9D3, 'M', u'𧲨'),
+    (0x2F9D4, 'M', u'貫'),
+    (0x2F9D5, 'M', u'賁'),
+    (0x2F9D6, 'M', u'贛'),
+    (0x2F9D7, 'M', u'起'),
+    (0x2F9D8, 'M', u'𧼯'),
+    (0x2F9D9, 'M', u'𠠄'),
+    (0x2F9DA, 'M', u'跋'),
+    (0x2F9DB, 'M', u'趼'),
+    (0x2F9DC, 'M', u'跰'),
+    (0x2F9DD, 'M', u'𠣞'),
+    (0x2F9DE, 'M', u'軔'),
+    (0x2F9DF, 'M', u'輸'),
+    (0x2F9E0, 'M', u'𨗒'),
+    (0x2F9E1, 'M', u'𨗭'),
+    (0x2F9E2, 'M', u'邔'),
+    (0x2F9E3, 'M', u'郱'),
+    (0x2F9E4, 'M', u'鄑'),
+    (0x2F9E5, 'M', u'𨜮'),
+    (0x2F9E6, 'M', u'鄛'),
+    (0x2F9E7, 'M', u'鈸'),
+    (0x2F9E8, 'M', u'鋗'),
+    (0x2F9E9, 'M', u'鋘'),
+    (0x2F9EA, 'M', u'鉼'),
+    (0x2F9EB, 'M', u'鏹'),
+    (0x2F9EC, 'M', u'鐕'),
+    (0x2F9ED, 'M', u'𨯺'),
+    (0x2F9EE, 'M', u'開'),
+    (0x2F9EF, 'M', u'䦕'),
+    (0x2F9F0, 'M', u'閷'),
+    (0x2F9F1, 'M', u'𨵷'),
+    (0x2F9F2, 'M', u'䧦'),
+    (0x2F9F3, 'M', u'雃'),
+    (0x2F9F4, 'M', u'嶲'),
+    (0x2F9F5, 'M', u'霣'),
+    (0x2F9F6, 'M', u'𩅅'),
+    (0x2F9F7, 'M', u'𩈚'),
+    (0x2F9F8, 'M', u'䩮'),
+    (0x2F9F9, 'M', u'䩶'),
+    (0x2F9FA, 'M', u'韠'),
+    (0x2F9FB, 'M', u'𩐊'),
+    (0x2F9FC, 'M', u'䪲'),
+    (0x2F9FD, 'M', u'𩒖'),
+    (0x2F9FE, 'M', u'頋'),
+    (0x2FA00, 'M', u'頩'),
+    (0x2FA01, 'M', u'𩖶'),
+    (0x2FA02, 'M', u'飢'),
+    (0x2FA03, 'M', u'䬳'),
+    (0x2FA04, 'M', u'餩'),
+    (0x2FA05, 'M', u'馧'),
+    (0x2FA06, 'M', u'駂'),
+    (0x2FA07, 'M', u'駾'),
+    (0x2FA08, 'M', u'䯎'),
+    (0x2FA09, 'M', u'𩬰'),
+    (0x2FA0A, 'M', u'鬒'),
+    (0x2FA0B, 'M', u'鱀'),
+    (0x2FA0C, 'M', u'鳽'),
+    (0x2FA0D, 'M', u'䳎'),
+    (0x2FA0E, 'M', u'䳭'),
+    (0x2FA0F, 'M', u'鵧'),
+    (0x2FA10, 'M', u'𪃎'),
+    (0x2FA11, 'M', u'䳸'),
+    (0x2FA12, 'M', u'𪄅'),
+    (0x2FA13, 'M', u'𪈎'),
+    (0x2FA14, 'M', u'𪊑'),
+    (0x2FA15, 'M', u'麻'),
+    (0x2FA16, 'M', u'䵖'),
+    (0x2FA17, 'M', u'黹'),
+    (0x2FA18, 'M', u'黾'),
+    (0x2FA19, 'M', u'鼅'),
+    (0x2FA1A, 'M', u'鼏'),
+    (0x2FA1B, 'M', u'鼖'),
+    (0x2FA1C, 'M', u'鼻'),
+    (0x2FA1D, 'M', u'𪘀'),
+    (0x2FA1E, 'X'),
+    (0xE0100, 'I'),
+    ]
+
+def _seg_78():
+    return [
+    (0xE01F0, 'X'),
+    ]
+
+uts46data = tuple(
+    _seg_0()
+    + _seg_1()
+    + _seg_2()
+    + _seg_3()
+    + _seg_4()
+    + _seg_5()
+    + _seg_6()
+    + _seg_7()
+    + _seg_8()
+    + _seg_9()
+    + _seg_10()
+    + _seg_11()
+    + _seg_12()
+    + _seg_13()
+    + _seg_14()
+    + _seg_15()
+    + _seg_16()
+    + _seg_17()
+    + _seg_18()
+    + _seg_19()
+    + _seg_20()
+    + _seg_21()
+    + _seg_22()
+    + _seg_23()
+    + _seg_24()
+    + _seg_25()
+    + _seg_26()
+    + _seg_27()
+    + _seg_28()
+    + _seg_29()
+    + _seg_30()
+    + _seg_31()
+    + _seg_32()
+    + _seg_33()
+    + _seg_34()
+    + _seg_35()
+    + _seg_36()
+    + _seg_37()
+    + _seg_38()
+    + _seg_39()
+    + _seg_40()
+    + _seg_41()
+    + _seg_42()
+    + _seg_43()
+    + _seg_44()
+    + _seg_45()
+    + _seg_46()
+    + _seg_47()
+    + _seg_48()
+    + _seg_49()
+    + _seg_50()
+    + _seg_51()
+    + _seg_52()
+    + _seg_53()
+    + _seg_54()
+    + _seg_55()
+    + _seg_56()
+    + _seg_57()
+    + _seg_58()
+    + _seg_59()
+    + _seg_60()
+    + _seg_61()
+    + _seg_62()
+    + _seg_63()
+    + _seg_64()
+    + _seg_65()
+    + _seg_66()
+    + _seg_67()
+    + _seg_68()
+    + _seg_69()
+    + _seg_70()
+    + _seg_71()
+    + _seg_72()
+    + _seg_73()
+    + _seg_74()
+    + _seg_75()
+    + _seg_76()
+    + _seg_77()
+    + _seg_78()
+)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..daba809f8779060da410795ed283248c33154ce1
GIT binary patch
literal 296556
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%0AekCedm*W6fv%(g)nmxQ(2+e*jfN!L4$VrSx(!(v
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%0D1(?W-8Iv*<K_W_U
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%0A_ywI5rXCrK~Oo45VU{@f=YCRpd~~QRJJ3$3GK~;
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
L&Wu3}S(*I-|00`@

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py b/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py
new file mode 100644
index 00000000..f2d07668
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py
@@ -0,0 +1,2419 @@
+# Copyright 2007 Google Inc.
+#  Licensed to PSF under a Contributor Agreement.
+
+"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
+
+This library is used to create/poke/manipulate IPv4 and IPv6 addresses
+and networks.
+
+"""
+
+from __future__ import unicode_literals
+
+
+import itertools
+import struct
+
+__version__ = '1.0.22'
+
+# Compatibility functions
+_compat_int_types = (int,)
+try:
+    _compat_int_types = (int, long)
+except NameError:
+    pass
+try:
+    _compat_str = unicode
+except NameError:
+    _compat_str = str
+    assert bytes != str
+if b'\0'[0] == 0:  # Python 3 semantics
+    def _compat_bytes_to_byte_vals(byt):
+        return byt
+else:
+    def _compat_bytes_to_byte_vals(byt):
+        return [struct.unpack(b'!B', b)[0] for b in byt]
+try:
+    _compat_int_from_byte_vals = int.from_bytes
+except AttributeError:
+    def _compat_int_from_byte_vals(bytvals, endianess):
+        assert endianess == 'big'
+        res = 0
+        for bv in bytvals:
+            assert isinstance(bv, _compat_int_types)
+            res = (res << 8) + bv
+        return res
+
+
+def _compat_to_bytes(intval, length, endianess):
+    assert isinstance(intval, _compat_int_types)
+    assert endianess == 'big'
+    if length == 4:
+        if intval < 0 or intval >= 2 ** 32:
+            raise struct.error("integer out of range for 'I' format code")
+        return struct.pack(b'!I', intval)
+    elif length == 16:
+        if intval < 0 or intval >= 2 ** 128:
+            raise struct.error("integer out of range for 'QQ' format code")
+        return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff)
+    else:
+        raise NotImplementedError()
+
+
+if hasattr(int, 'bit_length'):
+    # Not int.bit_length , since that won't work in 2.7 where long exists
+    def _compat_bit_length(i):
+        return i.bit_length()
+else:
+    def _compat_bit_length(i):
+        for res in itertools.count():
+            if i >> res == 0:
+                return res
+
+
+def _compat_range(start, end, step=1):
+    assert step > 0
+    i = start
+    while i < end:
+        yield i
+        i += step
+
+
+class _TotalOrderingMixin(object):
+    __slots__ = ()
+
+    # Helper that derives the other comparison operations from
+    # __lt__ and __eq__
+    # We avoid functools.total_ordering because it doesn't handle
+    # NotImplemented correctly yet (http://bugs.python.org/issue10042)
+    def __eq__(self, other):
+        raise NotImplementedError
+
+    def __ne__(self, other):
+        equal = self.__eq__(other)
+        if equal is NotImplemented:
+            return NotImplemented
+        return not equal
+
+    def __lt__(self, other):
+        raise NotImplementedError
+
+    def __le__(self, other):
+        less = self.__lt__(other)
+        if less is NotImplemented or not less:
+            return self.__eq__(other)
+        return less
+
+    def __gt__(self, other):
+        less = self.__lt__(other)
+        if less is NotImplemented:
+            return NotImplemented
+        equal = self.__eq__(other)
+        if equal is NotImplemented:
+            return NotImplemented
+        return not (less or equal)
+
+    def __ge__(self, other):
+        less = self.__lt__(other)
+        if less is NotImplemented:
+            return NotImplemented
+        return not less
+
+
+IPV4LENGTH = 32
+IPV6LENGTH = 128
+
+
+class AddressValueError(ValueError):
+    """A Value Error related to the address."""
+
+
+class NetmaskValueError(ValueError):
+    """A Value Error related to the netmask."""
+
+
+def ip_address(address):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP address.  Either IPv4 or
+          IPv6 addresses may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+
+    Returns:
+        An IPv4Address or IPv6Address object.
+
+    Raises:
+        ValueError: if the *address* passed isn't either a v4 or a v6
+          address
+
+    """
+    try:
+        return IPv4Address(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Address(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    if isinstance(address, bytes):
+        raise AddressValueError(
+            '%r does not appear to be an IPv4 or IPv6 address. '
+            'Did you pass in a bytes (str in Python 2) instead of'
+            ' a unicode object?' % address)
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
+                     address)
+
+
+def ip_network(address, strict=True):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP network.  Either IPv4 or
+          IPv6 networks may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+
+    Returns:
+        An IPv4Network or IPv6Network object.
+
+    Raises:
+        ValueError: if the string passed isn't either a v4 or a v6
+          address. Or if the network has host bits set.
+
+    """
+    try:
+        return IPv4Network(address, strict)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Network(address, strict)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    if isinstance(address, bytes):
+        raise AddressValueError(
+            '%r does not appear to be an IPv4 or IPv6 network. '
+            'Did you pass in a bytes (str in Python 2) instead of'
+            ' a unicode object?' % address)
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
+                     address)
+
+
+def ip_interface(address):
+    """Take an IP string/int and return an object of the correct type.
+
+    Args:
+        address: A string or integer, the IP address.  Either IPv4 or
+          IPv6 addresses may be supplied; integers less than 2**32 will
+          be considered to be IPv4 by default.
+
+    Returns:
+        An IPv4Interface or IPv6Interface object.
+
+    Raises:
+        ValueError: if the string passed isn't either a v4 or a v6
+          address.
+
+    Notes:
+        The IPv?Interface classes describe an Address on a particular
+        Network, so they're basically a combination of both the Address
+        and Network classes.
+
+    """
+    try:
+        return IPv4Interface(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    try:
+        return IPv6Interface(address)
+    except (AddressValueError, NetmaskValueError):
+        pass
+
+    raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
+                     address)
+
+
+def v4_int_to_packed(address):
+    """Represent an address as 4 packed bytes in network (big-endian) order.
+
+    Args:
+        address: An integer representation of an IPv4 IP address.
+
+    Returns:
+        The integer address packed as 4 bytes in network (big-endian) order.
+
+    Raises:
+        ValueError: If the integer is negative or too large to be an
+          IPv4 IP address.
+
+    """
+    try:
+        return _compat_to_bytes(address, 4, 'big')
+    except (struct.error, OverflowError):
+        raise ValueError("Address negative or too large for IPv4")
+
+
+def v6_int_to_packed(address):
+    """Represent an address as 16 packed bytes in network (big-endian) order.
+
+    Args:
+        address: An integer representation of an IPv6 IP address.
+
+    Returns:
+        The integer address packed as 16 bytes in network (big-endian) order.
+
+    """
+    try:
+        return _compat_to_bytes(address, 16, 'big')
+    except (struct.error, OverflowError):
+        raise ValueError("Address negative or too large for IPv6")
+
+
+def _split_optional_netmask(address):
+    """Helper to split the netmask and raise AddressValueError if needed"""
+    addr = _compat_str(address).split('/')
+    if len(addr) > 2:
+        raise AddressValueError("Only one '/' permitted in %r" % address)
+    return addr
+
+
+def _find_address_range(addresses):
+    """Find a sequence of sorted deduplicated IPv#Address.
+
+    Args:
+        addresses: a list of IPv#Address objects.
+
+    Yields:
+        A tuple containing the first and last IP addresses in the sequence.
+
+    """
+    it = iter(addresses)
+    first = last = next(it)
+    for ip in it:
+        if ip._ip != last._ip + 1:
+            yield first, last
+            first = ip
+        last = ip
+    yield first, last
+
+
+def _count_righthand_zero_bits(number, bits):
+    """Count the number of zero bits on the right hand side.
+
+    Args:
+        number: an integer.
+        bits: maximum number of bits to count.
+
+    Returns:
+        The number of zero bits on the right hand side of the number.
+
+    """
+    if number == 0:
+        return bits
+    return min(bits, _compat_bit_length(~number & (number - 1)))
+
+
+def summarize_address_range(first, last):
+    """Summarize a network range given the first and last IP addresses.
+
+    Example:
+        >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
+        ...                              IPv4Address('192.0.2.130')))
+        ...                                #doctest: +NORMALIZE_WHITESPACE
+        [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
+         IPv4Network('192.0.2.130/32')]
+
+    Args:
+        first: the first IPv4Address or IPv6Address in the range.
+        last: the last IPv4Address or IPv6Address in the range.
+
+    Returns:
+        An iterator of the summarized IPv(4|6) network objects.
+
+    Raise:
+        TypeError:
+            If the first and last objects are not IP addresses.
+            If the first and last objects are not the same version.
+        ValueError:
+            If the last object is not greater than the first.
+            If the version of the first address is not 4 or 6.
+
+    """
+    if (not (isinstance(first, _BaseAddress) and
+             isinstance(last, _BaseAddress))):
+        raise TypeError('first and last must be IP addresses, not networks')
+    if first.version != last.version:
+        raise TypeError("%s and %s are not of the same version" % (
+                        first, last))
+    if first > last:
+        raise ValueError('last IP address must be greater than first')
+
+    if first.version == 4:
+        ip = IPv4Network
+    elif first.version == 6:
+        ip = IPv6Network
+    else:
+        raise ValueError('unknown IP version')
+
+    ip_bits = first._max_prefixlen
+    first_int = first._ip
+    last_int = last._ip
+    while first_int <= last_int:
+        nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
+                    _compat_bit_length(last_int - first_int + 1) - 1)
+        net = ip((first_int, ip_bits - nbits))
+        yield net
+        first_int += 1 << nbits
+        if first_int - 1 == ip._ALL_ONES:
+            break
+
+
+def _collapse_addresses_internal(addresses):
+    """Loops through the addresses, collapsing concurrent netblocks.
+
+    Example:
+
+        ip1 = IPv4Network('192.0.2.0/26')
+        ip2 = IPv4Network('192.0.2.64/26')
+        ip3 = IPv4Network('192.0.2.128/26')
+        ip4 = IPv4Network('192.0.2.192/26')
+
+        _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
+          [IPv4Network('192.0.2.0/24')]
+
+        This shouldn't be called directly; it is called via
+          collapse_addresses([]).
+
+    Args:
+        addresses: A list of IPv4Network's or IPv6Network's
+
+    Returns:
+        A list of IPv4Network's or IPv6Network's depending on what we were
+        passed.
+
+    """
+    # First merge
+    to_merge = list(addresses)
+    subnets = {}
+    while to_merge:
+        net = to_merge.pop()
+        supernet = net.supernet()
+        existing = subnets.get(supernet)
+        if existing is None:
+            subnets[supernet] = net
+        elif existing != net:
+            # Merge consecutive subnets
+            del subnets[supernet]
+            to_merge.append(supernet)
+    # Then iterate over resulting networks, skipping subsumed subnets
+    last = None
+    for net in sorted(subnets.values()):
+        if last is not None:
+            # Since they are sorted,
+            # last.network_address <= net.network_address is a given.
+            if last.broadcast_address >= net.broadcast_address:
+                continue
+        yield net
+        last = net
+
+
+def collapse_addresses(addresses):
+    """Collapse a list of IP objects.
+
+    Example:
+        collapse_addresses([IPv4Network('192.0.2.0/25'),
+                            IPv4Network('192.0.2.128/25')]) ->
+                           [IPv4Network('192.0.2.0/24')]
+
+    Args:
+        addresses: An iterator of IPv4Network or IPv6Network objects.
+
+    Returns:
+        An iterator of the collapsed IPv(4|6)Network objects.
+
+    Raises:
+        TypeError: If passed a list of mixed version objects.
+
+    """
+    addrs = []
+    ips = []
+    nets = []
+
+    # split IP addresses and networks
+    for ip in addresses:
+        if isinstance(ip, _BaseAddress):
+            if ips and ips[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                                ip, ips[-1]))
+            ips.append(ip)
+        elif ip._prefixlen == ip._max_prefixlen:
+            if ips and ips[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                                ip, ips[-1]))
+            try:
+                ips.append(ip.ip)
+            except AttributeError:
+                ips.append(ip.network_address)
+        else:
+            if nets and nets[-1]._version != ip._version:
+                raise TypeError("%s and %s are not of the same version" % (
+                                ip, nets[-1]))
+            nets.append(ip)
+
+    # sort and dedup
+    ips = sorted(set(ips))
+
+    # find consecutive address ranges in the sorted sequence and summarize them
+    if ips:
+        for first, last in _find_address_range(ips):
+            addrs.extend(summarize_address_range(first, last))
+
+    return _collapse_addresses_internal(addrs + nets)
+
+
+def get_mixed_type_key(obj):
+    """Return a key suitable for sorting between networks and addresses.
+
+    Address and Network objects are not sortable by default; they're
+    fundamentally different so the expression
+
+        IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
+
+    doesn't make any sense.  There are some times however, where you may wish
+    to have ipaddress sort these for you anyway. If you need to do this, you
+    can use this function as the key= argument to sorted().
+
+    Args:
+      obj: either a Network or Address object.
+    Returns:
+      appropriate key.
+
+    """
+    if isinstance(obj, _BaseNetwork):
+        return obj._get_networks_key()
+    elif isinstance(obj, _BaseAddress):
+        return obj._get_address_key()
+    return NotImplemented
+
+
+class _IPAddressBase(_TotalOrderingMixin):
+
+    """The mother class."""
+
+    __slots__ = ()
+
+    @property
+    def exploded(self):
+        """Return the longhand version of the IP address as a string."""
+        return self._explode_shorthand_ip_string()
+
+    @property
+    def compressed(self):
+        """Return the shorthand version of the IP address as a string."""
+        return _compat_str(self)
+
+    @property
+    def reverse_pointer(self):
+        """The name of the reverse DNS pointer for the IP address, e.g.:
+            >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
+            '1.0.0.127.in-addr.arpa'
+            >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
+            '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
+
+        """
+        return self._reverse_pointer()
+
+    @property
+    def version(self):
+        msg = '%200s has no version specified' % (type(self),)
+        raise NotImplementedError(msg)
+
+    def _check_int_address(self, address):
+        if address < 0:
+            msg = "%d (< 0) is not permitted as an IPv%d address"
+            raise AddressValueError(msg % (address, self._version))
+        if address > self._ALL_ONES:
+            msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
+            raise AddressValueError(msg % (address, self._max_prefixlen,
+                                           self._version))
+
+    def _check_packed_address(self, address, expected_len):
+        address_len = len(address)
+        if address_len != expected_len:
+            msg = (
+                '%r (len %d != %d) is not permitted as an IPv%d address. '
+                'Did you pass in a bytes (str in Python 2) instead of'
+                ' a unicode object?')
+            raise AddressValueError(msg % (address, address_len,
+                                           expected_len, self._version))
+
+    @classmethod
+    def _ip_int_from_prefix(cls, prefixlen):
+        """Turn the prefix length into a bitwise netmask
+
+        Args:
+            prefixlen: An integer, the prefix length.
+
+        Returns:
+            An integer.
+
+        """
+        return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
+
+    @classmethod
+    def _prefix_from_ip_int(cls, ip_int):
+        """Return prefix length from the bitwise netmask.
+
+        Args:
+            ip_int: An integer, the netmask in expanded bitwise format
+
+        Returns:
+            An integer, the prefix length.
+
+        Raises:
+            ValueError: If the input intermingles zeroes & ones
+        """
+        trailing_zeroes = _count_righthand_zero_bits(ip_int,
+                                                     cls._max_prefixlen)
+        prefixlen = cls._max_prefixlen - trailing_zeroes
+        leading_ones = ip_int >> trailing_zeroes
+        all_ones = (1 << prefixlen) - 1
+        if leading_ones != all_ones:
+            byteslen = cls._max_prefixlen // 8
+            details = _compat_to_bytes(ip_int, byteslen, 'big')
+            msg = 'Netmask pattern %r mixes zeroes & ones'
+            raise ValueError(msg % details)
+        return prefixlen
+
+    @classmethod
+    def _report_invalid_netmask(cls, netmask_str):
+        msg = '%r is not a valid netmask' % netmask_str
+        raise NetmaskValueError(msg)
+
+    @classmethod
+    def _prefix_from_prefix_string(cls, prefixlen_str):
+        """Return prefix length from a numeric string
+
+        Args:
+            prefixlen_str: The string to be converted
+
+        Returns:
+            An integer, the prefix length.
+
+        Raises:
+            NetmaskValueError: If the input is not a valid netmask
+        """
+        # int allows a leading +/- as well as surrounding whitespace,
+        # so we ensure that isn't the case
+        if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str):
+            cls._report_invalid_netmask(prefixlen_str)
+        try:
+            prefixlen = int(prefixlen_str)
+        except ValueError:
+            cls._report_invalid_netmask(prefixlen_str)
+        if not (0 <= prefixlen <= cls._max_prefixlen):
+            cls._report_invalid_netmask(prefixlen_str)
+        return prefixlen
+
+    @classmethod
+    def _prefix_from_ip_string(cls, ip_str):
+        """Turn a netmask/hostmask string into a prefix length
+
+        Args:
+            ip_str: The netmask/hostmask to be converted
+
+        Returns:
+            An integer, the prefix length.
+
+        Raises:
+            NetmaskValueError: If the input is not a valid netmask/hostmask
+        """
+        # Parse the netmask/hostmask like an IP address.
+        try:
+            ip_int = cls._ip_int_from_string(ip_str)
+        except AddressValueError:
+            cls._report_invalid_netmask(ip_str)
+
+        # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
+        # Note that the two ambiguous cases (all-ones and all-zeroes) are
+        # treated as netmasks.
+        try:
+            return cls._prefix_from_ip_int(ip_int)
+        except ValueError:
+            pass
+
+        # Invert the bits, and try matching a /0+1+/ hostmask instead.
+        ip_int ^= cls._ALL_ONES
+        try:
+            return cls._prefix_from_ip_int(ip_int)
+        except ValueError:
+            cls._report_invalid_netmask(ip_str)
+
+    def __reduce__(self):
+        return self.__class__, (_compat_str(self),)
+
+
+class _BaseAddress(_IPAddressBase):
+
+    """A generic IP object.
+
+    This IP class contains the version independent methods which are
+    used by single IP addresses.
+    """
+
+    __slots__ = ()
+
+    def __int__(self):
+        return self._ip
+
+    def __eq__(self, other):
+        try:
+            return (self._ip == other._ip and
+                    self._version == other._version)
+        except AttributeError:
+            return NotImplemented
+
+    def __lt__(self, other):
+        if not isinstance(other, _IPAddressBase):
+            return NotImplemented
+        if not isinstance(other, _BaseAddress):
+            raise TypeError('%s and %s are not of the same type' % (
+                self, other))
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                self, other))
+        if self._ip != other._ip:
+            return self._ip < other._ip
+        return False
+
+    # Shorthand for Integer addition and subtraction. This is not
+    # meant to ever support addition/subtraction of addresses.
+    def __add__(self, other):
+        if not isinstance(other, _compat_int_types):
+            return NotImplemented
+        return self.__class__(int(self) + other)
+
+    def __sub__(self, other):
+        if not isinstance(other, _compat_int_types):
+            return NotImplemented
+        return self.__class__(int(self) - other)
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
+
+    def __str__(self):
+        return _compat_str(self._string_from_ip_int(self._ip))
+
+    def __hash__(self):
+        return hash(hex(int(self._ip)))
+
+    def _get_address_key(self):
+        return (self._version, self)
+
+    def __reduce__(self):
+        return self.__class__, (self._ip,)
+
+
+class _BaseNetwork(_IPAddressBase):
+
+    """A generic IP network object.
+
+    This IP class contains the version independent methods which are
+    used by networks.
+
+    """
+    def __init__(self, address):
+        self._cache = {}
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, _compat_str(self))
+
+    def __str__(self):
+        return '%s/%d' % (self.network_address, self.prefixlen)
+
+    def hosts(self):
+        """Generate Iterator over usable hosts in a network.
+
+        This is like __iter__ except it doesn't return the network
+        or broadcast addresses.
+
+        """
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        for x in _compat_range(network + 1, broadcast):
+            yield self._address_class(x)
+
+    def __iter__(self):
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        for x in _compat_range(network, broadcast + 1):
+            yield self._address_class(x)
+
+    def __getitem__(self, n):
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        if n >= 0:
+            if network + n > broadcast:
+                raise IndexError('address out of range')
+            return self._address_class(network + n)
+        else:
+            n += 1
+            if broadcast + n < network:
+                raise IndexError('address out of range')
+            return self._address_class(broadcast + n)
+
+    def __lt__(self, other):
+        if not isinstance(other, _IPAddressBase):
+            return NotImplemented
+        if not isinstance(other, _BaseNetwork):
+            raise TypeError('%s and %s are not of the same type' % (
+                            self, other))
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same version' % (
+                            self, other))
+        if self.network_address != other.network_address:
+            return self.network_address < other.network_address
+        if self.netmask != other.netmask:
+            return self.netmask < other.netmask
+        return False
+
+    def __eq__(self, other):
+        try:
+            return (self._version == other._version and
+                    self.network_address == other.network_address and
+                    int(self.netmask) == int(other.netmask))
+        except AttributeError:
+            return NotImplemented
+
+    def __hash__(self):
+        return hash(int(self.network_address) ^ int(self.netmask))
+
+    def __contains__(self, other):
+        # always false if one is v4 and the other is v6.
+        if self._version != other._version:
+            return False
+        # dealing with another network.
+        if isinstance(other, _BaseNetwork):
+            return False
+        # dealing with another address
+        else:
+            # address
+            return (int(self.network_address) <= int(other._ip) <=
+                    int(self.broadcast_address))
+
+    def overlaps(self, other):
+        """Tell if self is partly contained in other."""
+        return self.network_address in other or (
+            self.broadcast_address in other or (
+                other.network_address in self or (
+                    other.broadcast_address in self)))
+
+    @property
+    def broadcast_address(self):
+        x = self._cache.get('broadcast_address')
+        if x is None:
+            x = self._address_class(int(self.network_address) |
+                                    int(self.hostmask))
+            self._cache['broadcast_address'] = x
+        return x
+
+    @property
+    def hostmask(self):
+        x = self._cache.get('hostmask')
+        if x is None:
+            x = self._address_class(int(self.netmask) ^ self._ALL_ONES)
+            self._cache['hostmask'] = x
+        return x
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%d' % (self.network_address, self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (self.network_address, self.netmask)
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (self.network_address, self.hostmask)
+
+    @property
+    def num_addresses(self):
+        """Number of hosts in the current subnet."""
+        return int(self.broadcast_address) - int(self.network_address) + 1
+
+    @property
+    def _address_class(self):
+        # Returning bare address objects (rather than interfaces) allows for
+        # more consistent behaviour across the network address, broadcast
+        # address and individual host addresses.
+        msg = '%200s has no associated address class' % (type(self),)
+        raise NotImplementedError(msg)
+
+    @property
+    def prefixlen(self):
+        return self._prefixlen
+
+    def address_exclude(self, other):
+        """Remove an address from a larger block.
+
+        For example:
+
+            addr1 = ip_network('192.0.2.0/28')
+            addr2 = ip_network('192.0.2.1/32')
+            list(addr1.address_exclude(addr2)) =
+                [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
+                 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
+
+        or IPv6:
+
+            addr1 = ip_network('2001:db8::1/32')
+            addr2 = ip_network('2001:db8::1/128')
+            list(addr1.address_exclude(addr2)) =
+                [ip_network('2001:db8::1/128'),
+                 ip_network('2001:db8::2/127'),
+                 ip_network('2001:db8::4/126'),
+                 ip_network('2001:db8::8/125'),
+                 ...
+                 ip_network('2001:db8:8000::/33')]
+
+        Args:
+            other: An IPv4Network or IPv6Network object of the same type.
+
+        Returns:
+            An iterator of the IPv(4|6)Network objects which is self
+            minus other.
+
+        Raises:
+            TypeError: If self and other are of differing address
+              versions, or if other is not a network object.
+            ValueError: If other is not completely contained by self.
+
+        """
+        if not self._version == other._version:
+            raise TypeError("%s and %s are not of the same version" % (
+                            self, other))
+
+        if not isinstance(other, _BaseNetwork):
+            raise TypeError("%s is not a network object" % other)
+
+        if not other.subnet_of(self):
+            raise ValueError('%s not contained in %s' % (other, self))
+        if other == self:
+            return
+
+        # Make sure we're comparing the network of other.
+        other = other.__class__('%s/%s' % (other.network_address,
+                                           other.prefixlen))
+
+        s1, s2 = self.subnets()
+        while s1 != other and s2 != other:
+            if other.subnet_of(s1):
+                yield s2
+                s1, s2 = s1.subnets()
+            elif other.subnet_of(s2):
+                yield s1
+                s1, s2 = s2.subnets()
+            else:
+                # If we got here, there's a bug somewhere.
+                raise AssertionError('Error performing exclusion: '
+                                     's1: %s s2: %s other: %s' %
+                                     (s1, s2, other))
+        if s1 == other:
+            yield s2
+        elif s2 == other:
+            yield s1
+        else:
+            # If we got here, there's a bug somewhere.
+            raise AssertionError('Error performing exclusion: '
+                                 's1: %s s2: %s other: %s' %
+                                 (s1, s2, other))
+
+    def compare_networks(self, other):
+        """Compare two IP objects.
+
+        This is only concerned about the comparison of the integer
+        representation of the network addresses.  This means that the
+        host bits aren't considered at all in this method.  If you want
+        to compare host bits, you can easily enough do a
+        'HostA._ip < HostB._ip'
+
+        Args:
+            other: An IP object.
+
+        Returns:
+            If the IP versions of self and other are the same, returns:
+
+            -1 if self < other:
+              eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
+              IPv6Network('2001:db8::1000/124') <
+                  IPv6Network('2001:db8::2000/124')
+            0 if self == other
+              eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
+              IPv6Network('2001:db8::1000/124') ==
+                  IPv6Network('2001:db8::1000/124')
+            1 if self > other
+              eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
+                  IPv6Network('2001:db8::2000/124') >
+                      IPv6Network('2001:db8::1000/124')
+
+          Raises:
+              TypeError if the IP versions are different.
+
+        """
+        # does this need to raise a ValueError?
+        if self._version != other._version:
+            raise TypeError('%s and %s are not of the same type' % (
+                            self, other))
+        # self._version == other._version below here:
+        if self.network_address < other.network_address:
+            return -1
+        if self.network_address > other.network_address:
+            return 1
+        # self.network_address == other.network_address below here:
+        if self.netmask < other.netmask:
+            return -1
+        if self.netmask > other.netmask:
+            return 1
+        return 0
+
+    def _get_networks_key(self):
+        """Network-only key function.
+
+        Returns an object that identifies this address' network and
+        netmask. This function is a suitable "key" argument for sorted()
+        and list.sort().
+
+        """
+        return (self._version, self.network_address, self.netmask)
+
+    def subnets(self, prefixlen_diff=1, new_prefix=None):
+        """The subnets which join to make the current subnet.
+
+        In the case that self contains only one IP
+        (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
+        for IPv6), yield an iterator with just ourself.
+
+        Args:
+            prefixlen_diff: An integer, the amount the prefix length
+              should be increased by. This should not be set if
+              new_prefix is also set.
+            new_prefix: The desired new prefix length. This must be a
+              larger number (smaller prefix) than the existing prefix.
+              This should not be set if prefixlen_diff is also set.
+
+        Returns:
+            An iterator of IPv(4|6) objects.
+
+        Raises:
+            ValueError: The prefixlen_diff is too small or too large.
+                OR
+            prefixlen_diff and new_prefix are both set or new_prefix
+              is a smaller number than the current prefix (smaller
+              number means a larger network)
+
+        """
+        if self._prefixlen == self._max_prefixlen:
+            yield self
+            return
+
+        if new_prefix is not None:
+            if new_prefix < self._prefixlen:
+                raise ValueError('new prefix must be longer')
+            if prefixlen_diff != 1:
+                raise ValueError('cannot set prefixlen_diff and new_prefix')
+            prefixlen_diff = new_prefix - self._prefixlen
+
+        if prefixlen_diff < 0:
+            raise ValueError('prefix length diff must be > 0')
+        new_prefixlen = self._prefixlen + prefixlen_diff
+
+        if new_prefixlen > self._max_prefixlen:
+            raise ValueError(
+                'prefix length diff %d is invalid for netblock %s' % (
+                    new_prefixlen, self))
+
+        start = int(self.network_address)
+        end = int(self.broadcast_address) + 1
+        step = (int(self.hostmask) + 1) >> prefixlen_diff
+        for new_addr in _compat_range(start, end, step):
+            current = self.__class__((new_addr, new_prefixlen))
+            yield current
+
+    def supernet(self, prefixlen_diff=1, new_prefix=None):
+        """The supernet containing the current network.
+
+        Args:
+            prefixlen_diff: An integer, the amount the prefix length of
+              the network should be decreased by.  For example, given a
+              /24 network and a prefixlen_diff of 3, a supernet with a
+              /21 netmask is returned.
+
+        Returns:
+            An IPv4 network object.
+
+        Raises:
+            ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
+              a negative prefix length.
+                OR
+            If prefixlen_diff and new_prefix are both set or new_prefix is a
+              larger number than the current prefix (larger number means a
+              smaller network)
+
+        """
+        if self._prefixlen == 0:
+            return self
+
+        if new_prefix is not None:
+            if new_prefix > self._prefixlen:
+                raise ValueError('new prefix must be shorter')
+            if prefixlen_diff != 1:
+                raise ValueError('cannot set prefixlen_diff and new_prefix')
+            prefixlen_diff = self._prefixlen - new_prefix
+
+        new_prefixlen = self.prefixlen - prefixlen_diff
+        if new_prefixlen < 0:
+            raise ValueError(
+                'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
+                (self.prefixlen, prefixlen_diff))
+        return self.__class__((
+            int(self.network_address) & (int(self.netmask) << prefixlen_diff),
+            new_prefixlen))
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is a multicast address.
+            See RFC 2373 2.7 for details.
+
+        """
+        return (self.network_address.is_multicast and
+                self.broadcast_address.is_multicast)
+
+    @staticmethod
+    def _is_subnet_of(a, b):
+        try:
+            # Always false if one is v4 and the other is v6.
+            if a._version != b._version:
+                raise TypeError("%s and %s are not of the same version" (a, b))
+            return (b.network_address <= a.network_address and
+                    b.broadcast_address >= a.broadcast_address)
+        except AttributeError:
+            raise TypeError("Unable to test subnet containment "
+                            "between %s and %s" % (a, b))
+
+    def subnet_of(self, other):
+        """Return True if this network is a subnet of other."""
+        return self._is_subnet_of(self, other)
+
+    def supernet_of(self, other):
+        """Return True if this network is a supernet of other."""
+        return self._is_subnet_of(other, self)
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+        Returns:
+            A boolean, True if the address is within one of the
+            reserved IPv6 Network ranges.
+
+        """
+        return (self.network_address.is_reserved and
+                self.broadcast_address.is_reserved)
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 4291.
+
+        """
+        return (self.network_address.is_link_local and
+                self.broadcast_address.is_link_local)
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per
+            iana-ipv4-special-registry or iana-ipv6-special-registry.
+
+        """
+        return (self.network_address.is_private and
+                self.broadcast_address.is_private)
+
+    @property
+    def is_global(self):
+        """Test if this address is allocated for public networks.
+
+        Returns:
+            A boolean, True if the address is not reserved per
+            iana-ipv4-special-registry or iana-ipv6-special-registry.
+
+        """
+        return not self.is_private
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 2373 2.5.2.
+
+        """
+        return (self.network_address.is_unspecified and
+                self.broadcast_address.is_unspecified)
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback address as defined in
+            RFC 2373 2.5.3.
+
+        """
+        return (self.network_address.is_loopback and
+                self.broadcast_address.is_loopback)
+
+
+class _BaseV4(object):
+
+    """Base IPv4 object.
+
+    The following methods are used by IPv4 objects in both single IP
+    addresses and networks.
+
+    """
+
+    __slots__ = ()
+    _version = 4
+    # Equivalent to 255.255.255.255 or 32 bits of 1's.
+    _ALL_ONES = (2 ** IPV4LENGTH) - 1
+    _DECIMAL_DIGITS = frozenset('0123456789')
+
+    # the valid octets for host and netmasks. only useful for IPv4.
+    _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0])
+
+    _max_prefixlen = IPV4LENGTH
+    # There are only a handful of valid v4 netmasks, so we cache them all
+    # when constructed (see _make_netmask()).
+    _netmask_cache = {}
+
+    def _explode_shorthand_ip_string(self):
+        return _compat_str(self)
+
+    @classmethod
+    def _make_netmask(cls, arg):
+        """Make a (netmask, prefix_len) tuple from the given argument.
+
+        Argument can be:
+        - an integer (the prefix length)
+        - a string representing the prefix length (e.g. "24")
+        - a string representing the prefix netmask (e.g. "255.255.255.0")
+        """
+        if arg not in cls._netmask_cache:
+            if isinstance(arg, _compat_int_types):
+                prefixlen = arg
+            else:
+                try:
+                    # Check for a netmask in prefix length form
+                    prefixlen = cls._prefix_from_prefix_string(arg)
+                except NetmaskValueError:
+                    # Check for a netmask or hostmask in dotted-quad form.
+                    # This may raise NetmaskValueError.
+                    prefixlen = cls._prefix_from_ip_string(arg)
+            netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
+            cls._netmask_cache[arg] = netmask, prefixlen
+        return cls._netmask_cache[arg]
+
+    @classmethod
+    def _ip_int_from_string(cls, ip_str):
+        """Turn the given IP string into an integer for comparison.
+
+        Args:
+            ip_str: A string, the IP ip_str.
+
+        Returns:
+            The IP ip_str as an integer.
+
+        Raises:
+            AddressValueError: if ip_str isn't a valid IPv4 Address.
+
+        """
+        if not ip_str:
+            raise AddressValueError('Address cannot be empty')
+
+        octets = ip_str.split('.')
+        if len(octets) != 4:
+            raise AddressValueError("Expected 4 octets in %r" % ip_str)
+
+        try:
+            return _compat_int_from_byte_vals(
+                map(cls._parse_octet, octets), 'big')
+        except ValueError as exc:
+            raise AddressValueError("%s in %r" % (exc, ip_str))
+
+    @classmethod
+    def _parse_octet(cls, octet_str):
+        """Convert a decimal octet into an integer.
+
+        Args:
+            octet_str: A string, the number to parse.
+
+        Returns:
+            The octet as an integer.
+
+        Raises:
+            ValueError: if the octet isn't strictly a decimal from [0..255].
+
+        """
+        if not octet_str:
+            raise ValueError("Empty octet not permitted")
+        # Whitelist the characters, since int() allows a lot of bizarre stuff.
+        if not cls._DECIMAL_DIGITS.issuperset(octet_str):
+            msg = "Only decimal digits permitted in %r"
+            raise ValueError(msg % octet_str)
+        # We do the length check second, since the invalid character error
+        # is likely to be more informative for the user
+        if len(octet_str) > 3:
+            msg = "At most 3 characters permitted in %r"
+            raise ValueError(msg % octet_str)
+        # Convert to integer (we know digits are legal)
+        octet_int = int(octet_str, 10)
+        # Any octets that look like they *might* be written in octal,
+        # and which don't look exactly the same in both octal and
+        # decimal are rejected as ambiguous
+        if octet_int > 7 and octet_str[0] == '0':
+            msg = "Ambiguous (octal/decimal) value in %r not permitted"
+            raise ValueError(msg % octet_str)
+        if octet_int > 255:
+            raise ValueError("Octet %d (> 255) not permitted" % octet_int)
+        return octet_int
+
+    @classmethod
+    def _string_from_ip_int(cls, ip_int):
+        """Turns a 32-bit integer into dotted decimal notation.
+
+        Args:
+            ip_int: An integer, the IP address.
+
+        Returns:
+            The IP address as a string in dotted decimal notation.
+
+        """
+        return '.'.join(_compat_str(struct.unpack(b'!B', b)[0]
+                                    if isinstance(b, bytes)
+                                    else b)
+                        for b in _compat_to_bytes(ip_int, 4, 'big'))
+
+    def _is_hostmask(self, ip_str):
+        """Test if the IP string is a hostmask (rather than a netmask).
+
+        Args:
+            ip_str: A string, the potential hostmask.
+
+        Returns:
+            A boolean, True if the IP string is a hostmask.
+
+        """
+        bits = ip_str.split('.')
+        try:
+            parts = [x for x in map(int, bits) if x in self._valid_mask_octets]
+        except ValueError:
+            return False
+        if len(parts) != len(bits):
+            return False
+        if parts[0] < parts[-1]:
+            return True
+        return False
+
+    def _reverse_pointer(self):
+        """Return the reverse DNS pointer name for the IPv4 address.
+
+        This implements the method described in RFC1035 3.5.
+
+        """
+        reverse_octets = _compat_str(self).split('.')[::-1]
+        return '.'.join(reverse_octets) + '.in-addr.arpa'
+
+    @property
+    def max_prefixlen(self):
+        return self._max_prefixlen
+
+    @property
+    def version(self):
+        return self._version
+
+
+class IPv4Address(_BaseV4, _BaseAddress):
+
+    """Represent and manipulate single IPv4 Addresses."""
+
+    __slots__ = ('_ip', '__weakref__')
+
+    def __init__(self, address):
+
+        """
+        Args:
+            address: A string or integer representing the IP
+
+              Additionally, an integer can be passed, so
+              IPv4Address('192.0.2.1') == IPv4Address(3221225985).
+              or, more generally
+              IPv4Address(int(IPv4Address('192.0.2.1'))) ==
+                IPv4Address('192.0.2.1')
+
+        Raises:
+            AddressValueError: If ipaddress isn't a valid IPv4 address.
+
+        """
+        # Efficient constructor from integer.
+        if isinstance(address, _compat_int_types):
+            self._check_int_address(address)
+            self._ip = address
+            return
+
+        # Constructing from a packed address
+        if isinstance(address, bytes):
+            self._check_packed_address(address, 4)
+            bvs = _compat_bytes_to_byte_vals(address)
+            self._ip = _compat_int_from_byte_vals(bvs, 'big')
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP string.
+        addr_str = _compat_str(address)
+        if '/' in addr_str:
+            raise AddressValueError("Unexpected '/' in %r" % address)
+        self._ip = self._ip_int_from_string(addr_str)
+
+    @property
+    def packed(self):
+        """The binary representation of this address."""
+        return v4_int_to_packed(self._ip)
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+         Returns:
+             A boolean, True if the address is within the
+             reserved IPv4 Network range.
+
+        """
+        return self in self._constants._reserved_network
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per
+            iana-ipv4-special-registry.
+
+        """
+        return any(self in net for net in self._constants._private_networks)
+
+    @property
+    def is_global(self):
+        return (
+            self not in self._constants._public_network and
+            not self.is_private)
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is multicast.
+            See RFC 3171 for details.
+
+        """
+        return self in self._constants._multicast_network
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 5735 3.
+
+        """
+        return self == self._constants._unspecified_address
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback per RFC 3330.
+
+        """
+        return self in self._constants._loopback_network
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is link-local per RFC 3927.
+
+        """
+        return self in self._constants._linklocal_network
+
+
+class IPv4Interface(IPv4Address):
+
+    def __init__(self, address):
+        if isinstance(address, (bytes, _compat_int_types)):
+            IPv4Address.__init__(self, address)
+            self.network = IPv4Network(self._ip)
+            self._prefixlen = self._max_prefixlen
+            return
+
+        if isinstance(address, tuple):
+            IPv4Address.__init__(self, address[0])
+            if len(address) > 1:
+                self._prefixlen = int(address[1])
+            else:
+                self._prefixlen = self._max_prefixlen
+
+            self.network = IPv4Network(address, strict=False)
+            self.netmask = self.network.netmask
+            self.hostmask = self.network.hostmask
+            return
+
+        addr = _split_optional_netmask(address)
+        IPv4Address.__init__(self, addr[0])
+
+        self.network = IPv4Network(address, strict=False)
+        self._prefixlen = self.network._prefixlen
+
+        self.netmask = self.network.netmask
+        self.hostmask = self.network.hostmask
+
+    def __str__(self):
+        return '%s/%d' % (self._string_from_ip_int(self._ip),
+                          self.network.prefixlen)
+
+    def __eq__(self, other):
+        address_equal = IPv4Address.__eq__(self, other)
+        if not address_equal or address_equal is NotImplemented:
+            return address_equal
+        try:
+            return self.network == other.network
+        except AttributeError:
+            # An interface with an associated network is NOT the
+            # same as an unassociated address. That's why the hash
+            # takes the extra info into account.
+            return False
+
+    def __lt__(self, other):
+        address_less = IPv4Address.__lt__(self, other)
+        if address_less is NotImplemented:
+            return NotImplemented
+        try:
+            return (self.network < other.network or
+                    self.network == other.network and address_less)
+        except AttributeError:
+            # We *do* allow addresses and interfaces to be sorted. The
+            # unassociated address is considered less than all interfaces.
+            return False
+
+    def __hash__(self):
+        return self._ip ^ self._prefixlen ^ int(self.network.network_address)
+
+    __reduce__ = _IPAddressBase.__reduce__
+
+    @property
+    def ip(self):
+        return IPv4Address(self._ip)
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.netmask)
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.hostmask)
+
+
+class IPv4Network(_BaseV4, _BaseNetwork):
+
+    """This class represents and manipulates 32-bit IPv4 network + addresses..
+
+    Attributes: [examples for IPv4Network('192.0.2.0/27')]
+        .network_address: IPv4Address('192.0.2.0')
+        .hostmask: IPv4Address('0.0.0.31')
+        .broadcast_address: IPv4Address('192.0.2.32')
+        .netmask: IPv4Address('255.255.255.224')
+        .prefixlen: 27
+
+    """
+    # Class to use when creating address objects
+    _address_class = IPv4Address
+
+    def __init__(self, address, strict=True):
+
+        """Instantiate a new IPv4 network object.
+
+        Args:
+            address: A string or integer representing the IP [& network].
+              '192.0.2.0/24'
+              '192.0.2.0/255.255.255.0'
+              '192.0.0.2/0.0.0.255'
+              are all functionally the same in IPv4. Similarly,
+              '192.0.2.1'
+              '192.0.2.1/255.255.255.255'
+              '192.0.2.1/32'
+              are also functionally equivalent. That is to say, failing to
+              provide a subnetmask will create an object with a mask of /32.
+
+              If the mask (portion after the / in the argument) is given in
+              dotted quad form, it is treated as a netmask if it starts with a
+              non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
+              starts with a zero field (e.g. 0.255.255.255 == /8), with the
+              single exception of an all-zero mask which is treated as a
+              netmask == /0. If no mask is given, a default of /32 is used.
+
+              Additionally, an integer can be passed, so
+              IPv4Network('192.0.2.1') == IPv4Network(3221225985)
+              or, more generally
+              IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
+                IPv4Interface('192.0.2.1')
+
+        Raises:
+            AddressValueError: If ipaddress isn't a valid IPv4 address.
+            NetmaskValueError: If the netmask isn't valid for
+              an IPv4 address.
+            ValueError: If strict is True and a network address is not
+              supplied.
+
+        """
+        _BaseNetwork.__init__(self, address)
+
+        # Constructing from a packed address or integer
+        if isinstance(address, (_compat_int_types, bytes)):
+            self.network_address = IPv4Address(address)
+            self.netmask, self._prefixlen = self._make_netmask(
+                self._max_prefixlen)
+            # fixme: address/network test here.
+            return
+
+        if isinstance(address, tuple):
+            if len(address) > 1:
+                arg = address[1]
+            else:
+                # We weren't given an address[1]
+                arg = self._max_prefixlen
+            self.network_address = IPv4Address(address[0])
+            self.netmask, self._prefixlen = self._make_netmask(arg)
+            packed = int(self.network_address)
+            if packed & int(self.netmask) != packed:
+                if strict:
+                    raise ValueError('%s has host bits set' % self)
+                else:
+                    self.network_address = IPv4Address(packed &
+                                                       int(self.netmask))
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP prefix string.
+        addr = _split_optional_netmask(address)
+        self.network_address = IPv4Address(self._ip_int_from_string(addr[0]))
+
+        if len(addr) == 2:
+            arg = addr[1]
+        else:
+            arg = self._max_prefixlen
+        self.netmask, self._prefixlen = self._make_netmask(arg)
+
+        if strict:
+            if (IPv4Address(int(self.network_address) & int(self.netmask)) !=
+                    self.network_address):
+                raise ValueError('%s has host bits set' % self)
+        self.network_address = IPv4Address(int(self.network_address) &
+                                           int(self.netmask))
+
+        if self._prefixlen == (self._max_prefixlen - 1):
+            self.hosts = self.__iter__
+
+    @property
+    def is_global(self):
+        """Test if this address is allocated for public networks.
+
+        Returns:
+            A boolean, True if the address is not reserved per
+            iana-ipv4-special-registry.
+
+        """
+        return (not (self.network_address in IPv4Network('100.64.0.0/10') and
+                self.broadcast_address in IPv4Network('100.64.0.0/10')) and
+                not self.is_private)
+
+
+class _IPv4Constants(object):
+
+    _linklocal_network = IPv4Network('169.254.0.0/16')
+
+    _loopback_network = IPv4Network('127.0.0.0/8')
+
+    _multicast_network = IPv4Network('224.0.0.0/4')
+
+    _public_network = IPv4Network('100.64.0.0/10')
+
+    _private_networks = [
+        IPv4Network('0.0.0.0/8'),
+        IPv4Network('10.0.0.0/8'),
+        IPv4Network('127.0.0.0/8'),
+        IPv4Network('169.254.0.0/16'),
+        IPv4Network('172.16.0.0/12'),
+        IPv4Network('192.0.0.0/29'),
+        IPv4Network('192.0.0.170/31'),
+        IPv4Network('192.0.2.0/24'),
+        IPv4Network('192.168.0.0/16'),
+        IPv4Network('198.18.0.0/15'),
+        IPv4Network('198.51.100.0/24'),
+        IPv4Network('203.0.113.0/24'),
+        IPv4Network('240.0.0.0/4'),
+        IPv4Network('255.255.255.255/32'),
+    ]
+
+    _reserved_network = IPv4Network('240.0.0.0/4')
+
+    _unspecified_address = IPv4Address('0.0.0.0')
+
+
+IPv4Address._constants = _IPv4Constants
+
+
+class _BaseV6(object):
+
+    """Base IPv6 object.
+
+    The following methods are used by IPv6 objects in both single IP
+    addresses and networks.
+
+    """
+
+    __slots__ = ()
+    _version = 6
+    _ALL_ONES = (2 ** IPV6LENGTH) - 1
+    _HEXTET_COUNT = 8
+    _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
+    _max_prefixlen = IPV6LENGTH
+
+    # There are only a bunch of valid v6 netmasks, so we cache them all
+    # when constructed (see _make_netmask()).
+    _netmask_cache = {}
+
+    @classmethod
+    def _make_netmask(cls, arg):
+        """Make a (netmask, prefix_len) tuple from the given argument.
+
+        Argument can be:
+        - an integer (the prefix length)
+        - a string representing the prefix length (e.g. "24")
+        - a string representing the prefix netmask (e.g. "255.255.255.0")
+        """
+        if arg not in cls._netmask_cache:
+            if isinstance(arg, _compat_int_types):
+                prefixlen = arg
+            else:
+                prefixlen = cls._prefix_from_prefix_string(arg)
+            netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
+            cls._netmask_cache[arg] = netmask, prefixlen
+        return cls._netmask_cache[arg]
+
+    @classmethod
+    def _ip_int_from_string(cls, ip_str):
+        """Turn an IPv6 ip_str into an integer.
+
+        Args:
+            ip_str: A string, the IPv6 ip_str.
+
+        Returns:
+            An int, the IPv6 address
+
+        Raises:
+            AddressValueError: if ip_str isn't a valid IPv6 Address.
+
+        """
+        if not ip_str:
+            raise AddressValueError('Address cannot be empty')
+
+        parts = ip_str.split(':')
+
+        # An IPv6 address needs at least 2 colons (3 parts).
+        _min_parts = 3
+        if len(parts) < _min_parts:
+            msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
+            raise AddressValueError(msg)
+
+        # If the address has an IPv4-style suffix, convert it to hexadecimal.
+        if '.' in parts[-1]:
+            try:
+                ipv4_int = IPv4Address(parts.pop())._ip
+            except AddressValueError as exc:
+                raise AddressValueError("%s in %r" % (exc, ip_str))
+            parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
+            parts.append('%x' % (ipv4_int & 0xFFFF))
+
+        # An IPv6 address can't have more than 8 colons (9 parts).
+        # The extra colon comes from using the "::" notation for a single
+        # leading or trailing zero part.
+        _max_parts = cls._HEXTET_COUNT + 1
+        if len(parts) > _max_parts:
+            msg = "At most %d colons permitted in %r" % (
+                _max_parts - 1, ip_str)
+            raise AddressValueError(msg)
+
+        # Disregarding the endpoints, find '::' with nothing in between.
+        # This indicates that a run of zeroes has been skipped.
+        skip_index = None
+        for i in _compat_range(1, len(parts) - 1):
+            if not parts[i]:
+                if skip_index is not None:
+                    # Can't have more than one '::'
+                    msg = "At most one '::' permitted in %r" % ip_str
+                    raise AddressValueError(msg)
+                skip_index = i
+
+        # parts_hi is the number of parts to copy from above/before the '::'
+        # parts_lo is the number of parts to copy from below/after the '::'
+        if skip_index is not None:
+            # If we found a '::', then check if it also covers the endpoints.
+            parts_hi = skip_index
+            parts_lo = len(parts) - skip_index - 1
+            if not parts[0]:
+                parts_hi -= 1
+                if parts_hi:
+                    msg = "Leading ':' only permitted as part of '::' in %r"
+                    raise AddressValueError(msg % ip_str)  # ^: requires ^::
+            if not parts[-1]:
+                parts_lo -= 1
+                if parts_lo:
+                    msg = "Trailing ':' only permitted as part of '::' in %r"
+                    raise AddressValueError(msg % ip_str)  # :$ requires ::$
+            parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
+            if parts_skipped < 1:
+                msg = "Expected at most %d other parts with '::' in %r"
+                raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str))
+        else:
+            # Otherwise, allocate the entire address to parts_hi.  The
+            # endpoints could still be empty, but _parse_hextet() will check
+            # for that.
+            if len(parts) != cls._HEXTET_COUNT:
+                msg = "Exactly %d parts expected without '::' in %r"
+                raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
+            if not parts[0]:
+                msg = "Leading ':' only permitted as part of '::' in %r"
+                raise AddressValueError(msg % ip_str)  # ^: requires ^::
+            if not parts[-1]:
+                msg = "Trailing ':' only permitted as part of '::' in %r"
+                raise AddressValueError(msg % ip_str)  # :$ requires ::$
+            parts_hi = len(parts)
+            parts_lo = 0
+            parts_skipped = 0
+
+        try:
+            # Now, parse the hextets into a 128-bit integer.
+            ip_int = 0
+            for i in range(parts_hi):
+                ip_int <<= 16
+                ip_int |= cls._parse_hextet(parts[i])
+            ip_int <<= 16 * parts_skipped
+            for i in range(-parts_lo, 0):
+                ip_int <<= 16
+                ip_int |= cls._parse_hextet(parts[i])
+            return ip_int
+        except ValueError as exc:
+            raise AddressValueError("%s in %r" % (exc, ip_str))
+
+    @classmethod
+    def _parse_hextet(cls, hextet_str):
+        """Convert an IPv6 hextet string into an integer.
+
+        Args:
+            hextet_str: A string, the number to parse.
+
+        Returns:
+            The hextet as an integer.
+
+        Raises:
+            ValueError: if the input isn't strictly a hex number from
+              [0..FFFF].
+
+        """
+        # Whitelist the characters, since int() allows a lot of bizarre stuff.
+        if not cls._HEX_DIGITS.issuperset(hextet_str):
+            raise ValueError("Only hex digits permitted in %r" % hextet_str)
+        # We do the length check second, since the invalid character error
+        # is likely to be more informative for the user
+        if len(hextet_str) > 4:
+            msg = "At most 4 characters permitted in %r"
+            raise ValueError(msg % hextet_str)
+        # Length check means we can skip checking the integer value
+        return int(hextet_str, 16)
+
+    @classmethod
+    def _compress_hextets(cls, hextets):
+        """Compresses a list of hextets.
+
+        Compresses a list of strings, replacing the longest continuous
+        sequence of "0" in the list with "" and adding empty strings at
+        the beginning or at the end of the string such that subsequently
+        calling ":".join(hextets) will produce the compressed version of
+        the IPv6 address.
+
+        Args:
+            hextets: A list of strings, the hextets to compress.
+
+        Returns:
+            A list of strings.
+
+        """
+        best_doublecolon_start = -1
+        best_doublecolon_len = 0
+        doublecolon_start = -1
+        doublecolon_len = 0
+        for index, hextet in enumerate(hextets):
+            if hextet == '0':
+                doublecolon_len += 1
+                if doublecolon_start == -1:
+                    # Start of a sequence of zeros.
+                    doublecolon_start = index
+                if doublecolon_len > best_doublecolon_len:
+                    # This is the longest sequence of zeros so far.
+                    best_doublecolon_len = doublecolon_len
+                    best_doublecolon_start = doublecolon_start
+            else:
+                doublecolon_len = 0
+                doublecolon_start = -1
+
+        if best_doublecolon_len > 1:
+            best_doublecolon_end = (best_doublecolon_start +
+                                    best_doublecolon_len)
+            # For zeros at the end of the address.
+            if best_doublecolon_end == len(hextets):
+                hextets += ['']
+            hextets[best_doublecolon_start:best_doublecolon_end] = ['']
+            # For zeros at the beginning of the address.
+            if best_doublecolon_start == 0:
+                hextets = [''] + hextets
+
+        return hextets
+
+    @classmethod
+    def _string_from_ip_int(cls, ip_int=None):
+        """Turns a 128-bit integer into hexadecimal notation.
+
+        Args:
+            ip_int: An integer, the IP address.
+
+        Returns:
+            A string, the hexadecimal representation of the address.
+
+        Raises:
+            ValueError: The address is bigger than 128 bits of all ones.
+
+        """
+        if ip_int is None:
+            ip_int = int(cls._ip)
+
+        if ip_int > cls._ALL_ONES:
+            raise ValueError('IPv6 address is too large')
+
+        hex_str = '%032x' % ip_int
+        hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)]
+
+        hextets = cls._compress_hextets(hextets)
+        return ':'.join(hextets)
+
+    def _explode_shorthand_ip_string(self):
+        """Expand a shortened IPv6 address.
+
+        Args:
+            ip_str: A string, the IPv6 address.
+
+        Returns:
+            A string, the expanded IPv6 address.
+
+        """
+        if isinstance(self, IPv6Network):
+            ip_str = _compat_str(self.network_address)
+        elif isinstance(self, IPv6Interface):
+            ip_str = _compat_str(self.ip)
+        else:
+            ip_str = _compat_str(self)
+
+        ip_int = self._ip_int_from_string(ip_str)
+        hex_str = '%032x' % ip_int
+        parts = [hex_str[x:x + 4] for x in range(0, 32, 4)]
+        if isinstance(self, (_BaseNetwork, IPv6Interface)):
+            return '%s/%d' % (':'.join(parts), self._prefixlen)
+        return ':'.join(parts)
+
+    def _reverse_pointer(self):
+        """Return the reverse DNS pointer name for the IPv6 address.
+
+        This implements the method described in RFC3596 2.5.
+
+        """
+        reverse_chars = self.exploded[::-1].replace(':', '')
+        return '.'.join(reverse_chars) + '.ip6.arpa'
+
+    @property
+    def max_prefixlen(self):
+        return self._max_prefixlen
+
+    @property
+    def version(self):
+        return self._version
+
+
+class IPv6Address(_BaseV6, _BaseAddress):
+
+    """Represent and manipulate single IPv6 Addresses."""
+
+    __slots__ = ('_ip', '__weakref__')
+
+    def __init__(self, address):
+        """Instantiate a new IPv6 address object.
+
+        Args:
+            address: A string or integer representing the IP
+
+              Additionally, an integer can be passed, so
+              IPv6Address('2001:db8::') ==
+                IPv6Address(42540766411282592856903984951653826560)
+              or, more generally
+              IPv6Address(int(IPv6Address('2001:db8::'))) ==
+                IPv6Address('2001:db8::')
+
+        Raises:
+            AddressValueError: If address isn't a valid IPv6 address.
+
+        """
+        # Efficient constructor from integer.
+        if isinstance(address, _compat_int_types):
+            self._check_int_address(address)
+            self._ip = address
+            return
+
+        # Constructing from a packed address
+        if isinstance(address, bytes):
+            self._check_packed_address(address, 16)
+            bvs = _compat_bytes_to_byte_vals(address)
+            self._ip = _compat_int_from_byte_vals(bvs, 'big')
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP string.
+        addr_str = _compat_str(address)
+        if '/' in addr_str:
+            raise AddressValueError("Unexpected '/' in %r" % address)
+        self._ip = self._ip_int_from_string(addr_str)
+
+    @property
+    def packed(self):
+        """The binary representation of this address."""
+        return v6_int_to_packed(self._ip)
+
+    @property
+    def is_multicast(self):
+        """Test if the address is reserved for multicast use.
+
+        Returns:
+            A boolean, True if the address is a multicast address.
+            See RFC 2373 2.7 for details.
+
+        """
+        return self in self._constants._multicast_network
+
+    @property
+    def is_reserved(self):
+        """Test if the address is otherwise IETF reserved.
+
+        Returns:
+            A boolean, True if the address is within one of the
+            reserved IPv6 Network ranges.
+
+        """
+        return any(self in x for x in self._constants._reserved_networks)
+
+    @property
+    def is_link_local(self):
+        """Test if the address is reserved for link-local.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 4291.
+
+        """
+        return self in self._constants._linklocal_network
+
+    @property
+    def is_site_local(self):
+        """Test if the address is reserved for site-local.
+
+        Note that the site-local address space has been deprecated by RFC 3879.
+        Use is_private to test if this address is in the space of unique local
+        addresses as defined by RFC 4193.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+        """
+        return self in self._constants._sitelocal_network
+
+    @property
+    def is_private(self):
+        """Test if this address is allocated for private networks.
+
+        Returns:
+            A boolean, True if the address is reserved per
+            iana-ipv6-special-registry.
+
+        """
+        return any(self in net for net in self._constants._private_networks)
+
+    @property
+    def is_global(self):
+        """Test if this address is allocated for public networks.
+
+        Returns:
+            A boolean, true if the address is not reserved per
+            iana-ipv6-special-registry.
+
+        """
+        return not self.is_private
+
+    @property
+    def is_unspecified(self):
+        """Test if the address is unspecified.
+
+        Returns:
+            A boolean, True if this is the unspecified address as defined in
+            RFC 2373 2.5.2.
+
+        """
+        return self._ip == 0
+
+    @property
+    def is_loopback(self):
+        """Test if the address is a loopback address.
+
+        Returns:
+            A boolean, True if the address is a loopback address as defined in
+            RFC 2373 2.5.3.
+
+        """
+        return self._ip == 1
+
+    @property
+    def ipv4_mapped(self):
+        """Return the IPv4 mapped address.
+
+        Returns:
+            If the IPv6 address is a v4 mapped address, return the
+            IPv4 mapped address. Return None otherwise.
+
+        """
+        if (self._ip >> 32) != 0xFFFF:
+            return None
+        return IPv4Address(self._ip & 0xFFFFFFFF)
+
+    @property
+    def teredo(self):
+        """Tuple of embedded teredo IPs.
+
+        Returns:
+            Tuple of the (server, client) IPs or None if the address
+            doesn't appear to be a teredo address (doesn't start with
+            2001::/32)
+
+        """
+        if (self._ip >> 96) != 0x20010000:
+            return None
+        return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
+                IPv4Address(~self._ip & 0xFFFFFFFF))
+
+    @property
+    def sixtofour(self):
+        """Return the IPv4 6to4 embedded address.
+
+        Returns:
+            The IPv4 6to4-embedded address if present or None if the
+            address doesn't appear to contain a 6to4 embedded address.
+
+        """
+        if (self._ip >> 112) != 0x2002:
+            return None
+        return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
+
+
+class IPv6Interface(IPv6Address):
+
+    def __init__(self, address):
+        if isinstance(address, (bytes, _compat_int_types)):
+            IPv6Address.__init__(self, address)
+            self.network = IPv6Network(self._ip)
+            self._prefixlen = self._max_prefixlen
+            return
+        if isinstance(address, tuple):
+            IPv6Address.__init__(self, address[0])
+            if len(address) > 1:
+                self._prefixlen = int(address[1])
+            else:
+                self._prefixlen = self._max_prefixlen
+            self.network = IPv6Network(address, strict=False)
+            self.netmask = self.network.netmask
+            self.hostmask = self.network.hostmask
+            return
+
+        addr = _split_optional_netmask(address)
+        IPv6Address.__init__(self, addr[0])
+        self.network = IPv6Network(address, strict=False)
+        self.netmask = self.network.netmask
+        self._prefixlen = self.network._prefixlen
+        self.hostmask = self.network.hostmask
+
+    def __str__(self):
+        return '%s/%d' % (self._string_from_ip_int(self._ip),
+                          self.network.prefixlen)
+
+    def __eq__(self, other):
+        address_equal = IPv6Address.__eq__(self, other)
+        if not address_equal or address_equal is NotImplemented:
+            return address_equal
+        try:
+            return self.network == other.network
+        except AttributeError:
+            # An interface with an associated network is NOT the
+            # same as an unassociated address. That's why the hash
+            # takes the extra info into account.
+            return False
+
+    def __lt__(self, other):
+        address_less = IPv6Address.__lt__(self, other)
+        if address_less is NotImplemented:
+            return NotImplemented
+        try:
+            return (self.network < other.network or
+                    self.network == other.network and address_less)
+        except AttributeError:
+            # We *do* allow addresses and interfaces to be sorted. The
+            # unassociated address is considered less than all interfaces.
+            return False
+
+    def __hash__(self):
+        return self._ip ^ self._prefixlen ^ int(self.network.network_address)
+
+    __reduce__ = _IPAddressBase.__reduce__
+
+    @property
+    def ip(self):
+        return IPv6Address(self._ip)
+
+    @property
+    def with_prefixlen(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self._prefixlen)
+
+    @property
+    def with_netmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.netmask)
+
+    @property
+    def with_hostmask(self):
+        return '%s/%s' % (self._string_from_ip_int(self._ip),
+                          self.hostmask)
+
+    @property
+    def is_unspecified(self):
+        return self._ip == 0 and self.network.is_unspecified
+
+    @property
+    def is_loopback(self):
+        return self._ip == 1 and self.network.is_loopback
+
+
+class IPv6Network(_BaseV6, _BaseNetwork):
+
+    """This class represents and manipulates 128-bit IPv6 networks.
+
+    Attributes: [examples for IPv6('2001:db8::1000/124')]
+        .network_address: IPv6Address('2001:db8::1000')
+        .hostmask: IPv6Address('::f')
+        .broadcast_address: IPv6Address('2001:db8::100f')
+        .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
+        .prefixlen: 124
+
+    """
+
+    # Class to use when creating address objects
+    _address_class = IPv6Address
+
+    def __init__(self, address, strict=True):
+        """Instantiate a new IPv6 Network object.
+
+        Args:
+            address: A string or integer representing the IPv6 network or the
+              IP and prefix/netmask.
+              '2001:db8::/128'
+              '2001:db8:0000:0000:0000:0000:0000:0000/128'
+              '2001:db8::'
+              are all functionally the same in IPv6.  That is to say,
+              failing to provide a subnetmask will create an object with
+              a mask of /128.
+
+              Additionally, an integer can be passed, so
+              IPv6Network('2001:db8::') ==
+                IPv6Network(42540766411282592856903984951653826560)
+              or, more generally
+              IPv6Network(int(IPv6Network('2001:db8::'))) ==
+                IPv6Network('2001:db8::')
+
+            strict: A boolean. If true, ensure that we have been passed
+              A true network address, eg, 2001:db8::1000/124 and not an
+              IP address on a network, eg, 2001:db8::1/124.
+
+        Raises:
+            AddressValueError: If address isn't a valid IPv6 address.
+            NetmaskValueError: If the netmask isn't valid for
+              an IPv6 address.
+            ValueError: If strict was True and a network address was not
+              supplied.
+
+        """
+        _BaseNetwork.__init__(self, address)
+
+        # Efficient constructor from integer or packed address
+        if isinstance(address, (bytes, _compat_int_types)):
+            self.network_address = IPv6Address(address)
+            self.netmask, self._prefixlen = self._make_netmask(
+                self._max_prefixlen)
+            return
+
+        if isinstance(address, tuple):
+            if len(address) > 1:
+                arg = address[1]
+            else:
+                arg = self._max_prefixlen
+            self.netmask, self._prefixlen = self._make_netmask(arg)
+            self.network_address = IPv6Address(address[0])
+            packed = int(self.network_address)
+            if packed & int(self.netmask) != packed:
+                if strict:
+                    raise ValueError('%s has host bits set' % self)
+                else:
+                    self.network_address = IPv6Address(packed &
+                                                       int(self.netmask))
+            return
+
+        # Assume input argument to be string or any object representation
+        # which converts into a formatted IP prefix string.
+        addr = _split_optional_netmask(address)
+
+        self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
+
+        if len(addr) == 2:
+            arg = addr[1]
+        else:
+            arg = self._max_prefixlen
+        self.netmask, self._prefixlen = self._make_netmask(arg)
+
+        if strict:
+            if (IPv6Address(int(self.network_address) & int(self.netmask)) !=
+                    self.network_address):
+                raise ValueError('%s has host bits set' % self)
+        self.network_address = IPv6Address(int(self.network_address) &
+                                           int(self.netmask))
+
+        if self._prefixlen == (self._max_prefixlen - 1):
+            self.hosts = self.__iter__
+
+    def hosts(self):
+        """Generate Iterator over usable hosts in a network.
+
+          This is like __iter__ except it doesn't return the
+          Subnet-Router anycast address.
+
+        """
+        network = int(self.network_address)
+        broadcast = int(self.broadcast_address)
+        for x in _compat_range(network + 1, broadcast + 1):
+            yield self._address_class(x)
+
+    @property
+    def is_site_local(self):
+        """Test if the address is reserved for site-local.
+
+        Note that the site-local address space has been deprecated by RFC 3879.
+        Use is_private to test if this address is in the space of unique local
+        addresses as defined by RFC 4193.
+
+        Returns:
+            A boolean, True if the address is reserved per RFC 3513 2.5.6.
+
+        """
+        return (self.network_address.is_site_local and
+                self.broadcast_address.is_site_local)
+
+
+class _IPv6Constants(object):
+
+    _linklocal_network = IPv6Network('fe80::/10')
+
+    _multicast_network = IPv6Network('ff00::/8')
+
+    _private_networks = [
+        IPv6Network('::1/128'),
+        IPv6Network('::/128'),
+        IPv6Network('::ffff:0:0/96'),
+        IPv6Network('100::/64'),
+        IPv6Network('2001::/23'),
+        IPv6Network('2001:2::/48'),
+        IPv6Network('2001:db8::/32'),
+        IPv6Network('2001:10::/28'),
+        IPv6Network('fc00::/7'),
+        IPv6Network('fe80::/10'),
+    ]
+
+    _reserved_networks = [
+        IPv6Network('::/8'), IPv6Network('100::/8'),
+        IPv6Network('200::/7'), IPv6Network('400::/6'),
+        IPv6Network('800::/5'), IPv6Network('1000::/4'),
+        IPv6Network('4000::/3'), IPv6Network('6000::/3'),
+        IPv6Network('8000::/3'), IPv6Network('A000::/3'),
+        IPv6Network('C000::/3'), IPv6Network('E000::/4'),
+        IPv6Network('F000::/5'), IPv6Network('F800::/6'),
+        IPv6Network('FE00::/9'),
+    ]
+
+    _sitelocal_network = IPv6Network('fec0::/10')
+
+
+IPv6Address._constants = _IPv6Constants
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..176990381f3f938c58187b7cf13b0a9fefc8e58c
GIT binary patch
literal 85785
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
SWET6+ASby+EL^f$Oc4Mddn>~L

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py
new file mode 100644
index 00000000..a6f44a55
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.py
@@ -0,0 +1,347 @@
+# -*- coding: utf-8 -*-
+
+"""
+lockfile.py - Platform-independent advisory file locks.
+
+Requires Python 2.5 unless you apply 2.4.diff
+Locking is done on a per-thread basis instead of a per-process basis.
+
+Usage:
+
+>>> lock = LockFile('somefile')
+>>> try:
+...     lock.acquire()
+... except AlreadyLocked:
+...     print 'somefile', 'is locked already.'
+... except LockFailed:
+...     print 'somefile', 'can\\'t be locked.'
+... else:
+...     print 'got lock'
+got lock
+>>> print lock.is_locked()
+True
+>>> lock.release()
+
+>>> lock = LockFile('somefile')
+>>> print lock.is_locked()
+False
+>>> with lock:
+...    print lock.is_locked()
+True
+>>> print lock.is_locked()
+False
+
+>>> lock = LockFile('somefile')
+>>> # It is okay to lock twice from the same thread...
+>>> with lock:
+...     lock.acquire()
+...
+>>> # Though no counter is kept, so you can't unlock multiple times...
+>>> print lock.is_locked()
+False
+
+Exceptions:
+
+    Error - base class for other exceptions
+        LockError - base class for all locking exceptions
+            AlreadyLocked - Another thread or process already holds the lock
+            LockFailed - Lock failed for some other reason
+        UnlockError - base class for all unlocking exceptions
+            AlreadyUnlocked - File was not locked.
+            NotMyLock - File was locked but not by the current thread/process
+"""
+
+from __future__ import absolute_import
+
+import functools
+import os
+import socket
+import threading
+import warnings
+
+# Work with PEP8 and non-PEP8 versions of threading module.
+if not hasattr(threading, "current_thread"):
+    threading.current_thread = threading.currentThread
+if not hasattr(threading.Thread, "get_name"):
+    threading.Thread.get_name = threading.Thread.getName
+
+__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked',
+           'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock',
+           'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock',
+           'LockBase', 'locked']
+
+
+class Error(Exception):
+    """
+    Base class for other exceptions.
+
+    >>> try:
+    ...   raise Error
+    ... except Exception:
+    ...   pass
+    """
+    pass
+
+
+class LockError(Error):
+    """
+    Base class for error arising from attempts to acquire the lock.
+
+    >>> try:
+    ...   raise LockError
+    ... except Error:
+    ...   pass
+    """
+    pass
+
+
+class LockTimeout(LockError):
+    """Raised when lock creation fails within a user-defined period of time.
+
+    >>> try:
+    ...   raise LockTimeout
+    ... except LockError:
+    ...   pass
+    """
+    pass
+
+
+class AlreadyLocked(LockError):
+    """Some other thread/process is locking the file.
+
+    >>> try:
+    ...   raise AlreadyLocked
+    ... except LockError:
+    ...   pass
+    """
+    pass
+
+
+class LockFailed(LockError):
+    """Lock file creation failed for some other reason.
+
+    >>> try:
+    ...   raise LockFailed
+    ... except LockError:
+    ...   pass
+    """
+    pass
+
+
+class UnlockError(Error):
+    """
+    Base class for errors arising from attempts to release the lock.
+
+    >>> try:
+    ...   raise UnlockError
+    ... except Error:
+    ...   pass
+    """
+    pass
+
+
+class NotLocked(UnlockError):
+    """Raised when an attempt is made to unlock an unlocked file.
+
+    >>> try:
+    ...   raise NotLocked
+    ... except UnlockError:
+    ...   pass
+    """
+    pass
+
+
+class NotMyLock(UnlockError):
+    """Raised when an attempt is made to unlock a file someone else locked.
+
+    >>> try:
+    ...   raise NotMyLock
+    ... except UnlockError:
+    ...   pass
+    """
+    pass
+
+
+class _SharedBase(object):
+    def __init__(self, path):
+        self.path = path
+
+    def acquire(self, timeout=None):
+        """
+        Acquire the lock.
+
+        * If timeout is omitted (or None), wait forever trying to lock the
+          file.
+
+        * If timeout > 0, try to acquire the lock for that many seconds.  If
+          the lock period expires and the file is still locked, raise
+          LockTimeout.
+
+        * If timeout <= 0, raise AlreadyLocked immediately if the file is
+          already locked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def release(self):
+        """
+        Release the lock.
+
+        If the file is not locked, raise NotLocked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def __enter__(self):
+        """
+        Context manager support.
+        """
+        self.acquire()
+        return self
+
+    def __exit__(self, *_exc):
+        """
+        Context manager support.
+        """
+        self.release()
+
+    def __repr__(self):
+        return "<%s: %r>" % (self.__class__.__name__, self.path)
+
+
+class LockBase(_SharedBase):
+    """Base class for platform-specific lock classes."""
+    def __init__(self, path, threaded=True, timeout=None):
+        """
+        >>> lock = LockBase('somefile')
+        >>> lock = LockBase('somefile', threaded=False)
+        """
+        super(LockBase, self).__init__(path)
+        self.lock_file = os.path.abspath(path) + ".lock"
+        self.hostname = socket.gethostname()
+        self.pid = os.getpid()
+        if threaded:
+            t = threading.current_thread()
+            # Thread objects in Python 2.4 and earlier do not have ident
+            # attrs.  Worm around that.
+            ident = getattr(t, "ident", hash(t))
+            self.tname = "-%x" % (ident & 0xffffffff)
+        else:
+            self.tname = ""
+        dirname = os.path.dirname(self.lock_file)
+
+        # unique name is mostly about the current process, but must
+        # also contain the path -- otherwise, two adjacent locked
+        # files conflict (one file gets locked, creating lock-file and
+        # unique file, the other one gets locked, creating lock-file
+        # and overwriting the already existing lock-file, then one
+        # gets unlocked, deleting both lock-file and unique file,
+        # finally the last lock errors out upon releasing.
+        self.unique_name = os.path.join(dirname,
+                                        "%s%s.%s%s" % (self.hostname,
+                                                       self.tname,
+                                                       self.pid,
+                                                       hash(self.path)))
+        self.timeout = timeout
+
+    def is_locked(self):
+        """
+        Tell whether or not the file is locked.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def i_am_locking(self):
+        """
+        Return True if this object is locking the file.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def break_lock(self):
+        """
+        Remove a lock.  Useful if a locking thread failed to unlock.
+        """
+        raise NotImplemented("implement in subclass")
+
+    def __repr__(self):
+        return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name,
+                                   self.path)
+
+
+def _fl_helper(cls, mod, *args, **kwds):
+    warnings.warn("Import from %s module instead of lockfile package" % mod,
+                  DeprecationWarning, stacklevel=2)
+    # This is a bit funky, but it's only for awhile.  The way the unit tests
+    # are constructed this function winds up as an unbound method, so it
+    # actually takes three args, not two.  We want to toss out self.
+    if not isinstance(args[0], str):
+        # We are testing, avoid the first arg
+        args = args[1:]
+    if len(args) == 1 and not kwds:
+        kwds["threaded"] = True
+    return cls(*args, **kwds)
+
+
+def LinkFileLock(*args, **kwds):
+    """Factory function provided for backwards compatibility.
+
+    Do not use in new code.  Instead, import LinkLockFile from the
+    lockfile.linklockfile module.
+    """
+    from . import linklockfile
+    return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile",
+                      *args, **kwds)
+
+
+def MkdirFileLock(*args, **kwds):
+    """Factory function provided for backwards compatibility.
+
+    Do not use in new code.  Instead, import MkdirLockFile from the
+    lockfile.mkdirlockfile module.
+    """
+    from . import mkdirlockfile
+    return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile",
+                      *args, **kwds)
+
+
+def SQLiteFileLock(*args, **kwds):
+    """Factory function provided for backwards compatibility.
+
+    Do not use in new code.  Instead, import SQLiteLockFile from the
+    lockfile.mkdirlockfile module.
+    """
+    from . import sqlitelockfile
+    return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile",
+                      *args, **kwds)
+
+
+def locked(path, timeout=None):
+    """Decorator which enables locks for decorated function.
+
+    Arguments:
+     - path: path for lockfile.
+     - timeout (optional): Timeout for acquiring lock.
+
+     Usage:
+         @locked('/var/run/myname', timeout=0)
+         def myname(...):
+             ...
+    """
+    def decor(func):
+        @functools.wraps(func)
+        def wrapper(*args, **kwargs):
+            lock = FileLock(path, timeout=timeout)
+            lock.acquire()
+            try:
+                return func(*args, **kwargs)
+            finally:
+                lock.release()
+        return wrapper
+    return decor
+
+
+if hasattr(os, "link"):
+    from . import linklockfile as _llf
+    LockFile = _llf.LinkLockFile
+else:
+    from . import mkdirlockfile as _mlf
+    LockFile = _mlf.MkdirLockFile
+
+FileLock = LockFile
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0602f29ddfa98ecc7991952e67522f252c1facee
GIT binary patch
literal 13475
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py
new file mode 100644
index 00000000..2ca9be04
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.py
@@ -0,0 +1,73 @@
+from __future__ import absolute_import
+
+import time
+import os
+
+from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout,
+               AlreadyLocked)
+
+
+class LinkLockFile(LockBase):
+    """Lock access to a file using atomic property of link(2).
+
+    >>> lock = LinkLockFile('somefile')
+    >>> lock = LinkLockFile('somefile', threaded=False)
+    """
+
+    def acquire(self, timeout=None):
+        try:
+            open(self.unique_name, "wb").close()
+        except IOError:
+            raise LockFailed("failed to create %s" % self.unique_name)
+
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        while True:
+            # Try and create a hard link to it.
+            try:
+                os.link(self.unique_name, self.lock_file)
+            except OSError:
+                # Link creation failed.  Maybe we've double-locked?
+                nlinks = os.stat(self.unique_name).st_nlink
+                if nlinks == 2:
+                    # The original link plus the one I created == 2.  We're
+                    # good to go.
+                    return
+                else:
+                    # Otherwise the lock creation failed.
+                    if timeout is not None and time.time() > end_time:
+                        os.unlink(self.unique_name)
+                        if timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(timeout is not None and timeout / 10 or 0.1)
+            else:
+                # Link creation succeeded.  We're good to go.
+                return
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        elif not os.path.exists(self.unique_name):
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        os.unlink(self.unique_name)
+        os.unlink(self.lock_file)
+
+    def is_locked(self):
+        return os.path.exists(self.lock_file)
+
+    def i_am_locking(self):
+        return (self.is_locked() and
+                os.path.exists(self.unique_name) and
+                os.stat(self.unique_name).st_nlink == 2)
+
+    def break_lock(self):
+        if os.path.exists(self.lock_file):
+            os.unlink(self.lock_file)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/linklockfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e64d008883040964f34642c0e06c01f4e24dd7f7
GIT binary patch
literal 3238
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py
new file mode 100644
index 00000000..05a8c96c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py
@@ -0,0 +1,84 @@
+from __future__ import absolute_import, division
+
+import time
+import os
+import sys
+import errno
+
+from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout,
+               AlreadyLocked)
+
+
+class MkdirLockFile(LockBase):
+    """Lock file by creating a directory."""
+    def __init__(self, path, threaded=True, timeout=None):
+        """
+        >>> lock = MkdirLockFile('somefile')
+        >>> lock = MkdirLockFile('somefile', threaded=False)
+        """
+        LockBase.__init__(self, path, threaded, timeout)
+        # Lock file itself is a directory.  Place the unique file name into
+        # it.
+        self.unique_name = os.path.join(self.lock_file,
+                                        "%s.%s%s" % (self.hostname,
+                                                     self.tname,
+                                                     self.pid))
+
+    def acquire(self, timeout=None):
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        if timeout is None:
+            wait = 0.1
+        else:
+            wait = max(0, timeout / 10)
+
+        while True:
+            try:
+                os.mkdir(self.lock_file)
+            except OSError:
+                err = sys.exc_info()[1]
+                if err.errno == errno.EEXIST:
+                    # Already locked.
+                    if os.path.exists(self.unique_name):
+                        # Already locked by me.
+                        return
+                    if timeout is not None and time.time() > end_time:
+                        if timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            # Someone else has the lock.
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(wait)
+                else:
+                    # Couldn't create the lock for some other reason
+                    raise LockFailed("failed to create %s" % self.lock_file)
+            else:
+                open(self.unique_name, "wb").close()
+                return
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        elif not os.path.exists(self.unique_name):
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        os.unlink(self.unique_name)
+        os.rmdir(self.lock_file)
+
+    def is_locked(self):
+        return os.path.exists(self.lock_file)
+
+    def i_am_locking(self):
+        return (self.is_locked() and
+                os.path.exists(self.unique_name))
+
+    def break_lock(self):
+        if os.path.exists(self.lock_file):
+            for name in os.listdir(self.lock_file):
+                os.unlink(os.path.join(self.lock_file, name))
+            os.rmdir(self.lock_file)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ca45b1fa81bc46f14a5c9044f277ed4cf73afce7
GIT binary patch
literal 3802
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
DdmKCA

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py
new file mode 100644
index 00000000..069e85b1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.py
@@ -0,0 +1,190 @@
+# -*- coding: utf-8 -*-
+
+# pidlockfile.py
+#
+# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au>
+#
+# This is free software: you may copy, modify, and/or distribute this work
+# under the terms of the Python Software Foundation License, version 2 or
+# later as published by the Python Software Foundation.
+# No warranty expressed or implied. See the file LICENSE.PSF-2 for details.
+
+""" Lockfile behaviour implemented via Unix PID files.
+    """
+
+from __future__ import absolute_import
+
+import errno
+import os
+import time
+
+from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock,
+               LockTimeout)
+
+
+class PIDLockFile(LockBase):
+    """ Lockfile implemented as a Unix PID file.
+
+    The lock file is a normal file named by the attribute `path`.
+    A lock's PID file contains a single line of text, containing
+    the process ID (PID) of the process that acquired the lock.
+
+    >>> lock = PIDLockFile('somefile')
+    >>> lock = PIDLockFile('somefile')
+    """
+
+    def __init__(self, path, threaded=False, timeout=None):
+        # pid lockfiles don't support threaded operation, so always force
+        # False as the threaded arg.
+        LockBase.__init__(self, path, False, timeout)
+        self.unique_name = self.path
+
+    def read_pid(self):
+        """ Get the PID from the lock file.
+            """
+        return read_pid_from_pidfile(self.path)
+
+    def is_locked(self):
+        """ Test if the lock is currently held.
+
+            The lock is held if the PID file for this lock exists.
+
+            """
+        return os.path.exists(self.path)
+
+    def i_am_locking(self):
+        """ Test if the lock is held by the current process.
+
+        Returns ``True`` if the current process ID matches the
+        number stored in the PID file.
+        """
+        return self.is_locked() and os.getpid() == self.read_pid()
+
+    def acquire(self, timeout=None):
+        """ Acquire the lock.
+
+        Creates the PID file for this lock, or raises an error if
+        the lock could not be acquired.
+        """
+
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        while True:
+            try:
+                write_pid_to_pidfile(self.path)
+            except OSError as exc:
+                if exc.errno == errno.EEXIST:
+                    # The lock creation failed.  Maybe sleep a bit.
+                    if time.time() > end_time:
+                        if timeout is not None and timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(timeout is not None and timeout / 10 or 0.1)
+                else:
+                    raise LockFailed("failed to create %s" % self.path)
+            else:
+                return
+
+    def release(self):
+        """ Release the lock.
+
+            Removes the PID file to release the lock, or raises an
+            error if the current process does not hold the lock.
+
+            """
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        if not self.i_am_locking():
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        remove_existing_pidfile(self.path)
+
+    def break_lock(self):
+        """ Break an existing lock.
+
+            Removes the PID file if it already exists, otherwise does
+            nothing.
+
+            """
+        remove_existing_pidfile(self.path)
+
+
+def read_pid_from_pidfile(pidfile_path):
+    """ Read the PID recorded in the named PID file.
+
+        Read and return the numeric PID recorded as text in the named
+        PID file. If the PID file cannot be read, or if the content is
+        not a valid PID, return ``None``.
+
+        """
+    pid = None
+    try:
+        pidfile = open(pidfile_path, 'r')
+    except IOError:
+        pass
+    else:
+        # According to the FHS 2.3 section on PID files in /var/run:
+        #
+        #   The file must consist of the process identifier in
+        #   ASCII-encoded decimal, followed by a newline character.
+        #
+        #   Programs that read PID files should be somewhat flexible
+        #   in what they accept; i.e., they should ignore extra
+        #   whitespace, leading zeroes, absence of the trailing
+        #   newline, or additional lines in the PID file.
+
+        line = pidfile.readline().strip()
+        try:
+            pid = int(line)
+        except ValueError:
+            pass
+        pidfile.close()
+
+    return pid
+
+
+def write_pid_to_pidfile(pidfile_path):
+    """ Write the PID in the named PID file.
+
+        Get the numeric process ID (“PID”) of the current process
+        and write it to the named file as a line of text.
+
+        """
+    open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
+    open_mode = 0o644
+    pidfile_fd = os.open(pidfile_path, open_flags, open_mode)
+    pidfile = os.fdopen(pidfile_fd, 'w')
+
+    # According to the FHS 2.3 section on PID files in /var/run:
+    #
+    #   The file must consist of the process identifier in
+    #   ASCII-encoded decimal, followed by a newline character. For
+    #   example, if crond was process number 25, /var/run/crond.pid
+    #   would contain three characters: two, five, and newline.
+
+    pid = os.getpid()
+    pidfile.write("%s\n" % pid)
+    pidfile.close()
+
+
+def remove_existing_pidfile(pidfile_path):
+    """ Remove the named PID file if it exists.
+
+        Removing a PID file that doesn't already exist puts us in the
+        desired state, so we ignore the condition if the file does not
+        exist.
+
+        """
+    try:
+        os.remove(pidfile_path)
+    except OSError as exc:
+        if exc.errno == errno.ENOENT:
+            pass
+        else:
+            raise
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/pidlockfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..57875565beed4ba07c4845b0856c20daa3c95afe
GIT binary patch
literal 6473
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py
new file mode 100644
index 00000000..f997e244
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py
@@ -0,0 +1,156 @@
+from __future__ import absolute_import, division
+
+import time
+import os
+
+try:
+    unicode
+except NameError:
+    unicode = str
+
+from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked
+
+
+class SQLiteLockFile(LockBase):
+    "Demonstrate SQL-based locking."
+
+    testdb = None
+
+    def __init__(self, path, threaded=True, timeout=None):
+        """
+        >>> lock = SQLiteLockFile('somefile')
+        >>> lock = SQLiteLockFile('somefile', threaded=False)
+        """
+        LockBase.__init__(self, path, threaded, timeout)
+        self.lock_file = unicode(self.lock_file)
+        self.unique_name = unicode(self.unique_name)
+
+        if SQLiteLockFile.testdb is None:
+            import tempfile
+            _fd, testdb = tempfile.mkstemp()
+            os.close(_fd)
+            os.unlink(testdb)
+            del _fd, tempfile
+            SQLiteLockFile.testdb = testdb
+
+        import sqlite3
+        self.connection = sqlite3.connect(SQLiteLockFile.testdb)
+
+        c = self.connection.cursor()
+        try:
+            c.execute("create table locks"
+                      "("
+                      "   lock_file varchar(32),"
+                      "   unique_name varchar(32)"
+                      ")")
+        except sqlite3.OperationalError:
+            pass
+        else:
+            self.connection.commit()
+            import atexit
+            atexit.register(os.unlink, SQLiteLockFile.testdb)
+
+    def acquire(self, timeout=None):
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        if timeout is None:
+            wait = 0.1
+        elif timeout <= 0:
+            wait = 0
+        else:
+            wait = timeout / 10
+
+        cursor = self.connection.cursor()
+
+        while True:
+            if not self.is_locked():
+                # Not locked.  Try to lock it.
+                cursor.execute("insert into locks"
+                               "  (lock_file, unique_name)"
+                               "  values"
+                               "  (?, ?)",
+                               (self.lock_file, self.unique_name))
+                self.connection.commit()
+
+                # Check to see if we are the only lock holder.
+                cursor.execute("select * from locks"
+                               "  where unique_name = ?",
+                               (self.unique_name,))
+                rows = cursor.fetchall()
+                if len(rows) > 1:
+                    # Nope.  Someone else got there.  Remove our lock.
+                    cursor.execute("delete from locks"
+                                   "  where unique_name = ?",
+                                   (self.unique_name,))
+                    self.connection.commit()
+                else:
+                    # Yup.  We're done, so go home.
+                    return
+            else:
+                # Check to see if we are the only lock holder.
+                cursor.execute("select * from locks"
+                               "  where unique_name = ?",
+                               (self.unique_name,))
+                rows = cursor.fetchall()
+                if len(rows) == 1:
+                    # We're the locker, so go home.
+                    return
+
+            # Maybe we should wait a bit longer.
+            if timeout is not None and time.time() > end_time:
+                if timeout > 0:
+                    # No more waiting.
+                    raise LockTimeout("Timeout waiting to acquire"
+                                      " lock for %s" %
+                                      self.path)
+                else:
+                    # Someone else has the lock and we are impatient..
+                    raise AlreadyLocked("%s is already locked" % self.path)
+
+            # Well, okay.  We'll give it a bit longer.
+            time.sleep(wait)
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        if not self.i_am_locking():
+            raise NotMyLock("%s is locked, but not by me (by %s)" %
+                            (self.unique_name, self._who_is_locking()))
+        cursor = self.connection.cursor()
+        cursor.execute("delete from locks"
+                       "  where unique_name = ?",
+                       (self.unique_name,))
+        self.connection.commit()
+
+    def _who_is_locking(self):
+        cursor = self.connection.cursor()
+        cursor.execute("select unique_name from locks"
+                       "  where lock_file = ?",
+                       (self.lock_file,))
+        return cursor.fetchone()[0]
+
+    def is_locked(self):
+        cursor = self.connection.cursor()
+        cursor.execute("select * from locks"
+                       "  where lock_file = ?",
+                       (self.lock_file,))
+        rows = cursor.fetchall()
+        return not not rows
+
+    def i_am_locking(self):
+        cursor = self.connection.cursor()
+        cursor.execute("select * from locks"
+                       "  where lock_file = ?"
+                       "    and unique_name = ?",
+                       (self.lock_file, self.unique_name))
+        return not not cursor.fetchall()
+
+    def break_lock(self):
+        cursor = self.connection.cursor()
+        cursor.execute("delete from locks"
+                       "  where lock_file = ?",
+                       (self.lock_file,))
+        self.connection.commit()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b5f103a9cc4a260a28a6c30b6463ff0a33e9f025
GIT binary patch
literal 5126
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
T;$h@rVrJxE<YnYy(qIMvA6#r}

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py
new file mode 100644
index 00000000..23b41f58
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py
@@ -0,0 +1,70 @@
+from __future__ import absolute_import
+
+import os
+import time
+
+from . import (LockBase, NotLocked, NotMyLock, LockTimeout,
+               AlreadyLocked)
+
+
+class SymlinkLockFile(LockBase):
+    """Lock access to a file using symlink(2)."""
+
+    def __init__(self, path, threaded=True, timeout=None):
+        # super(SymlinkLockFile).__init(...)
+        LockBase.__init__(self, path, threaded, timeout)
+        # split it back!
+        self.unique_name = os.path.split(self.unique_name)[1]
+
+    def acquire(self, timeout=None):
+        # Hopefully unnecessary for symlink.
+        # try:
+        #     open(self.unique_name, "wb").close()
+        # except IOError:
+        #     raise LockFailed("failed to create %s" % self.unique_name)
+        timeout = timeout if timeout is not None else self.timeout
+        end_time = time.time()
+        if timeout is not None and timeout > 0:
+            end_time += timeout
+
+        while True:
+            # Try and create a symbolic link to it.
+            try:
+                os.symlink(self.unique_name, self.lock_file)
+            except OSError:
+                # Link creation failed.  Maybe we've double-locked?
+                if self.i_am_locking():
+                    # Linked to out unique name. Proceed.
+                    return
+                else:
+                    # Otherwise the lock creation failed.
+                    if timeout is not None and time.time() > end_time:
+                        if timeout > 0:
+                            raise LockTimeout("Timeout waiting to acquire"
+                                              " lock for %s" %
+                                              self.path)
+                        else:
+                            raise AlreadyLocked("%s is already locked" %
+                                                self.path)
+                    time.sleep(timeout / 10 if timeout is not None else 0.1)
+            else:
+                # Link creation succeeded.  We're good to go.
+                return
+
+    def release(self):
+        if not self.is_locked():
+            raise NotLocked("%s is not locked" % self.path)
+        elif not self.i_am_locking():
+            raise NotMyLock("%s is locked, but not by me" % self.path)
+        os.unlink(self.lock_file)
+
+    def is_locked(self):
+        return os.path.islink(self.lock_file)
+
+    def i_am_locking(self):
+        return (os.path.islink(self.lock_file)
+                and os.readlink(self.lock_file) == self.unique_name)
+
+    def break_lock(self):
+        if os.path.islink(self.lock_file):  # exists && link
+            os.unlink(self.lock_file)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/lockfile/symlinklockfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..acad380ec69766104cf932d51a55fb0495c7a6a6
GIT binary patch
literal 3201
zcmZSn%*&NH<x)&C0~9bbFfcecFfbHnF)%QsFfgPrGUPBY<T5fuF)}cM_)H8rObk&>
zU^ym+9A<_nW`-1Ih7=Zt92SOLR)#26hFms=C^m*%c7`Z+hFlJYC=P~PPKGE>2F4Ut
zhE!IDG)9ILHii}khGqta$S5v`6efmX4R!_whD?wfG#D8e7)tmV7#I?hit}?yOH$)A
za|`l|O8hcGG8(KPX$}Sk2A}-oY^TKH)Dlhx1_r<U5)eN%1;+EO1o2C_p$bDXb5rw6
zOG<bd7#JLLic%9(!1AdnV4H#~b8|BDvOzlBGILT<0>cRu7`_Y)45<vDFi2qlc|Mhy
zA%z_jHZ4pb4};iD3@wZxZ>KPWycWd{3Xv8Dkmpla!6KYcUq^8<1O;n=d{C?ob)7<D
za&l^Mu|i3{LZU)iW=^U?X>n#=x<WC;T^dH3ddVyd3=AL)^1n04O=h5gU|`5%WT;_a
zs9|KNVPdFZW@u(%U@T!`$YN&5VgX5Hu`)C>f?O(D!@v;F3W~O14JJ^CL4uQwfq@|i
z6tE>A7sbbC=4F<|$CrRq<QJEKEG$SY$tVHYT3nEmSpp8x(!9*V($x68#N1R3kP@)E
z;?$h9AWo2@Kqi%BfC4!+r34hQC6Lh90LL$gC@yDUV9+lp$}CGPN!2e)EYeTQ&q+xw
zD%Q^~)Xy$9GB-CY%rY`BGqf--&Z$f<k2gs%F)=VOFi6kS5795kEYQu&D=taQ$<ZxO
zv@8wG011I{d|7H<N`8@kPJVJWC?NHrK?vjP6;uX+Tm(u7#UQ6MFo`iGgM150_#j_`
z!&ZV39Hc1>4B4CvMM9w9&0_-xCnG~GBLgUanLx?6mI)*URptX`GcsheFckTKql1yb
zyq1X}kAb1$C_@P|Ly<6Jr4&O63quww*er;N><rCJ42<D<vlv)PI2f|I7>c+V85tRC
z7#OlRL3R}NgCnhm5k!HU^Aur!4HMY5r${!RXD9(@DUg0{2C-&Fh9*Xa!lw)+JfLif
zBAUklHi;Lk8{$<)Mvy%$45E3=3@PBG!&vCg5Rt;b5M1cb5Dua>KuN|AoL7t07#J9!
zSxccjF|!1eXhDfMxv(^|C{+Oz>I!N3MGC6L#Ucz0464NnnZ*i;ko*UhO-;$<VqjoM
zpEVN%cG_$3ff5iXV*K*+QiI?;PznO4vXG+E)F5yI14Sb=c7s6K9Gvq(HpYV@9-Qv{
zgI$Y?@{3A%K!r<uVs1Q0Ix{al2xI{`tp<Uj9Fn?oQd0{wK&c=Iq#R;3$fDG|lz5Q!
zgCq5V{gns_UttCYhGG>^eqxhm<YAOx<YnSyVrG<L<YnSvVqunJ<Y8oE5@2Fu6kt?m
zP6lOi5C(Y>oX8^>7{JL8To4y4F_eJI2~Y}Qf~A{0C9n!+P&zDj0VUlOCa?%X1p`9~
zD?=6=Sd<-9)_`h>U~oYC6$`*4Juklm8sWv#a6wRXq^9U7B$bvZfD|NED&(eui$-u{
zW)_1ZEHxzvltCf!B?>C9Kwf|(0#I5k%>xzQL7>n8S03Q_8$_{Hl$w*8SeyzfuZy`r
zvBk*4C<eyxI05+&948=8lz<EMEGBS}GJ}FN80;@Ua9IoXH#jUxK%UPm9<-hhl4M|D
zumz=2koOoEF@38C%Ip}v&DUiB1py1f|DZI<%8(6eCxBA0AGioY1VoSwC{cie4wPX*
z6%RO2K&1jW<OWfS2m&Qw2T-7Z${+?tQ7pltgEd%+G|+>EF%R5CgQX5oQHCv0f}|K2
z7zSH7lyEUHFeDYFCT4^4xC?TK_-TM*4%#3AH8SGk!OG*~bMsS5b5i5u!KGk)d`f<D
ze0-1~DE2`OMsUp@Bmv@r${29^1BZ8z94G`pS#NL@3qhcq3krZ@J_ZH`Hbyokel{Lu
zPIgXaP8NvYL6Y(DX{9BlMXB-eK_I6?q83!5mVmjSoB$~p!NnmcIe}|4u;B=Qf>{IE
a-U7#?4J795K#nd3Wl{kq9!4G}4Hf_ntj0nB

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py
new file mode 100644
index 00000000..2afca5ad
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py
@@ -0,0 +1,66 @@
+# coding: utf-8
+from pip._vendor.msgpack._version import version
+from pip._vendor.msgpack.exceptions import *
+
+from collections import namedtuple
+
+
+class ExtType(namedtuple('ExtType', 'code data')):
+    """ExtType represents ext type in msgpack."""
+    def __new__(cls, code, data):
+        if not isinstance(code, int):
+            raise TypeError("code must be int")
+        if not isinstance(data, bytes):
+            raise TypeError("data must be bytes")
+        if not 0 <= code <= 127:
+            raise ValueError("code must be 0~127")
+        return super(ExtType, cls).__new__(cls, code, data)
+
+
+import os
+if os.environ.get('MSGPACK_PUREPYTHON'):
+    from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker
+else:
+    try:
+        from pip._vendor.msgpack._packer import Packer
+        from pip._vendor.msgpack._unpacker import unpackb, Unpacker
+    except ImportError:
+        from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker
+
+
+def pack(o, stream, **kwargs):
+    """
+    Pack object `o` and write it to `stream`
+
+    See :class:`Packer` for options.
+    """
+    packer = Packer(**kwargs)
+    stream.write(packer.pack(o))
+
+
+def packb(o, **kwargs):
+    """
+    Pack object `o` and return packed bytes
+
+    See :class:`Packer` for options.
+    """
+    return Packer(**kwargs).pack(o)
+
+
+def unpack(stream, **kwargs):
+    """
+    Unpack an object from `stream`.
+
+    Raises `ExtraData` when `stream` contains extra bytes.
+    See :class:`Unpacker` for options.
+    """
+    data = stream.read()
+    return unpackb(data, **kwargs)
+
+
+# alias for compatibility to simplejson/marshal/pickle.
+load = unpack
+loads = unpackb
+
+dump = pack
+dumps = packb
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8c9feb21126126c71c3933ae4c0e927636cb60b4
GIT binary patch
literal 2871
zcmZSn%*&NH<x)&C0~D|_FfceUFfbI0GcquwFfgPrGUPBY<T5fuF)}cM_)H8rObj6)
z7BfQ*Gea&5Llg@GV+spHDhopj3quMkLo*XY8Y4pr8$$~NLo)+IWE3mdAa;fvHijrR
zhEz6&EOv%04u%vChGs^FqBgKBCqoV=LoOFX6c<A-H$xORLoN?P6b}PqUKB&67FY!r
zLk=%g1=u0n3^{zLYQyt%8CX*J8M3(;itaNoGJ=)iG?<YgB83O!#wY=X6kaexkRgQ+
z%n)Ko6=H}IW=Q2`h!SB)6<~-GWk?ldh!SH+VP^=|;Adc9$o&8R|9=fe1_p)_b_NE9
zvecsD%=|ov07z5|!sKFLV8~0%O-(5&Eyzg)D|M|X38^edE#_okU`WnSNmWQmEJ=h%
z07$PBI06_L7*ZKP;hw_45XA(Fi53QiC}xJBU=1da0(Axk2B=vIMX3cvsl};zCB+J<
z6(tHKl?AB^nRyDi#pwl!$=Q0z%nS?+Ak4zRz~Bth+zfI!149iXLkS}&#){<_O2BqB
zGcq(WGUPEZlrS*VFfo)cgJo^NvP_@|gUF^ZgY>d6XEQS72ZJI$n~@=piGhi+IGv#c
zk__Mmu`-mfG1M@C49a2$F=`k=MmIAv1Z%J{FfjNP3&4URx3suKAqnL6l42nS1_n^j
zD8K}hDoav}GeHS8vmWFJkOFW3!W0<P85)^uaDco93ir(7%)H`~#JuFx5|H0B^GZrU
zVGas>*P^2Qq7qPI2OC-fQXZC=Q<{p9C@w8XEeZl@1jkx@d|qmKe7pu&07N9`6qkU4
z6XXIg1LRf>kn6xiaXteBgML9#W?5oMs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdx
zp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4fiBqbIXSxJiI$~-86Y7rjxS5iOUW<NhsLdb
ze0*kJW=VX!UO{CL$QvMB%m;D@BR>?%F!D2MfZSRF3Y++NP=bt)2YWg`J~uz5G$%Da
z9_q`K{N(s}ut8vNAcz6+5GbHQZY~D7o{f=>(XRv)>%PJ60glez@d2Sht^tuD9{zri
zcmbuRfW+kN)FQBNO7lReKMCyXP%t~S2%Ig0K!$*GQIIeL14EDqDE)yl704Qpo!+4I
zr3Ok!;9Stlz)%ZL@L7xuHOvfIOrTWU%m~U3j46x^&<q*Dz`($zprD`ta)LsBQdVkm
zi9$ktf<j_mib8o&W=X0-W{E;czCuEANl|KIZUPrrb#Q8`f>m-(VsWum0!U|SQG!BR
zevv|cK}lwQUa=ln5yXRFcY~8H*f?;q19=e=xuBvWzXTKp5c9#z?DE8-^kOg*q%yT=
zfMZmQfq_9D6uO|GW?<uCOa?g{6!stt4tG$LfJz@mhF%5+P>3^t0y-ERbH(BK0=X!)
zq_ikc0qoHf1#s3TA&emj0+cj@K(2&v#X;#ql7WF?V8aa@=^%e4X@UX|6jlsu;GhE~
zR}cmV9mt_I3=CP|nzxn-RJhkLflBILP$~t5ba4+X03kU-Au$h@RMU#`bKz-I4-#-e
ziJ8Tz#R>_o6(vQ9E{P?H2@2&Isd;c^3d#9-C5f4N;CiPh5fbK*B#WG`A$DO++2CLX
zr{tp4#1wFT1ZU<T30TMn@eX|OgK`z5I57f+KREHS^Dt_Fl1GUQ0|P@rW`Q2GXx4)k
z%^*IwRS*O!jZ5Tks7kF!PK9Lk5^hjAl%JE6nhehRL7-@cR6!tCelfUIOU*0GEXvOV
z*J<ggB{*$QOU%hhN=(iM7aHJj1($Or(m31^4@zFCMJ2Mh<RSh~Edo2!Gq)hWs03VH
zf^$m{$k-r|UT|FI<R_+p(=3PqsVGxQa|^&iAVx7FJAqjPQM-Wa1sh2HX9o)4Vig7k
p1_4GcCIM!79v(&^MtLS?Mgc}CMqWk*W=<|nPEH;+Mm8okMgYA$s$Kv9

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py
new file mode 100644
index 00000000..d28f0deb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py
@@ -0,0 +1 @@
+version = (0, 5, 6)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2032fab3d252277e3a8bdf83c2552cd8680b4ee1
GIT binary patch
literal 251
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHzF)%QsurNe1Fr+Xu1Z%J|Ffe3-)MSELYzzzx
zei|UfXo4Dy3=9k<><kPHWvNBQnfZAdAWaCOIG=%mLBF6Vvn;VBRlh8;NIxw<CndG0
zSU<Z^KfBn-+}yA*%gDUU(89bpr!u`f-Xz7u#K6G7AU#h%M86=jKsPh5xFj(rN4GrD
zvNSLQBm~CsWvO{7`9=D<#pwl!$=UkxQ2X@?DoZ#R7#M7F^HWN5Qtd$QD+aj<0M~3e
AdH?_b

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py
new file mode 100644
index 00000000..97668814
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py
@@ -0,0 +1,41 @@
+class UnpackException(Exception):
+    """Deprecated.  Use Exception instead to catch all exception during unpacking."""
+
+
+class BufferFull(UnpackException):
+    pass
+
+
+class OutOfData(UnpackException):
+    pass
+
+
+class UnpackValueError(UnpackException, ValueError):
+    """Deprecated.  Use ValueError instead."""
+
+
+class ExtraData(UnpackValueError):
+    def __init__(self, unpacked, extra):
+        self.unpacked = unpacked
+        self.extra = extra
+
+    def __str__(self):
+        return "unpack(b) received extra data."
+
+
+class PackException(Exception):
+    """Deprecated.  Use Exception instead to catch all exception during packing."""
+
+
+class PackValueError(PackException, ValueError):
+    """PackValueError is raised when type of input data is supported but it's value is unsupported.
+
+    Deprecated.  Use ValueError instead.
+    """
+
+
+class PackOverflowError(PackValueError, OverflowError):
+    """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32).
+
+    Deprecated.  Use ValueError instead.
+    """
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..47c977699f645d2e397a150dfaa6d8bc77d7fed3
GIT binary patch
literal 3313
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJFWnf@PVPHsQU`S(RNMU4XVPI%xV2F%jWJqCR
zNM!_zGQ&lg7*beZqO5RHW`-0tkZ39kLmCr93Oihal_7<LA(a(u2q#>WjUj~#W+69R
zl${}khar`n0cr>@T!Mokg^wYXgCUg@Y&t(&f{P(VfFW2zkb!}rgr9+dAvCWbF*)0{
zB0067Br`t`?pH<z1_mdPU-=lo9tHW0fgy^CAt+b_Bv<Usz`)>=T2PdloLG{YqNkt`
zTAZo?H%B2euec;NF-4&yUm-cMBsoJNF(*eM6=sb>N@-DMUb;dl*!Il4bUh7F;FfSO
zFfhc&=OyN*#>ba%fjPPPDWy3eE<2c;lAjzOuK|h>1W{bbz`&qiP?TAgSdyw=mRO{p
zmY<W7T2!o`U8tX3Y-Db3SeRvGUS?=vUYt{zULJ3fVq#)oU|^7*ryrtUkXfJ$a&2Nx
zj&6CPWocjrNC=GM%Tn`F@{9Cyi_<}&qz`w0v0g!C5XceWpkQKPU|?eeyVt2SEiJXk
ztu!YGGbBNtOJ!h)Vg!XDNV5h=V-U!QAP@`TAuwxze8s}Rz`zQMc#xCW7)v-A7#RFZ
zOZ?MZ5=#<?s;5960(qnu>L~$u$`4D-DNS`PD#|ay^c$|EuYxV<BMgG2eMp){#BUHN
ziG!mSK@3nNvoSC*@S;VsYeh*>BKAm@LM{VZz{LQh)Qe&UrDaf{CWAZ&!XS<_$Y?PJ
z28J3&h8hNjcm{?VCNP5$RBS>D5I=D02j_T5DUg~{0*a<okTW2q0VpXJr{<&ufpSg|
zCj$e+KnEPyx$*Itd6^~g@j@V9g51c!$jO)t%EmAZ_CH7_g^?i`>`%X9IR*v>h(|S&
zG!=?clT$OxQd1Pb-c?9REJ@UZcn)Mn5Z7SvE2O|JE-8wS2gM~g?=UcGfc%A&sJR&!
z7=n0E+za-|0Hth@qd}EhG02&0jGQbbpmZKUULEI&Eu)iK$AM}NcnyaXaG=Zr4k-jN
zKw$<7Ay5_v$1odX38>ryg&3kpBff0xW?*1I)vJ(MtWcDgS)7`pP@a*Rr%+N^kgAZM
zrjVIeP+9^``5+a=r3D4~MJ1^z3Q46U3YjJ9#R_Ghq8TJtng^HF<Kj|KP*A{Vcp#h#
zFMYuZ!3D{n40KQ+gUSR*ptF>K5-lj;{L4~{(sJ_4NvxA5Lc<+JJ1FpwgFZ8_BsD#?
z2obXRr6r)KC`!yr2geDtp`!o|Z-r=GBP}gsLmdSWWu!TLLLb!hRRxvbpz4Z^#ZLoN
zjDg!a@azq4-vxn+kswgL1a96Tl35U_3Jn64HbJ2569kG*a8ZL20YM;p5cwO-8kkHD
duDNU=jcGej9a9W)u^0;oO0tM?im^zt0{~!@GhhG!

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py
new file mode 100644
index 00000000..94184218
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py
@@ -0,0 +1,977 @@
+"""Fallback pure Python implementation of msgpack"""
+
+import sys
+import struct
+import warnings
+
+if sys.version_info[0] == 3:
+    PY3 = True
+    int_types = int
+    Unicode = str
+    xrange = range
+    def dict_iteritems(d):
+        return d.items()
+else:
+    PY3 = False
+    int_types = (int, long)
+    Unicode = unicode
+    def dict_iteritems(d):
+        return d.iteritems()
+
+
+if hasattr(sys, 'pypy_version_info'):
+    # cStringIO is slow on PyPy, StringIO is faster.  However: PyPy's own
+    # StringBuilder is fastest.
+    from __pypy__ import newlist_hint
+    try:
+        from __pypy__.builders import BytesBuilder as StringBuilder
+    except ImportError:
+        from __pypy__.builders import StringBuilder
+    USING_STRINGBUILDER = True
+    class StringIO(object):
+        def __init__(self, s=b''):
+            if s:
+                self.builder = StringBuilder(len(s))
+                self.builder.append(s)
+            else:
+                self.builder = StringBuilder()
+        def write(self, s):
+            if isinstance(s, memoryview):
+                s = s.tobytes()
+            elif isinstance(s, bytearray):
+                s = bytes(s)
+            self.builder.append(s)
+        def getvalue(self):
+            return self.builder.build()
+else:
+    USING_STRINGBUILDER = False
+    from io import BytesIO as StringIO
+    newlist_hint = lambda size: []
+
+
+from pip._vendor.msgpack.exceptions import (
+    BufferFull,
+    OutOfData,
+    UnpackValueError,
+    PackValueError,
+    PackOverflowError,
+    ExtraData)
+
+from pip._vendor.msgpack import ExtType
+
+
+EX_SKIP                 = 0
+EX_CONSTRUCT            = 1
+EX_READ_ARRAY_HEADER    = 2
+EX_READ_MAP_HEADER      = 3
+
+TYPE_IMMEDIATE          = 0
+TYPE_ARRAY              = 1
+TYPE_MAP                = 2
+TYPE_RAW                = 3
+TYPE_BIN                = 4
+TYPE_EXT                = 5
+
+DEFAULT_RECURSE_LIMIT = 511
+
+
+def _check_type_strict(obj, t, type=type, tuple=tuple):
+    if type(t) is tuple:
+        return type(obj) in t
+    else:
+        return type(obj) is t
+
+
+def _get_data_from_buffer(obj):
+    try:
+        view = memoryview(obj)
+    except TypeError:
+        # try to use legacy buffer protocol if 2.7, otherwise re-raise
+        if not PY3:
+            view = memoryview(buffer(obj))
+            warnings.warn("using old buffer interface to unpack %s; "
+                          "this leads to unpacking errors if slicing is used and "
+                          "will be removed in a future version" % type(obj),
+                          RuntimeWarning)
+        else:
+            raise
+    if view.itemsize != 1:
+        raise ValueError("cannot unpack from multi-byte object")
+    return view
+
+
+def unpack(stream, **kwargs):
+    warnings.warn(
+        "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.",
+        PendingDeprecationWarning)
+    data = stream.read()
+    return unpackb(data, **kwargs)
+
+
+def unpackb(packed, **kwargs):
+    """
+    Unpack an object from `packed`.
+
+    Raises `ExtraData` when `packed` contains extra bytes.
+    See :class:`Unpacker` for options.
+    """
+    unpacker = Unpacker(None, **kwargs)
+    unpacker.feed(packed)
+    try:
+        ret = unpacker._unpack()
+    except OutOfData:
+        raise UnpackValueError("Data is not enough.")
+    if unpacker._got_extradata():
+        raise ExtraData(ret, unpacker._get_extradata())
+    return ret
+
+
+class Unpacker(object):
+    """Streaming unpacker.
+
+    arguments:
+
+    :param file_like:
+        File-like object having `.read(n)` method.
+        If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable.
+
+    :param int read_size:
+        Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`)
+
+    :param bool use_list:
+        If true, unpack msgpack array to Python list.
+        Otherwise, unpack to Python tuple. (default: True)
+
+    :param bool raw:
+        If true, unpack msgpack raw to Python bytes (default).
+        Otherwise, unpack to Python str (or unicode on Python 2) by decoding
+        with UTF-8 encoding (recommended).
+        Currently, the default is true, but it will be changed to false in
+        near future.  So you must specify it explicitly for keeping backward
+        compatibility.
+
+        *encoding* option which is deprecated overrides this option.
+
+    :param callable object_hook:
+        When specified, it should be callable.
+        Unpacker calls it with a dict argument after unpacking msgpack map.
+        (See also simplejson)
+
+    :param callable object_pairs_hook:
+        When specified, it should be callable.
+        Unpacker calls it with a list of key-value pairs after unpacking msgpack map.
+        (See also simplejson)
+
+    :param str encoding:
+        Encoding used for decoding msgpack raw.
+        If it is None (default), msgpack raw is deserialized to Python bytes.
+
+    :param str unicode_errors:
+        (deprecated) Used for decoding msgpack raw with *encoding*.
+        (default: `'strict'`)
+
+    :param int max_buffer_size:
+        Limits size of data waiting unpacked.  0 means system's INT_MAX (default).
+        Raises `BufferFull` exception when it is insufficient.
+        You should set this parameter when unpacking data from untrusted source.
+
+    :param int max_str_len:
+        Limits max length of str. (default: 2**31-1)
+
+    :param int max_bin_len:
+        Limits max length of bin. (default: 2**31-1)
+
+    :param int max_array_len:
+        Limits max length of array. (default: 2**31-1)
+
+    :param int max_map_len:
+        Limits max length of map. (default: 2**31-1)
+
+
+    example of streaming deserialize from file-like object::
+
+        unpacker = Unpacker(file_like, raw=False)
+        for o in unpacker:
+            process(o)
+
+    example of streaming deserialize from socket::
+
+        unpacker = Unpacker(raw=False)
+        while True:
+            buf = sock.recv(1024**2)
+            if not buf:
+                break
+            unpacker.feed(buf)
+            for o in unpacker:
+                process(o)
+    """
+
+    def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
+                 object_hook=None, object_pairs_hook=None, list_hook=None,
+                 encoding=None, unicode_errors=None, max_buffer_size=0,
+                 ext_hook=ExtType,
+                 max_str_len=2147483647, # 2**32-1
+                 max_bin_len=2147483647,
+                 max_array_len=2147483647,
+                 max_map_len=2147483647,
+                 max_ext_len=2147483647):
+
+        if encoding is not None:
+            warnings.warn(
+                "encoding is deprecated, Use raw=False instead.",
+                PendingDeprecationWarning)
+
+        if unicode_errors is None:
+            unicode_errors = 'strict'
+
+        if file_like is None:
+            self._feeding = True
+        else:
+            if not callable(file_like.read):
+                raise TypeError("`file_like.read` must be callable")
+            self.file_like = file_like
+            self._feeding = False
+
+        #: array of bytes fed.
+        self._buffer = bytearray()
+        # Some very old pythons don't support `struct.unpack_from()` with a
+        # `bytearray`. So we wrap it in a `buffer()` there.
+        if sys.version_info < (2, 7, 6):
+            self._buffer_view = buffer(self._buffer)
+        else:
+            self._buffer_view = self._buffer
+        #: Which position we currently reads
+        self._buff_i = 0
+
+        # When Unpacker is used as an iterable, between the calls to next(),
+        # the buffer is not "consumed" completely, for efficiency sake.
+        # Instead, it is done sloppily.  To make sure we raise BufferFull at
+        # the correct moments, we have to keep track of how sloppy we were.
+        # Furthermore, when the buffer is incomplete (that is: in the case
+        # we raise an OutOfData) we need to rollback the buffer to the correct
+        # state, which _buf_checkpoint records.
+        self._buf_checkpoint = 0
+
+        self._max_buffer_size = max_buffer_size or 2**31-1
+        if read_size > self._max_buffer_size:
+            raise ValueError("read_size must be smaller than max_buffer_size")
+        self._read_size = read_size or min(self._max_buffer_size, 16*1024)
+        self._raw = bool(raw)
+        self._encoding = encoding
+        self._unicode_errors = unicode_errors
+        self._use_list = use_list
+        self._list_hook = list_hook
+        self._object_hook = object_hook
+        self._object_pairs_hook = object_pairs_hook
+        self._ext_hook = ext_hook
+        self._max_str_len = max_str_len
+        self._max_bin_len = max_bin_len
+        self._max_array_len = max_array_len
+        self._max_map_len = max_map_len
+        self._max_ext_len = max_ext_len
+        self._stream_offset = 0
+
+        if list_hook is not None and not callable(list_hook):
+            raise TypeError('`list_hook` is not callable')
+        if object_hook is not None and not callable(object_hook):
+            raise TypeError('`object_hook` is not callable')
+        if object_pairs_hook is not None and not callable(object_pairs_hook):
+            raise TypeError('`object_pairs_hook` is not callable')
+        if object_hook is not None and object_pairs_hook is not None:
+            raise TypeError("object_pairs_hook and object_hook are mutually "
+                            "exclusive")
+        if not callable(ext_hook):
+            raise TypeError("`ext_hook` is not callable")
+
+    def feed(self, next_bytes):
+        assert self._feeding
+        view = _get_data_from_buffer(next_bytes)
+        if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size):
+            raise BufferFull
+
+        # Strip buffer before checkpoint before reading file.
+        if self._buf_checkpoint > 0:
+            del self._buffer[:self._buf_checkpoint]
+            self._buff_i -= self._buf_checkpoint
+            self._buf_checkpoint = 0
+
+        self._buffer += view
+
+    def _consume(self):
+        """ Gets rid of the used parts of the buffer. """
+        self._stream_offset += self._buff_i - self._buf_checkpoint
+        self._buf_checkpoint = self._buff_i
+
+    def _got_extradata(self):
+        return self._buff_i < len(self._buffer)
+
+    def _get_extradata(self):
+        return self._buffer[self._buff_i:]
+
+    def read_bytes(self, n):
+        return self._read(n)
+
+    def _read(self, n):
+        # (int) -> bytearray
+        self._reserve(n)
+        i = self._buff_i
+        self._buff_i = i+n
+        return self._buffer[i:i+n]
+
+    def _reserve(self, n):
+        remain_bytes = len(self._buffer) - self._buff_i - n
+
+        # Fast path: buffer has n bytes already
+        if remain_bytes >= 0:
+            return
+
+        if self._feeding:
+            self._buff_i = self._buf_checkpoint
+            raise OutOfData
+
+        # Strip buffer before checkpoint before reading file.
+        if self._buf_checkpoint > 0:
+            del self._buffer[:self._buf_checkpoint]
+            self._buff_i -= self._buf_checkpoint
+            self._buf_checkpoint = 0
+
+        # Read from file
+        remain_bytes = -remain_bytes
+        while remain_bytes > 0:
+            to_read_bytes = max(self._read_size, remain_bytes)
+            read_data = self.file_like.read(to_read_bytes)
+            if not read_data:
+                break
+            assert isinstance(read_data, bytes)
+            self._buffer += read_data
+            remain_bytes -= len(read_data)
+
+        if len(self._buffer) < n + self._buff_i:
+            self._buff_i = 0  # rollback
+            raise OutOfData
+
+    def _read_header(self, execute=EX_CONSTRUCT):
+        typ = TYPE_IMMEDIATE
+        n = 0
+        obj = None
+        self._reserve(1)
+        b = self._buffer[self._buff_i]
+        self._buff_i += 1
+        if b & 0b10000000 == 0:
+            obj = b
+        elif b & 0b11100000 == 0b11100000:
+            obj = -1 - (b ^ 0xff)
+        elif b & 0b11100000 == 0b10100000:
+            n = b & 0b00011111
+            typ = TYPE_RAW
+            if n > self._max_str_len:
+                raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
+            obj = self._read(n)
+        elif b & 0b11110000 == 0b10010000:
+            n = b & 0b00001111
+            typ = TYPE_ARRAY
+            if n > self._max_array_len:
+                raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
+        elif b & 0b11110000 == 0b10000000:
+            n = b & 0b00001111
+            typ = TYPE_MAP
+            if n > self._max_map_len:
+                raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
+        elif b == 0xc0:
+            obj = None
+        elif b == 0xc2:
+            obj = False
+        elif b == 0xc3:
+            obj = True
+        elif b == 0xc4:
+            typ = TYPE_BIN
+            self._reserve(1)
+            n = self._buffer[self._buff_i]
+            self._buff_i += 1
+            if n > self._max_bin_len:
+                raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
+            obj = self._read(n)
+        elif b == 0xc5:
+            typ = TYPE_BIN
+            self._reserve(2)
+            n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 2
+            if n > self._max_bin_len:
+                raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
+            obj = self._read(n)
+        elif b == 0xc6:
+            typ = TYPE_BIN
+            self._reserve(4)
+            n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 4
+            if n > self._max_bin_len:
+                raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
+            obj = self._read(n)
+        elif b == 0xc7:  # ext 8
+            typ = TYPE_EXT
+            self._reserve(2)
+            L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i)
+            self._buff_i += 2
+            if L > self._max_ext_len:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
+            obj = self._read(L)
+        elif b == 0xc8:  # ext 16
+            typ = TYPE_EXT
+            self._reserve(3)
+            L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i)
+            self._buff_i += 3
+            if L > self._max_ext_len:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
+            obj = self._read(L)
+        elif b == 0xc9:  # ext 32
+            typ = TYPE_EXT
+            self._reserve(5)
+            L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i)
+            self._buff_i += 5
+            if L > self._max_ext_len:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
+            obj = self._read(L)
+        elif b == 0xca:
+            self._reserve(4)
+            obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 4
+        elif b == 0xcb:
+            self._reserve(8)
+            obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 8
+        elif b == 0xcc:
+            self._reserve(1)
+            obj = self._buffer[self._buff_i]
+            self._buff_i += 1
+        elif b == 0xcd:
+            self._reserve(2)
+            obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 2
+        elif b == 0xce:
+            self._reserve(4)
+            obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 4
+        elif b == 0xcf:
+            self._reserve(8)
+            obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 8
+        elif b == 0xd0:
+            self._reserve(1)
+            obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 1
+        elif b == 0xd1:
+            self._reserve(2)
+            obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 2
+        elif b == 0xd2:
+            self._reserve(4)
+            obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 4
+        elif b == 0xd3:
+            self._reserve(8)
+            obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0]
+            self._buff_i += 8
+        elif b == 0xd4:  # fixext 1
+            typ = TYPE_EXT
+            if self._max_ext_len < 1:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
+            self._reserve(2)
+            n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i)
+            self._buff_i += 2
+        elif b == 0xd5:  # fixext 2
+            typ = TYPE_EXT
+            if self._max_ext_len < 2:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
+            self._reserve(3)
+            n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i)
+            self._buff_i += 3
+        elif b == 0xd6:  # fixext 4
+            typ = TYPE_EXT
+            if self._max_ext_len < 4:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
+            self._reserve(5)
+            n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i)
+            self._buff_i += 5
+        elif b == 0xd7:  # fixext 8
+            typ = TYPE_EXT
+            if self._max_ext_len < 8:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
+            self._reserve(9)
+            n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i)
+            self._buff_i += 9
+        elif b == 0xd8:  # fixext 16
+            typ = TYPE_EXT
+            if self._max_ext_len < 16:
+                raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
+            self._reserve(17)
+            n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i)
+            self._buff_i += 17
+        elif b == 0xd9:
+            typ = TYPE_RAW
+            self._reserve(1)
+            n = self._buffer[self._buff_i]
+            self._buff_i += 1
+            if n > self._max_str_len:
+                raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
+            obj = self._read(n)
+        elif b == 0xda:
+            typ = TYPE_RAW
+            self._reserve(2)
+            n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
+            self._buff_i += 2
+            if n > self._max_str_len:
+                raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
+            obj = self._read(n)
+        elif b == 0xdb:
+            typ = TYPE_RAW
+            self._reserve(4)
+            n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
+            self._buff_i += 4
+            if n > self._max_str_len:
+                raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
+            obj = self._read(n)
+        elif b == 0xdc:
+            typ = TYPE_ARRAY
+            self._reserve(2)
+            n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
+            self._buff_i += 2
+            if n > self._max_array_len:
+                raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
+        elif b == 0xdd:
+            typ = TYPE_ARRAY
+            self._reserve(4)
+            n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
+            self._buff_i += 4
+            if n > self._max_array_len:
+                raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
+        elif b == 0xde:
+            self._reserve(2)
+            n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
+            self._buff_i += 2
+            if n > self._max_map_len:
+                raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
+            typ = TYPE_MAP
+        elif b == 0xdf:
+            self._reserve(4)
+            n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
+            self._buff_i += 4
+            if n > self._max_map_len:
+                raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
+            typ = TYPE_MAP
+        else:
+            raise UnpackValueError("Unknown header: 0x%x" % b)
+        return typ, n, obj
+
+    def _unpack(self, execute=EX_CONSTRUCT):
+        typ, n, obj = self._read_header(execute)
+
+        if execute == EX_READ_ARRAY_HEADER:
+            if typ != TYPE_ARRAY:
+                raise UnpackValueError("Expected array")
+            return n
+        if execute == EX_READ_MAP_HEADER:
+            if typ != TYPE_MAP:
+                raise UnpackValueError("Expected map")
+            return n
+        # TODO should we eliminate the recursion?
+        if typ == TYPE_ARRAY:
+            if execute == EX_SKIP:
+                for i in xrange(n):
+                    # TODO check whether we need to call `list_hook`
+                    self._unpack(EX_SKIP)
+                return
+            ret = newlist_hint(n)
+            for i in xrange(n):
+                ret.append(self._unpack(EX_CONSTRUCT))
+            if self._list_hook is not None:
+                ret = self._list_hook(ret)
+            # TODO is the interaction between `list_hook` and `use_list` ok?
+            return ret if self._use_list else tuple(ret)
+        if typ == TYPE_MAP:
+            if execute == EX_SKIP:
+                for i in xrange(n):
+                    # TODO check whether we need to call hooks
+                    self._unpack(EX_SKIP)
+                    self._unpack(EX_SKIP)
+                return
+            if self._object_pairs_hook is not None:
+                ret = self._object_pairs_hook(
+                    (self._unpack(EX_CONSTRUCT),
+                     self._unpack(EX_CONSTRUCT))
+                    for _ in xrange(n))
+            else:
+                ret = {}
+                for _ in xrange(n):
+                    key = self._unpack(EX_CONSTRUCT)
+                    ret[key] = self._unpack(EX_CONSTRUCT)
+                if self._object_hook is not None:
+                    ret = self._object_hook(ret)
+            return ret
+        if execute == EX_SKIP:
+            return
+        if typ == TYPE_RAW:
+            if self._encoding is not None:
+                obj = obj.decode(self._encoding, self._unicode_errors)
+            elif self._raw:
+                obj = bytes(obj)
+            else:
+                obj = obj.decode('utf_8')
+            return obj
+        if typ == TYPE_EXT:
+            return self._ext_hook(n, bytes(obj))
+        if typ == TYPE_BIN:
+            return bytes(obj)
+        assert typ == TYPE_IMMEDIATE
+        return obj
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        try:
+            ret = self._unpack(EX_CONSTRUCT)
+            self._consume()
+            return ret
+        except OutOfData:
+            self._consume()
+            raise StopIteration
+
+    next = __next__
+
+    def skip(self, write_bytes=None):
+        self._unpack(EX_SKIP)
+        if write_bytes is not None:
+            warnings.warn("`write_bytes` option is deprecated.  Use `.tell()` instead.", DeprecationWarning)
+            write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
+        self._consume()
+
+    def unpack(self, write_bytes=None):
+        ret = self._unpack(EX_CONSTRUCT)
+        if write_bytes is not None:
+            warnings.warn("`write_bytes` option is deprecated.  Use `.tell()` instead.", DeprecationWarning)
+            write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
+        self._consume()
+        return ret
+
+    def read_array_header(self, write_bytes=None):
+        ret = self._unpack(EX_READ_ARRAY_HEADER)
+        if write_bytes is not None:
+            warnings.warn("`write_bytes` option is deprecated.  Use `.tell()` instead.", DeprecationWarning)
+            write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
+        self._consume()
+        return ret
+
+    def read_map_header(self, write_bytes=None):
+        ret = self._unpack(EX_READ_MAP_HEADER)
+        if write_bytes is not None:
+            warnings.warn("`write_bytes` option is deprecated.  Use `.tell()` instead.", DeprecationWarning)
+            write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
+        self._consume()
+        return ret
+
+    def tell(self):
+        return self._stream_offset
+
+
+class Packer(object):
+    """
+    MessagePack Packer
+
+    usage:
+
+        packer = Packer()
+        astream.write(packer.pack(a))
+        astream.write(packer.pack(b))
+
+    Packer's constructor has some keyword arguments:
+
+    :param callable default:
+        Convert user type to builtin type that Packer supports.
+        See also simplejson's document.
+
+    :param bool use_single_float:
+        Use single precision float type for float. (default: False)
+
+    :param bool autoreset:
+        Reset buffer after each pack and return its content as `bytes`. (default: True).
+        If set this to false, use `bytes()` to get content and `.reset()` to clear buffer.
+
+    :param bool use_bin_type:
+        Use bin type introduced in msgpack spec 2.0 for bytes.
+        It also enables str8 type for unicode.
+
+    :param bool strict_types:
+        If set to true, types will be checked to be exact. Derived classes
+        from serializeable types will not be serialized and will be
+        treated as unsupported type and forwarded to default.
+        Additionally tuples will not be serialized as lists.
+        This is useful when trying to implement accurate serialization
+        for python types.
+
+    :param str encoding:
+        (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8')
+
+    :param str unicode_errors:
+        Error handler for encoding unicode. (default: 'strict')
+    """
+    def __init__(self, default=None, encoding=None, unicode_errors=None,
+                 use_single_float=False, autoreset=True, use_bin_type=False,
+                 strict_types=False):
+        if encoding is None:
+            encoding = 'utf_8'
+        else:
+            warnings.warn(
+                "encoding is deprecated, Use raw=False instead.",
+                PendingDeprecationWarning)
+
+        if unicode_errors is None:
+            unicode_errors = 'strict'
+
+        self._strict_types = strict_types
+        self._use_float = use_single_float
+        self._autoreset = autoreset
+        self._use_bin_type = use_bin_type
+        self._encoding = encoding
+        self._unicode_errors = unicode_errors
+        self._buffer = StringIO()
+        if default is not None:
+            if not callable(default):
+                raise TypeError("default must be callable")
+        self._default = default
+
+    def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT,
+              check=isinstance, check_type_strict=_check_type_strict):
+        default_used = False
+        if self._strict_types:
+            check = check_type_strict
+            list_types = list
+        else:
+            list_types = (list, tuple)
+        while True:
+            if nest_limit < 0:
+                raise PackValueError("recursion limit exceeded")
+            if obj is None:
+                return self._buffer.write(b"\xc0")
+            if check(obj, bool):
+                if obj:
+                    return self._buffer.write(b"\xc3")
+                return self._buffer.write(b"\xc2")
+            if check(obj, int_types):
+                if 0 <= obj < 0x80:
+                    return self._buffer.write(struct.pack("B", obj))
+                if -0x20 <= obj < 0:
+                    return self._buffer.write(struct.pack("b", obj))
+                if 0x80 <= obj <= 0xff:
+                    return self._buffer.write(struct.pack("BB", 0xcc, obj))
+                if -0x80 <= obj < 0:
+                    return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
+                if 0xff < obj <= 0xffff:
+                    return self._buffer.write(struct.pack(">BH", 0xcd, obj))
+                if -0x8000 <= obj < -0x80:
+                    return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
+                if 0xffff < obj <= 0xffffffff:
+                    return self._buffer.write(struct.pack(">BI", 0xce, obj))
+                if -0x80000000 <= obj < -0x8000:
+                    return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
+                if 0xffffffff < obj <= 0xffffffffffffffff:
+                    return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
+                if -0x8000000000000000 <= obj < -0x80000000:
+                    return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
+                if not default_used and self._default is not None:
+                    obj = self._default(obj)
+                    default_used = True
+                    continue
+                raise PackOverflowError("Integer value out of range")
+            if check(obj, (bytes, bytearray)):
+                n = len(obj)
+                if n >= 2**32:
+                    raise PackValueError("%s is too large" % type(obj).__name__)
+                self._pack_bin_header(n)
+                return self._buffer.write(obj)
+            if check(obj, Unicode):
+                if self._encoding is None:
+                    raise TypeError(
+                        "Can't encode unicode string: "
+                        "no encoding is specified")
+                obj = obj.encode(self._encoding, self._unicode_errors)
+                n = len(obj)
+                if n >= 2**32:
+                    raise PackValueError("String is too large")
+                self._pack_raw_header(n)
+                return self._buffer.write(obj)
+            if check(obj, memoryview):
+                n = len(obj) * obj.itemsize
+                if n >= 2**32:
+                    raise PackValueError("Memoryview is too large")
+                self._pack_bin_header(n)
+                return self._buffer.write(obj)
+            if check(obj, float):
+                if self._use_float:
+                    return self._buffer.write(struct.pack(">Bf", 0xca, obj))
+                return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
+            if check(obj, ExtType):
+                code = obj.code
+                data = obj.data
+                assert isinstance(code, int)
+                assert isinstance(data, bytes)
+                L = len(data)
+                if L == 1:
+                    self._buffer.write(b'\xd4')
+                elif L == 2:
+                    self._buffer.write(b'\xd5')
+                elif L == 4:
+                    self._buffer.write(b'\xd6')
+                elif L == 8:
+                    self._buffer.write(b'\xd7')
+                elif L == 16:
+                    self._buffer.write(b'\xd8')
+                elif L <= 0xff:
+                    self._buffer.write(struct.pack(">BB", 0xc7, L))
+                elif L <= 0xffff:
+                    self._buffer.write(struct.pack(">BH", 0xc8, L))
+                else:
+                    self._buffer.write(struct.pack(">BI", 0xc9, L))
+                self._buffer.write(struct.pack("b", code))
+                self._buffer.write(data)
+                return
+            if check(obj, list_types):
+                n = len(obj)
+                self._pack_array_header(n)
+                for i in xrange(n):
+                    self._pack(obj[i], nest_limit - 1)
+                return
+            if check(obj, dict):
+                return self._pack_map_pairs(len(obj), dict_iteritems(obj),
+                                               nest_limit - 1)
+            if not default_used and self._default is not None:
+                obj = self._default(obj)
+                default_used = 1
+                continue
+            raise TypeError("Cannot serialize %r" % (obj, ))
+
+    def pack(self, obj):
+        try:
+            self._pack(obj)
+        except:
+            self._buffer = StringIO()  # force reset
+            raise
+        ret = self._buffer.getvalue()
+        if self._autoreset:
+            self._buffer = StringIO()
+        elif USING_STRINGBUILDER:
+            self._buffer = StringIO(ret)
+        return ret
+
+    def pack_map_pairs(self, pairs):
+        self._pack_map_pairs(len(pairs), pairs)
+        ret = self._buffer.getvalue()
+        if self._autoreset:
+            self._buffer = StringIO()
+        elif USING_STRINGBUILDER:
+            self._buffer = StringIO(ret)
+        return ret
+
+    def pack_array_header(self, n):
+        if n >= 2**32:
+            raise PackValueError
+        self._pack_array_header(n)
+        ret = self._buffer.getvalue()
+        if self._autoreset:
+            self._buffer = StringIO()
+        elif USING_STRINGBUILDER:
+            self._buffer = StringIO(ret)
+        return ret
+
+    def pack_map_header(self, n):
+        if n >= 2**32:
+            raise PackValueError
+        self._pack_map_header(n)
+        ret = self._buffer.getvalue()
+        if self._autoreset:
+            self._buffer = StringIO()
+        elif USING_STRINGBUILDER:
+            self._buffer = StringIO(ret)
+        return ret
+
+    def pack_ext_type(self, typecode, data):
+        if not isinstance(typecode, int):
+            raise TypeError("typecode must have int type.")
+        if not 0 <= typecode <= 127:
+            raise ValueError("typecode should be 0-127")
+        if not isinstance(data, bytes):
+            raise TypeError("data must have bytes type")
+        L = len(data)
+        if L > 0xffffffff:
+            raise PackValueError("Too large data")
+        if L == 1:
+            self._buffer.write(b'\xd4')
+        elif L == 2:
+            self._buffer.write(b'\xd5')
+        elif L == 4:
+            self._buffer.write(b'\xd6')
+        elif L == 8:
+            self._buffer.write(b'\xd7')
+        elif L == 16:
+            self._buffer.write(b'\xd8')
+        elif L <= 0xff:
+            self._buffer.write(b'\xc7' + struct.pack('B', L))
+        elif L <= 0xffff:
+            self._buffer.write(b'\xc8' + struct.pack('>H', L))
+        else:
+            self._buffer.write(b'\xc9' + struct.pack('>I', L))
+        self._buffer.write(struct.pack('B', typecode))
+        self._buffer.write(data)
+
+    def _pack_array_header(self, n):
+        if n <= 0x0f:
+            return self._buffer.write(struct.pack('B', 0x90 + n))
+        if n <= 0xffff:
+            return self._buffer.write(struct.pack(">BH", 0xdc, n))
+        if n <= 0xffffffff:
+            return self._buffer.write(struct.pack(">BI", 0xdd, n))
+        raise PackValueError("Array is too large")
+
+    def _pack_map_header(self, n):
+        if n <= 0x0f:
+            return self._buffer.write(struct.pack('B', 0x80 + n))
+        if n <= 0xffff:
+            return self._buffer.write(struct.pack(">BH", 0xde, n))
+        if n <= 0xffffffff:
+            return self._buffer.write(struct.pack(">BI", 0xdf, n))
+        raise PackValueError("Dict is too large")
+
+    def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
+        self._pack_map_header(n)
+        for (k, v) in pairs:
+            self._pack(k, nest_limit - 1)
+            self._pack(v, nest_limit - 1)
+
+    def _pack_raw_header(self, n):
+        if n <= 0x1f:
+            self._buffer.write(struct.pack('B', 0xa0 + n))
+        elif self._use_bin_type and n <= 0xff:
+            self._buffer.write(struct.pack('>BB', 0xd9, n))
+        elif n <= 0xffff:
+            self._buffer.write(struct.pack(">BH", 0xda, n))
+        elif n <= 0xffffffff:
+            self._buffer.write(struct.pack(">BI", 0xdb, n))
+        else:
+            raise PackValueError('Raw is too large')
+
+    def _pack_bin_header(self, n):
+        if not self._use_bin_type:
+            return self._pack_raw_header(n)
+        elif n <= 0xff:
+            return self._buffer.write(struct.pack('>BB', 0xc4, n))
+        elif n <= 0xffff:
+            return self._buffer.write(struct.pack(">BH", 0xc5, n))
+        elif n <= 0xffffffff:
+            return self._buffer.write(struct.pack(">BI", 0xc6, n))
+        else:
+            raise PackValueError('Bin is too large')
+
+    def bytes(self):
+        return self._buffer.getvalue()
+
+    def reset(self):
+        self._buffer = StringIO()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f594ecb9c03905e03df925393ac937f4718ddef0
GIT binary patch
literal 32803
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py
new file mode 100644
index 00000000..7481c9e2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py
@@ -0,0 +1,27 @@
+# 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
+
+__all__ = [
+    "__title__",
+    "__summary__",
+    "__uri__",
+    "__version__",
+    "__author__",
+    "__email__",
+    "__license__",
+    "__copyright__",
+]
+
+__title__ = "packaging"
+__summary__ = "Core utilities for Python packages"
+__uri__ = "https://github.com/pypa/packaging"
+
+__version__ = "19.0"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD or Apache License, Version 2.0"
+__copyright__ = "Copyright 2014-2019 %s" % __author__
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d2fc4e8e0851d38cb5a2b1c2ceb2a00b4be4661e
GIT binary patch
literal 841
zcmZSn%*&NH<x)&C0~ByDFfceIFftSuF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGo-LEq_8riurZ{tGo)}Zq;N8%b1+1)Fr;uXM6oiYa5F@)F{JP?M6olZ
z@G?YkFr@G?L~$~t@H0elF{B7EL~%2u2r{H{GKfX-Fr)}E1ZxO0Ffe3-+@itEz`#(#
z&%nTtm{gpfQ(BT5pP5^bUsO^8a$-tmS!Qu&eqIS50|P@rQD$CAd|GK<atTO?lYxOD
zKE5QgBqudKzJwdhD=y8=O)RR6k1t^d^Gk~|;c{iEMIfW%<4d@}a*3rS8Tm!=@g)$0
zQgahCbKr_|GLuvDia`eRf)yv{7gQEyre~Bu)fXftXD6m-=A{=aF)%PV=NF|al$K=X
zWR_&67AvIX7byf(mSp7TDL~Yv78ffrFfe44loS+O>FcLwmSmJB=_Tjq>K9ZNB<e#H
zfed3|U|=w`)H5j7WME)$$<Is7Nl^$cDNRc&QAo^7QOL{#1xQM1Vva&`eqKpYW>RTM
zeo=9;04Nf{svU~Ks`WDS!47i@c2USLQgAFtOwLGE@PT+rM<EOn6beRq2E}4v_d|WB
zU}RuuqHAPeXsMuD?56?pJ2bS?N=r(MQsd);K#>;2$iTo5!~}{tNH{0v<iy7Zfub@9
z<b@zskUSfR0Lce|qA~~+%t4@_*8mxTAizmbzo00yEU_e2zbvsxKP^8eCAFwnKf6#r
zyV%Iw+^{gq$h^$Z!n`=AGQB+BB*nzUz`(#DJx@PGzaX<fH#4ueBrzvPw>;6ZG%y1s
z1jg}Ysd*{+MTp?lkB?7G$}cU6kJl@x1g9^X-29Z%oK!oIql*<77#L)jnHiBGCo>x(
N8zUPN8xxph1OR`C&wKy?

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py
new file mode 100644
index 00000000..a0cf67df
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py
@@ -0,0 +1,26 @@
+# 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
+
+from .__about__ import (
+    __author__,
+    __copyright__,
+    __email__,
+    __license__,
+    __summary__,
+    __title__,
+    __uri__,
+    __version__,
+)
+
+__all__ = [
+    "__title__",
+    "__summary__",
+    "__uri__",
+    "__version__",
+    "__author__",
+    "__email__",
+    "__license__",
+    "__copyright__",
+]
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f9543d3f9d9ac1726186c78d14ec6061d247f345
GIT binary patch
literal 663
zcmZSn%*&NH<x)&C0~ByDFfceIFftTZFfcHrFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`=YcF+{O3<gznFu`}dyFhp@M<Z?1ZaWdp`F+_1O<Z?4a
zaWmxdFhub%Fs86Dq_8riurZ{tGo)}Zq;N8%a51ECGo*7cMDa4D@Gt~x@G>wkWP)6z
z!OXzGP{Pl^z>t_!oS#!#k{X|xTaaH=QUY>lN@iJRab|vA2_FLkLqSnyUP*jfX<l+k
zW`15KBLf4221ro}7Xt%Be0*YQNk)EAe0&MW?D+WP{DR7&%=C<s`1le|u!7Xw#LS%d
z_!4d~FDElOHLo}o&Mz*_%}p$-gsU#eEXe`MvV&EZ7G=U!mZcVf+!P-l1hPE{q#y`n
zLlDRvK_LGGu`)0)1hIh#76t|eKMj!cq0USzEh#NZjgJok`928bi6ACW5P(dGk55d>
zFD;3WhnND=i)0koBCwSpwP4#yKw|Oni8(p(@fsil5kzqz0|SG8K~ZK|Vo9ogSz?iX
zT7FJSYEiL%cA<WDv5~pCVPTe$d6}Vwd2vo<dU?D_iiwGVfq_AKo_>gaL1uw&W?peg
zVor{3d7@=$U<ODCjN{8v^HTDQ^a~P`vlG)Z^V0R><1_OzOXB183M#>|W|NzrQks)$
U2XcS05Ca2)43iZPGb1tt01<MH!2kdN

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py
new file mode 100644
index 00000000..25da473c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py
@@ -0,0 +1,31 @@
+# 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 sys
+
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+# flake8: noqa
+
+if PY3:
+    string_types = (str,)
+else:
+    string_types = (basestring,)
+
+
+def with_metaclass(meta, *bases):
+    """
+    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):
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+
+    return type.__new__(metaclass, "temporary_class", (), {})
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1cce028ea6834ef5d32714dcbeaccdd1bf63d3b4
GIT binary patch
literal 1404
zcmZSn%*&NH<x)&C0~9bZFfceIFftUEF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQw&M7*bgnvRFZ?B~zFgvY8m7*pP)-z(VW{sq73z2@I(m3~7uEQJf5U
zoD8X4P<9F{Lkj~#6gNW(6GN~D8v_GFCdfS+%nS?+CHxEw42em_`8lN}sqvY)1^GoK
zB^)5vWtL?YXXfXX@G&qj6clCVmBgo&<|UV8=I8lkg8Y#Q(w@x7z`y`vure?(u!DSN
z3ewBS(7_0@yq$reosl7p31o8{14A<dLu4%zLkR;z79&Fq6GI9!LkbJXG0iLt!5SbV
ziuD;77`PM^6cn6`QWHy36%rMa5{pw6l5-M^ixtW<OEMG^6>?Kc62Ss`V3j4D3=9l#
zF_f@o0=Y<vfq@~F0Tjdt=P)p|F@S<QC|CpJgJc#41_l@w25AytU;z1{hLNFzfuV+(
zp_!QhqSQ|V9CjeZB_NL{=M<NKIC+V=sU=*X5Y5Oejt4oqxCCT$iUugKN<f~22!a%Y
zTnjd*xPXCyLBF6Vvn;VBRlh8;NIxw<CndG0SU<Z^KfBn-+}yA*%gDUU(89bpr!u`f
z-Xz7u#K6G7AU#h%M86=jKsPh5xFj(rN4GrDvNSLQBm~CsWvO{7`9=B#iOJcC>6v-y
z`tiy6xdn+OdIgmw><kPH@$q@7<?-<{3=9m#AQv()Lec{$?&IS@zKM?q`zJm=H$SB`
zCpA7k2;@Dmv%!7}0x1mw1wL48K)ezJiUMhvAJ`bd$+;vIl#COLD&xVa1nfGni@_09
zQdy7+@d-#T*!>WnfVc>?5HXPN2E=3FYzIp3@u0K<_J;__o1oOgz%I|C!2?Qapa_YN
zPb)1cEds?4C}jqL5?v4|M#0ImxU#qeq_ixx2$Y-SGxO5&!4d(HMo`)qOc$3FffW{)
z6lLb6$Adzt7##nQR0|Re0+khz5CYi*W(`c>fKr|fBw5;lLZlc}NXanqFbgvZv#>Gp
IFmW;i0N0&FcmMzZ

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py
new file mode 100644
index 00000000..68dcca63
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py
@@ -0,0 +1,68 @@
+# 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
+
+
+class Infinity(object):
+    def __repr__(self):
+        return "Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return False
+
+    def __le__(self, other):
+        return False
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return True
+
+    def __ge__(self, other):
+        return True
+
+    def __neg__(self):
+        return NegativeInfinity
+
+
+Infinity = Infinity()
+
+
+class NegativeInfinity(object):
+    def __repr__(self):
+        return "-Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return True
+
+    def __le__(self, other):
+        return True
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return False
+
+    def __ge__(self, other):
+        return False
+
+    def __neg__(self):
+        return Infinity
+
+
+NegativeInfinity = NegativeInfinity()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..520578e2c08b9187bf95d65eb9e6308715daccf7
GIT binary patch
literal 5013
zcmZSn%*&NH<x)&C0~9bbFfceIFftU!F)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpXEFr+auq%bqIFfcSTFhoYNGNiJCSW&DDDJ(E)R=6}9Ln<3snvEfajUiZr
zoq>TN6J)Oj$kq~m1_p-2q~iRX(vsBp%-n+fqLLC0kSj9FGK(|w^Gf&_7#IqQGV@B}
z(@OJ_OF%*(dC$DG%)HE!O1K{w85kIxKz@j1U|>jP069H{0pyA(CXjzx7(gCKVFHV=
zK-~{<GDwPzAqDK@D0Yx5K_VOsDePdyoD3-(U<MaMP_PCk0|P@c$SxRm2HD91axo)A
zum%$Y1A|`>$Y&a0KY~=1fMknPbJ8F}Ao1c71_lQGf}+f_#FA9~vcw|&wEUcu)S_bj
z>_YwQVk2{N!@?{h^D;vV^WvP!^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6@<hwh
zzzmQO7{`~T=B4Bp=@%p>XD6m-=B4Y$7nc;3CYO{Jr55WIRD#1cKE5cmpeQ~b6pqCp
z7c(%zy##VP*h>No3=Aa<3?+;VH4F^Rj35-O0rHL?*ppySWh547fEgh3z>+~AzYZRM
zf*cqh&&|NV0P`ovyC4km3D}<?2bVA~!2AXhFJWb1U~o&!DNY4@73?RlSbj-HYSCcu
z9UB7!LwtNrNqjsgdywL{AWjAb286eQxIkP`k_3Be;L;`3N2&4gf>>e;Jyq5)f>LD`
zBSSM2Jmx^LS_1M;W-&N(<Rzz;aDu}rIVZ8WI6i*R`Z~2RK3)W$uR%dl!oYy+YaUpF
z1$jG&mw|yH2$U2CtsnDJ<KxA#_z{%faOOi$-V7-!MaqVQEWM_e#K%jK=&K-5Y!2FZ
zN>7cCmqqdsD1KlVXFP%G3cu9!#FEUiR9MA4xT*tCt0O)>FEu?rUIF1d4N%PhtrGJR
zb5rBv!39Wsd~SY9X-;Z<d=RK62m;lUK_I0;JfM6AYO(}@yc{G1;tGQZQIukIV9Qc)
z^8@7JVvzgT7&)0yVGyXS8I0|wVo-6d3r|4cS_zc)z!fk!Ou@u}RZ`&80CEDX!UZ`F
zgwd-fT#cq6P%Re(ikd-{JHQEC8<8!NL3IiUgZzdo(+|>O44hB(hKXN5#f>2rzo4f#
z<c7geX%_^6icu4Mo&(jBL$%cdt{=>?_zrKD0+oM*uVnzP=B$Q^UqH3BEs|eA@d3j)
zi#kw#8(bwesJ-EU@CLXc6C?&|iGUi};ED=ds)LKeA<}FCHA~b%e!|{t@dFPXK^tgk
zrJxaw`1l}DBOwSBfkB`Os{~ZR<|k#PCYOL)LExqisK#bM5ChhH05>#kAWcg<P}imy
P)UcFc7L(;<7Lx@4Hxr5I

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py
new file mode 100644
index 00000000..54824768
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py
@@ -0,0 +1,296 @@
+# 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 operator
+import os
+import platform
+import sys
+
+from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd
+from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString
+from pip._vendor.pyparsing import Literal as L  # noqa
+
+from ._compat import string_types
+from .specifiers import Specifier, InvalidSpecifier
+
+
+__all__ = [
+    "InvalidMarker",
+    "UndefinedComparison",
+    "UndefinedEnvironmentName",
+    "Marker",
+    "default_environment",
+]
+
+
+class InvalidMarker(ValueError):
+    """
+    An invalid marker was found, users should refer to PEP 508.
+    """
+
+
+class UndefinedComparison(ValueError):
+    """
+    An invalid operation was attempted on a value that doesn't support it.
+    """
+
+
+class UndefinedEnvironmentName(ValueError):
+    """
+    A name was attempted to be used that does not exist inside of the
+    environment.
+    """
+
+
+class Node(object):
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return str(self.value)
+
+    def __repr__(self):
+        return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
+
+    def serialize(self):
+        raise NotImplementedError
+
+
+class Variable(Node):
+    def serialize(self):
+        return str(self)
+
+
+class Value(Node):
+    def serialize(self):
+        return '"{0}"'.format(self)
+
+
+class Op(Node):
+    def serialize(self):
+        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")
+    | 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
+)
+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",
+}
+VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
+
+VERSION_CMP = (
+    L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<")
+)
+
+MARKER_OP = VERSION_CMP | L("not in") | L("in")
+MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
+
+MARKER_VALUE = QuotedString("'") | QuotedString('"')
+MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
+
+BOOLOP = L("and") | L("or")
+
+MARKER_VAR = VARIABLE | MARKER_VALUE
+
+MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
+MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))
+
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+
+MARKER_EXPR = Forward()
+MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
+MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)
+
+MARKER = stringStart + MARKER_EXPR + stringEnd
+
+
+def _coerce_parse_result(results):
+    if isinstance(results, ParseResults):
+        return [_coerce_parse_result(i) for i in results]
+    else:
+        return results
+
+
+def _format_marker(marker, first=True):
+    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))
+    ):
+        return _format_marker(marker[0])
+
+    if isinstance(marker, list):
+        inner = (_format_marker(m, first=False) for m in marker)
+        if first:
+            return " ".join(inner)
+        else:
+            return "(" + " ".join(inner) + ")"
+    elif isinstance(marker, tuple):
+        return " ".join([m.serialize() for m in marker])
+    else:
+        return marker
+
+
+_operators = {
+    "in": lambda lhs, rhs: lhs in rhs,
+    "not in": lambda lhs, rhs: lhs not in rhs,
+    "<": operator.lt,
+    "<=": operator.le,
+    "==": operator.eq,
+    "!=": operator.ne,
+    ">=": operator.ge,
+    ">": operator.gt,
+}
+
+
+def _eval_op(lhs, op, rhs):
+    try:
+        spec = Specifier("".join([op.serialize(), rhs]))
+    except InvalidSpecifier:
+        pass
+    else:
+        return spec.contains(lhs)
+
+    oper = _operators.get(op.serialize())
+    if oper is None:
+        raise UndefinedComparison(
+            "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
+        )
+
+    return oper(lhs, rhs)
+
+
+_undefined = object()
+
+
+def _get_env(environment, name):
+    value = environment.get(name, _undefined)
+
+    if value is _undefined:
+        raise UndefinedEnvironmentName(
+            "{0!r} does not exist in evaluation environment.".format(name)
+        )
+
+    return value
+
+
+def _evaluate_markers(markers, environment):
+    groups = [[]]
+
+    for marker in markers:
+        assert isinstance(marker, (list, tuple, string_types))
+
+        if isinstance(marker, list):
+            groups[-1].append(_evaluate_markers(marker, environment))
+        elif isinstance(marker, tuple):
+            lhs, op, rhs = marker
+
+            if isinstance(lhs, Variable):
+                lhs_value = _get_env(environment, lhs.value)
+                rhs_value = rhs.value
+            else:
+                lhs_value = lhs.value
+                rhs_value = _get_env(environment, rhs.value)
+
+            groups[-1].append(_eval_op(lhs_value, op, rhs_value))
+        else:
+            assert marker in ["and", "or"]
+            if marker == "or":
+                groups.append([])
+
+    return any(all(item) for item in groups)
+
+
+def format_full_version(info):
+    version = "{0.major}.{0.minor}.{0.micro}".format(info)
+    kind = info.releaselevel
+    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
+    else:
+        iver = "0"
+        implementation_name = ""
+
+    return {
+        "implementation_name": implementation_name,
+        "implementation_version": iver,
+        "os_name": os.name,
+        "platform_machine": platform.machine(),
+        "platform_release": platform.release(),
+        "platform_system": platform.system(),
+        "platform_version": platform.version(),
+        "python_full_version": platform.python_version(),
+        "platform_python_implementation": platform.python_implementation(),
+        "python_version": platform.python_version()[:3],
+        "sys_platform": sys.platform,
+    }
+
+
+class Marker(object):
+    def __init__(self, marker):
+        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]
+            )
+            raise InvalidMarker(err_str)
+
+    def __str__(self):
+        return _format_marker(self._markers)
+
+    def __repr__(self):
+        return "<Marker({0!r})>".format(str(self))
+
+    def evaluate(self, environment=None):
+        """Evaluate a marker.
+
+        Return the boolean from evaluating the given marker against the
+        environment. environment is an optional argument to override all or
+        part of the determined environment.
+
+        The environment is determined from the current Python process.
+        """
+        current_environment = default_environment()
+        if environment is not None:
+            current_environment.update(environment)
+
+        return _evaluate_markers(self._markers, current_environment)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..06452efabfea23cbb51426c23b94e1a20b62164c
GIT binary patch
literal 13357
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py
new file mode 100644
index 00000000..dbc5f11d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py
@@ -0,0 +1,138 @@
+# 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 string
+import re
+
+from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException
+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 .markers import MARKER_EXPR, Marker
+from .specifiers import LegacySpecifier, Specifier, SpecifierSet
+
+
+class InvalidRequirement(ValueError):
+    """
+    An invalid requirement was found, users should refer to PEP 508.
+    """
+
+
+ALPHANUM = Word(string.ascii_letters + string.digits)
+
+LBRACKET = L("[").suppress()
+RBRACKET = L("]").suppress()
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+COMMA = L(",").suppress()
+SEMICOLON = L(";").suppress()
+AT = L("@").suppress()
+
+PUNCTUATION = Word("-_.")
+IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
+IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
+
+NAME = IDENTIFIER("name")
+EXTRA = IDENTIFIER
+
+URI = Regex(r"[^ ]+")("url")
+URL = AT + URI
+
+EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
+EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
+
+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_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
+_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])
+)
+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)
+
+REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
+# pyparsing isn't thread safe during initialization, so we do it eagerly, see
+# issue #104
+REQUIREMENT.parseString("x[]")
+
+
+class Requirement(object):
+    """Parse a requirement.
+
+    Parse a given requirement string into its parts, such as name, specifier,
+    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
+    string.
+    """
+
+    # TODO: Can we test whether something is contained within a requirement?
+    #       If so how do we do that? Do we need to test against the _name_ of
+    #       the thing as well as the version? What about the markers?
+    # TODO: Can we normalize the name and extra name?
+
+    def __init__(self, requirement_string):
+        try:
+            req = REQUIREMENT.parseString(requirement_string)
+        except ParseException as e:
+            raise InvalidRequirement(
+                '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 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
+        self.extras = set(req.extras.asList() if req.extras else [])
+        self.specifier = SpecifierSet(req.specifier)
+        self.marker = req.marker if req.marker else None
+
+    def __str__(self):
+        parts = [self.name]
+
+        if self.extras:
+            parts.append("[{0}]".format(",".join(sorted(self.extras))))
+
+        if self.specifier:
+            parts.append(str(self.specifier))
+
+        if self.url:
+            parts.append("@ {0}".format(self.url))
+            if self.marker:
+                parts.append(" ")
+
+        if self.marker:
+            parts.append("; {0}".format(self.marker))
+
+        return "".join(parts)
+
+    def __repr__(self):
+        return "<Requirement({0!r})>".format(str(self))
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9afd0d8bbabc642cdf6eb60e483d2a4ee33b6e1a
GIT binary patch
literal 5695
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
Y5TgK-C?gvq7ZV7BOp;*YW9DTB08x(aQ2+n{

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py
new file mode 100644
index 00000000..743576a0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py
@@ -0,0 +1,749 @@
+# 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 abc
+import functools
+import itertools
+import re
+
+from ._compat import string_types, with_metaclass
+from .version import Version, LegacyVersion, parse
+
+
+class InvalidSpecifier(ValueError):
+    """
+    An invalid specifier was found, users should refer to PEP 440.
+    """
+
+
+class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
+    @abc.abstractmethod
+    def __str__(self):
+        """
+        Returns the str representation of this Specifier like object. This
+        should be representative of the Specifier itself.
+        """
+
+    @abc.abstractmethod
+    def __hash__(self):
+        """
+        Returns a hash value for this Specifier like object.
+        """
+
+    @abc.abstractmethod
+    def __eq__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are equal.
+        """
+
+    @abc.abstractmethod
+    def __ne__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are not equal.
+        """
+
+    @abc.abstractproperty
+    def prereleases(self):
+        """
+        Returns whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @prereleases.setter
+    def prereleases(self, value):
+        """
+        Sets whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @abc.abstractmethod
+    def contains(self, item, prereleases=None):
+        """
+        Determines if the given item is contained within this specifier.
+        """
+
+    @abc.abstractmethod
+    def filter(self, iterable, prereleases=None):
+        """
+        Takes an iterable of items and filters them so that only items which
+        are contained within this specifier are allowed in it.
+        """
+
+
+class _IndividualSpecifier(BaseSpecifier):
+
+    _operators = {}
+
+    def __init__(self, spec="", prereleases=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())
+
+        # Store whether or not this Specifier should accept prereleases
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        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)
+
+    def __str__(self):
+        return "{0}{1}".format(*self._spec)
+
+    def __hash__(self):
+        return hash(self._spec)
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec == other._spec
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec != other._spec
+
+    def _get_operator(self, op):
+        return getattr(self, "_compare_{0}".format(self._operators[op]))
+
+    def _coerce_version(self, version):
+        if not isinstance(version, (LegacyVersion, Version)):
+            version = parse(version)
+        return version
+
+    @property
+    def operator(self):
+        return self._spec[0]
+
+    @property
+    def version(self):
+        return self._spec[1]
+
+    @property
+    def prereleases(self):
+        return self._prereleases
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # 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)
+
+        # 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:
+            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)
+
+    def filter(self, iterable, prereleases=None):
+        yielded = False
+        found_prereleases = []
+
+        kw = {"prereleases": prereleases if prereleases is not None else True}
+
+        # Attempt to iterate over all the values in the iterable and if any of
+        # them match, yield them.
+        for version in iterable:
+            parsed_version = self._coerce_version(version)
+
+            if self.contains(parsed_version, **kw):
+                # 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
+                ):
+                    found_prereleases.append(version)
+                # Either this is not a prerelease, or we should have been
+                # accepting prereleases from the beginning.
+                else:
+                    yielded = True
+                    yield version
+
+        # Now that we've iterated over everything, determine if we've yielded
+        # any values, and if we have not and we have any prereleases stored up
+        # then we will go ahead and yield the prereleases.
+        if not yielded and found_prereleases:
+            for version in found_prereleases:
+                yield version
+
+
+class LegacySpecifier(_IndividualSpecifier):
+
+    _regex_str = r"""
+        (?P<operator>(==|!=|<=|>=|<|>))
+        \s*
+        (?P<version>
+            [^,;\s)]* # Since this is a "legacy" specifier, and the version
+                      # string can be just about anything, we match everything
+                      # except for whitespace, a semi-colon for marker support,
+                      # a closing paren since versions can be enclosed in
+                      # them, and a comma since it's a version separator.
+        )
+        """
+
+    _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+    }
+
+    def _coerce_version(self, version):
+        if not isinstance(version, LegacyVersion):
+            version = LegacyVersion(str(version))
+        return version
+
+    def _compare_equal(self, prospective, spec):
+        return prospective == self._coerce_version(spec)
+
+    def _compare_not_equal(self, prospective, spec):
+        return prospective != self._coerce_version(spec)
+
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= self._coerce_version(spec)
+
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= self._coerce_version(spec)
+
+    def _compare_less_than(self, prospective, spec):
+        return prospective < self._coerce_version(spec)
+
+    def _compare_greater_than(self, prospective, spec):
+        return prospective > self._coerce_version(spec)
+
+
+def _require_version_compare(fn):
+    @functools.wraps(fn)
+    def wrapped(self, prospective, spec):
+        if not isinstance(prospective, Version):
+            return False
+        return fn(self, prospective, spec)
+
+    return wrapped
+
+
+class Specifier(_IndividualSpecifier):
+
+    _regex_str = r"""
+        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
+        (?P<version>
+            (?:
+                # The identity operators allow for an escape hatch that will
+                # do an exact string match of the version you wish to install.
+                # This will not be parsed by PEP 440 and we cannot determine
+                # any semantic meaning from it. This operator is discouraged
+                # but included entirely as an escape hatch.
+                (?<====)  # Only match for the identity operator
+                \s*
+                [^\s]*    # We just match everything, except for whitespace
+                          # since we are only testing for strict identity.
+            )
+            |
+            (?:
+                # The (non)equality operators allow for wild card and local
+                # versions to be specified so we have to define these two
+                # operators separately to enable that.
+                (?<===|!=)            # Only match for equals and not equals
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+
+                # You cannot use a wild card and a dev or local version
+                # together so group them with a | and make them optional.
+                (?:
+                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
+                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
+                    |
+                    \.\*  # Wild card syntax of .*
+                )?
+            )
+            |
+            (?:
+                # The compatible operator requires at least two digits in the
+                # release segment.
+                (?<=~=)               # Only match for the compatible operator
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+            |
+            (?:
+                # All other operators only allow a sub set of what the
+                # (non)equality operators do. Specifically they do not allow
+                # local versions to be specified nor do they allow the prefix
+                # matching wild cards.
+                (?<!==|!=|~=)         # We have special cases for these
+                                      # operators so we want to make sure they
+                                      # don't match here.
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+        )
+        """
+
+    _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "~=": "compatible",
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+        "===": "arbitrary",
+    }
+
+    @_require_version_compare
+    def _compare_compatible(self, prospective, spec):
+        # 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
+        # implementing it ourselves. The only thing we need to do is construct
+        # the other specifiers.
+
+        # We want everything but the last item in the version, but we want to
+        # ignore post and dev releases and we want to treat the pre-release as
+        # it's own separate segment.
+        prefix = ".".join(
+            list(
+                itertools.takewhile(
+                    lambda x: (not x.startswith("post") and not x.startswith("dev")),
+                    _version_split(spec),
+                )
+            )[:-1]
+        )
+
+        # Add the prefix notation to the end of our string
+        prefix += ".*"
+
+        return self._get_operator(">=")(prospective, spec) and self._get_operator("==")(
+            prospective, prefix
+        )
+
+    @_require_version_compare
+    def _compare_equal(self, prospective, spec):
+        # 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 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))
+
+            # 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)]
+
+            # Pad out our two sides with zeros so that they both equal the same
+            # length.
+            spec, prospective = _pad_version(spec, prospective)
+        else:
+            # Convert our spec string into a Version
+            spec = 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:
+                prospective = Version(prospective.public)
+
+        return prospective == spec
+
+    @_require_version_compare
+    def _compare_not_equal(self, prospective, spec):
+        return not self._compare_equal(prospective, spec)
+
+    @_require_version_compare
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= Version(spec)
+
+    @_require_version_compare
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= Version(spec)
+
+    @_require_version_compare
+    def _compare_less_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # 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
+        # instead of doing extra unneeded work.
+        if not prospective < spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a pre-release version, that we do not accept pre-release
+        # versions for the version mentioned in the specifier (e.g. <3.1 should
+        # not match 3.1.dev0, but should match 3.0.dev0).
+        if not spec.is_prerelease and prospective.is_prerelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # less than the spec version *and* it's not a pre-release of the same
+        # version in the spec.
+        return True
+
+    @_require_version_compare
+    def _compare_greater_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # 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
+        # instead of doing extra unneeded work.
+        if not prospective > spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a post-release version, that we do not accept
+        # post-release versions for the version mentioned in the specifier
+        # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0).
+        if not spec.is_postrelease and prospective.is_postrelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # Ensure that we do not allow a local version of the version mentioned
+        # 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
+
+        # If we've gotten to here, it means that prospective version is both
+        # greater than the spec version *and* it's not a pre-release of the
+        # same version in the spec.
+        return True
+
+    def _compare_arbitrary(self, prospective, spec):
+        return str(prospective).lower() == str(spec).lower()
+
+    @property
+    def prereleases(self):
+        # If there is an explicit prereleases set for this, then we'll just
+        # blindly use that.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # Look at all of our specifiers and determine if they are inclusive
+        # operators, and if they are if they are including an explicit
+        # prerelease.
+        operator, version = self._spec
+        if operator in ["==", ">=", "<=", "~=", "==="]:
+            # The == specifier can include a trailing .*, if it does we
+            # want to remove before parsing.
+            if operator == "==" and version.endswith(".*"):
+                version = version[:-2]
+
+            # Parse the version, and if it is a pre-release than this
+            # specifier allows pre-releases.
+            if parse(version).is_prerelease:
+                return True
+
+        return False
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+
+_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
+
+
+def _version_split(version):
+    result = []
+    for item in version.split("."):
+        match = _prefix_regex.search(item)
+        if match:
+            result.extend(match.groups())
+        else:
+            result.append(item)
+    return result
+
+
+def _pad_version(left, right):
+    left_split, right_split = [], []
+
+    # Get the release segment of our versions
+    left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left)))
+    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]) :])
+
+    # 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])))
+
+    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
+        # strip each item to remove leading/trailing whitespace.
+        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:
+            try:
+                parsed.add(Specifier(specifier))
+            except InvalidSpecifier:
+                parsed.add(LegacySpecifier(specifier))
+
+        # Turn our parsed specifiers into a frozen set and save them for later.
+        self._specs = frozenset(parsed)
+
+        # Store our prereleases value so we can use it later to determine if
+        # we accept prereleases or not.
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        pre = (
+            ", prereleases={0!r}".format(self.prereleases)
+            if self._prereleases is not None
+            else ""
+        )
+
+        return "<SpecifierSet({0!r}{1})>".format(str(self), pre)
+
+    def __str__(self):
+        return ",".join(sorted(str(s) for s in self._specs))
+
+    def __hash__(self):
+        return hash(self._specs)
+
+    def __and__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        specifier = SpecifierSet()
+        specifier._specs = frozenset(self._specs | other._specs)
+
+        if self._prereleases is None and other._prereleases is not None:
+            specifier._prereleases = other._prereleases
+        elif self._prereleases is not None and other._prereleases is None:
+            specifier._prereleases = self._prereleases
+        elif self._prereleases == other._prereleases:
+            specifier._prereleases = self._prereleases
+        else:
+            raise ValueError(
+                "Cannot combine SpecifierSets with True and False prerelease "
+                "overrides."
+            )
+
+        return specifier
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs == other._specs
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs != other._specs
+
+    def __len__(self):
+        return len(self._specs)
+
+    def __iter__(self):
+        return iter(self._specs)
+
+    @property
+    def prereleases(self):
+        # If we have been given an explicit prerelease modifier, then we'll
+        # pass that through here.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # If we don't have any specifiers, and we don't have a forced value,
+        # then we'll just return None since we don't know if this should have
+        # pre-releases or not.
+        if not self._specs:
+            return None
+
+        # Otherwise we'll see if any of the given specifiers accept
+        # prereleases, if any of them do we'll return True, otherwise False.
+        return any(s.prereleases for s in self._specs)
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # Ensure that our item is a Version or LegacyVersion instance.
+        if not isinstance(item, (LegacyVersion, Version)):
+            item = parse(item)
+
+        # 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.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # We can determine if we're going to allow pre-releases by looking to
+        # see if any of the underlying items supports them. If none of them do
+        # and this item is a pre-release then we do not allow it and we can
+        # short circuit that here.
+        # Note: This means that 1.0.dev1 would not be contained in something
+        #       like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0
+        if not prereleases and item.is_prerelease:
+            return False
+
+        # We simply dispatch to the underlying specs here to make sure that the
+        # 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)
+
+    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.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # If we have any specifiers, then we want to wrap our iterable in the
+        # filter method for each one, this will act as a logical AND amongst
+        # each specifier.
+        if self._specs:
+            for spec in self._specs:
+                iterable = spec.filter(iterable, prereleases=bool(prereleases))
+            return iterable
+        # If we do not have any specifiers, then we need to have a rough filter
+        # 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 = []
+
+            for item in iterable:
+                # Ensure that we some kind of Version class for this item.
+                if not isinstance(item, (LegacyVersion, Version)):
+                    parsed_version = parse(item)
+                else:
+                    parsed_version = item
+
+                # Filter out any item which is parsed as a LegacyVersion
+                if isinstance(parsed_version, LegacyVersion):
+                    continue
+
+                # Store any item which is a pre-release for later unless we've
+                # already found a final version or we are accepting prereleases
+                if parsed_version.is_prerelease and not prereleases:
+                    if not filtered:
+                        found_prereleases.append(item)
+                else:
+                    filtered.append(item)
+
+            # If we've found no items except for pre-releases, then we'll go
+            # ahead and use the pre-releases
+            if not filtered and found_prereleases and prereleases is None:
+                return found_prereleases
+
+            return filtered
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2019af64f6bfc86920dcd6cb78e15051c62fe3e8
GIT binary patch
literal 28139
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py
new file mode 100644
index 00000000..88418786
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py
@@ -0,0 +1,57 @@
+# 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 .version import InvalidVersion, Version
+
+
+_canonicalize_regex = re.compile(r"[-_.]+")
+
+
+def canonicalize_name(name):
+    # This is taken from PEP 503.
+    return _canonicalize_regex.sub("-", name).lower()
+
+
+def canonicalize_version(version):
+    """
+    This is very similar to Version.__str__, but has one subtle differences
+    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/python2.7/site-packages/pip/_vendor/packaging/utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f77f5d84630fe8806b473e0e46df4eec35b4f19f
GIT binary patch
literal 2143
zcmZSn%*&NH<x)&C0~9bZFfceIFftT_L{b<SQWzO>7#MOH8KM{&a+w&Sm>6=I8KRgO
z7(sGO3^^<eQ7jB8%nT_k3^}X}xoiwkYz(>V3{mV1jHxUPSsV;0tPIVJ3{jj6DQpZa
z3=C0R3@Pkj1~)?r6GN~D2Ll5`CdhIPW(Ed^5`G2-hQy@e{G8H~)cDNYg8ZVA5|EOV
z%(Bel%>29(J_ZJcf}+g4lK8aJyyTM1{5-!*Mg|534Uo&hvYvTmi8+}mVW~x64eSgI
z3{ZA48v_GFv~Ij!tadU;4+w*7bq0A@3}ih6Llz^*&ovAT%}fkgObpEo48dTd{YpTp
zbs?@4W?*25PfpCs&&y0s%*m`ujW0?~Ppv2c8CG1HRKm)@z>t$)o?4^<(p192z`&4~
zn478r_9uua&SPL;&@U*;EK4j&)h|md(of6JNl7g#*3T}~&n`AHH#aQIGBPhSv@kEu
zsZ1}AH%T!uF)%PNNYB#`(J#m>(9O&%E=kPE(JfE3EDg*634w8ZS!!NNevy7bVsdt3
zdS+g_erZW&PO)A=Wr-jI0|SbiK~4e%XE7+~7?{980%C$f3>+lhj0_Bw0t_V#4508}
zWT<6e2+tE@U@2i_$mU`wQej|ZWUOIe2#!c+V5nsTDav93g<du@Ls1w*4I@JqGboa?
zSfEnPjG(l@n8yH>D`92GVuPlh6jp{Tc4#80VF0BZ7l`s^X0RrZ7$-vtH$yfjL(yKS
z0VynCP2dCtQ2^7#$N;v6fgy_<rs)Mt69)s-Mcg2hn-NNRU`mA<p^oQ-Ddj;^$_rC!
z2UE%gQ_72^6ym@du)l*fco-NMiklc17`PM^6cj=-GK&>5ixtXJiz*e0GjlU@5{nc{
z@)e+oRWClixTGjPUPmFRv_v5zu~;ELFI54Qx^hw#QZm!hQj1dal2ePpW|e1_WGIwm
zq$-prRw`tIl;@@7q!xpPic)h@6N^(7ic`~bQ}asnz#70=t{9Xss|{)ui$PJY5u<0I
zsjX51N}u4wt_M#M;B*bjB+?Avv=A!@if>T50Q)SAv5=V|1(Z`j$=wf<=)rnQioltt
z1eC1w48W#V3}`MW=44=Cut`tNORXp<vQq~|2*_=043zjah!<7>1%dKY5U3CvM84EU
z__7#Omg*Jc7nf8U)PiGOFD11M#0Dh=?P`NsKMk-KK-?fu6oSjL)Pnrvj1o}knOIPe
znwJ7*rsWsqCYFGswkS0Sl!CwoT~>Z(UI~Z?O?Tizv7jgwEa{h@2VsDm0G3HfEdyJT
zlb@WJ14%3(&1KNi8&r}OBo>tv4`_Inh@h99Q1^i<f?_35j$vbF6kz0KVr61u=4X^)
zF=FOtR0FYKm<gQwOSnKaM|@goNoi4Pe0&f{XAmgU1c6dv5XiV7P#yyZeGn)Tz(JXu
zpIeZblNtnyfgq3(L9(C}2hu&T;Q~rdHo5sJr8%i~AlDXy94EuX!z9Mc&&<gR0NJPE
AfdBvi

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py
new file mode 100644
index 00000000..95157a1f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py
@@ -0,0 +1,420 @@
+# 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 collections
+import itertools
+import re
+
+from ._structures import Infinity
+
+
+__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"]
+
+
+_Version = collections.namedtuple(
+    "_Version", ["epoch", "release", "dev", "pre", "post", "local"]
+)
+
+
+def parse(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
+    a valid PEP 440 version or a legacy version.
+    """
+    try:
+        return Version(version)
+    except InvalidVersion:
+        return LegacyVersion(version)
+
+
+class InvalidVersion(ValueError):
+    """
+    An invalid version was found, users should refer to PEP 440.
+    """
+
+
+class _BaseVersion(object):
+    def __hash__(self):
+        return hash(self._key)
+
+    def __lt__(self, other):
+        return self._compare(other, lambda s, o: s < o)
+
+    def __le__(self, other):
+        return self._compare(other, lambda s, o: s <= o)
+
+    def __eq__(self, other):
+        return self._compare(other, lambda s, o: s == o)
+
+    def __ge__(self, other):
+        return self._compare(other, lambda s, o: s >= o)
+
+    def __gt__(self, other):
+        return self._compare(other, lambda s, o: s > o)
+
+    def __ne__(self, other):
+        return self._compare(other, lambda s, o: s != o)
+
+    def _compare(self, other, method):
+        if not isinstance(other, _BaseVersion):
+            return NotImplemented
+
+        return method(self._key, other._key)
+
+
+class LegacyVersion(_BaseVersion):
+    def __init__(self, version):
+        self._version = str(version)
+        self._key = _legacy_cmpkey(self._version)
+
+    def __str__(self):
+        return self._version
+
+    def __repr__(self):
+        return "<LegacyVersion({0})>".format(repr(str(self)))
+
+    @property
+    def public(self):
+        return self._version
+
+    @property
+    def base_version(self):
+        return self._version
+
+    @property
+    def epoch(self):
+        return -1
+
+    @property
+    def release(self):
+        return None
+
+    @property
+    def pre(self):
+        return None
+
+    @property
+    def post(self):
+        return None
+
+    @property
+    def dev(self):
+        return None
+
+    @property
+    def local(self):
+        return None
+
+    @property
+    def is_prerelease(self):
+        return False
+
+    @property
+    def is_postrelease(self):
+        return False
+
+    @property
+    def is_devrelease(self):
+        return False
+
+
+_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE)
+
+_legacy_version_replacement_map = {
+    "pre": "c",
+    "preview": "c",
+    "-": "final-",
+    "rc": "c",
+    "dev": "@",
+}
+
+
+def _parse_version_parts(s):
+    for part in _legacy_version_component_re.split(s):
+        part = _legacy_version_replacement_map.get(part, part)
+
+        if not part or part == ".":
+            continue
+
+        if part[:1] in "0123456789":
+            # pad for numeric comparison
+            yield part.zfill(8)
+        else:
+            yield "*" + part
+
+    # ensure that alpha/beta/candidate are before final
+    yield "*final"
+
+
+def _legacy_cmpkey(version):
+    # 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,
+    # as before all PEP 440 versions.
+    epoch = -1
+
+    # This scheme is taken from pkg_resources.parse_version setuptools prior to
+    # it's adoption of the packaging library.
+    parts = []
+    for part in _parse_version_parts(version.lower()):
+        if part.startswith("*"):
+            # remove "-" before a prerelease tag
+            if part < "*final":
+                while parts and parts[-1] == "*final-":
+                    parts.pop()
+
+            # remove trailing zeros from each series of numeric parts
+            while parts and parts[-1] == "00000000":
+                parts.pop()
+
+        parts.append(part)
+    parts = tuple(parts)
+
+    return epoch, parts
+
+
+# Deliberately not anchored to the start and end of the string, to make it
+# easier for 3rd party code to reuse
+VERSION_PATTERN = r"""
+    v?
+    (?:
+        (?:(?P<epoch>[0-9]+)!)?                           # epoch
+        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
+        (?P<pre>                                          # pre-release
+            [-_\.]?
+            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
+            [-_\.]?
+            (?P<pre_n>[0-9]+)?
+        )?
+        (?P<post>                                         # post release
+            (?:-(?P<post_n1>[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?P<post_l>post|rev|r)
+                [-_\.]?
+                (?P<post_n2>[0-9]+)?
+            )
+        )?
+        (?P<dev>                                          # dev release
+            [-_\.]?
+            (?P<dev_l>dev)
+            [-_\.]?
+            (?P<dev_n>[0-9]+)?
+        )?
+    )
+    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
+"""
+
+
+class Version(_BaseVersion):
+
+    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    def __init__(self, version):
+        # Validate the version and parse it into pieces
+        match = self._regex.search(version)
+        if not match:
+            raise InvalidVersion("Invalid version: '{0}'".format(version))
+
+        # Store the parsed out pieces of the version
+        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")),
+            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")),
+            local=_parse_local_version(match.group("local")),
+        )
+
+        # Generate a key which will be used for sorting
+        self._key = _cmpkey(
+            self._version.epoch,
+            self._version.release,
+            self._version.pre,
+            self._version.post,
+            self._version.dev,
+            self._version.local,
+        )
+
+    def __repr__(self):
+        return "<Version({0})>".format(repr(str(self)))
+
+    def __str__(self):
+        parts = []
+
+        # Epoch
+        if self.epoch != 0:
+            parts.append("{0}!".format(self.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self.release))
+
+        # Pre-release
+        if self.pre is not None:
+            parts.append("".join(str(x) for x in self.pre))
+
+        # Post-release
+        if self.post is not None:
+            parts.append(".post{0}".format(self.post))
+
+        # Development release
+        if self.dev is not None:
+            parts.append(".dev{0}".format(self.dev))
+
+        # Local version segment
+        if self.local is not None:
+            parts.append("+{0}".format(self.local))
+
+        return "".join(parts)
+
+    @property
+    def epoch(self):
+        return self._version.epoch
+
+    @property
+    def release(self):
+        return self._version.release
+
+    @property
+    def pre(self):
+        return self._version.pre
+
+    @property
+    def post(self):
+        return self._version.post[1] if self._version.post else None
+
+    @property
+    def dev(self):
+        return self._version.dev[1] if self._version.dev else None
+
+    @property
+    def local(self):
+        if self._version.local:
+            return ".".join(str(x) for x in self._version.local)
+        else:
+            return None
+
+    @property
+    def public(self):
+        return str(self).split("+", 1)[0]
+
+    @property
+    def base_version(self):
+        parts = []
+
+        # Epoch
+        if self.epoch != 0:
+            parts.append("{0}!".format(self.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self.release))
+
+        return "".join(parts)
+
+    @property
+    def is_prerelease(self):
+        return self.dev is not None or self.pre is not None
+
+    @property
+    def is_postrelease(self):
+        return self.post is not None
+
+    @property
+    def is_devrelease(self):
+        return self.dev is not None
+
+
+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.
+        if number is None:
+            number = 0
+
+        # We normalize any letters to their lower case form
+        letter = letter.lower()
+
+        # We consider some words to be alternate spellings of other words and
+        # in those cases we want to normalize the spellings to our preferred
+        # spelling.
+        if letter == "alpha":
+            letter = "a"
+        elif letter == "beta":
+            letter = "b"
+        elif letter in ["c", "pre", "preview"]:
+            letter = "rc"
+        elif letter in ["rev", "r"]:
+            letter = "post"
+
+        return letter, int(number)
+    if not letter and number:
+        # We assume if we are given a number, but we are not given a letter
+        # then this is using the implicit post release syntax (e.g. 1.0-1)
+        letter = "post"
+
+        return letter, int(number)
+
+
+_local_version_separators = re.compile(r"[\._-]")
+
+
+def _parse_local_version(local):
+    """
+    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_separators.split(local)
+        )
+
+
+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(
+        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.
+    # We'll do this by abusing the pre segment, but we _only_ want to do this
+    # 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
+    # Versions without a pre-release (except as noted above) should sort after
+    # those with one.
+    elif pre is None:
+        pre = Infinity
+
+    # Versions without a post segment should sort before those with one.
+    if post is None:
+        post = -Infinity
+
+    # Versions without a development segment should sort after those with one.
+    if dev is None:
+        dev = Infinity
+
+    if local is None:
+        # Versions without a local segment should sort before those with one.
+        local = -Infinity
+    else:
+        # Versions with a local segment need that segment parsed to implement
+        # the sorting rules in PEP440.
+        # - Alpha numeric segments sort before numeric segments
+        # - Alpha numeric segments sort lexicographically
+        # - 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)
+
+    return epoch, release, pre, post, dev, local
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..17a342a8f1e279eaccce757178a183e2264e43ab
GIT binary patch
literal 19012
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py
new file mode 100644
index 00000000..9c1a098f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py
@@ -0,0 +1,4 @@
+"""Wrappers to build Python packages using PEP 517 hooks
+"""
+
+__version__ = '0.5.0'
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2969a70cd253403c0c191a4830fb562b4421e8ea
GIT binary patch
literal 308
zcmZSn%*&NH<x)&C0~9baFfceUFfbGgFfcHrFfc?hFr+XtL@_d?FfjycFoR^w7#JAB
zixLY8Qj3ZeO7azwN;7j(6ap$sGV=2j3KEmE6Vp?R6-tXU^U@UpTmuwL4b2rY^7FHc
zxr$jC7#IxnO!W->G?*9|7)sa~7#QN?Q}UDJ<4d@~?6TCN;>`TK_;?MFgAhb<9s>h|
zenC-YSz<}5epzCXep-G`N@`KDes-aLcCnGUxnW_Jk$IV+g?VvKWqNtMNs5Vyfq{WR
zdY*oWenDn|Zf0I_Nn%cpZh4|*X<!CO2#n*)Qu9*si}VXp3rr2o_2c6+^D;}~<Mj$E
YOE?%97;JL$Q%ZAE?Lf{g1`%vb0F$Io?*IS*

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py
new file mode 100644
index 00000000..d6524b66
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py
@@ -0,0 +1,207 @@
+"""This is invoked in a subprocess to call the build backend hooks.
+
+It expects:
+- Command line args: hook_name, control_dir
+- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec
+- control_dir/input.json:
+  - {"kwargs": {...}}
+
+Results:
+- control_dir/output.json
+  - {"return_val": ...}
+"""
+from glob import glob
+from importlib import import_module
+import os
+from os.path import join as pjoin
+import re
+import shutil
+import sys
+
+# This is run as a script, not a module, so it can't do a relative import
+import compat
+
+
+class BackendUnavailable(Exception):
+    """Raised if we cannot import the backend"""
+
+
+def _build_backend():
+    """Find and load the build backend"""
+    ep = os.environ['PEP517_BUILD_BACKEND']
+    mod_path, _, obj_path = ep.partition(':')
+    try:
+        obj = import_module(mod_path)
+    except ImportError:
+        raise BackendUnavailable
+    if obj_path:
+        for path_part in obj_path.split('.'):
+            obj = getattr(obj, path_part)
+    return obj
+
+
+def get_requires_for_build_wheel(config_settings):
+    """Invoke the optional get_requires_for_build_wheel hook
+
+    Returns [] if the hook is not defined.
+    """
+    backend = _build_backend()
+    try:
+        hook = backend.get_requires_for_build_wheel
+    except AttributeError:
+        return []
+    else:
+        return hook(config_settings)
+
+
+def prepare_metadata_for_build_wheel(metadata_directory, config_settings):
+    """Invoke optional prepare_metadata_for_build_wheel
+
+    Implements a fallback by building a wheel if the hook isn't defined.
+    """
+    backend = _build_backend()
+    try:
+        hook = backend.prepare_metadata_for_build_wheel
+    except AttributeError:
+        return _get_wheel_metadata_from_wheel(backend, metadata_directory,
+                                              config_settings)
+    else:
+        return hook(metadata_directory, config_settings)
+
+
+WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL'
+
+
+def _dist_info_files(whl_zip):
+    """Identify the .dist-info folder inside a wheel ZipFile."""
+    res = []
+    for path in whl_zip.namelist():
+        m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path)
+        if m:
+            res.append(path)
+    if res:
+        return res
+    raise Exception("No .dist-info folder found in wheel")
+
+
+def _get_wheel_metadata_from_wheel(
+        backend, metadata_directory, config_settings):
+    """Build a wheel and extract the metadata from it.
+
+    Fallback for when the build backend does not
+    define the 'get_wheel_metadata' hook.
+    """
+    from zipfile import ZipFile
+    whl_basename = backend.build_wheel(metadata_directory, config_settings)
+    with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'):
+        pass  # Touch marker file
+
+    whl_file = os.path.join(metadata_directory, whl_basename)
+    with ZipFile(whl_file) as zipf:
+        dist_info = _dist_info_files(zipf)
+        zipf.extractall(path=metadata_directory, members=dist_info)
+    return dist_info[0].split('/')[0]
+
+
+def _find_already_built_wheel(metadata_directory):
+    """Check for a wheel already built during the get_wheel_metadata hook.
+    """
+    if not metadata_directory:
+        return None
+    metadata_parent = os.path.dirname(metadata_directory)
+    if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)):
+        return None
+
+    whl_files = glob(os.path.join(metadata_parent, '*.whl'))
+    if not whl_files:
+        print('Found wheel built marker, but no .whl files')
+        return None
+    if len(whl_files) > 1:
+        print('Found multiple .whl files; unspecified behaviour. '
+              'Will call build_wheel.')
+        return None
+
+    # Exactly one .whl file
+    return whl_files[0]
+
+
+def build_wheel(wheel_directory, config_settings, metadata_directory=None):
+    """Invoke the mandatory build_wheel hook.
+
+    If a wheel was already built in the
+    prepare_metadata_for_build_wheel fallback, this
+    will copy it rather than rebuilding the wheel.
+    """
+    prebuilt_whl = _find_already_built_wheel(metadata_directory)
+    if prebuilt_whl:
+        shutil.copy2(prebuilt_whl, wheel_directory)
+        return os.path.basename(prebuilt_whl)
+
+    return _build_backend().build_wheel(wheel_directory, config_settings,
+                                        metadata_directory)
+
+
+def get_requires_for_build_sdist(config_settings):
+    """Invoke the optional get_requires_for_build_wheel hook
+
+    Returns [] if the hook is not defined.
+    """
+    backend = _build_backend()
+    try:
+        hook = backend.get_requires_for_build_sdist
+    except AttributeError:
+        return []
+    else:
+        return hook(config_settings)
+
+
+class _DummyException(Exception):
+    """Nothing should ever raise this exception"""
+
+
+class GotUnsupportedOperation(Exception):
+    """For internal use when backend raises UnsupportedOperation"""
+
+
+def build_sdist(sdist_directory, config_settings):
+    """Invoke the mandatory build_sdist hook."""
+    backend = _build_backend()
+    try:
+        return backend.build_sdist(sdist_directory, config_settings)
+    except getattr(backend, 'UnsupportedOperation', _DummyException):
+        raise GotUnsupportedOperation
+
+
+HOOK_NAMES = {
+    'get_requires_for_build_wheel',
+    'prepare_metadata_for_build_wheel',
+    'build_wheel',
+    'get_requires_for_build_sdist',
+    'build_sdist',
+}
+
+
+def main():
+    if len(sys.argv) < 3:
+        sys.exit("Needs args: hook_name, control_dir")
+    hook_name = sys.argv[1]
+    control_dir = sys.argv[2]
+    if hook_name not in HOOK_NAMES:
+        sys.exit("Unknown hook: %s" % hook_name)
+    hook = globals()[hook_name]
+
+    hook_input = compat.read_json(pjoin(control_dir, 'input.json'))
+
+    json_out = {'unsupported': False, 'return_val': None}
+    try:
+        json_out['return_val'] = hook(**hook_input['kwargs'])
+    except BackendUnavailable:
+        json_out['no_backend'] = True
+    except GotUnsupportedOperation:
+        json_out['unsupported'] = True
+
+    compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b07d8653db69f359aaa46de505592e6fddc3c2cb
GIT binary patch
literal 7785
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py
new file mode 100644
index 00000000..ac6c9495
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py
@@ -0,0 +1,108 @@
+"""Build a project using PEP 517 hooks.
+"""
+import argparse
+import logging
+import os
+import contextlib
+from pip._vendor import pytoml
+import shutil
+import errno
+import tempfile
+
+from .envbuild import BuildEnvironment
+from .wrappers import Pep517HookCaller
+
+log = logging.getLogger(__name__)
+
+
+@contextlib.contextmanager
+def tempdir():
+    td = tempfile.mkdtemp()
+    try:
+        yield td
+    finally:
+        shutil.rmtree(td)
+
+
+def _do_build(hooks, env, dist, dest):
+    get_requires_name = 'get_requires_for_build_{dist}'.format(**locals())
+    get_requires = getattr(hooks, get_requires_name)
+    reqs = get_requires({})
+    log.info('Got build requires: %s', reqs)
+
+    env.pip_install(reqs)
+    log.info('Installed dynamic build dependencies')
+
+    with tempdir() as td:
+        log.info('Trying to build %s in %s', dist, td)
+        build_name = 'build_{dist}'.format(**locals())
+        build = getattr(hooks, build_name)
+        filename = build(td, {})
+        source = os.path.join(td, filename)
+        shutil.move(source, os.path.join(dest, os.path.basename(filename)))
+
+
+def mkdir_p(*args, **kwargs):
+    """Like `mkdir`, but does not raise an exception if the
+    directory already exists.
+    """
+    try:
+        return os.mkdir(*args, **kwargs)
+    except OSError as exc:
+        if exc.errno != errno.EEXIST:
+            raise
+
+
+def build(source_dir, dist, dest=None):
+    pyproject = os.path.join(source_dir, 'pyproject.toml')
+    dest = os.path.join(source_dir, dest or 'dist')
+    mkdir_p(dest)
+
+    with open(pyproject) as f:
+        pyproject_data = pytoml.load(f)
+    # Ensure the mandatory data can be loaded
+    buildsys = pyproject_data['build-system']
+    requires = buildsys['requires']
+    backend = buildsys['build-backend']
+
+    hooks = Pep517HookCaller(source_dir, backend)
+
+    with BuildEnvironment() as env:
+        env.pip_install(requires)
+        _do_build(hooks, env, dist, dest)
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+    'source_dir',
+    help="A directory containing pyproject.toml",
+)
+parser.add_argument(
+    '--binary', '-b',
+    action='store_true',
+    default=False,
+)
+parser.add_argument(
+    '--source', '-s',
+    action='store_true',
+    default=False,
+)
+parser.add_argument(
+    '--out-dir', '-o',
+    help="Destination in which to save the builds relative to source dir",
+)
+
+
+def main(args):
+    # determine which dists to build
+    dists = list(filter(None, (
+        'sdist' if args.source or not args.binary else None,
+        'wheel' if args.binary or not args.source else None,
+    )))
+
+    for dist in dists:
+        build(args.source_dir, dist, args.out_dir)
+
+
+if __name__ == '__main__':
+    main(parser.parse_args())
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a275189486e3200cf5cd4e1f736594517a2c8708
GIT binary patch
literal 3865
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py
new file mode 100644
index 00000000..f4cdc6be
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py
@@ -0,0 +1,202 @@
+"""Check a project and backend by attempting to build using PEP 517 hooks.
+"""
+import argparse
+import logging
+import os
+from os.path import isfile, join as pjoin
+from pip._vendor.pytoml import TomlError, load as toml_load
+import shutil
+from subprocess import CalledProcessError
+import sys
+import tarfile
+from tempfile import mkdtemp
+import zipfile
+
+from .colorlog import enable_colourful_output
+from .envbuild import BuildEnvironment
+from .wrappers import Pep517HookCaller
+
+log = logging.getLogger(__name__)
+
+
+def check_build_sdist(hooks, build_sys_requires):
+    with BuildEnvironment() as env:
+        try:
+            env.pip_install(build_sys_requires)
+            log.info('Installed static build dependencies')
+        except CalledProcessError:
+            log.error('Failed to install static build dependencies')
+            return False
+
+        try:
+            reqs = hooks.get_requires_for_build_sdist({})
+            log.info('Got build requires: %s', reqs)
+        except Exception:
+            log.error('Failure in get_requires_for_build_sdist', exc_info=True)
+            return False
+
+        try:
+            env.pip_install(reqs)
+            log.info('Installed dynamic build dependencies')
+        except CalledProcessError:
+            log.error('Failed to install dynamic build dependencies')
+            return False
+
+        td = mkdtemp()
+        log.info('Trying to build sdist in %s', td)
+        try:
+            try:
+                filename = hooks.build_sdist(td, {})
+                log.info('build_sdist returned %r', filename)
+            except Exception:
+                log.info('Failure in build_sdist', exc_info=True)
+                return False
+
+            if not filename.endswith('.tar.gz'):
+                log.error(
+                    "Filename %s doesn't have .tar.gz extension", filename)
+                return False
+
+            path = pjoin(td, filename)
+            if isfile(path):
+                log.info("Output file %s exists", path)
+            else:
+                log.error("Output file %s does not exist", path)
+                return False
+
+            if tarfile.is_tarfile(path):
+                log.info("Output file is a tar file")
+            else:
+                log.error("Output file is not a tar file")
+                return False
+
+        finally:
+            shutil.rmtree(td)
+
+        return True
+
+
+def check_build_wheel(hooks, build_sys_requires):
+    with BuildEnvironment() as env:
+        try:
+            env.pip_install(build_sys_requires)
+            log.info('Installed static build dependencies')
+        except CalledProcessError:
+            log.error('Failed to install static build dependencies')
+            return False
+
+        try:
+            reqs = hooks.get_requires_for_build_wheel({})
+            log.info('Got build requires: %s', reqs)
+        except Exception:
+            log.error('Failure in get_requires_for_build_sdist', exc_info=True)
+            return False
+
+        try:
+            env.pip_install(reqs)
+            log.info('Installed dynamic build dependencies')
+        except CalledProcessError:
+            log.error('Failed to install dynamic build dependencies')
+            return False
+
+        td = mkdtemp()
+        log.info('Trying to build wheel in %s', td)
+        try:
+            try:
+                filename = hooks.build_wheel(td, {})
+                log.info('build_wheel returned %r', filename)
+            except Exception:
+                log.info('Failure in build_wheel', exc_info=True)
+                return False
+
+            if not filename.endswith('.whl'):
+                log.error("Filename %s doesn't have .whl extension", filename)
+                return False
+
+            path = pjoin(td, filename)
+            if isfile(path):
+                log.info("Output file %s exists", path)
+            else:
+                log.error("Output file %s does not exist", path)
+                return False
+
+            if zipfile.is_zipfile(path):
+                log.info("Output file is a zip file")
+            else:
+                log.error("Output file is not a zip file")
+                return False
+
+        finally:
+            shutil.rmtree(td)
+
+        return True
+
+
+def check(source_dir):
+    pyproject = pjoin(source_dir, 'pyproject.toml')
+    if isfile(pyproject):
+        log.info('Found pyproject.toml')
+    else:
+        log.error('Missing pyproject.toml')
+        return False
+
+    try:
+        with open(pyproject) as f:
+            pyproject_data = toml_load(f)
+        # Ensure the mandatory data can be loaded
+        buildsys = pyproject_data['build-system']
+        requires = buildsys['requires']
+        backend = buildsys['build-backend']
+        log.info('Loaded pyproject.toml')
+    except (TomlError, KeyError):
+        log.error("Invalid pyproject.toml", exc_info=True)
+        return False
+
+    hooks = Pep517HookCaller(source_dir, backend)
+
+    sdist_ok = check_build_sdist(hooks, requires)
+    wheel_ok = check_build_wheel(hooks, requires)
+
+    if not sdist_ok:
+        log.warning('Sdist checks failed; scroll up to see')
+    if not wheel_ok:
+        log.warning('Wheel checks failed')
+
+    return sdist_ok
+
+
+def main(argv=None):
+    ap = argparse.ArgumentParser()
+    ap.add_argument(
+        'source_dir',
+        help="A directory containing pyproject.toml")
+    args = ap.parse_args(argv)
+
+    enable_colourful_output()
+
+    ok = check(args.source_dir)
+
+    if ok:
+        print(ansi('Checks passed', 'green'))
+    else:
+        print(ansi('Checks failed', 'red'))
+        sys.exit(1)
+
+
+ansi_codes = {
+    'reset': '\x1b[0m',
+    'bold': '\x1b[1m',
+    'red': '\x1b[31m',
+    'green': '\x1b[32m',
+}
+
+
+def ansi(s, attr):
+    if os.name != 'nt' and sys.stdout.isatty():
+        return ansi_codes[attr] + str(s) + ansi_codes['reset']
+    else:
+        return str(s)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c6af7b287684a2f5aa1e80926f7ba64ee7062268
GIT binary patch
literal 6183
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py
new file mode 100644
index 00000000..69c8a59d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py
@@ -0,0 +1,115 @@
+"""Nicer log formatting with colours.
+
+Code copied from Tornado, Apache licensed.
+"""
+# Copyright 2012 Facebook
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import logging
+import sys
+
+try:
+    import curses
+except ImportError:
+    curses = None
+
+
+def _stderr_supports_color():
+    color = False
+    if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty():
+        try:
+            curses.setupterm()
+            if curses.tigetnum("colors") > 0:
+                color = True
+        except Exception:
+            pass
+    return color
+
+
+class LogFormatter(logging.Formatter):
+    """Log formatter with colour support
+    """
+    DEFAULT_COLORS = {
+        logging.INFO: 2,  # Green
+        logging.WARNING: 3,  # Yellow
+        logging.ERROR: 1,  # Red
+        logging.CRITICAL: 1,
+    }
+
+    def __init__(self, color=True, datefmt=None):
+        r"""
+        :arg bool color: Enables color support.
+        :arg string fmt: Log message format.
+        It will be applied to the attributes dict of log records. The
+        text between ``%(color)s`` and ``%(end_color)s`` will be colored
+        depending on the level if color support is on.
+        :arg dict colors: color mappings from logging level to terminal color
+        code
+        :arg string datefmt: Datetime format.
+        Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``.
+        .. versionchanged:: 3.2
+        Added ``fmt`` and ``datefmt`` arguments.
+        """
+        logging.Formatter.__init__(self, datefmt=datefmt)
+        self._colors = {}
+        if color and _stderr_supports_color():
+            # The curses module has some str/bytes confusion in
+            # python3. Until version 3.2.3, most methods return
+            # bytes, but only accept strings. In addition, we want to
+            # output these strings with the logging module, which
+            # works with unicode strings. The explicit calls to
+            # unicode() below are harmless in python2 but will do the
+            # right conversion in python 3.
+            fg_color = (curses.tigetstr("setaf") or
+                        curses.tigetstr("setf") or "")
+            if (3, 0) < sys.version_info < (3, 2, 3):
+                fg_color = str(fg_color, "ascii")
+
+            for levelno, code in self.DEFAULT_COLORS.items():
+                self._colors[levelno] = str(
+                    curses.tparm(fg_color, code), "ascii")
+            self._normal = str(curses.tigetstr("sgr0"), "ascii")
+
+            scr = curses.initscr()
+            self.termwidth = scr.getmaxyx()[1]
+            curses.endwin()
+        else:
+            self._normal = ''
+            # Default width is usually 80, but too wide is
+            # worse than too narrow
+            self.termwidth = 70
+
+    def formatMessage(self, record):
+        mlen = len(record.message)
+        right_text = '{initial}-{name}'.format(initial=record.levelname[0],
+                                               name=record.name)
+        if mlen + len(right_text) < self.termwidth:
+            space = ' ' * (self.termwidth - (mlen + len(right_text)))
+        else:
+            space = '  '
+
+        if record.levelno in self._colors:
+            start_color = self._colors[record.levelno]
+            end_color = self._normal
+        else:
+            start_color = end_color = ''
+
+        return record.message + space + start_color + right_text + end_color
+
+
+def enable_colourful_output(level=logging.INFO):
+    handler = logging.StreamHandler()
+    handler.setFormatter(LogFormatter())
+    logging.root.addHandler(handler)
+    logging.root.setLevel(level)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7a041facd1d3f4d008006e7675453930f1d68024
GIT binary patch
literal 3906
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py
new file mode 100644
index 00000000..01c66fc7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py
@@ -0,0 +1,23 @@
+"""Handle reading and writing JSON in UTF-8, on Python 3 and 2."""
+import json
+import sys
+
+if sys.version_info[0] >= 3:
+    # Python 3
+    def write_json(obj, path, **kwargs):
+        with open(path, 'w', encoding='utf-8') as f:
+            json.dump(obj, f, **kwargs)
+
+    def read_json(path):
+        with open(path, 'r', encoding='utf-8') as f:
+            return json.load(f)
+
+else:
+    # Python 2
+    def write_json(obj, path, **kwargs):
+        with open(path, 'wb') as f:
+            json.dump(obj, f, encoding='utf-8', **kwargs)
+
+    def read_json(path):
+        with open(path, 'rb') as f:
+            return json.load(f)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d26737f5755b99e690eddde3431818c2efc030e2
GIT binary patch
literal 1587
zcmZSn%*&NH<x)&C0~9bZFfceUFfbIyFfcHrFfc?hFr+Xtq%bk$Ffv3j!q`j<QA`Y}
zObl7f3@OYEk|`_<*{lpjZVV}`3@r={Q7jB8Y+wc}L!J;r3Okt1!jQrNX0U>c3)bKS
z*<!=Mz~GUXmy(mJP?VaOl9`vTkeHXEP+pW-0%Cgw`}-+m<|%}RxanHxDCFlU1XPw}
z<mV|EgOwTSW&Z#F|G!@*$nlxX3=9m(AosH{Ffed1Ffe$7Y%pbDU?^c=sDZgXg_)t5
ziLqabp_ZAUgpnbOiJ^vpp@x~EhKZq<iGeXZg@GY3B87n=SOa8?UkM`v14DTU$hg$J
z<b03|i&+^M7)ndhbS*SMR+fO&<rk#pff-rF`4C1*X>I}7h!T*Z{G=?fbU|WCMhP1O
z14DLsVo`cA*z`0Fkn_PraSj6mgML9#W?5oMs(x8wk$zf!PD*M~v3_=;es-~uxw&Cs
zmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4fo^7AaY<rMj&6CPWocjrNC=GM%Tn`F
z@{9BfQVUEC&GnP>a|;qn^a?6VxIo@3$}CBZ2f3Ub6k;I%Ffd9mCWE{V3Qv%Gok24C
z(6EH1320b~Fw`=_!jh4pnUNtFYbX{4feb_oy&#YUL7*T4hfhv^Vu}V>2xMsxDA>UP
z119JnI-oQPN|)fk;RXc(Ja9mc1aUwCh?&runHc&N(34mS6DYTU6B;9CLIW9Co`gS)
zf<QKcQ&kWs5e9(+2^47q9a2G{kP<`$kPw#Cqluh)Kmmj|-GG9_uLMLEC4uu9BBca@
zVq);5k{})i1_n`NziWWvr34f&@$o77$?@@!1P)5&#g)Y+AoXRbMa7x<dGVQfY5Cy5
t1DgU)<_LoR2_BT;Y;yBcN^?@}z`2!=fq{XIk%y6oNtlU~g@=uk1psr*SttMi

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py
new file mode 100644
index 00000000..f7ac5f46
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py
@@ -0,0 +1,158 @@
+"""Build wheels/sdists by installing build deps to a temporary environment.
+"""
+
+import os
+import logging
+from pip._vendor import pytoml
+import shutil
+from subprocess import check_call
+import sys
+from sysconfig import get_paths
+from tempfile import mkdtemp
+
+from .wrappers import Pep517HookCaller
+
+log = logging.getLogger(__name__)
+
+
+def _load_pyproject(source_dir):
+    with open(os.path.join(source_dir, 'pyproject.toml')) as f:
+        pyproject_data = pytoml.load(f)
+    buildsys = pyproject_data['build-system']
+    return buildsys['requires'], buildsys['build-backend']
+
+
+class BuildEnvironment(object):
+    """Context manager to install build deps in a simple temporary environment
+
+    Based on code I wrote for pip, which is MIT licensed.
+    """
+    # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file)
+    #
+    # Permission is hereby granted, free of charge, to any person obtaining
+    # a copy of this software and associated documentation files (the
+    # "Software"), to deal in the Software without restriction, including
+    # without limitation the rights to use, copy, modify, merge, publish,
+    # distribute, sublicense, and/or sell copies of the Software, and to
+    # permit persons to whom the Software is furnished to do so, subject to
+    # the following conditions:
+    #
+    # The above copyright notice and this permission notice shall be
+    # included in all copies or substantial portions of the Software.
+    #
+    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+    # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+    # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+    # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+    # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    path = None
+
+    def __init__(self, cleanup=True):
+        self._cleanup = cleanup
+
+    def __enter__(self):
+        self.path = mkdtemp(prefix='pep517-build-env-')
+        log.info('Temporary build environment: %s', self.path)
+
+        self.save_path = os.environ.get('PATH', None)
+        self.save_pythonpath = os.environ.get('PYTHONPATH', None)
+
+        install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix'
+        install_dirs = get_paths(install_scheme, vars={
+            'base': self.path,
+            'platbase': self.path,
+        })
+
+        scripts = install_dirs['scripts']
+        if self.save_path:
+            os.environ['PATH'] = scripts + os.pathsep + self.save_path
+        else:
+            os.environ['PATH'] = scripts + os.pathsep + os.defpath
+
+        if install_dirs['purelib'] == install_dirs['platlib']:
+            lib_dirs = install_dirs['purelib']
+        else:
+            lib_dirs = install_dirs['purelib'] + os.pathsep + \
+                install_dirs['platlib']
+        if self.save_pythonpath:
+            os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \
+                self.save_pythonpath
+        else:
+            os.environ['PYTHONPATH'] = lib_dirs
+
+        return self
+
+    def pip_install(self, reqs):
+        """Install dependencies into this env by calling pip in a subprocess"""
+        if not reqs:
+            return
+        log.info('Calling pip to install %s', reqs)
+        check_call([
+            sys.executable, '-m', 'pip', 'install', '--ignore-installed',
+            '--prefix', self.path] + list(reqs))
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        needs_cleanup = (
+            self._cleanup and
+            self.path is not None and
+            os.path.isdir(self.path)
+        )
+        if needs_cleanup:
+            shutil.rmtree(self.path)
+
+        if self.save_path is None:
+            os.environ.pop('PATH', None)
+        else:
+            os.environ['PATH'] = self.save_path
+
+        if self.save_pythonpath is None:
+            os.environ.pop('PYTHONPATH', None)
+        else:
+            os.environ['PYTHONPATH'] = self.save_pythonpath
+
+
+def build_wheel(source_dir, wheel_dir, config_settings=None):
+    """Build a wheel from a source directory using PEP 517 hooks.
+
+    :param str source_dir: Source directory containing pyproject.toml
+    :param str wheel_dir: Target directory to create wheel in
+    :param dict config_settings: Options to pass to build backend
+
+    This is a blocking function which will run pip in a subprocess to install
+    build requirements.
+    """
+    if config_settings is None:
+        config_settings = {}
+    requires, backend = _load_pyproject(source_dir)
+    hooks = Pep517HookCaller(source_dir, backend)
+
+    with BuildEnvironment() as env:
+        env.pip_install(requires)
+        reqs = hooks.get_requires_for_build_wheel(config_settings)
+        env.pip_install(reqs)
+        return hooks.build_wheel(wheel_dir, config_settings)
+
+
+def build_sdist(source_dir, sdist_dir, config_settings=None):
+    """Build an sdist from a source directory using PEP 517 hooks.
+
+    :param str source_dir: Source directory containing pyproject.toml
+    :param str sdist_dir: Target directory to place sdist in
+    :param dict config_settings: Options to pass to build backend
+
+    This is a blocking function which will run pip in a subprocess to install
+    build requirements.
+    """
+    if config_settings is None:
+        config_settings = {}
+    requires, backend = _load_pyproject(source_dir)
+    hooks = Pep517HookCaller(source_dir, backend)
+
+    with BuildEnvironment() as env:
+        env.pip_install(requires)
+        reqs = hooks.get_requires_for_build_sdist(config_settings)
+        env.pip_install(reqs)
+        return hooks.build_sdist(sdist_dir, config_settings)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5b93c3a91b88d8a845fd8f2c9df47bc0a1d3c858
GIT binary patch
literal 5625
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py
new file mode 100644
index 00000000..b14b8991
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py
@@ -0,0 +1,163 @@
+from contextlib import contextmanager
+import os
+from os.path import dirname, abspath, join as pjoin
+import shutil
+from subprocess import check_call
+import sys
+from tempfile import mkdtemp
+
+from . import compat
+
+_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py')
+
+
+@contextmanager
+def tempdir():
+    td = mkdtemp()
+    try:
+        yield td
+    finally:
+        shutil.rmtree(td)
+
+
+class BackendUnavailable(Exception):
+    """Will be raised if the backend cannot be imported in the hook process."""
+
+
+class UnsupportedOperation(Exception):
+    """May be raised by build_sdist if the backend indicates that it can't."""
+
+
+def default_subprocess_runner(cmd, cwd=None, extra_environ=None):
+    """The default method of calling the wrapper subprocess."""
+    env = os.environ.copy()
+    if extra_environ:
+        env.update(extra_environ)
+
+    check_call(cmd, cwd=cwd, env=env)
+
+
+class Pep517HookCaller(object):
+    """A wrapper around a source directory to be built with a PEP 517 backend.
+
+    source_dir : The path to the source directory, containing pyproject.toml.
+    backend : The build backend spec, as per PEP 517, from pyproject.toml.
+    """
+    def __init__(self, source_dir, build_backend):
+        self.source_dir = abspath(source_dir)
+        self.build_backend = build_backend
+        self._subprocess_runner = default_subprocess_runner
+
+    # TODO: Is this over-engineered? Maybe frontends only need to
+    #       set this when creating the wrapper, not on every call.
+    @contextmanager
+    def subprocess_runner(self, runner):
+        prev = self._subprocess_runner
+        self._subprocess_runner = runner
+        yield
+        self._subprocess_runner = prev
+
+    def get_requires_for_build_wheel(self, config_settings=None):
+        """Identify packages required for building a wheel
+
+        Returns a list of dependency specifications, e.g.:
+            ["wheel >= 0.25", "setuptools"]
+
+        This does not include requirements specified in pyproject.toml.
+        It returns the result of calling the equivalently named hook in a
+        subprocess.
+        """
+        return self._call_hook('get_requires_for_build_wheel', {
+            'config_settings': config_settings
+        })
+
+    def prepare_metadata_for_build_wheel(
+            self, metadata_directory, config_settings=None):
+        """Prepare a *.dist-info folder with metadata for this project.
+
+        Returns the name of the newly created folder.
+
+        If the build backend defines a hook with this name, it will be called
+        in a subprocess. If not, the backend will be asked to build a wheel,
+        and the dist-info extracted from that.
+        """
+        return self._call_hook('prepare_metadata_for_build_wheel', {
+            'metadata_directory': abspath(metadata_directory),
+            'config_settings': config_settings,
+        })
+
+    def build_wheel(
+            self, wheel_directory, config_settings=None,
+            metadata_directory=None):
+        """Build a wheel from this project.
+
+        Returns the name of the newly created file.
+
+        In general, this will call the 'build_wheel' hook in the backend.
+        However, if that was previously called by
+        'prepare_metadata_for_build_wheel', and the same metadata_directory is
+        used, the previously built wheel will be copied to wheel_directory.
+        """
+        if metadata_directory is not None:
+            metadata_directory = abspath(metadata_directory)
+        return self._call_hook('build_wheel', {
+            'wheel_directory': abspath(wheel_directory),
+            'config_settings': config_settings,
+            'metadata_directory': metadata_directory,
+        })
+
+    def get_requires_for_build_sdist(self, config_settings=None):
+        """Identify packages required for building a wheel
+
+        Returns a list of dependency specifications, e.g.:
+            ["setuptools >= 26"]
+
+        This does not include requirements specified in pyproject.toml.
+        It returns the result of calling the equivalently named hook in a
+        subprocess.
+        """
+        return self._call_hook('get_requires_for_build_sdist', {
+            'config_settings': config_settings
+        })
+
+    def build_sdist(self, sdist_directory, config_settings=None):
+        """Build an sdist from this project.
+
+        Returns the name of the newly created file.
+
+        This calls the 'build_sdist' backend hook in a subprocess.
+        """
+        return self._call_hook('build_sdist', {
+            'sdist_directory': abspath(sdist_directory),
+            'config_settings': config_settings,
+        })
+
+    def _call_hook(self, hook_name, kwargs):
+        # On Python 2, pytoml returns Unicode values (which is correct) but the
+        # environment passed to check_call needs to contain string values. We
+        # convert here by encoding using ASCII (the backend can only contain
+        # letters, digits and _, . and : characters, and will be used as a
+        # Python identifier, so non-ASCII content is wrong on Python 2 in
+        # any case).
+        if sys.version_info[0] == 2:
+            build_backend = self.build_backend.encode('ASCII')
+        else:
+            build_backend = self.build_backend
+
+        with tempdir() as td:
+            compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'),
+                              indent=2)
+
+            # Run the hook in a subprocess
+            self._subprocess_runner(
+                [sys.executable, _in_proc_script, hook_name, td],
+                cwd=self.source_dir,
+                extra_environ={'PEP517_BUILD_BACKEND': build_backend}
+            )
+
+            data = compat.read_json(pjoin(td, 'output.json'))
+            if data.get('unsupported'):
+                raise UnsupportedOperation
+            if data.get('no_backend'):
+                raise BackendUnavailable
+            return data['return_val']
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0a31bf690e047b63503defc334af83f9085ab4ae
GIT binary patch
literal 7144
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py
new file mode 100644
index 00000000..fdd40de4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py
@@ -0,0 +1,3286 @@
+# coding: utf-8
+"""
+Package resource API
+--------------------
+
+A resource is a logical file contained within a package, or a logical
+subdirectory thereof.  The package resource API expects resource names
+to have their path parts separated with ``/``, *not* whatever the local
+path separator is.  Do not use os.path operations to manipulate resource
+names being passed into the API.
+
+The package resource API is designed to work with normal filesystem packages,
+.egg files, and unpacked .egg files.  It can also work in a limited way with
+.zip files and with custom PEP 302 loaders that support the ``get_data()``
+method.
+"""
+
+from __future__ import absolute_import
+
+import sys
+import os
+import io
+import time
+import re
+import types
+import zipfile
+import zipimport
+import warnings
+import stat
+import functools
+import pkgutil
+import operator
+import platform
+import collections
+import plistlib
+import email.parser
+import errno
+import tempfile
+import textwrap
+import itertools
+import inspect
+import ntpath
+import posixpath
+from pkgutil import get_importer
+
+try:
+    import _imp
+except ImportError:
+    # Python 3.2 compatibility
+    import imp as _imp
+
+try:
+    FileExistsError
+except NameError:
+    FileExistsError = OSError
+
+from pip._vendor import six
+from pip._vendor.six.moves import urllib, map, filter
+
+# capture these to bypass sandboxing
+from os import utime
+try:
+    from os import mkdir, rename, unlink
+    WRITE_SUPPORT = True
+except ImportError:
+    # no write support, probably under GAE
+    WRITE_SUPPORT = False
+
+from os import open as os_open
+from os.path import isdir, split
+
+try:
+    import importlib.machinery as importlib_machinery
+    # access attribute to force import under delayed import mechanisms.
+    importlib_machinery.__name__
+except ImportError:
+    importlib_machinery = None
+
+from . import py31compat
+from pip._vendor import appdirs
+from pip._vendor import packaging
+__import__('pip._vendor.packaging.version')
+__import__('pip._vendor.packaging.specifiers')
+__import__('pip._vendor.packaging.requirements')
+__import__('pip._vendor.packaging.markers')
+
+
+__metaclass__ = type
+
+
+if (3, 0) < sys.version_info < (3, 4):
+    raise RuntimeError("Python 3.4 or later is required")
+
+if six.PY2:
+    # Those builtin exceptions are only defined in Python 3
+    PermissionError = None
+    NotADirectoryError = None
+
+# declare some globals that will be defined later to
+# satisfy the linters.
+require = None
+working_set = None
+add_activation_listener = None
+resources_stream = None
+cleanup_resources = None
+resource_dir = None
+resource_stream = None
+set_extraction_path = None
+resource_isdir = None
+resource_string = None
+iter_entry_points = None
+resource_listdir = None
+resource_filename = None
+resource_exists = None
+_distribution_finders = None
+_namespace_handlers = None
+_namespace_packages = None
+
+
+class PEP440Warning(RuntimeWarning):
+    """
+    Used when there is an issue with a version or specifier not complying with
+    PEP 440.
+    """
+
+
+def parse_version(v):
+    try:
+        return packaging.version.Version(v)
+    except packaging.version.InvalidVersion:
+        return packaging.version.LegacyVersion(v)
+
+
+_state_vars = {}
+
+
+def _declare_state(vartype, **kw):
+    globals().update(kw)
+    _state_vars.update(dict.fromkeys(kw, vartype))
+
+
+def __getstate__():
+    state = {}
+    g = globals()
+    for k, v in _state_vars.items():
+        state[k] = g['_sget_' + v](g[k])
+    return state
+
+
+def __setstate__(state):
+    g = globals()
+    for k, v in state.items():
+        g['_sset_' + _state_vars[k]](k, g[k], v)
+    return state
+
+
+def _sget_dict(val):
+    return val.copy()
+
+
+def _sset_dict(key, ob, state):
+    ob.clear()
+    ob.update(state)
+
+
+def _sget_object(val):
+    return val.__getstate__()
+
+
+def _sset_object(key, ob, state):
+    ob.__setstate__(state)
+
+
+_sget_none = _sset_none = lambda *args: None
+
+
+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
+    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
+    current version of the OS.
+
+    If this condition occurs for any other platform with a version in its
+    platform strings, this function should be extended accordingly.
+    """
+    plat = get_build_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))
+        except ValueError:
+            # not Mac OS X
+            pass
+    return plat
+
+
+__all__ = [
+    # Basic resource access and distribution/entry point discovery
+    'require', 'run_script', 'get_provider', 'get_distribution',
+    'load_entry_point', 'get_entry_map', 'get_entry_info',
+    'iter_entry_points',
+    'resource_string', 'resource_stream', 'resource_filename',
+    'resource_listdir', 'resource_exists', 'resource_isdir',
+
+    # Environmental control
+    'declare_namespace', 'working_set', 'add_activation_listener',
+    'find_distributions', 'set_extraction_path', 'cleanup_resources',
+    'get_default_cache',
+
+    # Primary implementation classes
+    'Environment', 'WorkingSet', 'ResourceManager',
+    'Distribution', 'Requirement', 'EntryPoint',
+
+    # Exceptions
+    'ResolutionError', 'VersionConflict', 'DistributionNotFound',
+    'UnknownExtra', 'ExtractionError',
+
+    # Warnings
+    'PEP440Warning',
+
+    # Parsing functions and string utilities
+    'parse_requirements', 'parse_version', 'safe_name', 'safe_version',
+    'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections',
+    'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker',
+
+    # filesystem utilities
+    'ensure_directory', 'normalize_path',
+
+    # Distribution "precedence" constants
+    'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST',
+
+    # "Provider" interfaces, implementations, and registration/lookup APIs
+    'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
+    'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
+    'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
+    'register_finder', 'register_namespace_handler', 'register_loader_type',
+    'fixup_namespace_packages', 'get_importer',
+
+    # Warnings
+    'PkgResourcesDeprecationWarning',
+
+    # Deprecated/backward compatibility only
+    'run_main', 'AvailableDistributions',
+]
+
+
+class ResolutionError(Exception):
+    """Abstract base for dependency resolution errors"""
+
+    def __repr__(self):
+        return self.__class__.__name__ + repr(self.args)
+
+
+class VersionConflict(ResolutionError):
+    """
+    An already-installed version conflicts with the requested version.
+
+    Should be initialized with the installed Distribution and the requested
+    Requirement.
+    """
+
+    _template = "{self.dist} is installed but {self.req} is required"
+
+    @property
+    def dist(self):
+        return self.args[0]
+
+    @property
+    def req(self):
+        return self.args[1]
+
+    def report(self):
+        return self._template.format(**locals())
+
+    def with_context(self, required_by):
+        """
+        If required_by is non-empty, return a version of self that is a
+        ContextualVersionConflict.
+        """
+        if not required_by:
+            return self
+        args = self.args + (required_by,)
+        return ContextualVersionConflict(*args)
+
+
+class ContextualVersionConflict(VersionConflict):
+    """
+    A VersionConflict that accepts a third parameter, the set of the
+    requirements that required the installed Distribution.
+    """
+
+    _template = VersionConflict._template + ' by {self.required_by}'
+
+    @property
+    def required_by(self):
+        return self.args[2]
+
+
+class DistributionNotFound(ResolutionError):
+    """A requested distribution was not found"""
+
+    _template = ("The '{self.req}' distribution was not found "
+                 "and is required by {self.requirers_str}")
+
+    @property
+    def req(self):
+        return self.args[0]
+
+    @property
+    def requirers(self):
+        return self.args[1]
+
+    @property
+    def requirers_str(self):
+        if not self.requirers:
+            return 'the application'
+        return ', '.join(self.requirers)
+
+    def report(self):
+        return self._template.format(**locals())
+
+    def __str__(self):
+        return self.report()
+
+
+class UnknownExtra(ResolutionError):
+    """Distribution doesn't have an "extra feature" of the given name"""
+
+
+_provider_factories = {}
+
+PY_MAJOR = sys.version[:3]
+EGG_DIST = 3
+BINARY_DIST = 2
+SOURCE_DIST = 1
+CHECKOUT_DIST = 0
+DEVELOP_DIST = -1
+
+
+def register_loader_type(loader_type, provider_factory):
+    """Register `provider_factory` to make providers for `loader_type`
+
+    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
+    and `provider_factory` is a function that, passed a *module* object,
+    returns an ``IResourceProvider`` for that module.
+    """
+    _provider_factories[loader_type] = provider_factory
+
+
+def get_provider(moduleOrReq):
+    """Return an IResourceProvider for the named module or requirement"""
+    if isinstance(moduleOrReq, Requirement):
+        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
+    try:
+        module = sys.modules[moduleOrReq]
+    except KeyError:
+        __import__(moduleOrReq)
+        module = sys.modules[moduleOrReq]
+    loader = getattr(module, '__loader__', None)
+    return _find_adapter(_provider_factories, loader)(module)
+
+
+def _macosx_vers(_cache=[]):
+    if not _cache:
+        version = platform.mac_ver()[0]
+        # fallback for MacPorts
+        if version == '':
+            plist = '/System/Library/CoreServices/SystemVersion.plist'
+            if os.path.exists(plist):
+                if hasattr(plistlib, 'readPlist'):
+                    plist_content = plistlib.readPlist(plist)
+                    if 'ProductVersion' in plist_content:
+                        version = plist_content['ProductVersion']
+
+        _cache.append(version.split('.'))
+    return _cache[0]
+
+
+def _macosx_arch(machine):
+    return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
+
+
+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.
+    """
+    from sysconfig import get_platform
+
+    plat = get_platform()
+    if sys.platform == "darwin" and not plat.startswith('macosx-'):
+        try:
+            version = _macosx_vers()
+            machine = os.uname()[4].replace(" ", "_")
+            return "macosx-%d.%d-%s" % (
+                int(version[0]), int(version[1]),
+                _macosx_arch(machine),
+            )
+        except ValueError:
+            # if someone is running a non-Mac darwin system, this will fall
+            # through to the default implementation
+            pass
+    return plat
+
+
+macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
+darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
+# XXX backward compat
+get_platform = get_build_platform
+
+
+def compatible_platforms(provided, required):
+    """Can code for the `provided` platform run on the `required` platform?
+
+    Returns true if either platform is ``None``, or the platforms are equal.
+
+    XXX Needs compatibility checks for Linux and other unixy OSes.
+    """
+    if provided is None or required is None or provided == required:
+        # easy case
+        return True
+
+    # Mac OS X special cases
+    reqMac = macosVersionString.match(required)
+    if reqMac:
+        provMac = macosVersionString.match(provided)
+
+        # is this a Mac package?
+        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.
+            provDarwin = darwinVersionString.match(provided)
+            if provDarwin:
+                dversion = int(provDarwin.group(1))
+                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
+                if dversion == 7 and macosversion >= "10.3" or \
+                        dversion == 8 and macosversion >= "10.4":
+                    return True
+            # egg isn't macosx or legacy darwin
+            return False
+
+        # are they the same major version and machine type?
+        if provMac.group(1) != reqMac.group(1) or \
+                provMac.group(3) != reqMac.group(3):
+            return False
+
+        # is the required OS major update >= the provided one?
+        if int(provMac.group(2)) > int(reqMac.group(2)):
+            return False
+
+        return True
+
+    # XXX Linux and other platforms' special cases should go here
+    return False
+
+
+def run_script(dist_spec, script_name):
+    """Locate distribution `dist_spec` and run its `script_name` script"""
+    ns = sys._getframe(1).f_globals
+    name = ns['__name__']
+    ns.clear()
+    ns['__name__'] = name
+    require(dist_spec)[0].run_script(script_name, ns)
+
+
+# backward compatibility
+run_main = run_script
+
+
+def get_distribution(dist):
+    """Return a current distribution object for a Requirement or string"""
+    if isinstance(dist, six.string_types):
+        dist = Requirement.parse(dist)
+    if isinstance(dist, Requirement):
+        dist = get_provider(dist)
+    if not isinstance(dist, Distribution):
+        raise TypeError("Expected string, Requirement, or Distribution", dist)
+    return dist
+
+
+def load_entry_point(dist, group, name):
+    """Return `name` entry point of `group` for `dist` or raise ImportError"""
+    return get_distribution(dist).load_entry_point(group, name)
+
+
+def get_entry_map(dist, group=None):
+    """Return the entry point map for `group`, or the full entry map"""
+    return get_distribution(dist).get_entry_map(group)
+
+
+def get_entry_info(dist, group, name):
+    """Return the EntryPoint object for `group`+`name`, or ``None``"""
+    return get_distribution(dist).get_entry_info(group, name)
+
+
+class IMetadataProvider:
+    def has_metadata(name):
+        """Does the package's distribution contain the named metadata?"""
+
+    def get_metadata(name):
+        """The named metadata resource as a string"""
+
+    def get_metadata_lines(name):
+        """Yield named metadata resource as list of non-blank non-comment lines
+
+       Leading and trailing whitespace is stripped from each line, and lines
+       with ``#`` as the first non-blank character are omitted."""
+
+    def metadata_isdir(name):
+        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
+
+    def metadata_listdir(name):
+        """List of metadata names in the directory (like ``os.listdir()``)"""
+
+    def run_script(script_name, namespace):
+        """Execute the named script in the supplied namespace dictionary"""
+
+
+class IResourceProvider(IMetadataProvider):
+    """An object that provides access to package resources"""
+
+    def get_resource_filename(manager, resource_name):
+        """Return a true filesystem path for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_stream(manager, resource_name):
+        """Return a readable file-like object for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_string(manager, resource_name):
+        """Return a string containing the contents of `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def has_resource(resource_name):
+        """Does the package contain the named resource?"""
+
+    def resource_isdir(resource_name):
+        """Is the named resource a directory?  (like ``os.path.isdir()``)"""
+
+    def resource_listdir(resource_name):
+        """List of resource names in the directory (like ``os.listdir()``)"""
+
+
+class WorkingSet:
+    """A collection of active distributions on sys.path (or a similar list)"""
+
+    def __init__(self, entries=None):
+        """Create working set from list of path entries (default=sys.path)"""
+        self.entries = []
+        self.entry_keys = {}
+        self.by_key = {}
+        self.callbacks = []
+
+        if entries is None:
+            entries = sys.path
+
+        for entry in entries:
+            self.add_entry(entry)
+
+    @classmethod
+    def _build_master(cls):
+        """
+        Prepare the master working set.
+        """
+        ws = cls()
+        try:
+            from __main__ import __requires__
+        except ImportError:
+            # The main program does not list any requirements
+            return ws
+
+        # ensure the requirements are met
+        try:
+            ws.require(__requires__)
+        except VersionConflict:
+            return cls._build_from_requirements(__requires__)
+
+        return ws
+
+    @classmethod
+    def _build_from_requirements(cls, req_spec):
+        """
+        Build a working set from a requirement spec. Rewrites sys.path.
+        """
+        # try it without defaults already on sys.path
+        # by starting with an empty path
+        ws = cls([])
+        reqs = parse_requirements(req_spec)
+        dists = ws.resolve(reqs, Environment())
+        for dist in dists:
+            ws.add(dist)
+
+        # add any missing entries from sys.path
+        for entry in sys.path:
+            if entry not in ws.entries:
+                ws.add_entry(entry)
+
+        # then copy back to sys.path
+        sys.path[:] = ws.entries
+        return ws
+
+    def add_entry(self, entry):
+        """Add a path item to ``.entries``, finding any distributions on it
+
+        ``find_distributions(entry, True)`` is used to find distributions
+        corresponding to the path entry, and they are added.  `entry` is
+        always appended to ``.entries``, even if it is already present.
+        (This is because ``sys.path`` can contain the same value more than
+        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
+        equal ``sys.path``.)
+        """
+        self.entry_keys.setdefault(entry, [])
+        self.entries.append(entry)
+        for dist in find_distributions(entry, True):
+            self.add(dist, entry, False)
+
+    def __contains__(self, dist):
+        """True if `dist` is the active distribution for its project"""
+        return self.by_key.get(dist.key) == dist
+
+    def find(self, req):
+        """Find a distribution matching requirement `req`
+
+        If there is an active distribution for the requested project, this
+        returns it as long as it meets the version requirement specified by
+        `req`.  But, if there is an active distribution for the project and it
+        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
+        If there is no active distribution for the requested project, ``None``
+        is returned.
+        """
+        dist = self.by_key.get(req.key)
+        if dist is not None and dist not in req:
+            # XXX add more info
+            raise VersionConflict(dist, req)
+        return dist
+
+    def iter_entry_points(self, group, name=None):
+        """Yield entry point objects from `group` matching `name`
+
+        If `name` is None, yields all entry points in `group` from all
+        distributions in the working set, otherwise only ones matching
+        both `group` and `name` are yielded (in distribution order).
+        """
+        return (
+            entry
+            for dist in self
+            for entry in dist.get_entry_map(group).values()
+            if name is None or name == entry.name
+        )
+
+    def run_script(self, requires, script_name):
+        """Locate distribution for `requires` and run `script_name` script"""
+        ns = sys._getframe(1).f_globals
+        name = ns['__name__']
+        ns.clear()
+        ns['__name__'] = name
+        self.require(requires)[0].run_script(script_name, ns)
+
+    def __iter__(self):
+        """Yield distributions for non-duplicate projects in the working set
+
+        The yield order is the order in which the items' path entries were
+        added to the working set.
+        """
+        seen = {}
+        for item in self.entries:
+            if item not in self.entry_keys:
+                # workaround a cache issue
+                continue
+
+            for key in self.entry_keys[item]:
+                if key not in seen:
+                    seen[key] = 1
+                    yield self.by_key[key]
+
+    def add(self, dist, entry=None, insert=True, replace=False):
+        """Add `dist` to working set, associated with `entry`
+
+        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
+        On exit from this routine, `entry` is added to the end of the working
+        set's ``.entries`` (if it wasn't already present).
+
+        `dist` is only added to the working set if it's for a project that
+        doesn't already have a distribution in the set, unless `replace=True`.
+        If it's added, any callbacks registered with the ``subscribe()`` method
+        will be called.
+        """
+        if insert:
+            dist.insert_on(self.entries, entry, replace=replace)
+
+        if entry is None:
+            entry = dist.location
+        keys = self.entry_keys.setdefault(entry, [])
+        keys2 = self.entry_keys.setdefault(dist.location, [])
+        if not replace and dist.key in self.by_key:
+            # ignore hidden distros
+            return
+
+        self.by_key[dist.key] = dist
+        if dist.key not in keys:
+            keys.append(dist.key)
+        if dist.key not in keys2:
+            keys2.append(dist.key)
+        self._added_new(dist)
+
+    def resolve(self, requirements, env=None, installer=None,
+                replace_conflicting=False, extras=None):
+        """List all distributions needed to (recursively) meet `requirements`
+
+        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
+        if supplied, should be an ``Environment`` instance.  If
+        not supplied, it defaults to all distributions available within any
+        entry or distribution in the working set.  `installer`, if supplied,
+        will be invoked with each requirement that cannot be met by an
+        already-installed distribution; it should return a ``Distribution`` or
+        ``None``.
+
+        Unless `replace_conflicting=True`, raises a VersionConflict exception
+        if
+        any requirements are found on the path that have the correct name but
+        the wrong version.  Otherwise, if an `installer` is supplied it will be
+        invoked to obtain the correct version of the requirement and activate
+        it.
+
+        `extras` is a list of the extras to be used with these requirements.
+        This is important because extra requirements may look like `my_req;
+        extra = "my_extra"`, which would otherwise be interpreted as a purely
+        optional requirement.  Instead, we want to be able to assert that these
+        requirements are truly required.
+        """
+
+        # set up the stack
+        requirements = list(requirements)[::-1]
+        # set of processed requirements
+        processed = {}
+        # key -> dist
+        best = {}
+        to_activate = []
+
+        req_extras = _ReqExtras()
+
+        # Mapping of requirement to set of distributions that required it;
+        # useful for reporting info about conflicts.
+        required_by = collections.defaultdict(set)
+
+        while requirements:
+            # process dependencies breadth-first
+            req = requirements.pop(0)
+            if req in processed:
+                # Ignore cyclic or redundant dependencies
+                continue
+
+            if not req_extras.markers_pass(req, extras):
+                continue
+
+            dist = best.get(req.key)
+            if dist is None:
+                # Find the best distribution and add it to the map
+                dist = self.by_key.get(req.key)
+                if dist is None or (dist not in req and replace_conflicting):
+                    ws = self
+                    if env is None:
+                        if dist is None:
+                            env = Environment(self.entries)
+                        else:
+                            # Use an empty environment and workingset to avoid
+                            # any further conflicts with the conflicting
+                            # distribution
+                            env = Environment([])
+                            ws = WorkingSet([])
+                    dist = best[req.key] = env.best_match(
+                        req, ws, installer,
+                        replace_conflicting=replace_conflicting
+                    )
+                    if dist is None:
+                        requirers = required_by.get(req, None)
+                        raise DistributionNotFound(req, requirers)
+                to_activate.append(dist)
+            if dist not in req:
+                # Oops, the "best" so far conflicts with a dependency
+                dependent_req = required_by[req]
+                raise VersionConflict(dist, req).with_context(dependent_req)
+
+            # push the new requirements onto the stack
+            new_requirements = dist.requires(req.extras)[::-1]
+            requirements.extend(new_requirements)
+
+            # Register the new requirements needed by req
+            for new_requirement in new_requirements:
+                required_by[new_requirement].add(req.project_name)
+                req_extras[new_requirement] = req.extras
+
+            processed[req] = True
+
+        # return list of distros to activate
+        return to_activate
+
+    def find_plugins(
+            self, plugin_env, full_env=None, installer=None, fallback=True):
+        """Find all activatable distributions in `plugin_env`
+
+        Example usage::
+
+            distributions, errors = working_set.find_plugins(
+                Environment(plugin_dirlist)
+            )
+            # add plugins+libs to sys.path
+            map(working_set.add, distributions)
+            # display errors
+            print('Could not load', errors)
+
+        The `plugin_env` should be an ``Environment`` instance that contains
+        only distributions that are in the project's "plugin directory" or
+        directories. The `full_env`, if supplied, should be an ``Environment``
+        contains all currently-available distributions.  If `full_env` is not
+        supplied, one is created automatically from the ``WorkingSet`` this
+        method is called on, which will typically mean that every directory on
+        ``sys.path`` will be scanned for distributions.
+
+        `installer` is a standard installer callback as used by the
+        ``resolve()`` method. The `fallback` flag indicates whether we should
+        attempt to resolve older versions of a plugin if the newest version
+        cannot be resolved.
+
+        This method returns a 2-tuple: (`distributions`, `error_info`), where
+        `distributions` is a list of the distributions found in `plugin_env`
+        that were loadable, along with any other distributions that are needed
+        to resolve their dependencies.  `error_info` is a dictionary mapping
+        unloadable plugin distributions to an exception instance describing the
+        error that occurred. Usually this will be a ``DistributionNotFound`` or
+        ``VersionConflict`` instance.
+        """
+
+        plugin_projects = list(plugin_env)
+        # scan project names in alphabetic order
+        plugin_projects.sort()
+
+        error_info = {}
+        distributions = {}
+
+        if full_env is None:
+            env = Environment(self.entries)
+            env += plugin_env
+        else:
+            env = full_env + plugin_env
+
+        shadow_set = self.__class__([])
+        # put all our entries in shadow_set
+        list(map(shadow_set.add, self))
+
+        for project_name in plugin_projects:
+
+            for dist in plugin_env[project_name]:
+
+                req = [dist.as_requirement()]
+
+                try:
+                    resolvees = shadow_set.resolve(req, env, installer)
+
+                except ResolutionError as v:
+                    # save error info
+                    error_info[dist] = v
+                    if fallback:
+                        # try the next older version of project
+                        continue
+                    else:
+                        # give up on this project, keep going
+                        break
+
+                else:
+                    list(map(shadow_set.add, resolvees))
+                    distributions.update(dict.fromkeys(resolvees))
+
+                    # success, no need to try any more versions of this project
+                    break
+
+        distributions = list(distributions)
+        distributions.sort()
+
+        return distributions, error_info
+
+    def require(self, *requirements):
+        """Ensure that distributions matching `requirements` are activated
+
+        `requirements` must be a string or a (possibly-nested) sequence
+        thereof, specifying the distributions and versions required.  The
+        return value is a sequence of the distributions that needed to be
+        activated to fulfill the requirements; all relevant distributions are
+        included, even if they were already activated in this working set.
+        """
+        needed = self.resolve(parse_requirements(requirements))
+
+        for dist in needed:
+            self.add(dist)
+
+        return needed
+
+    def subscribe(self, callback, existing=True):
+        """Invoke `callback` for all distributions
+
+        If `existing=True` (default),
+        call on all existing ones, as well.
+        """
+        if callback in self.callbacks:
+            return
+        self.callbacks.append(callback)
+        if not existing:
+            return
+        for dist in self:
+            callback(dist)
+
+    def _added_new(self, dist):
+        for callback in self.callbacks:
+            callback(dist)
+
+    def __getstate__(self):
+        return (
+            self.entries[:], self.entry_keys.copy(), self.by_key.copy(),
+            self.callbacks[:]
+        )
+
+    def __setstate__(self, e_k_b_c):
+        entries, keys, by_key, callbacks = e_k_b_c
+        self.entries = entries[:]
+        self.entry_keys = keys.copy()
+        self.by_key = by_key.copy()
+        self.callbacks = callbacks[:]
+
+
+class _ReqExtras(dict):
+    """
+    Map each requirement to the extras that demanded it.
+    """
+
+    def markers_pass(self, req, extras=None):
+        """
+        Evaluate markers for req against each extra that
+        demanded it.
+
+        Return False if the req has a marker and fails
+        evaluation. Otherwise, return True.
+        """
+        extra_evals = (
+            req.marker.evaluate({'extra': extra})
+            for extra in self.get(req, ()) + (extras or (None,))
+        )
+        return not req.marker or any(extra_evals)
+
+
+class Environment:
+    """Searchable snapshot of distributions on a search path"""
+
+    def __init__(
+            self, search_path=None, platform=get_supported_platform(),
+            python=PY_MAJOR):
+        """Snapshot distributions available on a search path
+
+        Any distributions found on `search_path` are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.
+
+        `platform` is an optional string specifying the name of the platform
+        that platform-specific distributions must be compatible with.  If
+        unspecified, it defaults to the current platform.  `python` is an
+        optional string naming the desired version of Python (e.g. ``'3.6'``);
+        it defaults to the current version.
+
+        You may explicitly set `platform` (and/or `python`) to ``None`` if you
+        wish to map *all* distributions, not just those compatible with the
+        running platform or Python version.
+        """
+        self._distmap = {}
+        self.platform = platform
+        self.python = python
+        self.scan(search_path)
+
+    def can_add(self, dist):
+        """Is distribution `dist` acceptable for this environment?
+
+        The distribution must match the platform and python version
+        requirements specified when this environment was created, or False
+        is returned.
+        """
+        py_compat = (
+            self.python is None
+            or dist.py_version is None
+            or dist.py_version == self.python
+        )
+        return py_compat and compatible_platforms(dist.platform, self.platform)
+
+    def remove(self, dist):
+        """Remove `dist` from the environment"""
+        self._distmap[dist.key].remove(dist)
+
+    def scan(self, search_path=None):
+        """Scan `search_path` for distributions usable in this environment
+
+        Any distributions found are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.  Only distributions conforming to
+        the platform/python version defined at initialization are added.
+        """
+        if search_path is None:
+            search_path = sys.path
+
+        for item in search_path:
+            for dist in find_distributions(item):
+                self.add(dist)
+
+    def __getitem__(self, project_name):
+        """Return a newest-to-oldest list of distributions for `project_name`
+
+        Uses case-insensitive `project_name` comparison, assuming all the
+        project's distributions use their project's name converted to all
+        lowercase as their key.
+
+        """
+        distribution_key = project_name.lower()
+        return self._distmap.get(distribution_key, [])
+
+    def add(self, dist):
+        """Add `dist` if we ``can_add()`` it and it has not already been added
+        """
+        if self.can_add(dist) and dist.has_version():
+            dists = self._distmap.setdefault(dist.key, [])
+            if dist not in dists:
+                dists.append(dist)
+                dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
+
+    def best_match(
+            self, req, working_set, installer=None, replace_conflicting=False):
+        """Find distribution best matching `req` and usable on `working_set`
+
+        This calls the ``find(req)`` method of the `working_set` to see if a
+        suitable distribution is already active.  (This may raise
+        ``VersionConflict`` if an unsuitable version of the project is already
+        active in the specified `working_set`.)  If a suitable distribution
+        isn't active, this method returns the newest distribution in the
+        environment that meets the ``Requirement`` in `req`.  If no suitable
+        distribution is found, and `installer` is supplied, then the result of
+        calling the environment's ``obtain(req, installer)`` method will be
+        returned.
+        """
+        try:
+            dist = working_set.find(req)
+        except VersionConflict:
+            if not replace_conflicting:
+                raise
+            dist = None
+        if dist is not None:
+            return dist
+        for dist in self[req.key]:
+            if dist in req:
+                return dist
+        # try to download/install
+        return self.obtain(req, installer)
+
+    def obtain(self, requirement, installer=None):
+        """Obtain a distribution matching `requirement` (e.g. via download)
+
+        Obtain a distro that matches requirement (e.g. via download).  In the
+        base ``Environment`` class, this routine just returns
+        ``installer(requirement)``, unless `installer` is None, in which case
+        None is returned instead.  This method is a hook that allows subclasses
+        to attempt other ways of obtaining a distribution before falling back
+        to the `installer` argument."""
+        if installer is not None:
+            return installer(requirement)
+
+    def __iter__(self):
+        """Yield the unique project names of the available distributions"""
+        for key in self._distmap.keys():
+            if self[key]:
+                yield key
+
+    def __iadd__(self, other):
+        """In-place addition of a distribution or environment"""
+        if isinstance(other, Distribution):
+            self.add(other)
+        elif isinstance(other, Environment):
+            for project in other:
+                for dist in other[project]:
+                    self.add(dist)
+        else:
+            raise TypeError("Can't add %r to environment" % (other,))
+        return self
+
+    def __add__(self, other):
+        """Add an environment or distribution to an environment"""
+        new = self.__class__([], platform=None, python=None)
+        for env in self, other:
+            new += env
+        return new
+
+
+# XXX backward compatibility
+AvailableDistributions = Environment
+
+
+class ExtractionError(RuntimeError):
+    """An error occurred extracting a resource
+
+    The following attributes are available from instances of this exception:
+
+    manager
+        The resource manager that raised this exception
+
+    cache_path
+        The base directory for resource extraction
+
+    original_error
+        The exception instance that caused extraction to fail
+    """
+
+
+class ResourceManager:
+    """Manage resource extraction and packages"""
+    extraction_path = None
+
+    def __init__(self):
+        self.cached_files = {}
+
+    def resource_exists(self, package_or_requirement, resource_name):
+        """Does the named resource exist?"""
+        return get_provider(package_or_requirement).has_resource(resource_name)
+
+    def resource_isdir(self, package_or_requirement, resource_name):
+        """Is the named resource an existing directory?"""
+        return get_provider(package_or_requirement).resource_isdir(
+            resource_name
+        )
+
+    def resource_filename(self, package_or_requirement, resource_name):
+        """Return a true filesystem path for specified resource"""
+        return get_provider(package_or_requirement).get_resource_filename(
+            self, resource_name
+        )
+
+    def resource_stream(self, package_or_requirement, resource_name):
+        """Return a readable file-like object for specified resource"""
+        return get_provider(package_or_requirement).get_resource_stream(
+            self, resource_name
+        )
+
+    def resource_string(self, package_or_requirement, resource_name):
+        """Return specified resource as a string"""
+        return get_provider(package_or_requirement).get_resource_string(
+            self, resource_name
+        )
+
+    def resource_listdir(self, package_or_requirement, resource_name):
+        """List the contents of the named resource directory"""
+        return get_provider(package_or_requirement).resource_listdir(
+            resource_name
+        )
+
+    def extraction_error(self):
+        """Give an error message for problems extracting file(s)"""
+
+        old_exc = sys.exc_info()[1]
+        cache_path = self.extraction_path or get_default_cache()
+
+        tmpl = textwrap.dedent("""
+            Can't extract file(s) to egg cache
+
+            The following error occurred while trying to extract file(s)
+            to the Python egg cache:
+
+              {old_exc}
+
+            The Python egg cache directory is currently set to:
+
+              {cache_path}
+
+            Perhaps your account does not have write access to this directory?
+            You can change the cache directory by setting the PYTHON_EGG_CACHE
+            environment variable to point to an accessible directory.
+            """).lstrip()
+        err = ExtractionError(tmpl.format(**locals()))
+        err.manager = self
+        err.cache_path = cache_path
+        err.original_error = old_exc
+        raise err
+
+    def get_cache_path(self, archive_name, names=()):
+        """Return absolute location in cache for `archive_name` and `names`
+
+        The parent directory of the resulting path will be created if it does
+        not already exist.  `archive_name` should be the base filename of the
+        enclosing egg (which may not be the name of the enclosing zipfile!),
+        including its ".egg" extension.  `names`, if provided, should be a
+        sequence of path name parts "under" the egg's extraction location.
+
+        This method should only be called by resource providers that need to
+        obtain an extraction location, and only for names they intend to
+        extract, as it tracks the generated names for possible cleanup later.
+        """
+        extract_path = self.extraction_path or get_default_cache()
+        target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
+        try:
+            _bypass_ensure_directory(target_path)
+        except Exception:
+            self.extraction_error()
+
+        self._warn_unsafe_extraction_path(extract_path)
+
+        self.cached_files[target_path] = 1
+        return target_path
+
+    @staticmethod
+    def _warn_unsafe_extraction_path(path):
+        """
+        If the default extraction path is overridden and set to an insecure
+        location, such as /tmp, it opens up an opportunity for an attacker to
+        replace an extracted file with an unauthorized payload. Warn the user
+        if a known insecure location is used.
+
+        See Distribute #375 for more details.
+        """
+        if os.name == 'nt' and not path.startswith(os.environ['windir']):
+            # On Windows, permissions are generally restrictive by default
+            #  and temp directories are not writable by other users, so
+            #  bypass the warning.
+            return
+        mode = os.stat(path).st_mode
+        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
+            msg = (
+                "%s is writable by group/others and vulnerable to attack "
+                "when "
+                "used with get_resource_filename. Consider a more secure "
+                "location (set with .set_extraction_path or the "
+                "PYTHON_EGG_CACHE environment variable)." % path
+            )
+            warnings.warn(msg, UserWarning)
+
+    def postprocess(self, tempname, filename):
+        """Perform any platform-specific postprocessing of `tempname`
+
+        This is where Mac header rewrites should be done; other platforms don't
+        have anything special they should do.
+
+        Resource providers should call this method ONLY after successfully
+        extracting a compressed resource.  They must NOT call it on resources
+        that are already in the filesystem.
+
+        `tempname` is the current (temporary) name of the file, and `filename`
+        is the name it will be renamed to by the caller after this routine
+        returns.
+        """
+
+        if os.name == 'posix':
+            # Make the resource executable
+            mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
+            os.chmod(tempname, mode)
+
+    def set_extraction_path(self, path):
+        """Set the base path where resources will be extracted to, if needed.
+
+        If you do not call this routine before any extractions take place, the
+        path defaults to the return value of ``get_default_cache()``.  (Which
+        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
+        platform-specific fallbacks.  See that routine's documentation for more
+        details.)
+
+        Resources are extracted to subdirectories of this path based upon
+        information given by the ``IResourceProvider``.  You may set this to a
+        temporary directory, but then you must call ``cleanup_resources()`` to
+        delete the extracted files when done.  There is no guarantee that
+        ``cleanup_resources()`` will be able to remove all extracted files.
+
+        (Note: you may not change the extraction path for a given resource
+        manager once resources have been extracted, unless you first call
+        ``cleanup_resources()``.)
+        """
+        if self.cached_files:
+            raise ValueError(
+                "Can't change extraction path, files already extracted"
+            )
+
+        self.extraction_path = path
+
+    def cleanup_resources(self, force=False):
+        """
+        Delete all extracted resource files and directories, returning a list
+        of the file and directory names that could not be successfully removed.
+        This function does not have any concurrency protection, so it should
+        generally only be called when the extraction path is a temporary
+        directory exclusive to a single process.  This method is not
+        automatically called; you must call it explicitly or register it as an
+        ``atexit`` function if you wish to ensure cleanup of a temporary
+        directory used for extractions.
+        """
+        # XXX
+
+
+def get_default_cache():
+    """
+    Return the ``PYTHON_EGG_CACHE`` environment variable
+    or a platform-relevant user cache dir for an app
+    named "Python-Eggs".
+    """
+    return (
+        os.environ.get('PYTHON_EGG_CACHE')
+        or appdirs.user_cache_dir(appname='Python-Eggs')
+    )
+
+
+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
+    """
+    try:
+        # normalize the version
+        return str(packaging.version.Version(version))
+    except packaging.version.InvalidVersion:
+        version = version.replace(' ', '.')
+        return re.sub('[^A-Za-z0-9.]+', '-', version)
+
+
+def safe_extra(extra):
+    """Convert an arbitrary string to a standard 'extra' name
+
+    Any runs of non-alphanumeric characters are replaced with a single '_',
+    and the result is always lowercased.
+    """
+    return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
+
+
+def to_filename(name):
+    """Convert a project or version name to its filename-escaped form
+
+    Any '-' characters are currently replaced with '_'.
+    """
+    return name.replace('-', '_')
+
+
+def invalid_marker(text):
+    """
+    Validate text as a PEP 508 environment marker; return an exception
+    if invalid or False otherwise.
+    """
+    try:
+        evaluate_marker(text)
+    except SyntaxError as e:
+        e.filename = None
+        e.lineno = None
+        return e
+    return False
+
+
+def evaluate_marker(text, extra=None):
+    """
+    Evaluate a PEP 508 environment marker.
+    Return a boolean indicating the marker result in this environment.
+    Raise SyntaxError if marker is invalid.
+
+    This implementation uses the 'pyparsing' module.
+    """
+    try:
+        marker = packaging.markers.Marker(text)
+        return marker.evaluate()
+    except packaging.markers.InvalidMarker as e:
+        raise SyntaxError(e)
+
+
+class NullProvider:
+    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
+
+    egg_name = None
+    egg_info = None
+    loader = None
+
+    def __init__(self, module):
+        self.loader = getattr(module, '__loader__', None)
+        self.module_path = os.path.dirname(getattr(module, '__file__', ''))
+
+    def get_resource_filename(self, manager, resource_name):
+        return self._fn(self.module_path, resource_name)
+
+    def get_resource_stream(self, manager, resource_name):
+        return io.BytesIO(self.get_resource_string(manager, resource_name))
+
+    def get_resource_string(self, manager, resource_name):
+        return self._get(self._fn(self.module_path, resource_name))
+
+    def has_resource(self, resource_name):
+        return self._has(self._fn(self.module_path, resource_name))
+
+    def _get_metadata_path(self, name):
+        return self._fn(self.egg_info, name)
+
+    def has_metadata(self, name):
+        if not self.egg_info:
+            return self.egg_info
+
+        path = self._get_metadata_path(name)
+        return self._has(path)
+
+    def get_metadata(self, name):
+        if not self.egg_info:
+            return ""
+        value = self._get(self._fn(self.egg_info, name))
+        return value.decode('utf-8') if six.PY3 else value
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+    def resource_isdir(self, resource_name):
+        return self._isdir(self._fn(self.module_path, resource_name))
+
+    def metadata_isdir(self, name):
+        return self.egg_info and self._isdir(self._fn(self.egg_info, name))
+
+    def resource_listdir(self, resource_name):
+        return self._listdir(self._fn(self.module_path, resource_name))
+
+    def metadata_listdir(self, name):
+        if self.egg_info:
+            return self._listdir(self._fn(self.egg_info, name))
+        return []
+
+    def run_script(self, script_name, namespace):
+        script = 'scripts/' + script_name
+        if not self.has_metadata(script):
+            raise ResolutionError(
+                "Script {script!r} not found in metadata at {self.egg_info!r}"
+                .format(**locals()),
+            )
+        script_text = self.get_metadata(script).replace('\r\n', '\n')
+        script_text = script_text.replace('\r', '\n')
+        script_filename = self._fn(self.egg_info, script)
+        namespace['__file__'] = script_filename
+        if os.path.exists(script_filename):
+            source = open(script_filename).read()
+            code = compile(source, script_filename, 'exec')
+            exec(code, namespace, namespace)
+        else:
+            from linecache import cache
+            cache[script_filename] = (
+                len(script_text), 0, script_text.split('\n'), script_filename
+            )
+            script_code = compile(script_text, script_filename, 'exec')
+            exec(script_code, namespace, namespace)
+
+    def _has(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _isdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _listdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _fn(self, base, resource_name):
+        self._validate_resource_path(resource_name)
+        if resource_name:
+            return os.path.join(base, *resource_name.split('/'))
+        return base
+
+    @staticmethod
+    def _validate_resource_path(path):
+        """
+        Validate the resource paths according to the docs.
+        https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access
+
+        >>> warned = getfixture('recwarn')
+        >>> warnings.simplefilter('always')
+        >>> vrp = NullProvider._validate_resource_path
+        >>> vrp('foo/bar.txt')
+        >>> bool(warned)
+        False
+        >>> vrp('../foo/bar.txt')
+        >>> bool(warned)
+        True
+        >>> warned.clear()
+        >>> vrp('/foo/bar.txt')
+        >>> bool(warned)
+        True
+        >>> vrp('foo/../../bar.txt')
+        >>> bool(warned)
+        True
+        >>> warned.clear()
+        >>> vrp('foo/f../bar.txt')
+        >>> bool(warned)
+        False
+
+        Windows path separators are straight-up disallowed.
+        >>> vrp(r'\\foo/bar.txt')
+        Traceback (most recent call last):
+        ...
+        ValueError: Use of .. or absolute path in a resource path \
+is not allowed.
+
+        >>> vrp(r'C:\\foo/bar.txt')
+        Traceback (most recent call last):
+        ...
+        ValueError: Use of .. or absolute path in a resource path \
+is not allowed.
+
+        Blank values are allowed
+
+        >>> vrp('')
+        >>> bool(warned)
+        False
+
+        Non-string values are not.
+
+        >>> vrp(None)
+        Traceback (most recent call last):
+        ...
+        AttributeError: ...
+        """
+        invalid = (
+            os.path.pardir in path.split(posixpath.sep) or
+            posixpath.isabs(path) or
+            ntpath.isabs(path)
+        )
+        if not invalid:
+            return
+
+        msg = "Use of .. or absolute path in a resource path is not allowed."
+
+        # Aggressively disallow Windows absolute paths
+        if ntpath.isabs(path) and not posixpath.isabs(path):
+            raise ValueError(msg)
+
+        # for compatibility, warn; in future
+        # raise ValueError(msg)
+        warnings.warn(
+            msg[:-1] + " and will raise exceptions in a future release.",
+            DeprecationWarning,
+            stacklevel=4,
+        )
+
+    def _get(self, path):
+        if hasattr(self.loader, 'get_data'):
+            return self.loader.get_data(path)
+        raise NotImplementedError(
+            "Can't perform this operation for loaders without 'get_data()'"
+        )
+
+
+register_loader_type(object, NullProvider)
+
+
+class EggProvider(NullProvider):
+    """Provider based on a virtual filesystem"""
+
+    def __init__(self, module):
+        NullProvider.__init__(self, module)
+        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)
+
+
+class DefaultProvider(EggProvider):
+    """Provides access to package resources in the filesystem"""
+
+    def _has(self, path):
+        return os.path.exists(path)
+
+    def _isdir(self, path):
+        return os.path.isdir(path)
+
+    def _listdir(self, path):
+        return os.listdir(path)
+
+    def get_resource_stream(self, manager, resource_name):
+        return open(self._fn(self.module_path, resource_name), 'rb')
+
+    def _get(self, path):
+        with open(path, 'rb') as stream:
+            return stream.read()
+
+    @classmethod
+    def _register(cls):
+        loader_names = 'SourceFileLoader', 'SourcelessFileLoader',
+        for name in loader_names:
+            loader_cls = getattr(importlib_machinery, name, type(None))
+            register_loader_type(loader_cls, cls)
+
+
+DefaultProvider._register()
+
+
+class EmptyProvider(NullProvider):
+    """Provider that returns nothing for all requests"""
+
+    module_path = None
+
+    _isdir = _has = lambda self, path: False
+
+    def _get(self, path):
+        return ''
+
+    def _listdir(self, path):
+        return []
+
+    def __init__(self):
+        pass
+
+
+empty_provider = EmptyProvider()
+
+
+class ZipManifests(dict):
+    """
+    zip manifest builder
+    """
+
+    @classmethod
+    def build(cls, path):
+        """
+        Build a dictionary similar to the zipimport directory
+        caches, except instead of tuples, store ZipInfo objects.
+
+        Use a platform-specific path separator (os.sep) for the path keys
+        for compatibility with pypy on Windows.
+        """
+        with zipfile.ZipFile(path) as zfile:
+            items = (
+                (
+                    name.replace('/', os.sep),
+                    zfile.getinfo(name),
+                )
+                for name in zfile.namelist()
+            )
+            return dict(items)
+
+    load = build
+
+
+class MemoizedZipManifests(ZipManifests):
+    """
+    Memoized zipfile manifests.
+    """
+    manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
+
+    def load(self, path):
+        """
+        Load a manifest at path or return a suitable manifest already loaded.
+        """
+        path = os.path.normpath(path)
+        mtime = os.stat(path).st_mtime
+
+        if path not in self or self[path].mtime != mtime:
+            manifest = self.build(path)
+            self[path] = self.manifest_mod(manifest, mtime)
+
+        return self[path].manifest
+
+
+class ZipProvider(EggProvider):
+    """Resource support for zips and eggs"""
+
+    eagers = None
+    _zip_manifests = MemoizedZipManifests()
+
+    def __init__(self, module):
+        EggProvider.__init__(self, module)
+        self.zip_pre = self.loader.archive + os.sep
+
+    def _zipinfo_name(self, fspath):
+        # Convert a virtual filename (full path to file) into a zipfile subpath
+        # usable with the zipimport directory cache for our target archive
+        fspath = fspath.rstrip(os.sep)
+        if fspath == self.loader.archive:
+            return ''
+        if fspath.startswith(self.zip_pre):
+            return fspath[len(self.zip_pre):]
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.zip_pre)
+        )
+
+    def _parts(self, zip_path):
+        # Convert a zipfile subpath into an egg-relative path part list.
+        # pseudo-fs path
+        fspath = self.zip_pre + zip_path
+        if fspath.startswith(self.egg_root + os.sep):
+            return fspath[len(self.egg_root) + 1:].split(os.sep)
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.egg_root)
+        )
+
+    @property
+    def zipinfo(self):
+        return self._zip_manifests.load(self.loader.archive)
+
+    def get_resource_filename(self, manager, resource_name):
+        if not self.egg_name:
+            raise NotImplementedError(
+                "resource_filename() only supported for .egg, not .zip"
+            )
+        # no need to lock for extraction, since we use temp names
+        zip_path = self._resource_to_zip(resource_name)
+        eagers = self._get_eager_resources()
+        if '/'.join(self._parts(zip_path)) in eagers:
+            for name in eagers:
+                self._extract_resource(manager, self._eager_to_zip(name))
+        return self._extract_resource(manager, zip_path)
+
+    @staticmethod
+    def _get_date_and_size(zip_stat):
+        size = zip_stat.file_size
+        # ymdhms+wday, yday, dst
+        date_time = zip_stat.date_time + (0, 0, -1)
+        # 1980 offset already done
+        timestamp = time.mktime(date_time)
+        return timestamp, size
+
+    def _extract_resource(self, manager, zip_path):
+
+        if zip_path in self._index():
+            for name in self._index()[zip_path]:
+                last = self._extract_resource(
+                    manager, os.path.join(zip_path, name)
+                )
+            # return the extracted directory name
+            return os.path.dirname(last)
+
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+
+        if not WRITE_SUPPORT:
+            raise IOError('"os.rename" and "os.unlink" are not supported '
+                          'on this platform')
+        try:
+
+            real_path = manager.get_cache_path(
+                self.egg_name, self._parts(zip_path)
+            )
+
+            if self._is_current(real_path, zip_path):
+                return real_path
+
+            outf, tmpnam = _mkstemp(
+                ".$extract",
+                dir=os.path.dirname(real_path),
+            )
+            os.write(outf, self.loader.get_data(zip_path))
+            os.close(outf)
+            utime(tmpnam, (timestamp, timestamp))
+            manager.postprocess(tmpnam, real_path)
+
+            try:
+                rename(tmpnam, real_path)
+
+            except os.error:
+                if os.path.isfile(real_path):
+                    if self._is_current(real_path, zip_path):
+                        # the file became current since it was checked above,
+                        #  so proceed.
+                        return real_path
+                    # Windows, del old file and retry
+                    elif os.name == 'nt':
+                        unlink(real_path)
+                        rename(tmpnam, real_path)
+                        return real_path
+                raise
+
+        except os.error:
+            # report a user-friendly error
+            manager.extraction_error()
+
+        return real_path
+
+    def _is_current(self, file_path, zip_path):
+        """
+        Return True if the file_path is current for this zip_path
+        """
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+        if not os.path.isfile(file_path):
+            return False
+        stat = os.stat(file_path)
+        if stat.st_size != size or stat.st_mtime != timestamp:
+            return False
+        # check that the contents match
+        zip_contents = self.loader.get_data(zip_path)
+        with open(file_path, 'rb') as f:
+            file_contents = f.read()
+        return zip_contents == file_contents
+
+    def _get_eager_resources(self):
+        if self.eagers is None:
+            eagers = []
+            for name in ('native_libs.txt', 'eager_resources.txt'):
+                if self.has_metadata(name):
+                    eagers.extend(self.get_metadata_lines(name))
+            self.eagers = eagers
+        return self.eagers
+
+    def _index(self):
+        try:
+            return self._dirindex
+        except AttributeError:
+            ind = {}
+            for path in self.zipinfo:
+                parts = path.split(os.sep)
+                while parts:
+                    parent = os.sep.join(parts[:-1])
+                    if parent in ind:
+                        ind[parent].append(parts[-1])
+                        break
+                    else:
+                        ind[parent] = [parts.pop()]
+            self._dirindex = ind
+            return ind
+
+    def _has(self, fspath):
+        zip_path = self._zipinfo_name(fspath)
+        return zip_path in self.zipinfo or zip_path in self._index()
+
+    def _isdir(self, fspath):
+        return self._zipinfo_name(fspath) in self._index()
+
+    def _listdir(self, fspath):
+        return list(self._index().get(self._zipinfo_name(fspath), ()))
+
+    def _eager_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.egg_root, resource_name))
+
+    def _resource_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.module_path, resource_name))
+
+
+register_loader_type(zipimport.zipimporter, ZipProvider)
+
+
+class FileMetadata(EmptyProvider):
+    """Metadata handler for standalone PKG-INFO files
+
+    Usage::
+
+        metadata = FileMetadata("/path/to/PKG-INFO")
+
+    This provider rejects all data and metadata requests except for PKG-INFO,
+    which is treated as existing, and will be the contents of the file at
+    the provided location.
+    """
+
+    def __init__(self, path):
+        self.path = path
+
+    def _get_metadata_path(self, name):
+        return self.path
+
+    def has_metadata(self, name):
+        return name == 'PKG-INFO' and os.path.isfile(self.path)
+
+    def get_metadata(self, name):
+        if name != 'PKG-INFO':
+            raise KeyError("No metadata except PKG-INFO is available")
+
+        with io.open(self.path, encoding='utf-8', errors="replace") as f:
+            metadata = f.read()
+        self._warn_on_replacement(metadata)
+        return metadata
+
+    def _warn_on_replacement(self, metadata):
+        # Python 2.7 compat for: replacement_char = '�'
+        replacement_char = b'\xef\xbf\xbd'.decode('utf-8')
+        if replacement_char in metadata:
+            tmpl = "{self.path} could not be properly decoded in UTF-8"
+            msg = tmpl.format(**locals())
+            warnings.warn(msg)
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+
+class PathMetadata(DefaultProvider):
+    """Metadata provider for egg directories
+
+    Usage::
+
+        # Development eggs:
+
+        egg_info = "/path/to/PackageName.egg-info"
+        base_dir = os.path.dirname(egg_info)
+        metadata = PathMetadata(base_dir, egg_info)
+        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
+        dist = Distribution(basedir, project_name=dist_name, metadata=metadata)
+
+        # Unpacked egg directories:
+
+        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
+        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
+        dist = Distribution.from_filename(egg_path, metadata=metadata)
+    """
+
+    def __init__(self, path, egg_info):
+        self.module_path = path
+        self.egg_info = egg_info
+
+
+class EggMetadata(ZipProvider):
+    """Metadata provider for .egg files"""
+
+    def __init__(self, importer):
+        """Create a metadata provider from a zipimporter"""
+
+        self.zip_pre = importer.archive + os.sep
+        self.loader = importer
+        if importer.prefix:
+            self.module_path = os.path.join(importer.archive, importer.prefix)
+        else:
+            self.module_path = importer.archive
+        self._setup_prefix()
+
+
+_declare_state('dict', _distribution_finders={})
+
+
+def register_finder(importer_type, distribution_finder):
+    """Register `distribution_finder` to find distributions in sys.path items
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `distribution_finder` is a callable that, passed a path
+    item and the importer instance, yields ``Distribution`` instances found on
+    that path item.  See ``pkg_resources.find_on_path`` for an example."""
+    _distribution_finders[importer_type] = distribution_finder
+
+
+def find_distributions(path_item, only=False):
+    """Yield distributions accessible via `path_item`"""
+    importer = get_importer(path_item)
+    finder = _find_adapter(_distribution_finders, importer)
+    return finder(importer, path_item, only)
+
+
+def find_eggs_in_zip(importer, path_item, only=False):
+    """
+    Find eggs in zip files; possibly multiple nested eggs.
+    """
+    if importer.archive.endswith('.whl'):
+        # wheels are not supported with this finder
+        # they don't have PKG-INFO metadata, and won't ever contain eggs
+        return
+    metadata = EggMetadata(importer)
+    if metadata.has_metadata('PKG-INFO'):
+        yield Distribution.from_filename(path_item, metadata=metadata)
+    if only:
+        # don't yield nested distros
+        return
+    for subitem in metadata.resource_listdir(''):
+        if _is_egg_path(subitem):
+            subpath = os.path.join(path_item, subitem)
+            dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
+            for dist in dists:
+                yield dist
+        elif subitem.lower().endswith('.dist-info'):
+            subpath = os.path.join(path_item, subitem)
+            submeta = EggMetadata(zipimport.zipimporter(subpath))
+            submeta.egg_info = subpath
+            yield Distribution.from_location(path_item, subitem, submeta)
+
+
+register_finder(zipimport.zipimporter, find_eggs_in_zip)
+
+
+def find_nothing(importer, path_item, only=False):
+    return ()
+
+
+register_finder(object, find_nothing)
+
+
+def _by_version_descending(names):
+    """
+    Given a list of filenames, return them in descending order
+    by version number.
+
+    >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg'
+    >>> _by_version_descending(names)
+    ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar']
+    >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg'
+    >>> _by_version_descending(names)
+    ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg']
+    >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg'
+    >>> _by_version_descending(names)
+    ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg']
+    """
+    def _by_version(name):
+        """
+        Parse each component of the filename
+        """
+        name, ext = os.path.splitext(name)
+        parts = itertools.chain(name.split('-'), [ext])
+        return [packaging.version.parse(part) for part in parts]
+
+    return sorted(names, key=_by_version, reverse=True)
+
+
+def find_on_path(importer, path_item, only=False):
+    """Yield distributions accessible on a sys.path directory"""
+    path_item = _normalize_cached(path_item)
+
+    if _is_unpacked_egg(path_item):
+        yield Distribution.from_filename(
+            path_item, metadata=PathMetadata(
+                path_item, os.path.join(path_item, 'EGG-INFO')
+            )
+        )
+        return
+
+    entries = safe_listdir(path_item)
+
+    # for performance, before sorting by version,
+    # screen entries for only those that will yield
+    # distributions
+    filtered = (
+        entry
+        for entry in entries
+        if dist_factory(path_item, entry, only)
+    )
+
+    # scan for .egg and .egg-info in directory
+    path_item_entries = _by_version_descending(filtered)
+    for entry in path_item_entries:
+        fullpath = os.path.join(path_item, entry)
+        factory = dist_factory(path_item, entry, only)
+        for dist in factory(fullpath):
+            yield dist
+
+
+def dist_factory(path_item, entry, only):
+    """
+    Return a dist_factory for a path_item and entry
+    """
+    lower = entry.lower()
+    is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info')))
+    return (
+        distributions_from_metadata
+        if is_meta else
+        find_distributions
+        if not only and _is_egg_path(entry) else
+        resolve_egg_link
+        if not only and lower.endswith('.egg-link') else
+        NoDists()
+    )
+
+
+class NoDists:
+    """
+    >>> bool(NoDists())
+    False
+
+    >>> list(NoDists()('anything'))
+    []
+    """
+    def __bool__(self):
+        return False
+    if six.PY2:
+        __nonzero__ = __bool__
+
+    def __call__(self, fullpath):
+        return iter(())
+
+
+def safe_listdir(path):
+    """
+    Attempt to list contents of path, but suppress some exceptions.
+    """
+    try:
+        return os.listdir(path)
+    except (PermissionError, NotADirectoryError):
+        pass
+    except OSError as e:
+        # Ignore the directory if does not exist, not a directory or
+        # permission denied
+        ignorable = (
+            e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT)
+            # Python 2 on Windows needs to be handled this way :(
+            or getattr(e, "winerror", None) == 267
+        )
+        if not ignorable:
+            raise
+    return ()
+
+
+def distributions_from_metadata(path):
+    root = os.path.dirname(path)
+    if os.path.isdir(path):
+        if len(os.listdir(path)) == 0:
+            # empty metadata dir; skip
+            return
+        metadata = PathMetadata(root, path)
+    else:
+        metadata = FileMetadata(path)
+    entry = os.path.basename(path)
+    yield Distribution.from_location(
+        root, entry, metadata, precedence=DEVELOP_DIST,
+    )
+
+
+def non_empty_lines(path):
+    """
+    Yield non-empty lines from file at path
+    """
+    with open(path) as f:
+        for line in f:
+            line = line.strip()
+            if line:
+                yield line
+
+
+def resolve_egg_link(path):
+    """
+    Given a path to an .egg-link, resolve distributions
+    present in the referenced path.
+    """
+    referenced_paths = non_empty_lines(path)
+    resolved_paths = (
+        os.path.join(os.path.dirname(path), ref)
+        for ref in referenced_paths
+    )
+    dist_groups = map(find_distributions, resolved_paths)
+    return next(dist_groups, ())
+
+
+register_finder(pkgutil.ImpImporter, find_on_path)
+
+if hasattr(importlib_machinery, 'FileFinder'):
+    register_finder(importlib_machinery.FileFinder, find_on_path)
+
+_declare_state('dict', _namespace_handlers={})
+_declare_state('dict', _namespace_packages={})
+
+
+def register_namespace_handler(importer_type, namespace_handler):
+    """Register `namespace_handler` to declare namespace packages
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `namespace_handler` is a callable like this::
+
+        def namespace_handler(importer, path_entry, moduleName, module):
+            # return a path_entry to use for child packages
+
+    Namespace handlers are only called if the importer object has already
+    agreed that it can handle the relevant path item, and they should only
+    return a subpath if the module __path__ does not already contain an
+    equivalent subpath.  For an example namespace handler, see
+    ``pkg_resources.file_ns_handler``.
+    """
+    _namespace_handlers[importer_type] = namespace_handler
+
+
+def _handle_ns(packageName, path_item):
+    """Ensure that named package includes a subpath of path_item (if needed)"""
+
+    importer = get_importer(path_item)
+    if importer is None:
+        return None
+
+    # capture warnings due to #1111
+    with warnings.catch_warnings():
+        warnings.simplefilter("ignore")
+        loader = importer.find_module(packageName)
+
+    if loader is None:
+        return None
+    module = sys.modules.get(packageName)
+    if module is None:
+        module = sys.modules[packageName] = types.ModuleType(packageName)
+        module.__path__ = []
+        _set_parent_ns(packageName)
+    elif not hasattr(module, '__path__'):
+        raise TypeError("Not a package:", packageName)
+    handler = _find_adapter(_namespace_handlers, importer)
+    subpath = handler(importer, path_item, packageName, module)
+    if subpath is not None:
+        path = module.__path__
+        path.append(subpath)
+        loader.load_module(packageName)
+        _rebuild_mod_path(path, packageName, module)
+    return subpath
+
+
+def _rebuild_mod_path(orig_path, package_name, module):
+    """
+    Rebuild module.__path__ ensuring that all entries are ordered
+    corresponding to their sys.path order
+    """
+    sys_path = [_normalize_cached(p) for p in sys.path]
+
+    def safe_sys_path_index(entry):
+        """
+        Workaround for #520 and #513.
+        """
+        try:
+            return sys_path.index(entry)
+        except ValueError:
+            return float('inf')
+
+    def position_in_sys_path(path):
+        """
+        Return the ordinal of the path based on its position in sys.path
+        """
+        path_parts = path.split(os.sep)
+        module_parts = package_name.count('.') + 1
+        parts = path_parts[:-module_parts]
+        return safe_sys_path_index(_normalize_cached(os.sep.join(parts)))
+
+    new_path = sorted(orig_path, key=position_in_sys_path)
+    new_path = [_normalize_cached(p) for p in new_path]
+
+    if isinstance(module.__path__, list):
+        module.__path__[:] = new_path
+    else:
+        module.__path__ = new_path
+
+
+def declare_namespace(packageName):
+    """Declare that package 'packageName' is a namespace package"""
+
+    _imp.acquire_lock()
+    try:
+        if packageName in _namespace_packages:
+            return
+
+        path = sys.path
+        parent, _, _ = packageName.rpartition('.')
+
+        if parent:
+            declare_namespace(parent)
+            if parent not in _namespace_packages:
+                __import__(parent)
+            try:
+                path = sys.modules[parent].__path__
+            except AttributeError:
+                raise TypeError("Not a package:", parent)
+
+        # Track what packages are namespaces, so when new path items are added,
+        # they can be updated
+        _namespace_packages.setdefault(parent or None, []).append(packageName)
+        _namespace_packages.setdefault(packageName, [])
+
+        for path_item in path:
+            # Ensure all the parent's path items are reflected in the child,
+            # if they apply
+            _handle_ns(packageName, path_item)
+
+    finally:
+        _imp.release_lock()
+
+
+def fixup_namespace_packages(path_item, parent=None):
+    """Ensure that previously-declared namespace packages include path_item"""
+    _imp.acquire_lock()
+    try:
+        for package in _namespace_packages.get(parent, ()):
+            subpath = _handle_ns(package, path_item)
+            if subpath:
+                fixup_namespace_packages(subpath, package)
+    finally:
+        _imp.release_lock()
+
+
+def file_ns_handler(importer, path_item, packageName, module):
+    """Compute an ns-package subpath for a filesystem or zipfile importer"""
+
+    subpath = os.path.join(path_item, packageName.split('.')[-1])
+    normalized = _normalize_cached(subpath)
+    for item in module.__path__:
+        if _normalize_cached(item) == normalized:
+            break
+    else:
+        # Only return the path if it's not already there
+        return subpath
+
+
+register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
+register_namespace_handler(zipimport.zipimporter, file_ns_handler)
+
+if hasattr(importlib_machinery, 'FileFinder'):
+    register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
+
+
+def null_ns_handler(importer, path_item, packageName, module):
+    return None
+
+
+register_namespace_handler(object, null_ns_handler)
+
+
+def normalize_path(filename):
+    """Normalize a file/dir name for comparison purposes"""
+    return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
+
+
+def _cygwin_patch(filename):  # pragma: nocover
+    """
+    Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
+    symlink components. Using
+    os.path.abspath() works around this limitation. A fix in os.getcwd()
+    would probably better, in Cygwin even more so, except
+    that this seems to be by design...
+    """
+    return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
+
+
+def _normalize_cached(filename, _cache={}):
+    try:
+        return _cache[filename]
+    except KeyError:
+        _cache[filename] = result = normalize_path(filename)
+        return result
+
+
+def _is_egg_path(path):
+    """
+    Determine if given path appears to be an egg.
+    """
+    return path.lower().endswith('.egg')
+
+
+def _is_unpacked_egg(path):
+    """
+    Determine if given path appears to be an unpacked egg.
+    """
+    return (
+        _is_egg_path(path) and
+        os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO'))
+    )
+
+
+def _set_parent_ns(packageName):
+    parts = packageName.split('.')
+    name = parts.pop()
+    if parts:
+        parent = '.'.join(parts)
+        setattr(sys.modules[parent], name, sys.modules[packageName])
+
+
+def yield_lines(strs):
+    """Yield non-empty/non-comment lines of a string or sequence"""
+    if isinstance(strs, six.string_types):
+        for s in strs.splitlines():
+            s = s.strip()
+            # skip blank lines/comments
+            if s and not s.startswith('#'):
+                yield s
+    else:
+        for ss in strs:
+            for s in yield_lines(ss):
+                yield s
+
+
+MODULE = re.compile(r"\w+(\.\w+)*$").match
+EGG_NAME = re.compile(
+    r"""
+    (?P<name>[^-]+) (
+        -(?P<ver>[^-]+) (
+            -py(?P<pyver>[^-]+) (
+                -(?P<plat>.+)
+            )?
+        )?
+    )?
+    """,
+    re.VERBOSE | re.IGNORECASE,
+).match
+
+
+class EntryPoint:
+    """Object representing an advertised importable object"""
+
+    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
+        if not MODULE(module_name):
+            raise ValueError("Invalid module name", module_name)
+        self.name = name
+        self.module_name = module_name
+        self.attrs = tuple(attrs)
+        self.extras = tuple(extras)
+        self.dist = dist
+
+    def __str__(self):
+        s = "%s = %s" % (self.name, self.module_name)
+        if self.attrs:
+            s += ':' + '.'.join(self.attrs)
+        if self.extras:
+            s += ' [%s]' % ','.join(self.extras)
+        return s
+
+    def __repr__(self):
+        return "EntryPoint.parse(%r)" % str(self)
+
+    def load(self, require=True, *args, **kwargs):
+        """
+        Require packages for this EntryPoint, then resolve it.
+        """
+        if not require or args or kwargs:
+            warnings.warn(
+                "Parameters to load are deprecated.  Call .resolve and "
+                ".require separately.",
+                PkgResourcesDeprecationWarning,
+                stacklevel=2,
+            )
+        if require:
+            self.require(*args, **kwargs)
+        return self.resolve()
+
+    def resolve(self):
+        """
+        Resolve the entry point from its module and attrs.
+        """
+        module = __import__(self.module_name, fromlist=['__name__'], level=0)
+        try:
+            return functools.reduce(getattr, self.attrs, module)
+        except AttributeError as exc:
+            raise ImportError(str(exc))
+
+    def require(self, env=None, installer=None):
+        if self.extras and not self.dist:
+            raise UnknownExtra("Can't require() without a distribution", self)
+
+        # Get the requirements for this entry point with all its extras and
+        # then resolve them. We have to pass `extras` along when resolving so
+        # that the working set knows what extras we want. Otherwise, for
+        # dist-info distributions, the working set will assume that the
+        # requirements for that extra are purely optional and skip over them.
+        reqs = self.dist.requires(self.extras)
+        items = working_set.resolve(reqs, env, installer, extras=self.extras)
+        list(map(working_set.add, items))
+
+    pattern = re.compile(
+        r'\s*'
+        r'(?P<name>.+?)\s*'
+        r'=\s*'
+        r'(?P<module>[\w.]+)\s*'
+        r'(:\s*(?P<attr>[\w.]+))?\s*'
+        r'(?P<extras>\[.*\])?\s*$'
+    )
+
+    @classmethod
+    def parse(cls, src, dist=None):
+        """Parse a single entry point from string `src`
+
+        Entry point syntax follows the form::
+
+            name = some.module:some.attr [extra1, extra2]
+
+        The entry name and module name are required, but the ``:attrs`` and
+        ``[extras]`` parts are optional
+        """
+        m = cls.pattern.match(src)
+        if not m:
+            msg = "EntryPoint must be in 'name=module:attrs [extras]' format"
+            raise ValueError(msg, src)
+        res = m.groupdict()
+        extras = cls._parse_extras(res['extras'])
+        attrs = res['attr'].split('.') if res['attr'] else ()
+        return cls(res['name'], res['module'], attrs, extras, dist)
+
+    @classmethod
+    def _parse_extras(cls, extras_spec):
+        if not extras_spec:
+            return ()
+        req = Requirement.parse('x' + extras_spec)
+        if req.specs:
+            raise ValueError()
+        return req.extras
+
+    @classmethod
+    def parse_group(cls, group, lines, dist=None):
+        """Parse an entry point group"""
+        if not MODULE(group):
+            raise ValueError("Invalid group name", group)
+        this = {}
+        for line in yield_lines(lines):
+            ep = cls.parse(line, dist)
+            if ep.name in this:
+                raise ValueError("Duplicate entry point", group, ep.name)
+            this[ep.name] = ep
+        return this
+
+    @classmethod
+    def parse_map(cls, data, dist=None):
+        """Parse a map of entry point groups"""
+        if isinstance(data, dict):
+            data = data.items()
+        else:
+            data = split_sections(data)
+        maps = {}
+        for group, lines in data:
+            if group is None:
+                if not lines:
+                    continue
+                raise ValueError("Entry points must be listed in groups")
+            group = group.strip()
+            if group in maps:
+                raise ValueError("Duplicate group name", group)
+            maps[group] = cls.parse_group(group, lines, dist)
+        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
+    the value of the Version field, if present, or None otherwise.
+    """
+    def is_version_line(line):
+        return line.lower().startswith('version:')
+    version_lines = filter(is_version_line, lines)
+    line = next(iter(version_lines), '')
+    _, _, value = line.partition(':')
+    return safe_version(value.strip()) or None
+
+
+class Distribution:
+    """Wrap an actual or potential sys.path entry w/metadata"""
+    PKG_INFO = 'PKG-INFO'
+
+    def __init__(
+            self, location=None, metadata=None, project_name=None,
+            version=None, py_version=PY_MAJOR, platform=None,
+            precedence=EGG_DIST):
+        self.project_name = safe_name(project_name or 'Unknown')
+        if version is not None:
+            self._version = safe_version(version)
+        self.py_version = py_version
+        self.platform = platform
+        self.location = location
+        self.precedence = precedence
+        self._provider = metadata or empty_provider
+
+    @classmethod
+    def from_location(cls, location, basename, metadata=None, **kw):
+        project_name, version, py_version, platform = [None] * 4
+        basename, ext = os.path.splitext(basename)
+        if ext.lower() in _distributionImpl:
+            cls = _distributionImpl[ext.lower()]
+
+            match = EGG_NAME(basename)
+            if match:
+                project_name, version, py_version, platform = match.group(
+                    'name', 'ver', 'pyver', 'plat'
+                )
+        return cls(
+            location, metadata, project_name=project_name, version=version,
+            py_version=py_version, platform=platform, **kw
+        )._reload_version()
+
+    def _reload_version(self):
+        return self
+
+    @property
+    def hashcmp(self):
+        return (
+            self.parsed_version,
+            self.precedence,
+            self.key,
+            _remove_md5_fragment(self.location),
+            self.py_version or '',
+            self.platform or '',
+        )
+
+    def __hash__(self):
+        return hash(self.hashcmp)
+
+    def __lt__(self, other):
+        return self.hashcmp < other.hashcmp
+
+    def __le__(self, other):
+        return self.hashcmp <= other.hashcmp
+
+    def __gt__(self, other):
+        return self.hashcmp > other.hashcmp
+
+    def __ge__(self, other):
+        return self.hashcmp >= other.hashcmp
+
+    def __eq__(self, other):
+        if not isinstance(other, self.__class__):
+            # It's not a Distribution, so they are not equal
+            return False
+        return self.hashcmp == other.hashcmp
+
+    def __ne__(self, other):
+        return not self == other
+
+    # These properties have to be lazy so that we don't have to load any
+    # metadata until/unless it's actually needed.  (i.e., some distributions
+    # may not know their name or version without loading PKG-INFO)
+
+    @property
+    def key(self):
+        try:
+            return self._key
+        except AttributeError:
+            self._key = key = self.project_name.lower()
+            return key
+
+    @property
+    def parsed_version(self):
+        if not hasattr(self, "_parsed_version"):
+            self._parsed_version = parse_version(self.version)
+
+        return self._parsed_version
+
+    def _warn_legacy_version(self):
+        LV = packaging.version.LegacyVersion
+        is_legacy = isinstance(self._parsed_version, LV)
+        if not is_legacy:
+            return
+
+        # While an empty version is technically a legacy version and
+        # is not a valid PEP 440 version, it's also unlikely to
+        # actually come from someone and instead it is more likely that
+        # it comes from setuptools attempting to parse a filename and
+        # including it in the list. So for that we'll gate this warning
+        # on if the version is anything at all or not.
+        if not self.version:
+            return
+
+        tmpl = textwrap.dedent("""
+            '{project_name} ({version})' is being parsed as a legacy,
+            non PEP 440,
+            version. You may find odd behavior and sort order.
+            In particular it will be sorted as less than 0.0. It
+            is recommended to migrate to PEP 440 compatible
+            versions.
+            """).strip().replace('\n', ' ')
+
+        warnings.warn(tmpl.format(**vars(self)), PEP440Warning)
+
+    @property
+    def version(self):
+        try:
+            return self._version
+        except AttributeError:
+            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)
+
+            return version
+
+    @property
+    def _dep_map(self):
+        """
+        A map of extra to its list of (direct) requirements
+        for this distribution, including the null extra.
+        """
+        try:
+            return self.__dep_map
+        except AttributeError:
+            self.__dep_map = self._filter_extras(self._build_dep_map())
+        return self.__dep_map
+
+    @staticmethod
+    def _filter_extras(dm):
+        """
+        Given a mapping of extras to dependencies, strip off
+        environment markers and filter out any dependencies
+        not matching the markers.
+        """
+        for extra in list(filter(None, dm)):
+            new_extra = extra
+            reqs = dm.pop(extra)
+            new_extra, _, marker = extra.partition(':')
+            fails_marker = marker and (
+                invalid_marker(marker)
+                or not evaluate_marker(marker)
+            )
+            if fails_marker:
+                reqs = []
+            new_extra = safe_extra(new_extra) or None
+
+            dm.setdefault(new_extra, []).extend(reqs)
+        return dm
+
+    def _build_dep_map(self):
+        dm = {}
+        for name in 'requires.txt', 'depends.txt':
+            for extra, reqs in split_sections(self._get_metadata(name)):
+                dm.setdefault(extra, []).extend(parse_requirements(reqs))
+        return dm
+
+    def requires(self, extras=()):
+        """List of Requirements needed for this distro if `extras` are used"""
+        dm = self._dep_map
+        deps = []
+        deps.extend(dm.get(None, ()))
+        for ext in extras:
+            try:
+                deps.extend(dm[safe_extra(ext)])
+            except KeyError:
+                raise UnknownExtra(
+                    "%s has no such extra feature %r" % (self, ext)
+                )
+        return deps
+
+    def _get_metadata_path_for_display(self, name):
+        """
+        Return the path to the given metadata file, if available.
+        """
+        try:
+            # We need to access _get_metadata_path() on the provider object
+            # directly rather than through this class's __getattr__()
+            # since _get_metadata_path() is marked private.
+            path = self._provider._get_metadata_path(name)
+
+        # Handle exceptions e.g. in case the distribution's metadata
+        # provider doesn't support _get_metadata_path().
+        except Exception:
+            return '[could not detect]'
+
+        return path
+
+    def _get_metadata(self, name):
+        if self.has_metadata(name):
+            for line in self.get_metadata_lines(name):
+                yield line
+
+    def _get_version(self):
+        lines = self._get_metadata(self.PKG_INFO)
+        version = _version_from_file(lines)
+
+        return version
+
+    def activate(self, path=None, replace=False):
+        """Ensure distribution is importable on `path` (default=sys.path)"""
+        if path is None:
+            path = sys.path
+        self.insert_on(path, replace=replace)
+        if path is sys.path:
+            fixup_namespace_packages(self.location)
+            for pkg in self._get_metadata('namespace_packages.txt'):
+                if pkg in sys.modules:
+                    declare_namespace(pkg)
+
+    def egg_name(self):
+        """Return what this distribution's standard .egg filename should be"""
+        filename = "%s-%s-py%s" % (
+            to_filename(self.project_name), to_filename(self.version),
+            self.py_version or PY_MAJOR
+        )
+
+        if self.platform:
+            filename += '-' + self.platform
+        return filename
+
+    def __repr__(self):
+        if self.location:
+            return "%s (%s)" % (self, self.location)
+        else:
+            return str(self)
+
+    def __str__(self):
+        try:
+            version = getattr(self, 'version', None)
+        except ValueError:
+            version = None
+        version = version or "[unknown version]"
+        return "%s %s" % (self.project_name, version)
+
+    def __getattr__(self, attr):
+        """Delegate all unrecognized public attributes to .metadata provider"""
+        if attr.startswith('_'):
+            raise AttributeError(attr)
+        return getattr(self._provider, attr)
+
+    def __dir__(self):
+        return list(
+            set(super(Distribution, self).__dir__())
+            | set(
+                attr for attr in self._provider.__dir__()
+                if not attr.startswith('_')
+            )
+        )
+
+    if not hasattr(object, '__dir__'):
+        # python 2.7 not supported
+        del __dir__
+
+    @classmethod
+    def from_filename(cls, filename, metadata=None, **kw):
+        return cls.from_location(
+            _normalize_cached(filename), os.path.basename(filename), metadata,
+            **kw
+        )
+
+    def as_requirement(self):
+        """Return a ``Requirement`` that matches this distribution exactly"""
+        if isinstance(self.parsed_version, packaging.version.Version):
+            spec = "%s==%s" % (self.project_name, self.parsed_version)
+        else:
+            spec = "%s===%s" % (self.project_name, self.parsed_version)
+
+        return Requirement.parse(spec)
+
+    def load_entry_point(self, group, name):
+        """Return the `name` entry point of `group` or raise ImportError"""
+        ep = self.get_entry_info(group, name)
+        if ep is None:
+            raise ImportError("Entry point %r not found" % ((group, name),))
+        return ep.load()
+
+    def get_entry_map(self, group=None):
+        """Return the entry point map for `group`, or the full entry map"""
+        try:
+            ep_map = self._ep_map
+        except AttributeError:
+            ep_map = self._ep_map = EntryPoint.parse_map(
+                self._get_metadata('entry_points.txt'), self
+            )
+        if group is not None:
+            return ep_map.get(group, {})
+        return ep_map
+
+    def get_entry_info(self, group, name):
+        """Return the EntryPoint object for `group`+`name`, or ``None``"""
+        return self.get_entry_map(group).get(name)
+
+    def insert_on(self, path, loc=None, replace=False):
+        """Ensure self.location is on path
+
+        If replace=False (default):
+            - If location is already in path anywhere, do nothing.
+            - Else:
+              - If it's an egg and its parent directory is on path,
+                insert just ahead of the parent.
+              - Else: add to the end of path.
+        If replace=True:
+            - If location is already on path anywhere (not eggs)
+              or higher priority than its parent (eggs)
+              do nothing.
+            - Else:
+              - If it's an egg and its parent directory is on path,
+                insert just ahead of the parent,
+                removing any lower-priority entries.
+              - Else: add it to the front of path.
+        """
+
+        loc = loc or self.location
+        if not loc:
+            return
+
+        nloc = _normalize_cached(loc)
+        bdir = os.path.dirname(nloc)
+        npath = [(p and _normalize_cached(p) or p) for p in path]
+
+        for p, item in enumerate(npath):
+            if item == nloc:
+                if replace:
+                    break
+                else:
+                    # don't modify path (even removing duplicates) if
+                    # found and not replace
+                    return
+            elif item == bdir and self.precedence == EGG_DIST:
+                # if it's an .egg, give it precedence over its directory
+                # UNLESS it's already been added to sys.path and replace=False
+                if (not replace) and nloc in npath[p:]:
+                    return
+                if path is sys.path:
+                    self.check_version_conflict()
+                path.insert(p, loc)
+                npath.insert(p, nloc)
+                break
+        else:
+            if path is sys.path:
+                self.check_version_conflict()
+            if replace:
+                path.insert(0, loc)
+            else:
+                path.append(loc)
+            return
+
+        # p is the spot where we found or inserted loc; now remove duplicates
+        while True:
+            try:
+                np = npath.index(nloc, p + 1)
+            except ValueError:
+                break
+            else:
+                del npath[np], path[np]
+                # ha!
+                p = np
+
+        return
+
+    def check_version_conflict(self):
+        if self.key == 'setuptools':
+            # ignore the inevitable setuptools self-conflicts  :(
+            return
+
+        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
+        loc = normalize_path(self.location)
+        for modname in self._get_metadata('top_level.txt'):
+            if (modname not in sys.modules or modname in nsp
+                    or modname in _namespace_packages):
+                continue
+            if modname in ('pkg_resources', 'setuptools', 'site'):
+                continue
+            fn = getattr(sys.modules[modname], '__file__', None)
+            if fn and (normalize_path(fn).startswith(loc) or
+                       fn.startswith(self.location)):
+                continue
+            issue_warning(
+                "Module %s was already imported from %s, but %s is being added"
+                " to sys.path" % (modname, fn, self.location),
+            )
+
+    def has_version(self):
+        try:
+            self.version
+        except ValueError:
+            issue_warning("Unbuilt egg for " + repr(self))
+            return False
+        return True
+
+    def clone(self, **kw):
+        """Copy this distribution, substituting in any changed keyword args"""
+        names = 'project_name version py_version platform location precedence'
+        for attr in names.split():
+            kw.setdefault(attr, getattr(self, attr, None))
+        kw.setdefault('metadata', self._provider)
+        return self.__class__(**kw)
+
+    @property
+    def extras(self):
+        return [dep for dep in self._dep_map if dep]
+
+
+class EggInfoDistribution(Distribution):
+    def _reload_version(self):
+        """
+        Packages installed by distutils (e.g. numpy or scipy),
+        which uses an old safe_version, and so
+        their version numbers can get mangled when
+        converted to filenames (e.g., 1.11.0.dev0+2329eae to
+        1.11.0.dev0_2329eae). These distributions will not be
+        parsed properly
+        downstream by Distribution and safe_version, so
+        take an extra step and try to get the version number from
+        the metadata file itself instead of the filename.
+        """
+        md_version = self._get_version()
+        if md_version:
+            self._version = md_version
+        return self
+
+
+class DistInfoDistribution(Distribution):
+    """
+    Wrap an actual or potential sys.path entry
+    w/metadata, .dist-info style.
+    """
+    PKG_INFO = 'METADATA'
+    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")
+
+    @property
+    def _parsed_pkg_info(self):
+        """Parse and cache metadata"""
+        try:
+            return self._pkg_info
+        except AttributeError:
+            metadata = self.get_metadata(self.PKG_INFO)
+            self._pkg_info = email.parser.Parser().parsestr(metadata)
+            return self._pkg_info
+
+    @property
+    def _dep_map(self):
+        try:
+            return self.__dep_map
+        except AttributeError:
+            self.__dep_map = self._compute_dependencies()
+            return self.__dep_map
+
+    def _compute_dependencies(self):
+        """Recompute this distribution's dependencies."""
+        dm = self.__dep_map = {None: []}
+
+        reqs = []
+        # Including any condition expressions
+        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
+            reqs.extend(parse_requirements(req))
+
+        def reqs_for_extra(extra):
+            for req in reqs:
+                if not req.marker or req.marker.evaluate({'extra': extra}):
+                    yield req
+
+        common = frozenset(reqs_for_extra(None))
+        dm[None].extend(common)
+
+        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
+            s_extra = safe_extra(extra.strip())
+            dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common)
+
+        return dm
+
+
+_distributionImpl = {
+    '.egg': Distribution,
+    '.egg-info': EggInfoDistribution,
+    '.dist-info': DistInfoDistribution,
+}
+
+
+def issue_warning(*args, **kw):
+    level = 1
+    g = globals()
+    try:
+        # find the first stack frame that is *not* code in
+        # the pkg_resources module, to use for the warning
+        while sys._getframe(level).f_globals is g:
+            level += 1
+    except ValueError:
+        pass
+    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`
+
+    `strs` must be a string, or a (possibly-nested) iterable thereof.
+    """
+    # create a steppable iterator, so we can handle \-continuations
+    lines = iter(yield_lines(strs))
+
+    for line in lines:
+        # Drop comments -- a hash without a space may be in a URL.
+        if ' #' in line:
+            line = line[:line.find(' #')]
+        # If there is a line continuation, drop it, and append the next line.
+        if line.endswith('\\'):
+            line = line[:-2].strip()
+            try:
+                line += next(lines)
+            except StopIteration:
+                return
+        yield Requirement(line)
+
+
+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))
+        self.unsafe_name = self.name
+        project_name = safe_name(self.name)
+        self.project_name, self.key = project_name, project_name.lower()
+        self.specs = [
+            (spec.operator, spec.version) for spec in self.specifier]
+        self.extras = tuple(map(safe_extra, self.extras))
+        self.hashCmp = (
+            self.key,
+            self.specifier,
+            frozenset(self.extras),
+            str(self.marker) if self.marker else None,
+        )
+        self.__hash = hash(self.hashCmp)
+
+    def __eq__(self, other):
+        return (
+            isinstance(other, Requirement) and
+            self.hashCmp == other.hashCmp
+        )
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __contains__(self, item):
+        if isinstance(item, Distribution):
+            if item.key != self.key:
+                return False
+
+            item = item.version
+
+        # Allow prereleases always in order to match the previous behavior of
+        # this method. In the future this should be smarter and follow PEP 440
+        # more accurately.
+        return self.specifier.contains(item, prereleases=True)
+
+    def __hash__(self):
+        return self.__hash
+
+    def __repr__(self):
+        return "Requirement.parse(%r)" % str(self)
+
+    @staticmethod
+    def parse(s):
+        req, = parse_requirements(s)
+        return req
+
+
+def _always_object(classes):
+    """
+    Ensure object appears in the mro even
+    for old-style classes.
+    """
+    if object not in classes:
+        return classes + (object,)
+    return classes
+
+
+def _find_adapter(registry, ob):
+    """Return an adapter factory for `ob` from `registry`"""
+    types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
+    for t in types:
+        if t in registry:
+            return registry[t]
+
+
+def ensure_directory(path):
+    """Ensure that the parent directory of `path` exists"""
+    dirname = os.path.dirname(path)
+    py31compat.makedirs(dirname, exist_ok=True)
+
+
+def _bypass_ensure_directory(path):
+    """Sandbox-bypassing version of ensure_directory()"""
+    if not WRITE_SUPPORT:
+        raise IOError('"os.mkdir" not supported on this platform.')
+    dirname, filename = split(path)
+    if dirname and filename and not isdir(dirname):
+        _bypass_ensure_directory(dirname)
+        try:
+            mkdir(dirname, 0o755)
+        except FileExistsError:
+            pass
+
+
+def split_sections(s):
+    """Split a string or iterable thereof into (section, content) pairs
+
+    Each ``section`` is a stripped version of the section header ("[section]")
+    and each ``content`` is a list of stripped lines excluding blank lines and
+    comment-only lines.  If there are any such lines before the first section
+    header, they're returned in a first ``section`` of ``None``.
+    """
+    section = None
+    content = []
+    for line in yield_lines(s):
+        if line.startswith("["):
+            if line.endswith("]"):
+                if section or content:
+                    yield section, content
+                section = line[1:-1].strip()
+                content = []
+            else:
+                raise ValueError("Invalid section heading", line)
+        else:
+            content.append(line)
+
+    # wrap up last segment
+    yield section, content
+
+
+def _mkstemp(*args, **kw):
+    old_open = os.open
+    try:
+        # temporarily bypass sandboxing
+        os.open = os_open
+        return tempfile.mkstemp(*args, **kw)
+    finally:
+        # and then put it back
+        os.open = old_open
+
+
+# Silence the PEP440Warning by default, so that end users don't get hit by it
+# randomly just because they use pkg_resources. We want to append the rule
+# because we want earlier uses of filterwarnings to take precedence over this
+# one.
+warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
+
+
+# from jaraco.functools 1.3
+def _call_aside(f, *args, **kwargs):
+    f(*args, **kwargs)
+    return f
+
+
+@_call_aside
+def _initialize(g=globals()):
+    "Set up global resource manager (deliberately not state-saved)"
+    manager = ResourceManager()
+    g['_manager'] = manager
+    g.update(
+        (name, getattr(manager, name))
+        for name in dir(manager)
+        if not name.startswith('_')
+    )
+
+
+@_call_aside
+def _initialize_master_working_set():
+    """
+    Prepare the master working set and make the ``require()``
+    API available.
+
+    This function has explicit effects on the global state
+    of pkg_resources. It is intended to be invoked once at
+    the initialization of this module.
+
+    Invocation by other packages is unsupported and done
+    at their own risk.
+    """
+    working_set = WorkingSet._build_master()
+    _declare_state('object', working_set=working_set)
+
+    require = working_set.require
+    iter_entry_points = working_set.iter_entry_points
+    add_activation_listener = working_set.subscribe
+    run_script = working_set.run_script
+    # backward compatibility
+    run_main = run_script
+    # Activate all distributions already on sys.path with replace=False and
+    # ensure that all distributions added to the working set in the future
+    # (e.g. by calling ``require()``) will get activated as well,
+    # with higher priority (replace=True).
+    tuple(
+        dist.activate(replace=False)
+        for dist in working_set
+    )
+    add_activation_listener(
+        lambda dist: dist.activate(replace=True),
+        existing=False,
+    )
+    working_set.entries = []
+    # match order
+    list(map(working_set.add_entry, sys.path))
+    globals().update(locals())
+
+class PkgResourcesDeprecationWarning(Warning):
+    """
+    Base class for warning about deprecations in ``pkg_resources``
+
+    This class is not derived from ``DeprecationWarning``, and as such is
+    visible by default.
+    """
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4cef75398e55fbd67dcc61982a7f109ab1a7f90d
GIT binary patch
literal 137688
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py
new file mode 100644
index 00000000..a2d3007c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py
@@ -0,0 +1,23 @@
+import os
+import errno
+import sys
+
+from pip._vendor 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/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..36a7dcf42299da022e296e5ae84832f7bcf93c4c
GIT binary patch
literal 881
zcmZSn%*&NH<x)&C0~D|@FfceUFfbH1GB7ZtFfgPrGUPBYM8VmN3{i|QaVCZ+CNP_c
zA%~eEmxUpUg@G}Zl_7<hp@oqlij5(ag&~Wbp&*qZg`FXli6M)FfrUAnks&{sA%%k>
zn}H#ZiGhhRijyIglcA`DA(f3GkBuRffgy{FA&LuRbFc;{0|P_m|NsC0`)M#TFff!b
zgPfLGk<7%vzyM;iGB7YWgT%ZT7#J!A8A=!!vKSd^7#Nxv85qO!j2Ku-m>9CT7>ZmO
z7;Bjr7;6|Ac#3TpYM2<Zm_epxu`pyaGZeWoG%+v~x-sN2GDM^>Fa(1w^V0yCUIMZz
zzqo{hfq@}6F*`LSv#7X)oq>VDKiIXXD8Hx#q$sthC@;T+je&u|)iuI1I79>Fwh~ZS
z79^Hrfc2(UWEPji=VybxkXn(f0Sa(1QC!Zzz@T4Hlv$QolB!>pSfrnppOcbWRIHy}
zsGnVIWNvO)m}O*MW@uqvoKu-z9&eIjVq#!mV33}tAEIB7S)iMlS6q^qlcQUnXjvMV
z0TKe^__EZzl>8$7g6#D8qSWI2(xT+lV*P?jW5eY9+=9dsy@JXT9tH-6c$mN9jSWHG
zEan2ajggsAkddEJk}(tHnM{ypGC^^m0SXX=7}%=_E<_180|P@4NO2HI8`#UmmBl3>
z;eyNpJ*dNiK-Pf6&n+>hI5mh97Q+FNMqr1Pr4|)u=I6y{=B4GA@G&qj<fW#j6vLex
s1ab*D2oc191|}%*Y;yBcN^?@}K)x>qxtWKNhmnU#fSHGflTn@t0BMrHZ2$lO

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py
new file mode 100644
index 00000000..e434c257
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py
@@ -0,0 +1,177 @@
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from __future__ import division, print_function
+
+from collections import deque
+from datetime import timedelta
+from math import ceil
+from sys import stderr
+try:
+    from time import monotonic
+except ImportError:
+    from time import time as monotonic
+
+
+__version__ = '1.5'
+
+HIDE_CURSOR = '\x1b[?25l'
+SHOW_CURSOR = '\x1b[?25h'
+
+
+class Infinite(object):
+    file = stderr
+    sma_window = 10         # Simple Moving Average window
+    check_tty = True
+    hide_cursor = True
+
+    def __init__(self, message='', **kwargs):
+        self.index = 0
+        self.start_ts = monotonic()
+        self.avg = 0
+        self._avg_update_ts = self.start_ts
+        self._ts = self.start_ts
+        self._xput = deque(maxlen=self.sma_window)
+        for key, val in kwargs.items():
+            setattr(self, key, val)
+
+        self._width = 0
+        self.message = message
+
+        if self.file and self.is_tty():
+            if self.hide_cursor:
+                print(HIDE_CURSOR, end='', file=self.file)
+            print(self.message, end='', file=self.file)
+            self.file.flush()
+
+    def __getitem__(self, key):
+        if key.startswith('_'):
+            return None
+        return getattr(self, key, None)
+
+    @property
+    def elapsed(self):
+        return int(monotonic() - self.start_ts)
+
+    @property
+    def elapsed_td(self):
+        return timedelta(seconds=self.elapsed)
+
+    def update_avg(self, n, dt):
+        if n > 0:
+            xput_len = len(self._xput)
+            self._xput.append(dt / n)
+            now = monotonic()
+            # update when we're still filling _xput, then after every second
+            if (xput_len < self.sma_window or
+                    now - self._avg_update_ts > 1):
+                self.avg = sum(self._xput) / len(self._xput)
+                self._avg_update_ts = now
+
+    def update(self):
+        pass
+
+    def start(self):
+        pass
+
+    def clearln(self):
+        if self.file and self.is_tty():
+            print('\r\x1b[K', end='', file=self.file)
+
+    def write(self, s):
+        if self.file and self.is_tty():
+            line = self.message + s.ljust(self._width)
+            print('\r' + line, end='', file=self.file)
+            self._width = max(self._width, len(s))
+            self.file.flush()
+
+    def writeln(self, line):
+        if self.file and self.is_tty():
+            self.clearln()
+            print(line, end='', file=self.file)
+            self.file.flush()
+
+    def finish(self):
+        if self.file and self.is_tty():
+            print(file=self.file)
+            if self.hide_cursor:
+                print(SHOW_CURSOR, end='', file=self.file)
+
+    def is_tty(self):
+        return self.file.isatty() if self.check_tty else True
+
+    def next(self, n=1):
+        now = monotonic()
+        dt = now - self._ts
+        self.update_avg(n, dt)
+        self._ts = now
+        self.index = self.index + n
+        self.update()
+
+    def iter(self, it):
+        with self:
+            for x in it:
+                yield x
+                self.next()
+
+    def __enter__(self):
+        self.start()
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.finish()
+
+
+class Progress(Infinite):
+    def __init__(self, *args, **kwargs):
+        super(Progress, self).__init__(*args, **kwargs)
+        self.max = kwargs.get('max', 100)
+
+    @property
+    def eta(self):
+        return int(ceil(self.avg * self.remaining))
+
+    @property
+    def eta_td(self):
+        return timedelta(seconds=self.eta)
+
+    @property
+    def percent(self):
+        return self.progress * 100
+
+    @property
+    def progress(self):
+        return min(1, self.index / self.max)
+
+    @property
+    def remaining(self):
+        return max(self.max - self.index, 0)
+
+    def start(self):
+        self.update()
+
+    def goto(self, index):
+        incr = index - self.index
+        self.next(incr)
+
+    def iter(self, it):
+        try:
+            self.max = len(it)
+        except TypeError:
+            pass
+
+        with self:
+            for x in it:
+                yield x
+                self.next()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fa2ddaa80dba894320a6a1bb98265862db5163e2
GIT binary patch
literal 8933
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py
new file mode 100644
index 00000000..8819efda
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from __future__ import unicode_literals
+
+import sys
+
+from . import Progress
+
+
+class Bar(Progress):
+    width = 32
+    suffix = '%(index)d/%(max)d'
+    bar_prefix = ' |'
+    bar_suffix = '| '
+    empty_fill = ' '
+    fill = '#'
+
+    def update(self):
+        filled_length = int(self.width * self.progress)
+        empty_length = self.width - filled_length
+
+        message = self.message % self
+        bar = self.fill * filled_length
+        empty = self.empty_fill * empty_length
+        suffix = self.suffix % self
+        line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix,
+                        suffix])
+        self.writeln(line)
+
+
+class ChargingBar(Bar):
+    suffix = '%(percent)d%%'
+    bar_prefix = ' '
+    bar_suffix = ' '
+    empty_fill = '∙'
+    fill = '█'
+
+
+class FillingSquaresBar(ChargingBar):
+    empty_fill = '▢'
+    fill = '▣'
+
+
+class FillingCirclesBar(ChargingBar):
+    empty_fill = '◯'
+    fill = '◉'
+
+
+class IncrementalBar(Bar):
+    if sys.platform.startswith('win'):
+        phases = (u' ', u'▌', u'█')
+    else:
+        phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█')
+
+    def update(self):
+        nphases = len(self.phases)
+        filled_len = self.width * self.progress
+        nfull = int(filled_len)                      # Number of full chars
+        phase = int((filled_len - nfull) * nphases)  # Phase of last char
+        nempty = self.width - nfull                  # Number of empty chars
+
+        message = self.message % self
+        bar = self.phases[-1] * nfull
+        current = self.phases[phase] if phase > 0 else ''
+        empty = self.empty_fill * max(0, nempty - len(current))
+        suffix = self.suffix % self
+        line = ''.join([message, self.bar_prefix, bar, current, empty,
+                        self.bar_suffix, suffix])
+        self.writeln(line)
+
+
+class PixelBar(IncrementalBar):
+    phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿')
+
+
+class ShadyBar(IncrementalBar):
+    phases = (' ', '░', '▒', '▓', '█')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a85cf7750509df39e77c093203b76836d91a42f5
GIT binary patch
literal 4043
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
Babo}g

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py
new file mode 100644
index 00000000..d955ca47
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from __future__ import unicode_literals
+from . import Infinite, Progress
+
+
+class Counter(Infinite):
+    def update(self):
+        self.write(str(self.index))
+
+
+class Countdown(Progress):
+    def update(self):
+        self.write(str(self.remaining))
+
+
+class Stack(Progress):
+    phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█')
+
+    def update(self):
+        nphases = len(self.phases)
+        i = min(nphases - 1, int(self.progress * nphases))
+        self.write(self.phases[i])
+
+
+class Pie(Stack):
+    phases = ('○', '◔', '◑', '◕', '●')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d0619345ce25dd1fd0addefd03124c16e00666a8
GIT binary patch
literal 2422
zcmZSn%*&NH<x)&C0~9bbFfceUFfkN2F)%QsFfgPrGUPBY<T5fuF)}cwFfpVsGvqKa
z<T5ivF*D?{FhsF1Fs86Dq%t$4F*2mEGPE!-G&3+nMzJ!aurZ{vfJNEiqHGK)957K%
zxF|bA3Kv5vJ6J6@T$F<$g@++ngO`DUA@l$L|Nk`@85kH!1Q-|?O7k+4^HWmeb23X(
zixP8+GeI&MOdx3v1_lPtytK@`%#zd+5GSB0KfNfmxVVI!fq}s}zcjBTwFvH4kUl4n
zUj-Q$7*ZKPUQA&CIUtIOAt)GZVKPV!2!q1K8KhQ<fq|ihfgy{5p@b34U}9)y1R=&0
z1_p>GKMj!T5>^HVhVmkiOF-P>k|MB3W?o8a1=#Eo76t}};?$fp4N%yFiQ;?)1_u3t
zqRg_yl2rY&#3KE){G623qGJ8*LjCMwBXe`Z!Ym{6GD8dV;+)F#@_3UJ6B7di1B3KD
z{Sf_v%mUrayyB9?oE+WqM9b2^43H2Q$Cst%rQ{ds7eK>9KN%7hdIgmwY@jeLNJ%V7
z6$3d46p##z5HEm&Fg`vnF*h|nzJ!Z`fgwIVH$SB`CpA7k2qXt~G=dli=LdlTR}|)O
zHpUW8SWKtnm*>$bu7f~P83c-Ou=Pc$xrv#1nR)5pcn$)ky#Wp+P-IEN0tp(sL7<Qd
z0>$c}iA!z<1_n?DD+VP(Hb!uU2`))Y&W6V$$j#t9D~`ysTntf63@P9OC5jo8b3w+G
zf^w}wDJXS3n$`%Vo1k<vlx~62tx&oRO1DGl4siYlnE{GhaQ=4(l{1hc0G#b>85v5L
z7-|?nC8b0OGq^}#0r5pZ#R3yUEfZLX6-+WR)G#qfHiL>%P+<Y`r5~jD0%gJykVQGE
zdEgvbkdauNS_~G-&CCPSnRzAPLJgLQ!Kn_MQNc+JT*l==^?`h!IS3M+5-8DuJjcMu
z&#1tt0g6BBM2!YG&w<Q?q+xyr28KbCka-yx800}-2RV|Bk&Ou)fdQGR@PrIXP~e2j
zhe*h*poAP0tN{uyND7?Z4W*|*>4{K!DwOWm02u`35LOIIVMzHN6lRD-0%i?J84fDH
zLAFEly&pK4Kr5WI(vs35P=y1kB}+g=5GZj6fie%c@DJh!#XKm)gJ9+`fDD5W1K}TV
cF13Nwly;!TMKKox1A_pg7_%6w7^@g30Pu$`zyJUM

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py b/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py
new file mode 100644
index 00000000..4e100cab
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+from __future__ import unicode_literals
+from . import Infinite
+
+
+class Spinner(Infinite):
+    phases = ('-', '\\', '|', '/')
+    hide_cursor = True
+
+    def update(self):
+        i = self.index % len(self.phases)
+        self.write(self.phases[i])
+
+
+class PieSpinner(Spinner):
+    phases = ['◷', '◶', '◵', '◴']
+
+
+class MoonSpinner(Spinner):
+    phases = ['◑', '◒', '◐', '◓']
+
+
+class LineSpinner(Spinner):
+    phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻']
+
+
+class PixelSpinner(Spinner):
+    phases = ['⣾', '⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽']
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6a8f739e2a1d07315ad637b94f5b14828a56ad39
GIT binary patch
literal 2211
zcmZSn%*&NH<x)&C0~9bbFfceUFfkNQVqjoMVPHsMWXNG)$Yo@RVq{=UVPZ&OX2@Y;
z$Yo}TVrF1WVPQyRW=LaXNMU7YVPI%xV2F%jVMt+PNM!+wvcpAL8B#c4qMUG1Hii@~
zm?$?~l${}k2PVo37v*3`;bREa;Adc9$o&8R|9=fe1_p)_0R{$!(!9*%{FK!AoXnEc
zqQsoyOppvjnuCFX!80!{GcU6wwS=94fg!jcGcPZ-2<}}L1_lNvkauMn7#LC+K)y_2
zWr$(|`3vL~7Lff>tPDZH8f+k|Kt}79g2)&!Spz2ZlR+X(3=9mQ;By9<r^mp+P{Y8G
z#lTR)2xc%bG&3@Y)j~MTP@x(|2FYenz%nodgI(;W0di3ZE6A65DXA4DAOmw!^GZOr
z7i1(Brxt@H%ZoBgQZ+y}mVh)Ar{<)UfZUL&0g6X3QJl}fz@T4Hlv$QolB!>pSfrnp
zpOcbWRIHy}sGnVIWNvO)m}O*MW@uqvoKu-z9&eIjVq#!mV33}tAEIB7S)iMlS6q^q
zlcQUnXjvMV0TKe^__EZzl>8$7f};HNqSWGI{bER<>J?OiompCtl30=|$-ux+400O-
zqZlLDSKy$+5_sT{EdfPUe0*MFZfbmd2^RwcLwtO0eoARhYJ7YUC^*3W3@Iv2E#YQh
zV93Z!NsUh~Eh^403gTp7U;z6VK@5c7gFvw%3i355uGkpa7}=P>9tp@y#hL7+5Xlal
z*C078oduKxgMuN!21){trf)BW(A%K&Rw%ti10)^<3b7zi$bbV25fWh5fCL900|SE`
zC^$gj!o~=WHsAdGJSv36M5x~<LFoxldh%cm3s9-0gccS)nRyuL0+e#V#gPKmbOA~o
zj11{)7^$Og7bFDwc0=hsP<roR4G~bmt%ejLJPZsB0htx4Iq1m)R4#yn1f&{TLL+6B
z6c$kBlfuT3!p@M+0Sy?C9!LNz-Up?j*=O;3D1SbLUbr7ZFM`sGp#ivf&<30!0|SE=
zBH;WqK*b-poQaQ5D=jH40u`8`N}vQp1c53AaLE(|%8x;ygct-0`yh}x;KBhx3`8*j
aF86I9CA}TUO~s&;AiyZVEXFCu0)ha`R{2%{

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py b/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py
new file mode 100644
index 00000000..9d6a01d5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py
@@ -0,0 +1,6493 @@
+#-*- coding: utf-8 -*-
+# module pyparsing.py
+#
+# Copyright (c) 2003-2019  Paul T. McGuire
+#
+# 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.
+#
+
+__doc__ = \
+"""
+pyparsing module - Classes and methods to define and execute parsing grammars
+=============================================================================
+
+The pyparsing module is an alternative approach to creating and
+executing simple grammars, vs. the traditional lex/yacc approach, or the
+use of regular expressions.  With pyparsing, you don't need to learn
+a new syntax for defining grammars or matching expressions - the parsing
+module provides a library of classes that you use to construct the
+grammar directly in Python.
+
+Here is a program to parse "Hello, World!" (or any greeting of the form
+``"<salutation>, <addressee>!"``), built up using :class:`Word`,
+:class:`Literal`, and :class:`And` elements
+(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions,
+and the strings are auto-converted to :class:`Literal` expressions)::
+
+    from pip._vendor.pyparsing import Word, alphas
+
+    # define grammar of a greeting
+    greet = Word(alphas) + "," + Word(alphas) + "!"
+
+    hello = "Hello, World!"
+    print (hello, "->", greet.parseString(hello))
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the
+self-explanatory class names, and the use of '+', '|' and '^' operators.
+
+The :class:`ParseResults` object returned from
+:class:`ParserElement.parseString` can be
+accessed as a nested list, a dictionary, or an object with named
+attributes.
+
+The pyparsing module handles some of the problems that are typically
+vexing when writing text parsers:
+
+  - extra or missing whitespace (the above program will also handle
+    "Hello,World!", "Hello  ,  World  !", etc.)
+  - quoted strings
+  - embedded comments
+
+
+Getting Started -
+-----------------
+Visit the classes :class:`ParserElement` and :class:`ParseResults` to
+see the base classes that most other pyparsing
+classes inherit from. Use the docstrings for examples of how to:
+
+ - construct literal match expressions from :class:`Literal` and
+   :class:`CaselessLiteral` classes
+ - construct character word-group expressions using the :class:`Word`
+   class
+ - see how to create repetitive expressions using :class:`ZeroOrMore`
+   and :class:`OneOrMore` classes
+ - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`,
+   and :class:`'&'<Each>` operators to combine simple expressions into
+   more complex ones
+ - associate names with your parsed results using
+   :class:`ParserElement.setResultsName`
+ - find some helpful expression short-cuts like :class:`delimitedList`
+   and :class:`oneOf`
+ - find more useful common expressions in the :class:`pyparsing_common`
+   namespace class
+"""
+
+__version__ = "2.4.0"
+__versionTime__ = "07 Apr 2019 18:28 UTC"
+__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"
+
+import string
+from weakref import ref as wkref
+import copy
+import sys
+import warnings
+import re
+import sre_constants
+import collections
+import pprint
+import traceback
+import types
+from datetime import datetime
+
+try:
+    # Python 3
+    from itertools import filterfalse
+except ImportError:
+    from itertools import ifilterfalse as filterfalse
+
+try:
+    from _thread import RLock
+except ImportError:
+    from threading import RLock
+
+try:
+    # Python 3
+    from collections.abc import Iterable
+    from collections.abc import MutableMapping
+except ImportError:
+    # Python 2.7
+    from collections import Iterable
+    from collections import MutableMapping
+
+try:
+    from collections import OrderedDict as _OrderedDict
+except ImportError:
+    try:
+        from ordereddict import OrderedDict as _OrderedDict
+    except ImportError:
+        _OrderedDict = None
+
+try:
+    from types import SimpleNamespace
+except ImportError:
+    class SimpleNamespace: pass
+
+# version compatibility configuration
+__compat__ = SimpleNamespace()
+__compat__.__doc__ = """
+    A cross-version compatibility configuration for pyparsing features that will be 
+    released in a future version. By setting values in this configuration to True, 
+    those features can be enabled in prior versions for compatibility development 
+    and testing.
+    
+     - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping
+       of results names when an And expression is nested within an Or or MatchFirst; set to 
+       True to enable bugfix to be released in pyparsing 2.4
+"""
+__compat__.collect_all_And_tokens = True
+
+
+#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )
+
+__all__ = [ '__version__', '__versionTime__', '__author__', '__compat__',
+'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
+'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
+'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
+'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
+'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
+'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter',
+'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char',
+'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
+'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
+'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums',
+'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno',
+'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
+'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
+'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity',
+'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
+'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
+'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass',
+'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set',
+]
+
+system_version = tuple(sys.version_info)[:3]
+PY_3 = system_version[0] == 3
+if PY_3:
+    _MAX_INT = sys.maxsize
+    basestring = str
+    unichr = chr
+    unicode = str
+    _ustr = str
+
+    # build list of single arg builtins, that can be used as parse actions
+    singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max]
+
+else:
+    _MAX_INT = sys.maxint
+    range = xrange
+
+    def _ustr(obj):
+        """Drop-in replacement for str(obj) that tries to be Unicode
+        friendly. It first tries str(obj). If that fails with
+        a UnicodeEncodeError, then it tries unicode(obj). It then
+        < returns the unicode object | encodes it with the default
+        encoding | ... >.
+        """
+        if isinstance(obj,unicode):
+            return obj
+
+        try:
+            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
+            # it won't break any existing code.
+            return str(obj)
+
+        except UnicodeEncodeError:
+            # Else encode it
+            ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace')
+            xmlcharref = Regex(r'&#\d+;')
+            xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:])
+            return xmlcharref.transformString(ret)
+
+    # build list of single arg builtins, tolerant of Python version, that can be used as parse actions
+    singleArgBuiltins = []
+    import __builtin__
+    for fname in "sum len sorted reversed list tuple set any all min max".split():
+        try:
+            singleArgBuiltins.append(getattr(__builtin__,fname))
+        except AttributeError:
+            continue
+
+_generatorType = type((y for y in range(1)))
+
+def _xml_escape(data):
+    """Escape &, <, >, ", ', etc. in a string of data."""
+
+    # ampersand must be replaced first
+    from_symbols = '&><"\''
+    to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split())
+    for from_,to_ in zip(from_symbols, to_symbols):
+        data = data.replace(from_, to_)
+    return data
+
+alphas     = string.ascii_uppercase + string.ascii_lowercase
+nums       = "0123456789"
+hexnums    = nums + "ABCDEFabcdef"
+alphanums  = alphas + nums
+_bslash    = chr(92)
+printables = "".join(c for c in string.printable if c not in string.whitespace)
+
+class ParseBaseException(Exception):
+    """base exception class for all parsing runtime exceptions"""
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, pstr, loc=0, msg=None, elem=None ):
+        self.loc = loc
+        if msg is None:
+            self.msg = pstr
+            self.pstr = ""
+        else:
+            self.msg = msg
+            self.pstr = pstr
+        self.parserElement = elem
+        self.args = (pstr, loc, msg)
+
+    @classmethod
+    def _from_exception(cls, pe):
+        """
+        internal factory method to simplify creating one type of ParseException
+        from another - avoids having __init__ signature conflicts among subclasses
+        """
+        return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement)
+
+    def __getattr__( self, aname ):
+        """supported attributes by name are:
+           - lineno - returns the line number of the exception text
+           - col - returns the column number of the exception text
+           - line - returns the line containing the exception text
+        """
+        if( aname == "lineno" ):
+            return lineno( self.loc, self.pstr )
+        elif( aname in ("col", "column") ):
+            return col( self.loc, self.pstr )
+        elif( aname == "line" ):
+            return line( self.loc, self.pstr )
+        else:
+            raise AttributeError(aname)
+
+    def __str__( self ):
+        return "%s (at char %d), (line:%d, col:%d)" % \
+                ( self.msg, self.loc, self.lineno, self.column )
+    def __repr__( self ):
+        return _ustr(self)
+    def markInputline( self, markerString = ">!<" ):
+        """Extracts the exception line from the input string, and marks
+           the location of the exception with a special symbol.
+        """
+        line_str = self.line
+        line_column = self.column - 1
+        if markerString:
+            line_str = "".join((line_str[:line_column],
+                                markerString, line_str[line_column:]))
+        return line_str.strip()
+    def __dir__(self):
+        return "lineno col line".split() + dir(type(self))
+
+class ParseException(ParseBaseException):
+    """
+    Exception thrown when parse expressions don't match class;
+    supported attributes by name are:
+    - lineno - returns the line number of the exception text
+    - col - returns the column number of the exception text
+    - line - returns the line containing the exception text
+
+    Example::
+
+        try:
+            Word(nums).setName("integer").parseString("ABC")
+        except ParseException as pe:
+            print(pe)
+            print("column: {}".format(pe.col))
+
+    prints::
+
+       Expected integer (at char 0), (line:1, col:1)
+        column: 1
+
+    """
+
+    @staticmethod
+    def explain(exc, depth=16):
+        """
+        Method to take an exception and translate the Python internal traceback into a list
+        of the pyparsing expressions that caused the exception to be raised.
+
+        Parameters:
+
+         - exc - exception raised during parsing (need not be a ParseException, in support
+           of Python exceptions that might be raised in a parse action)
+         - depth (default=16) - number of levels back in the stack trace to list expression
+           and function names; if None, the full stack trace names will be listed; if 0, only
+           the failing input line, marker, and exception string will be shown
+
+        Returns a multi-line string listing the ParserElements and/or function names in the
+        exception's stack trace.
+
+        Note: the diagnostic output will include string representations of the expressions
+        that failed to parse. These representations will be more helpful if you use `setName` to
+        give identifiable names to your expressions. Otherwise they will use the default string
+        forms, which may be cryptic to read.
+
+        explain() is only supported under Python 3.
+        """
+        import inspect
+
+        if depth is None:
+            depth = sys.getrecursionlimit()
+        ret = []
+        if isinstance(exc, ParseBaseException):
+            ret.append(exc.line)
+            ret.append(' ' * (exc.col - 1) + '^')
+        ret.append("{0}: {1}".format(type(exc).__name__, exc))
+
+        if depth > 0:
+            callers = inspect.getinnerframes(exc.__traceback__, context=depth)
+            seen = set()
+            for i, ff in enumerate(callers[-depth:]):
+                frm = ff[0]
+
+                f_self = frm.f_locals.get('self', None)
+                if isinstance(f_self, ParserElement):
+                    if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'):
+                        continue
+                    if f_self in seen:
+                        continue
+                    seen.add(f_self)
+
+                    self_type = type(f_self)
+                    ret.append("{0}.{1} - {2}".format(self_type.__module__,
+                                                      self_type.__name__,
+                                                      f_self))
+                elif f_self is not None:
+                    self_type = type(f_self)
+                    ret.append("{0}.{1}".format(self_type.__module__,
+                                                self_type.__name__))
+                else:
+                    code = frm.f_code
+                    if code.co_name in ('wrapper', '<module>'):
+                        continue
+
+                    ret.append("{0}".format(code.co_name))
+
+                depth -= 1
+                if not depth:
+                    break
+
+        return '\n'.join(ret)
+
+
+class ParseFatalException(ParseBaseException):
+    """user-throwable exception thrown when inconsistent parse content
+       is found; stops all parsing immediately"""
+    pass
+
+class ParseSyntaxException(ParseFatalException):
+    """just like :class:`ParseFatalException`, but thrown internally
+    when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates
+    that parsing is to stop immediately because an unbacktrackable
+    syntax error has been found.
+    """
+    pass
+
+#~ class ReparseException(ParseBaseException):
+    #~ """Experimental class - parse actions can raise this exception to cause
+       #~ pyparsing to reparse the input string:
+        #~ - with a modified input string, and/or
+        #~ - with a modified start location
+       #~ Set the values of the ReparseException in the constructor, and raise the
+       #~ exception in a parse action to cause pyparsing to use the new string/location.
+       #~ Setting the values as None causes no change to be made.
+       #~ """
+    #~ def __init_( self, newstring, restartLoc ):
+        #~ self.newParseText = newstring
+        #~ self.reparseLoc = restartLoc
+
+class RecursiveGrammarException(Exception):
+    """exception thrown by :class:`ParserElement.validate` if the
+    grammar could be improperly recursive
+    """
+    def __init__( self, parseElementList ):
+        self.parseElementTrace = parseElementList
+
+    def __str__( self ):
+        return "RecursiveGrammarException: %s" % self.parseElementTrace
+
+class _ParseResultsWithOffset(object):
+    def __init__(self,p1,p2):
+        self.tup = (p1,p2)
+    def __getitem__(self,i):
+        return self.tup[i]
+    def __repr__(self):
+        return repr(self.tup[0])
+    def setOffset(self,i):
+        self.tup = (self.tup[0],i)
+
+class ParseResults(object):
+    """Structured parse results, to provide multiple means of access to
+    the parsed data:
+
+       - as a list (``len(results)``)
+       - by list index (``results[0], results[1]``, etc.)
+       - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`)
+
+    Example::
+
+        integer = Word(nums)
+        date_str = (integer.setResultsName("year") + '/'
+                        + integer.setResultsName("month") + '/'
+                        + integer.setResultsName("day"))
+        # equivalent form:
+        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+        # parseString returns a ParseResults object
+        result = date_str.parseString("1999/12/31")
+
+        def test(s, fn=repr):
+            print("%s -> %s" % (s, fn(eval(s))))
+        test("list(result)")
+        test("result[0]")
+        test("result['month']")
+        test("result.day")
+        test("'month' in result")
+        test("'minutes' in result")
+        test("result.dump()", str)
+
+    prints::
+
+        list(result) -> ['1999', '/', '12', '/', '31']
+        result[0] -> '1999'
+        result['month'] -> '12'
+        result.day -> '31'
+        'month' in result -> True
+        'minutes' in result -> False
+        result.dump() -> ['1999', '/', '12', '/', '31']
+        - day: 31
+        - month: 12
+        - year: 1999
+    """
+    def __new__(cls, toklist=None, name=None, asList=True, modal=True ):
+        if isinstance(toklist, cls):
+            return toklist
+        retobj = object.__new__(cls)
+        retobj.__doinit = True
+        return retobj
+
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ):
+        if self.__doinit:
+            self.__doinit = False
+            self.__name = None
+            self.__parent = None
+            self.__accumNames = {}
+            self.__asList = asList
+            self.__modal = modal
+            if toklist is None:
+                toklist = []
+            if isinstance(toklist, list):
+                self.__toklist = toklist[:]
+            elif isinstance(toklist, _generatorType):
+                self.__toklist = list(toklist)
+            else:
+                self.__toklist = [toklist]
+            self.__tokdict = dict()
+
+        if name is not None and name:
+            if not modal:
+                self.__accumNames[name] = 0
+            if isinstance(name,int):
+                name = _ustr(name) # will always return a str, but use _ustr for consistency
+            self.__name = name
+            if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])):
+                if isinstance(toklist,basestring):
+                    toklist = [ toklist ]
+                if asList:
+                    if isinstance(toklist,ParseResults):
+                        self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0)
+                    else:
+                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0)
+                    self[name].__name = name
+                else:
+                    try:
+                        self[name] = toklist[0]
+                    except (KeyError,TypeError,IndexError):
+                        self[name] = toklist
+
+    def __getitem__( self, i ):
+        if isinstance( i, (int,slice) ):
+            return self.__toklist[i]
+        else:
+            if i not in self.__accumNames:
+                return self.__tokdict[i][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[i] ])
+
+    def __setitem__( self, k, v, isinstance=isinstance ):
+        if isinstance(v,_ParseResultsWithOffset):
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
+            sub = v[0]
+        elif isinstance(k,(int,slice)):
+            self.__toklist[k] = v
+            sub = v
+        else:
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
+            sub = v
+        if isinstance(sub,ParseResults):
+            sub.__parent = wkref(self)
+
+    def __delitem__( self, i ):
+        if isinstance(i,(int,slice)):
+            mylen = len( self.__toklist )
+            del self.__toklist[i]
+
+            # convert int to slice
+            if isinstance(i, int):
+                if i < 0:
+                    i += mylen
+                i = slice(i, i+1)
+            # get removed indices
+            removed = list(range(*i.indices(mylen)))
+            removed.reverse()
+            # fixup indices in token dictionary
+            for name,occurrences in self.__tokdict.items():
+                for j in removed:
+                    for k, (value, position) in enumerate(occurrences):
+                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
+        else:
+            del self.__tokdict[i]
+
+    def __contains__( self, k ):
+        return k in self.__tokdict
+
+    def __len__( self ): return len( self.__toklist )
+    def __bool__(self): return ( not not self.__toklist )
+    __nonzero__ = __bool__
+    def __iter__( self ): return iter( self.__toklist )
+    def __reversed__( self ): return iter( self.__toklist[::-1] )
+    def _iterkeys( self ):
+        if hasattr(self.__tokdict, "iterkeys"):
+            return self.__tokdict.iterkeys()
+        else:
+            return iter(self.__tokdict)
+
+    def _itervalues( self ):
+        return (self[k] for k in self._iterkeys())
+
+    def _iteritems( self ):
+        return ((k, self[k]) for k in self._iterkeys())
+
+    if PY_3:
+        keys = _iterkeys
+        """Returns an iterator of all named result keys."""
+
+        values = _itervalues
+        """Returns an iterator of all named result values."""
+
+        items = _iteritems
+        """Returns an iterator of all named result key-value tuples."""
+
+    else:
+        iterkeys = _iterkeys
+        """Returns an iterator of all named result keys (Python 2.x only)."""
+
+        itervalues = _itervalues
+        """Returns an iterator of all named result values (Python 2.x only)."""
+
+        iteritems = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 2.x only)."""
+
+        def keys( self ):
+            """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iterkeys())
+
+        def values( self ):
+            """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.itervalues())
+
+        def items( self ):
+            """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iteritems())
+
+    def haskeys( self ):
+        """Since keys() returns an iterator, this method is helpful in bypassing
+           code that looks for the existence of any defined results names."""
+        return bool(self.__tokdict)
+
+    def pop( self, *args, **kwargs):
+        """
+        Removes and returns item at specified index (default= ``last``).
+        Supports both ``list`` and ``dict`` semantics for ``pop()``. If
+        passed no argument or an integer argument, it will use ``list``
+        semantics and pop tokens from the list of parsed tokens. If passed
+        a non-integer argument (most likely a string), it will use ``dict``
+        semantics and pop the corresponding value from any defined results
+        names. A second default return value argument is supported, just as in
+        ``dict.pop()``.
+
+        Example::
+
+            def remove_first(tokens):
+                tokens.pop(0)
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']
+
+            label = Word(alphas)
+            patt = label("LABEL") + OneOrMore(Word(nums))
+            print(patt.parseString("AAB 123 321").dump())
+
+            # Use pop() in a parse action to remove named result (note that corresponding value is not
+            # removed from list form of results)
+            def remove_LABEL(tokens):
+                tokens.pop("LABEL")
+                return tokens
+            patt.addParseAction(remove_LABEL)
+            print(patt.parseString("AAB 123 321").dump())
+
+        prints::
+
+            ['AAB', '123', '321']
+            - LABEL: AAB
+
+            ['AAB', '123', '321']
+        """
+        if not args:
+            args = [-1]
+        for k,v in kwargs.items():
+            if k == 'default':
+                args = (args[0], v)
+            else:
+                raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
+        if (isinstance(args[0], int) or
+                        len(args) == 1 or
+                        args[0] in self):
+            index = args[0]
+            ret = self[index]
+            del self[index]
+            return ret
+        else:
+            defaultvalue = args[1]
+            return defaultvalue
+
+    def get(self, key, defaultValue=None):
+        """
+        Returns named result matching the given key, or if there is no
+        such name, then returns the given ``defaultValue`` or ``None`` if no
+        ``defaultValue`` is specified.
+
+        Similar to ``dict.get()``.
+
+        Example::
+
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+            result = date_str.parseString("1999/12/31")
+            print(result.get("year")) # -> '1999'
+            print(result.get("hour", "not specified")) # -> 'not specified'
+            print(result.get("hour")) # -> None
+        """
+        if key in self:
+            return self[key]
+        else:
+            return defaultValue
+
+    def insert( self, index, insStr ):
+        """
+        Inserts new element at location index in the list of parsed tokens.
+
+        Similar to ``list.insert()``.
+
+        Example::
+
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+
+            # use a parse action to insert the parse location in the front of the parsed results
+            def insert_locn(locn, tokens):
+                tokens.insert(0, locn)
+            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
+        """
+        self.__toklist.insert(index, insStr)
+        # fixup indices in token dictionary
+        for name,occurrences in self.__tokdict.items():
+            for k, (value, position) in enumerate(occurrences):
+                occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))
+
+    def append( self, item ):
+        """
+        Add single element to end of ParseResults list of elements.
+
+        Example::
+
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+
+            # use a parse action to compute the sum of the parsed integers, and add it to the end
+            def append_sum(tokens):
+                tokens.append(sum(map(int, tokens)))
+            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
+        """
+        self.__toklist.append(item)
+
+    def extend( self, itemseq ):
+        """
+        Add sequence of elements to end of ParseResults list of elements.
+
+        Example::
+
+            patt = OneOrMore(Word(alphas))
+
+            # use a parse action to append the reverse of the matched strings, to make a palindrome
+            def make_palindrome(tokens):
+                tokens.extend(reversed([t[::-1] for t in tokens]))
+                return ''.join(tokens)
+            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
+        """
+        if isinstance(itemseq, ParseResults):
+            self.__iadd__(itemseq)
+        else:
+            self.__toklist.extend(itemseq)
+
+    def clear( self ):
+        """
+        Clear all elements and results names.
+        """
+        del self.__toklist[:]
+        self.__tokdict.clear()
+
+    def __getattr__( self, name ):
+        try:
+            return self[name]
+        except KeyError:
+            return ""
+
+        if name in self.__tokdict:
+            if name not in self.__accumNames:
+                return self.__tokdict[name][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[name] ])
+        else:
+            return ""
+
+    def __add__( self, other ):
+        ret = self.copy()
+        ret += other
+        return ret
+
+    def __iadd__( self, other ):
+        if other.__tokdict:
+            offset = len(self.__toklist)
+            addoffset = lambda a: offset if a<0 else a+offset
+            otheritems = other.__tokdict.items()
+            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
+                                for (k,vlist) in otheritems for v in vlist]
+            for k,v in otherdictitems:
+                self[k] = v
+                if isinstance(v[0],ParseResults):
+                    v[0].__parent = wkref(self)
+
+        self.__toklist += other.__toklist
+        self.__accumNames.update( other.__accumNames )
+        return self
+
+    def __radd__(self, other):
+        if isinstance(other,int) and other == 0:
+            # useful for merging many ParseResults using sum() builtin
+            return self.copy()
+        else:
+            # this may raise a TypeError - so be it
+            return other + self
+
+    def __repr__( self ):
+        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
+
+    def __str__( self ):
+        return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']'
+
+    def _asStringList( self, sep='' ):
+        out = []
+        for item in self.__toklist:
+            if out and sep:
+                out.append(sep)
+            if isinstance( item, ParseResults ):
+                out += item._asStringList()
+            else:
+                out.append( _ustr(item) )
+        return out
+
+    def asList( self ):
+        """
+        Returns the parse results as a nested list of matching tokens, all converted to strings.
+
+        Example::
+
+            patt = OneOrMore(Word(alphas))
+            result = patt.parseString("sldkj lsdkj sldkj")
+            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
+            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
+
+            # Use asList() to create an actual list
+            result_list = result.asList()
+            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
+        """
+        return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist]
+
+    def asDict( self ):
+        """
+        Returns the named parse results as a nested dictionary.
+
+        Example::
+
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+            result = date_str.parseString('12/31/1999')
+            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
+
+            result_dict = result.asDict()
+            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}
+
+            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
+            import json
+            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
+            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
+        """
+        if PY_3:
+            item_fn = self.items
+        else:
+            item_fn = self.iteritems
+
+        def toItem(obj):
+            if isinstance(obj, ParseResults):
+                if obj.haskeys():
+                    return obj.asDict()
+                else:
+                    return [toItem(v) for v in obj]
+            else:
+                return obj
+
+        return dict((k,toItem(v)) for k,v in item_fn())
+
+    def copy( self ):
+        """
+        Returns a new copy of a :class:`ParseResults` object.
+        """
+        ret = ParseResults( self.__toklist )
+        ret.__tokdict = dict(self.__tokdict.items())
+        ret.__parent = self.__parent
+        ret.__accumNames.update( self.__accumNames )
+        ret.__name = self.__name
+        return ret
+
+    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
+        """
+        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
+        """
+        nl = "\n"
+        out = []
+        namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items()
+                                                            for v in vlist)
+        nextLevelIndent = indent + "  "
+
+        # collapse out indents if formatting is not desired
+        if not formatted:
+            indent = ""
+            nextLevelIndent = ""
+            nl = ""
+
+        selfTag = None
+        if doctag is not None:
+            selfTag = doctag
+        else:
+            if self.__name:
+                selfTag = self.__name
+
+        if not selfTag:
+            if namedItemsOnly:
+                return ""
+            else:
+                selfTag = "ITEM"
+
+        out += [ nl, indent, "<", selfTag, ">" ]
+
+        for i,res in enumerate(self.__toklist):
+            if isinstance(res,ParseResults):
+                if i in namedItems:
+                    out += [ res.asXML(namedItems[i],
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+                else:
+                    out += [ res.asXML(None,
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+            else:
+                # individual token, see if there is a name for it
+                resTag = None
+                if i in namedItems:
+                    resTag = namedItems[i]
+                if not resTag:
+                    if namedItemsOnly:
+                        continue
+                    else:
+                        resTag = "ITEM"
+                xmlBodyText = _xml_escape(_ustr(res))
+                out += [ nl, nextLevelIndent, "<", resTag, ">",
+                                                xmlBodyText,
+                                                "</", resTag, ">" ]
+
+        out += [ nl, indent, "</", selfTag, ">" ]
+        return "".join(out)
+
+    def __lookup(self,sub):
+        for k,vlist in self.__tokdict.items():
+            for v,loc in vlist:
+                if sub is v:
+                    return k
+        return None
+
+    def getName(self):
+        r"""
+        Returns the results name for this token expression. Useful when several
+        different expressions might match at a particular location.
+
+        Example::
+
+            integer = Word(nums)
+            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
+            house_number_expr = Suppress('#') + Word(nums, alphanums)
+            user_data = (Group(house_number_expr)("house_number")
+                        | Group(ssn_expr)("ssn")
+                        | Group(integer)("age"))
+            user_info = OneOrMore(user_data)
+
+            result = user_info.parseString("22 111-22-3333 #221B")
+            for item in result:
+                print(item.getName(), ':', item[0])
+
+        prints::
+
+            age : 22
+            ssn : 111-22-3333
+            house_number : 221B
+        """
+        if self.__name:
+            return self.__name
+        elif self.__parent:
+            par = self.__parent()
+            if par:
+                return par.__lookup(self)
+            else:
+                return None
+        elif (len(self) == 1 and
+               len(self.__tokdict) == 1 and
+               next(iter(self.__tokdict.values()))[0][1] in (0,-1)):
+            return next(iter(self.__tokdict.keys()))
+        else:
+            return None
+
+    def dump(self, indent='', depth=0, full=True):
+        """
+        Diagnostic method for listing out the contents of
+        a :class:`ParseResults`. Accepts an optional ``indent`` argument so
+        that this string can be embedded in a nested display of other data.
+
+        Example::
+
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+            result = date_str.parseString('12/31/1999')
+            print(result.dump())
+
+        prints::
+
+            ['12', '/', '31', '/', '1999']
+            - day: 1999
+            - month: 31
+            - year: 12
+        """
+        out = []
+        NL = '\n'
+        out.append( indent+_ustr(self.asList()) )
+        if full:
+            if self.haskeys():
+                items = sorted((str(k), v) for k,v in self.items())
+                for k,v in items:
+                    if out:
+                        out.append(NL)
+                    out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
+                    if isinstance(v,ParseResults):
+                        if v:
+                            out.append( v.dump(indent,depth+1) )
+                        else:
+                            out.append(_ustr(v))
+                    else:
+                        out.append(repr(v))
+            elif any(isinstance(vv,ParseResults) for vv in self):
+                v = self
+                for i,vv in enumerate(v):
+                    if isinstance(vv,ParseResults):
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),vv.dump(indent,depth+1) ))
+                    else:
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),_ustr(vv)))
+
+        return "".join(out)
+
+    def pprint(self, *args, **kwargs):
+        """
+        Pretty-printer for parsed results as a list, using the
+        `pprint <https://docs.python.org/3/library/pprint.html>`_ module.
+        Accepts additional positional or keyword args as defined for
+        `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ .
+
+        Example::
+
+            ident = Word(alphas, alphanums)
+            num = Word(nums)
+            func = Forward()
+            term = ident | num | Group('(' + func + ')')
+            func <<= ident + Group(Optional(delimitedList(term)))
+            result = func.parseString("fna a,b,(fnb c,d,200),100")
+            result.pprint(width=40)
+
+        prints::
+
+            ['fna',
+             ['a',
+              'b',
+              ['(', 'fnb', ['c', 'd', '200'], ')'],
+              '100']]
+        """
+        pprint.pprint(self.asList(), *args, **kwargs)
+
+    # add support for pickle protocol
+    def __getstate__(self):
+        return ( self.__toklist,
+                 ( self.__tokdict.copy(),
+                   self.__parent is not None and self.__parent() or None,
+                   self.__accumNames,
+                   self.__name ) )
+
+    def __setstate__(self,state):
+        self.__toklist = state[0]
+        (self.__tokdict,
+         par,
+         inAccumNames,
+         self.__name) = state[1]
+        self.__accumNames = {}
+        self.__accumNames.update(inAccumNames)
+        if par is not None:
+            self.__parent = wkref(par)
+        else:
+            self.__parent = None
+
+    def __getnewargs__(self):
+        return self.__toklist, self.__name, self.__asList, self.__modal
+
+    def __dir__(self):
+        return (dir(type(self)) + list(self.keys()))
+
+MutableMapping.register(ParseResults)
+
+def col (loc,strg):
+    """Returns current column within a string, counting newlines as line separators.
+   The first column is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See
+   :class:`ParserElement.parseString` for more
+   information on parsing strings containing ``<TAB>`` s, and suggested
+   methods to maintain a consistent view of the parsed string, the parse
+   location, and line and column positions within the parsed string.
+   """
+    s = strg
+    return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc)
+
+def lineno(loc,strg):
+    """Returns current line number within a string, counting newlines as line separators.
+    The first line is number 1.
+
+    Note - the default parsing behavior is to expand tabs in the input string
+    before starting the parsing process.  See :class:`ParserElement.parseString`
+    for more information on parsing strings containing ``<TAB>`` s, and
+    suggested methods to maintain a consistent view of the parsed string, the
+    parse location, and line and column positions within the parsed string.
+    """
+    return strg.count("\n",0,loc) + 1
+
+def line( loc, strg ):
+    """Returns the line of text containing loc within a string, counting newlines as line separators.
+       """
+    lastCR = strg.rfind("\n", 0, loc)
+    nextCR = strg.find("\n", loc)
+    if nextCR >= 0:
+        return strg[lastCR+1:nextCR]
+    else:
+        return strg[lastCR+1:]
+
+def _defaultStartDebugAction( instring, loc, expr ):
+    print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))
+
+def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
+    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))
+
+def _defaultExceptionDebugAction( instring, loc, expr, exc ):
+    print ("Exception raised:" + _ustr(exc))
+
+def nullDebugAction(*args):
+    """'Do-nothing' debug action, to suppress debugging output during parsing."""
+    pass
+
+# Only works on Python 3.x - nonlocal is toxic to Python 2 installs
+#~ 'decorator to trim function calls to match the arity of the target'
+#~ def _trim_arity(func, maxargs=3):
+    #~ if func in singleArgBuiltins:
+        #~ return lambda s,l,t: func(t)
+    #~ limit = 0
+    #~ foundArity = False
+    #~ def wrapper(*args):
+        #~ nonlocal limit,foundArity
+        #~ while 1:
+            #~ try:
+                #~ ret = func(*args[limit:])
+                #~ foundArity = True
+                #~ return ret
+            #~ except TypeError:
+                #~ if limit == maxargs or foundArity:
+                    #~ raise
+                #~ limit += 1
+                #~ continue
+    #~ return wrapper
+
+# this version is Python 2.x-3.x cross-compatible
+'decorator to trim function calls to match the arity of the target'
+def _trim_arity(func, maxargs=2):
+    if func in singleArgBuiltins:
+        return lambda s,l,t: func(t)
+    limit = [0]
+    foundArity = [False]
+
+    # traceback return data structure changed in Py3.5 - normalize back to plain tuples
+    if system_version[:2] >= (3,5):
+        def extract_stack(limit=0):
+            # special handling for Python 3.5.0 - extra deep call stack by 1
+            offset = -3 if system_version == (3,5,0) else -2
+            frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset]
+            return [frame_summary[:2]]
+        def extract_tb(tb, limit=0):
+            frames = traceback.extract_tb(tb, limit=limit)
+            frame_summary = frames[-1]
+            return [frame_summary[:2]]
+    else:
+        extract_stack = traceback.extract_stack
+        extract_tb = traceback.extract_tb
+
+    # synthesize what would be returned by traceback.extract_stack at the call to
+    # user's parse action 'func', so that we don't incur call penalty at parse time
+
+    LINE_DIFF = 6
+    # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND
+    # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
+    this_line = extract_stack(limit=2)[-1]
+    pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF)
+
+    def wrapper(*args):
+        while 1:
+            try:
+                ret = func(*args[limit[0]:])
+                foundArity[0] = True
+                return ret
+            except TypeError:
+                # re-raise TypeErrors if they did not come from our arity testing
+                if foundArity[0]:
+                    raise
+                else:
+                    try:
+                        tb = sys.exc_info()[-1]
+                        if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth:
+                            raise
+                    finally:
+                        del tb
+
+                if limit[0] <= maxargs:
+                    limit[0] += 1
+                    continue
+                raise
+
+    # copy func name to wrapper for sensible debug output
+    func_name = "<parse action>"
+    try:
+        func_name = getattr(func, '__name__',
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    wrapper.__name__ = func_name
+
+    return wrapper
+
+class ParserElement(object):
+    """Abstract base level parser element class."""
+    DEFAULT_WHITE_CHARS = " \n\t\r"
+    verbose_stacktrace = False
+
+    @staticmethod
+    def setDefaultWhitespaceChars( chars ):
+        r"""
+        Overrides the default whitespace chars
+
+        Example::
+
+            # default whitespace chars are space, <TAB> and newline
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
+
+            # change to just treat newline as significant
+            ParserElement.setDefaultWhitespaceChars(" \t")
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
+        """
+        ParserElement.DEFAULT_WHITE_CHARS = chars
+
+    @staticmethod
+    def inlineLiteralsUsing(cls):
+        """
+        Set class to be used for inclusion of string literals into a parser.
+
+        Example::
+
+            # default literal class used is Literal
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+
+            # change to Suppress
+            ParserElement.inlineLiteralsUsing(Suppress)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
+        """
+        ParserElement._literalStringClass = cls
+
+    def __init__( self, savelist=False ):
+        self.parseAction = list()
+        self.failAction = None
+        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
+        self.strRepr = None
+        self.resultsName = None
+        self.saveAsList = savelist
+        self.skipWhitespace = True
+        self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS)
+        self.copyDefaultWhiteChars = True
+        self.mayReturnEmpty = False # used when checking for left-recursion
+        self.keepTabs = False
+        self.ignoreExprs = list()
+        self.debug = False
+        self.streamlined = False
+        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
+        self.errmsg = ""
+        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
+        self.debugActions = ( None, None, None ) #custom debug actions
+        self.re = None
+        self.callPreparse = True # used to avoid redundant calls to preParse
+        self.callDuringTry = False
+
+    def copy( self ):
+        """
+        Make a copy of this :class:`ParserElement`.  Useful for defining
+        different parse actions for the same parsing pattern, using copies of
+        the original parse element.
+
+        Example::
+
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
+            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+
+            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
+
+        prints::
+
+            [5120, 100, 655360, 268435456]
+
+        Equivalent form of ``expr.copy()`` is just ``expr()``::
+
+            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+        """
+        cpy = copy.copy( self )
+        cpy.parseAction = self.parseAction[:]
+        cpy.ignoreExprs = self.ignoreExprs[:]
+        if self.copyDefaultWhiteChars:
+            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        return cpy
+
+    def setName( self, name ):
+        """
+        Define name for this expression, makes debugging and exception messages clearer.
+
+        Example::
+
+            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
+            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
+        """
+        self.name = name
+        self.errmsg = "Expected " + self.name
+        if hasattr(self,"exception"):
+            self.exception.msg = self.errmsg
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        """
+        Define name for referencing matching tokens as a nested attribute
+        of the returned parse results.
+        NOTE: this returns a *copy* of the original :class:`ParserElement` object;
+        this is so that the client can define a basic element, such as an
+        integer, and reference it in multiple places with different names.
+
+        You can also set results names using the abbreviated syntax,
+        ``expr("name")`` in place of ``expr.setResultsName("name")``
+        - see :class:`__call__`.
+
+        Example::
+
+            date_str = (integer.setResultsName("year") + '/'
+                        + integer.setResultsName("month") + '/'
+                        + integer.setResultsName("day"))
+
+            # equivalent form:
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+        """
+        newself = self.copy()
+        if name.endswith("*"):
+            name = name[:-1]
+            listAllMatches=True
+        newself.resultsName = name
+        newself.modalResults = not listAllMatches
+        return newself
+
+    def setBreak(self,breakFlag = True):
+        """Method to invoke the Python pdb debugger when this element is
+           about to be parsed. Set ``breakFlag`` to True to enable, False to
+           disable.
+        """
+        if breakFlag:
+            _parseMethod = self._parse
+            def breaker(instring, loc, doActions=True, callPreParse=True):
+                import pdb
+                pdb.set_trace()
+                return _parseMethod( instring, loc, doActions, callPreParse )
+            breaker._originalParseMethod = _parseMethod
+            self._parse = breaker
+        else:
+            if hasattr(self._parse,"_originalParseMethod"):
+                self._parse = self._parse._originalParseMethod
+        return self
+
+    def setParseAction( self, *fns, **kwargs ):
+        """
+        Define one or more actions to perform when successfully matching parse element definition.
+        Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` ,
+        ``fn(loc,toks)`` , ``fn(toks)`` , or just ``fn()`` , where:
+
+        - s   = the original string being parsed (see note below)
+        - loc = the location of the matching substring
+        - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object
+
+        If the functions in fns modify the tokens, they can return them as the return
+        value from fn, and the modified list of tokens will replace the original.
+        Otherwise, fn does not need to return any value.
+
+        Optional keyword arguments:
+        - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing
+
+        Note: the default parsing behavior is to expand tabs in the input string
+        before starting the parsing process.  See :class:`parseString for more
+        information on parsing strings containing ``<TAB>`` s, and suggested
+        methods to maintain a consistent view of the parsed string, the parse
+        location, and line and column positions within the parsed string.
+
+        Example::
+
+            integer = Word(nums)
+            date_str = integer + '/' + integer + '/' + integer
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+            # use parse action to convert to ints at parse time
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            date_str = integer + '/' + integer + '/' + integer
+
+            # note that integer fields are now ints, not strings
+            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
+        """
+        self.parseAction = list(map(_trim_arity, list(fns)))
+        self.callDuringTry = kwargs.get("callDuringTry", False)
+        return self
+
+    def addParseAction( self, *fns, **kwargs ):
+        """
+        Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`.
+
+        See examples in :class:`copy`.
+        """
+        self.parseAction += list(map(_trim_arity, list(fns)))
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def addCondition(self, *fns, **kwargs):
+        """Add a boolean predicate function to expression's list of parse actions. See
+        :class:`setParseAction` for function call signatures. Unlike ``setParseAction``,
+        functions passed to ``addCondition`` need to return boolean success/fail of the condition.
+
+        Optional keyword arguments:
+        - message = define a custom message to be used in the raised exception
+        - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
+
+        Example::
+
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            year_int = integer.copy()
+            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
+            date_str = year_int + '/' + integer + '/' + integer
+
+            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
+        """
+        msg = kwargs.get("message", "failed user-defined condition")
+        exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException
+        for fn in fns:
+            fn = _trim_arity(fn)
+            def pa(s,l,t):
+                if not bool(fn(s,l,t)):
+                    raise exc_type(s,l,msg)
+            self.parseAction.append(pa)
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def setFailAction( self, fn ):
+        """Define action to perform if parsing fails at this expression.
+           Fail acton fn is a callable function that takes the arguments
+           ``fn(s,loc,expr,err)`` where:
+           - s = string being parsed
+           - loc = location where expression match was attempted and failed
+           - expr = the parse expression that failed
+           - err = the exception thrown
+           The function returns no value.  It may throw :class:`ParseFatalException`
+           if it is desired to stop parsing immediately."""
+        self.failAction = fn
+        return self
+
+    def _skipIgnorables( self, instring, loc ):
+        exprsFound = True
+        while exprsFound:
+            exprsFound = False
+            for e in self.ignoreExprs:
+                try:
+                    while 1:
+                        loc,dummy = e._parse( instring, loc )
+                        exprsFound = True
+                except ParseException:
+                    pass
+        return loc
+
+    def preParse( self, instring, loc ):
+        if self.ignoreExprs:
+            loc = self._skipIgnorables( instring, loc )
+
+        if self.skipWhitespace:
+            wt = self.whiteChars
+            instrlen = len(instring)
+            while loc < instrlen and instring[loc] in wt:
+                loc += 1
+
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        return loc, []
+
+    def postParse( self, instring, loc, tokenlist ):
+        return tokenlist
+
+    #~ @profile
+    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
+        debugging = ( self.debug ) #and doActions )
+
+        if debugging or self.failAction:
+            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
+            if (self.debugActions[0] ):
+                self.debugActions[0]( instring, loc, self )
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            try:
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            except ParseBaseException as err:
+                #~ print ("Exception raised:", err)
+                if self.debugActions[2]:
+                    self.debugActions[2]( instring, tokensStart, self, err )
+                if self.failAction:
+                    self.failAction( instring, tokensStart, self, err )
+                raise
+        else:
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            if self.mayIndexError or preloc >= len(instring):
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            else:
+                loc,tokens = self.parseImpl( instring, preloc, doActions )
+
+        tokens = self.postParse( instring, loc, tokens )
+
+        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
+        if self.parseAction and (doActions or self.callDuringTry):
+            if debugging:
+                try:
+                    for fn in self.parseAction:
+                        try:
+                            tokens = fn( instring, tokensStart, retTokens )
+                        except IndexError as parse_action_exc:
+                            exc = ParseException("exception raised in parse action")
+                            exc.__cause__ = parse_action_exc
+                            raise exc
+
+                        if tokens is not None and tokens is not retTokens:
+                            retTokens = ParseResults( tokens,
+                                                      self.resultsName,
+                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                      modal=self.modalResults )
+                except ParseBaseException as err:
+                    #~ print "Exception raised in user parse action:", err
+                    if (self.debugActions[2] ):
+                        self.debugActions[2]( instring, tokensStart, self, err )
+                    raise
+            else:
+                for fn in self.parseAction:
+                    try:
+                        tokens = fn( instring, tokensStart, retTokens )
+                    except IndexError as parse_action_exc:
+                        exc = ParseException("exception raised in parse action")
+                        exc.__cause__ = parse_action_exc
+                        raise exc
+
+                    if tokens is not None and tokens is not retTokens:
+                        retTokens = ParseResults( tokens,
+                                                  self.resultsName,
+                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                  modal=self.modalResults )
+        if debugging:
+            #~ print ("Matched",self,"->",retTokens.asList())
+            if (self.debugActions[1] ):
+                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )
+
+        return loc, retTokens
+
+    def tryParse( self, instring, loc ):
+        try:
+            return self._parse( instring, loc, doActions=False )[0]
+        except ParseFatalException:
+            raise ParseException( instring, loc, self.errmsg, self)
+
+    def canParseNext(self, instring, loc):
+        try:
+            self.tryParse(instring, loc)
+        except (ParseException, IndexError):
+            return False
+        else:
+            return True
+
+    class _UnboundedCache(object):
+        def __init__(self):
+            cache = {}
+            self.not_in_cache = not_in_cache = object()
+
+            def get(self, key):
+                return cache.get(key, not_in_cache)
+
+            def set(self, key, value):
+                cache[key] = value
+
+            def clear(self):
+                cache.clear()
+
+            def cache_len(self):
+                return len(cache)
+
+            self.get = types.MethodType(get, self)
+            self.set = types.MethodType(set, self)
+            self.clear = types.MethodType(clear, self)
+            self.__len__ = types.MethodType(cache_len, self)
+
+    if _OrderedDict is not None:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = _OrderedDict()
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    while len(cache) > size:
+                        try:
+                            cache.popitem(False)
+                        except KeyError:
+                            pass
+
+                def clear(self):
+                    cache.clear()
+
+                def cache_len(self):
+                    return len(cache)
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+                self.__len__ = types.MethodType(cache_len, self)
+
+    else:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = {}
+                key_fifo = collections.deque([], size)
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    while len(key_fifo) > size:
+                        cache.pop(key_fifo.popleft(), None)
+                    key_fifo.append(key)
+
+                def clear(self):
+                    cache.clear()
+                    key_fifo.clear()
+
+                def cache_len(self):
+                    return len(cache)
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+                self.__len__ = types.MethodType(cache_len, self)
+
+    # argument cache for optimizing repeated calls when backtracking through recursive expressions
+    packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail
+    packrat_cache_lock = RLock()
+    packrat_cache_stats = [0, 0]
+
+    # this method gets repeatedly called during backtracking with the same arguments -
+    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
+    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
+        HIT, MISS = 0, 1
+        lookup = (self, instring, loc, callPreParse, doActions)
+        with ParserElement.packrat_cache_lock:
+            cache = ParserElement.packrat_cache
+            value = cache.get(lookup)
+            if value is cache.not_in_cache:
+                ParserElement.packrat_cache_stats[MISS] += 1
+                try:
+                    value = self._parseNoCache(instring, loc, doActions, callPreParse)
+                except ParseBaseException as pe:
+                    # cache a copy of the exception, without the traceback
+                    cache.set(lookup, pe.__class__(*pe.args))
+                    raise
+                else:
+                    cache.set(lookup, (value[0], value[1].copy()))
+                    return value
+            else:
+                ParserElement.packrat_cache_stats[HIT] += 1
+                if isinstance(value, Exception):
+                    raise value
+                return (value[0], value[1].copy())
+
+    _parse = _parseNoCache
+
+    @staticmethod
+    def resetCache():
+        ParserElement.packrat_cache.clear()
+        ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats)
+
+    _packratEnabled = False
+    @staticmethod
+    def enablePackrat(cache_size_limit=128):
+        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
+           Repeated parse attempts at the same string location (which happens
+           often in many complex grammars) can immediately return a cached value,
+           instead of re-executing parsing/validating code.  Memoizing is done of
+           both valid results and parsing exceptions.
+
+           Parameters:
+
+           - cache_size_limit - (default= ``128``) - if an integer value is provided
+             will limit the size of the packrat cache; if None is passed, then
+             the cache size will be unbounded; if 0 is passed, the cache will
+             be effectively disabled.
+
+           This speedup may break existing programs that use parse actions that
+           have side-effects.  For this reason, packrat parsing is disabled when
+           you first import pyparsing.  To activate the packrat feature, your
+           program must call the class method :class:`ParserElement.enablePackrat`.
+           For best results, call ``enablePackrat()`` immediately after
+           importing pyparsing.
+
+           Example::
+
+               from pip._vendor import pyparsing
+               pyparsing.ParserElement.enablePackrat()
+        """
+        if not ParserElement._packratEnabled:
+            ParserElement._packratEnabled = True
+            if cache_size_limit is None:
+                ParserElement.packrat_cache = ParserElement._UnboundedCache()
+            else:
+                ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit)
+            ParserElement._parse = ParserElement._parseCache
+
+    def parseString( self, instring, parseAll=False ):
+        """
+        Execute the parse expression with the given string.
+        This is the main interface to the client code, once the complete
+        expression has been built.
+
+        If you want the grammar to require that the entire input string be
+        successfully parsed, then set ``parseAll`` to True (equivalent to ending
+        the grammar with ``StringEnd()``).
+
+        Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string,
+        in order to report proper column numbers in parse actions.
+        If the input string contains tabs and
+        the grammar uses parse actions that use the ``loc`` argument to index into the
+        string being parsed, you can ensure you have a consistent view of the input
+        string by:
+
+        - calling ``parseWithTabs`` on your grammar before calling ``parseString``
+          (see :class:`parseWithTabs`)
+        - define your parse action using the full ``(s,loc,toks)`` signature, and
+          reference the input string using the parse action's ``s`` argument
+        - explictly expand the tabs in your input string before calling
+          ``parseString``
+
+        Example::
+
+            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
+            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
+        """
+        ParserElement.resetCache()
+        if not self.streamlined:
+            self.streamline()
+            #~ self.saveAsList = True
+        for e in self.ignoreExprs:
+            e.streamline()
+        if not self.keepTabs:
+            instring = instring.expandtabs()
+        try:
+            loc, tokens = self._parse( instring, 0 )
+            if parseAll:
+                loc = self.preParse( instring, loc )
+                se = Empty() + StringEnd()
+                se._parse( instring, loc )
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+        else:
+            return tokens
+
+    def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
+        """
+        Scan the input string for expression matches.  Each match will return the
+        matching tokens, start location, and end location.  May be called with optional
+        ``maxMatches`` argument, to clip scanning after 'n' matches are found.  If
+        ``overlap`` is specified, then overlapping matches will be reported.
+
+        Note that the start and end locations are reported relative to the string
+        being parsed.  See :class:`parseString` for more information on parsing
+        strings with embedded tabs.
+
+        Example::
+
+            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
+            print(source)
+            for tokens,start,end in Word(alphas).scanString(source):
+                print(' '*start + '^'*(end-start))
+                print(' '*start + tokens[0])
+
+        prints::
+
+            sldjf123lsdjjkf345sldkjf879lkjsfd987
+            ^^^^^
+            sldjf
+                    ^^^^^^^
+                    lsdjjkf
+                              ^^^^^^
+                              sldkjf
+                                       ^^^^^^
+                                       lkjsfd
+        """
+        if not self.streamlined:
+            self.streamline()
+        for e in self.ignoreExprs:
+            e.streamline()
+
+        if not self.keepTabs:
+            instring = _ustr(instring).expandtabs()
+        instrlen = len(instring)
+        loc = 0
+        preparseFn = self.preParse
+        parseFn = self._parse
+        ParserElement.resetCache()
+        matches = 0
+        try:
+            while loc <= instrlen and matches < maxMatches:
+                try:
+                    preloc = preparseFn( instring, loc )
+                    nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
+                except ParseException:
+                    loc = preloc+1
+                else:
+                    if nextLoc > loc:
+                        matches += 1
+                        yield tokens, preloc, nextLoc
+                        if overlap:
+                            nextloc = preparseFn( instring, loc )
+                            if nextloc > loc:
+                                loc = nextLoc
+                            else:
+                                loc += 1
+                        else:
+                            loc = nextLoc
+                    else:
+                        loc = preloc+1
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def transformString( self, instring ):
+        """
+        Extension to :class:`scanString`, to modify matching text with modified tokens that may
+        be returned from a parse action.  To use ``transformString``, define a grammar and
+        attach a parse action to it that modifies the returned token list.
+        Invoking ``transformString()`` on a target string will then scan for matches,
+        and replace the matched text patterns according to the logic in the parse
+        action.  ``transformString()`` returns the resulting transformed string.
+
+        Example::
+
+            wd = Word(alphas)
+            wd.setParseAction(lambda toks: toks[0].title())
+
+            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
+
+        prints::
+
+            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
+        """
+        out = []
+        lastE = 0
+        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
+        # keep string locs straight between transformString and scanString
+        self.keepTabs = True
+        try:
+            for t,s,e in self.scanString( instring ):
+                out.append( instring[lastE:s] )
+                if t:
+                    if isinstance(t,ParseResults):
+                        out += t.asList()
+                    elif isinstance(t,list):
+                        out += t
+                    else:
+                        out.append(t)
+                lastE = e
+            out.append(instring[lastE:])
+            out = [o for o in out if o]
+            return "".join(map(_ustr,_flatten(out)))
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def searchString( self, instring, maxMatches=_MAX_INT ):
+        """
+        Another extension to :class:`scanString`, simplifying the access to the tokens found
+        to match the given parse expression.  May be called with optional
+        ``maxMatches`` argument, to clip searching after 'n' matches are found.
+
+        Example::
+
+            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
+            cap_word = Word(alphas.upper(), alphas.lower())
+
+            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
+
+            # the sum() builtin can be used to merge results into a single ParseResults object
+            print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")))
+
+        prints::
+
+            [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']]
+            ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity']
+        """
+        try:
+            return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False):
+        """
+        Generator method to split a string using the given expression as a separator.
+        May be called with optional ``maxsplit`` argument, to limit the number of splits;
+        and the optional ``includeSeparators`` argument (default= ``False``), if the separating
+        matching text should be included in the split results.
+
+        Example::
+
+            punc = oneOf(list(".,;:/-!?"))
+            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
+
+        prints::
+
+            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
+        """
+        splits = 0
+        last = 0
+        for t,s,e in self.scanString(instring, maxMatches=maxsplit):
+            yield instring[last:s]
+            if includeSeparators:
+                yield t[0]
+            last = e
+        yield instring[last:]
+
+    def __add__(self, other ):
+        """
+        Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement
+        converts them to :class:`Literal`s by default.
+
+        Example::
+
+            greet = Word(alphas) + "," + Word(alphas) + "!"
+            hello = "Hello, World!"
+            print (hello, "->", greet.parseString(hello))
+
+        prints::
+
+            Hello, World! -> ['Hello', ',', 'World', '!']
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, other ] )
+
+    def __radd__(self, other ):
+        """
+        Implementation of + operator when left operand is not a :class:`ParserElement`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other + self
+
+    def __sub__(self, other):
+        """
+        Implementation of - operator, returns :class:`And` with error stop
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return self + And._ErrorStop() + other
+
+    def __rsub__(self, other ):
+        """
+        Implementation of - operator when left operand is not a :class:`ParserElement`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other - self
+
+    def __mul__(self,other):
+        """
+        Implementation of * operator, allows use of ``expr * 3`` in place of
+        ``expr + expr + expr``.  Expressions may also me multiplied by a 2-integer
+        tuple, similar to ``{min,max}`` multipliers in regular expressions.  Tuples
+        may also include ``None`` as in:
+         - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent
+              to ``expr*n + ZeroOrMore(expr)``
+              (read as "at least n instances of ``expr``")
+         - ``expr*(None,n)`` is equivalent to ``expr*(0,n)``
+              (read as "0 to n instances of ``expr``")
+         - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)``
+         - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)``
+
+        Note that ``expr*(None,n)`` does not raise an exception if
+        more than n exprs exist in the input stream; that is,
+        ``expr*(None,n)`` does not enforce a maximum number of expr
+        occurrences.  If this behavior is desired, then write
+        ``expr*(None,n) + ~expr``
+        """
+        if isinstance(other,int):
+            minElements, optElements = other,0
+        elif isinstance(other,tuple):
+            other = (other + (None, None))[:2]
+            if other[0] is None:
+                other = (0, other[1])
+            if isinstance(other[0],int) and other[1] is None:
+                if other[0] == 0:
+                    return ZeroOrMore(self)
+                if other[0] == 1:
+                    return OneOrMore(self)
+                else:
+                    return self*other[0] + ZeroOrMore(self)
+            elif isinstance(other[0],int) and isinstance(other[1],int):
+                minElements, optElements = other
+                optElements -= minElements
+            else:
+                raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
+        else:
+            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))
+
+        if minElements < 0:
+            raise ValueError("cannot multiply ParserElement by negative value")
+        if optElements < 0:
+            raise ValueError("second tuple value must be greater or equal to first tuple value")
+        if minElements == optElements == 0:
+            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")
+
+        if (optElements):
+            def makeOptionalList(n):
+                if n>1:
+                    return Optional(self + makeOptionalList(n-1))
+                else:
+                    return Optional(self)
+            if minElements:
+                if minElements == 1:
+                    ret = self + makeOptionalList(optElements)
+                else:
+                    ret = And([self]*minElements) + makeOptionalList(optElements)
+            else:
+                ret = makeOptionalList(optElements)
+        else:
+            if minElements == 1:
+                ret = self
+            else:
+                ret = And([self]*minElements)
+        return ret
+
+    def __rmul__(self, other):
+        return self.__mul__(other)
+
+    def __or__(self, other ):
+        """
+        Implementation of | operator - returns :class:`MatchFirst`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return MatchFirst( [ self, other ] )
+
+    def __ror__(self, other ):
+        """
+        Implementation of | operator when left operand is not a :class:`ParserElement`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other | self
+
+    def __xor__(self, other ):
+        """
+        Implementation of ^ operator - returns :class:`Or`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Or( [ self, other ] )
+
+    def __rxor__(self, other ):
+        """
+        Implementation of ^ operator when left operand is not a :class:`ParserElement`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other ^ self
+
+    def __and__(self, other ):
+        """
+        Implementation of & operator - returns :class:`Each`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Each( [ self, other ] )
+
+    def __rand__(self, other ):
+        """
+        Implementation of & operator when left operand is not a :class:`ParserElement`
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other & self
+
+    def __invert__( self ):
+        """
+        Implementation of ~ operator - returns :class:`NotAny`
+        """
+        return NotAny( self )
+
+    def __call__(self, name=None):
+        """
+        Shortcut for :class:`setResultsName`, with ``listAllMatches=False``.
+
+        If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be
+        passed as ``True``.
+
+        If ``name` is omitted, same as calling :class:`copy`.
+
+        Example::
+
+            # these are equivalent
+            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
+            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")
+        """
+        if name is not None:
+            return self.setResultsName(name)
+        else:
+            return self.copy()
+
+    def suppress( self ):
+        """
+        Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from
+        cluttering up returned output.
+        """
+        return Suppress( self )
+
+    def leaveWhitespace( self ):
+        """
+        Disables the skipping of whitespace before matching the characters in the
+        :class:`ParserElement`'s defined pattern.  This is normally only used internally by
+        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
+        """
+        self.skipWhitespace = False
+        return self
+
+    def setWhitespaceChars( self, chars ):
+        """
+        Overrides the default whitespace chars
+        """
+        self.skipWhitespace = True
+        self.whiteChars = chars
+        self.copyDefaultWhiteChars = False
+        return self
+
+    def parseWithTabs( self ):
+        """
+        Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string.
+        Must be called before ``parseString`` when the input grammar contains elements that
+        match ``<TAB>`` characters.
+        """
+        self.keepTabs = True
+        return self
+
+    def ignore( self, other ):
+        """
+        Define expression to be ignored (e.g., comments) while doing pattern
+        matching; may be called repeatedly, to define multiple comment or other
+        ignorable patterns.
+
+        Example::
+
+            patt = OneOrMore(Word(alphas))
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
+
+            patt.ignore(cStyleComment)
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
+        """
+        if isinstance(other, basestring):
+            other = Suppress(other)
+
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                self.ignoreExprs.append(other)
+        else:
+            self.ignoreExprs.append( Suppress( other.copy() ) )
+        return self
+
+    def setDebugActions( self, startAction, successAction, exceptionAction ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        """
+        self.debugActions = (startAction or _defaultStartDebugAction,
+                             successAction or _defaultSuccessDebugAction,
+                             exceptionAction or _defaultExceptionDebugAction)
+        self.debug = True
+        return self
+
+    def setDebug( self, flag=True ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        Set ``flag`` to True to enable, False to disable.
+
+        Example::
+
+            wd = Word(alphas).setName("alphaword")
+            integer = Word(nums).setName("numword")
+            term = wd | integer
+
+            # turn on debugging for wd
+            wd.setDebug()
+
+            OneOrMore(term).parseString("abc 123 xyz 890")
+
+        prints::
+
+            Match alphaword at loc 0(1,1)
+            Matched alphaword -> ['abc']
+            Match alphaword at loc 3(1,4)
+            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
+            Match alphaword at loc 7(1,8)
+            Matched alphaword -> ['xyz']
+            Match alphaword at loc 11(1,12)
+            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
+            Match alphaword at loc 15(1,16)
+            Exception raised:Expected alphaword (at char 15), (line:1, col:16)
+
+        The output shown is that produced by the default debug actions - custom debug actions can be
+        specified using :class:`setDebugActions`. Prior to attempting
+        to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"``
+        is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"``
+        message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression,
+        which makes debugging and exception messages easier to understand - for instance, the default
+        name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``.
+        """
+        if flag:
+            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
+        else:
+            self.debug = False
+        return self
+
+    def __str__( self ):
+        return self.name
+
+    def __repr__( self ):
+        return _ustr(self)
+
+    def streamline( self ):
+        self.streamlined = True
+        self.strRepr = None
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        pass
+
+    def validate( self, validateTrace=[] ):
+        """
+        Check defined expressions for valid structure, check for infinite recursive definitions.
+        """
+        self.checkRecursion( [] )
+
+    def parseFile( self, file_or_filename, parseAll=False ):
+        """
+        Execute the parse expression on the given file or filename.
+        If a filename is specified (instead of a file object),
+        the entire file is opened, read, and closed before parsing.
+        """
+        try:
+            file_contents = file_or_filename.read()
+        except AttributeError:
+            with open(file_or_filename, "r") as f:
+                file_contents = f.read()
+        try:
+            return self.parseString(file_contents, parseAll)
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def __eq__(self,other):
+        if isinstance(other, ParserElement):
+            return self is other or vars(self) == vars(other)
+        elif isinstance(other, basestring):
+            return self.matches(other)
+        else:
+            return super(ParserElement,self)==other
+
+    def __ne__(self,other):
+        return not (self == other)
+
+    def __hash__(self):
+        return hash(id(self))
+
+    def __req__(self,other):
+        return self == other
+
+    def __rne__(self,other):
+        return not (self == other)
+
+    def matches(self, testString, parseAll=True):
+        """
+        Method for quick testing of a parser against a test string. Good for simple
+        inline microtests of sub expressions while building up larger parser.
+
+        Parameters:
+         - testString - to test against this expression for a match
+         - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests
+
+        Example::
+
+            expr = Word(nums)
+            assert expr.matches("100")
+        """
+        try:
+            self.parseString(_ustr(testString), parseAll=parseAll)
+            return True
+        except ParseBaseException:
+            return False
+
+    def runTests(self, tests, parseAll=True, comment='#',
+                 fullDump=True, printResults=True, failureTests=False, postParse=None):
+        """
+        Execute the parse expression on a series of test strings, showing each
+        test, the parsed results or where the parse failed. Quick and easy way to
+        run a parse expression against a list of sample strings.
+
+        Parameters:
+         - tests - a list of separate test strings, or a multiline string of test strings
+         - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests
+         - comment - (default= ``'#'``) - expression for indicating embedded comments in the test
+              string; pass None to disable comment filtering
+         - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline;
+              if False, only dump nested list
+         - printResults - (default= ``True``) prints test output to stdout
+         - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing
+         - postParse - (default= ``None``) optional callback for successful parse results; called as
+              `fn(test_string, parse_results)` and returns a string to be added to the test output
+
+        Returns: a (success, results) tuple, where success indicates that all tests succeeded
+        (or failed if ``failureTests`` is True), and the results contain a list of lines of each
+        test's output
+
+        Example::
+
+            number_expr = pyparsing_common.number.copy()
+
+            result = number_expr.runTests('''
+                # unsigned integer
+                100
+                # negative integer
+                -100
+                # float with scientific notation
+                6.02e23
+                # integer with scientific notation
+                1e-12
+                ''')
+            print("Success" if result[0] else "Failed!")
+
+            result = number_expr.runTests('''
+                # stray character
+                100Z
+                # missing leading digit before '.'
+                -.100
+                # too many '.'
+                3.14.159
+                ''', failureTests=True)
+            print("Success" if result[0] else "Failed!")
+
+        prints::
+
+            # unsigned integer
+            100
+            [100]
+
+            # negative integer
+            -100
+            [-100]
+
+            # float with scientific notation
+            6.02e23
+            [6.02e+23]
+
+            # integer with scientific notation
+            1e-12
+            [1e-12]
+
+            Success
+
+            # stray character
+            100Z
+               ^
+            FAIL: Expected end of text (at char 3), (line:1, col:4)
+
+            # missing leading digit before '.'
+            -.100
+            ^
+            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)
+
+            # too many '.'
+            3.14.159
+                ^
+            FAIL: Expected end of text (at char 4), (line:1, col:5)
+
+            Success
+
+        Each test string must be on a single line. If you want to test a string that spans multiple
+        lines, create a test like this::
+
+            expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines")
+
+        (Note that this is a raw string literal, you must include the leading 'r'.)
+        """
+        if isinstance(tests, basestring):
+            tests = list(map(str.strip, tests.rstrip().splitlines()))
+        if isinstance(comment, basestring):
+            comment = Literal(comment)
+        allResults = []
+        comments = []
+        success = True
+        for t in tests:
+            if comment is not None and comment.matches(t, False) or comments and not t:
+                comments.append(t)
+                continue
+            if not t:
+                continue
+            out = ['\n'.join(comments), t]
+            comments = []
+            try:
+                # convert newline marks to actual newlines, and strip leading BOM if present
+                NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString)
+                BOM = '\ufeff'
+                t = NL.transformString(t.lstrip(BOM))
+                result = self.parseString(t, parseAll=parseAll)
+                out.append(result.dump(full=fullDump))
+                success = success and not failureTests
+                if postParse is not None:
+                    try:
+                        pp_value = postParse(t, result)
+                        if pp_value is not None:
+                            out.append(str(pp_value))
+                    except Exception as e:
+                        out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e))
+            except ParseBaseException as pe:
+                fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
+                if '\n' in t:
+                    out.append(line(pe.loc, t))
+                    out.append(' '*(col(pe.loc,t)-1) + '^' + fatal)
+                else:
+                    out.append(' '*pe.loc + '^' + fatal)
+                out.append("FAIL: " + str(pe))
+                success = success and failureTests
+                result = pe
+            except Exception as exc:
+                out.append("FAIL-EXCEPTION: " + str(exc))
+                success = success and failureTests
+                result = exc
+
+            if printResults:
+                if fullDump:
+                    out.append('')
+                print('\n'.join(out))
+
+            allResults.append((t, result))
+
+        return success, allResults
+
+
+class Token(ParserElement):
+    """Abstract :class:`ParserElement` subclass, for defining atomic
+    matching patterns.
+    """
+    def __init__( self ):
+        super(Token,self).__init__( savelist=False )
+
+
+class Empty(Token):
+    """An empty token, will always match.
+    """
+    def __init__( self ):
+        super(Empty,self).__init__()
+        self.name = "Empty"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+
+class NoMatch(Token):
+    """A token that will never match.
+    """
+    def __init__( self ):
+        super(NoMatch,self).__init__()
+        self.name = "NoMatch"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.errmsg = "Unmatchable token"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Literal(Token):
+    """Token to exactly match a specified string.
+
+    Example::
+
+        Literal('blah').parseString('blah')  # -> ['blah']
+        Literal('blah').parseString('blahfooblah')  # -> ['blah']
+        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
+
+    For case-insensitive matching, use :class:`CaselessLiteral`.
+
+    For keyword matching (force word break before and after the matched string),
+    use :class:`Keyword` or :class:`CaselessKeyword`.
+    """
+    def __init__( self, matchString ):
+        super(Literal,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Literal; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+            self.__class__ = Empty
+        self.name = '"%s"' % _ustr(self.match)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+
+    # Performance tuning: this routine gets called a *lot*
+    # if this is a single character match string  and the first character matches,
+    # short-circuit as quickly as possible, and avoid calling startswith
+    #~ @profile
+    def parseImpl( self, instring, loc, doActions=True ):
+        if (instring[loc] == self.firstMatchChar and
+            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+_L = Literal
+ParserElement._literalStringClass = Literal
+
+class Keyword(Token):
+    """Token to exactly match a specified string as a keyword, that is,
+    it must be immediately followed by a non-keyword character.  Compare
+    with :class:`Literal`:
+
+     - ``Literal("if")`` will match the leading ``'if'`` in
+       ``'ifAndOnlyIf'``.
+     - ``Keyword("if")`` will not; it will only match the leading
+       ``'if'`` in ``'if x=1'``, or ``'if(y==2)'``
+
+    Accepts two optional constructor arguments in addition to the
+    keyword string:
+
+     - ``identChars`` is a string of characters that would be valid
+       identifier characters, defaulting to all alphanumerics + "_" and
+       "$"
+     - ``caseless`` allows case-insensitive matching, default is ``False``.
+
+    Example::
+
+        Keyword("start").parseString("start")  # -> ['start']
+        Keyword("start").parseString("starting")  # -> Exception
+
+    For case-insensitive matching, use :class:`CaselessKeyword`.
+    """
+    DEFAULT_KEYWORD_CHARS = alphanums+"_$"
+
+    def __init__( self, matchString, identChars=None, caseless=False ):
+        super(Keyword,self).__init__()
+        if identChars is None:
+            identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Keyword; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+        self.caseless = caseless
+        if caseless:
+            self.caselessmatch = matchString.upper()
+            identChars = identChars.upper()
+        self.identChars = set(identChars)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.caseless:
+            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
+                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        else:
+            if (instring[loc] == self.firstMatchChar and
+                (self.matchLen==1 or instring.startswith(self.match,loc)) and
+                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
+                (loc == 0 or instring[loc-1] not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+    def copy(self):
+        c = super(Keyword,self).copy()
+        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        return c
+
+    @staticmethod
+    def setDefaultKeywordChars( chars ):
+        """Overrides the default Keyword chars
+        """
+        Keyword.DEFAULT_KEYWORD_CHARS = chars
+
+class CaselessLiteral(Literal):
+    """Token to match a specified string, ignoring case of letters.
+    Note: the matched results will always be in the case of the given
+    match string, NOT the case of the input text.
+
+    Example::
+
+        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
+
+    (Contrast with example for :class:`CaselessKeyword`.)
+    """
+    def __init__( self, matchString ):
+        super(CaselessLiteral,self).__init__( matchString.upper() )
+        # Preserve the defining literal.
+        self.returnString = matchString
+        self.name = "'%s'" % self.returnString
+        self.errmsg = "Expected " + self.name
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[ loc:loc+self.matchLen ].upper() == self.match:
+            return loc+self.matchLen, self.returnString
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CaselessKeyword(Keyword):
+    """
+    Caseless version of :class:`Keyword`.
+
+    Example::
+
+        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
+
+    (Contrast with example for :class:`CaselessLiteral`.)
+    """
+    def __init__( self, matchString, identChars=None ):
+        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )
+
+class CloseMatch(Token):
+    """A variation on :class:`Literal` which matches "close" matches,
+    that is, strings with at most 'n' mismatching characters.
+    :class:`CloseMatch` takes parameters:
+
+     - ``match_string`` - string to be matched
+     - ``maxMismatches`` - (``default=1``) maximum number of
+       mismatches allowed to count as a match
+
+    The results from a successful parse will contain the matched text
+    from the input string and the following named results:
+
+     - ``mismatches`` - a list of the positions within the
+       match_string where mismatches were found
+     - ``original`` - the original match_string used to compare
+       against the input string
+
+    If ``mismatches`` is an empty list, then the match was an exact
+    match.
+
+    Example::
+
+        patt = CloseMatch("ATCATCGAATGGA")
+        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
+        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)
+
+        # exact match
+        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})
+
+        # close match allowing up to 2 mismatches
+        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
+        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
+    """
+    def __init__(self, match_string, maxMismatches=1):
+        super(CloseMatch,self).__init__()
+        self.name = match_string
+        self.match_string = match_string
+        self.maxMismatches = maxMismatches
+        self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches)
+        self.mayIndexError = False
+        self.mayReturnEmpty = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        start = loc
+        instrlen = len(instring)
+        maxloc = start + len(self.match_string)
+
+        if maxloc <= instrlen:
+            match_string = self.match_string
+            match_stringloc = 0
+            mismatches = []
+            maxMismatches = self.maxMismatches
+
+            for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)):
+                src,mat = s_m
+                if src != mat:
+                    mismatches.append(match_stringloc)
+                    if len(mismatches) > maxMismatches:
+                        break
+            else:
+                loc = match_stringloc + 1
+                results = ParseResults([instring[start:loc]])
+                results['original'] = self.match_string
+                results['mismatches'] = mismatches
+                return loc, results
+
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Word(Token):
+    """Token for matching words composed of allowed character sets.
+    Defined with string containing all allowed initial characters, an
+    optional string containing allowed body characters (if omitted,
+    defaults to the initial character set), and an optional minimum,
+    maximum, and/or exact length.  The default value for ``min`` is
+    1 (a minimum value < 1 is not valid); the default values for
+    ``max`` and ``exact`` are 0, meaning no maximum or exact
+    length restriction. An optional ``excludeChars`` parameter can
+    list characters that might be found in the input ``bodyChars``
+    string; useful to define a word of all printables except for one or
+    two characters, for instance.
+
+    :class:`srange` is useful for defining custom character set strings
+    for defining ``Word`` expressions, using range notation from
+    regular expression character sets.
+
+    A common mistake is to use :class:`Word` to match a specific literal
+    string, as in ``Word("Address")``. Remember that :class:`Word`
+    uses the string argument to define *sets* of matchable characters.
+    This expression would match "Add", "AAA", "dAred", or any other word
+    made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an
+    exact literal string, use :class:`Literal` or :class:`Keyword`.
+
+    pyparsing includes helper strings for building Words:
+
+     - :class:`alphas`
+     - :class:`nums`
+     - :class:`alphanums`
+     - :class:`hexnums`
+     - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255
+       - accented, tilded, umlauted, etc.)
+     - :class:`punc8bit` (non-alphabetic characters in ASCII range
+       128-255 - currency, symbols, superscripts, diacriticals, etc.)
+     - :class:`printables` (any non-whitespace character)
+
+    Example::
+
+        # a word composed of digits
+        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
+
+        # a word with a leading capital, and zero or more lowercase
+        capital_word = Word(alphas.upper(), alphas.lower())
+
+        # hostnames are alphanumeric, with leading alpha, and '-'
+        hostname = Word(alphas, alphanums+'-')
+
+        # roman numeral (not a strict parser, accepts invalid mix of characters)
+        roman = Word("IVXLCDM")
+
+        # any string of non-whitespace characters, except for ','
+        csv_value = Word(printables, excludeChars=",")
+    """
+    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
+        super(Word,self).__init__()
+        if excludeChars:
+            excludeChars = set(excludeChars)
+            initChars = ''.join(c for c in initChars if c not in excludeChars)
+            if bodyChars:
+                bodyChars = ''.join(c for c in bodyChars if c not in excludeChars)
+        self.initCharsOrig = initChars
+        self.initChars = set(initChars)
+        if bodyChars :
+            self.bodyCharsOrig = bodyChars
+            self.bodyChars = set(bodyChars)
+        else:
+            self.bodyCharsOrig = initChars
+            self.bodyChars = set(initChars)
+
+        self.maxSpecified = max > 0
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.asKeyword = asKeyword
+
+        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
+            if self.bodyCharsOrig == self.initCharsOrig:
+                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
+            elif len(self.initCharsOrig) == 1:
+                self.reString = "%s[%s]*" % \
+                                      (re.escape(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            else:
+                self.reString = "[%s][%s]*" % \
+                                      (_escapeRegexRangeChars(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            if self.asKeyword:
+                self.reString = r"\b"+self.reString+r"\b"
+            try:
+                self.re = re.compile( self.reString )
+            except Exception:
+                self.re = None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.re:
+            result = self.re.match(instring,loc)
+            if not result:
+                raise ParseException(instring, loc, self.errmsg, self)
+
+            loc = result.end()
+            return loc, result.group()
+
+        if instring[loc] not in self.initChars:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        instrlen = len(instring)
+        bodychars = self.bodyChars
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, instrlen )
+        while loc < maxloc and instring[loc] in bodychars:
+            loc += 1
+
+        throwException = False
+        if loc - start < self.minLen:
+            throwException = True
+        elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
+            throwException = True
+        elif self.asKeyword:
+            if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars):
+                throwException = True
+
+        if throwException:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(Word,self).__str__()
+        except Exception:
+            pass
+
+
+        if self.strRepr is None:
+
+            def charsAsStr(s):
+                if len(s)>4:
+                    return s[:4]+"..."
+                else:
+                    return s
+
+            if ( self.initCharsOrig != self.bodyCharsOrig ):
+                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
+            else:
+                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
+
+        return self.strRepr
+
+
+class Char(Word):
+    """A short-cut class for defining ``Word(characters, exact=1)``,
+    when defining a match of any single character in a string of
+    characters.
+    """
+    def __init__(self, charset, asKeyword=False, excludeChars=None):
+        super(Char, self).__init__(charset, exact=1, asKeyword=asKeyword, excludeChars=excludeChars)
+        self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig)
+        self.re = re.compile( self.reString )
+
+
+class Regex(Token):
+    r"""Token for matching strings that match a given regular
+    expression. Defined with string specifying the regular expression in
+    a form recognized by the stdlib Python  `re module <https://docs.python.org/3/library/re.html>`_.
+    If the given regex contains named groups (defined using ``(?P<name>...)``),
+    these will be preserved as named parse results.
+
+    Example::
+
+        realnum = Regex(r"[+-]?\d+\.\d*")
+        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
+        # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
+        roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
+    """
+    compiledREtype = type(re.compile("[A-Z]"))
+    def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False):
+        """The parameters ``pattern`` and ``flags`` are passed
+        to the ``re.compile()`` function as-is. See the Python
+        `re module <https://docs.python.org/3/library/re.html>`_ module for an
+        explanation of the acceptable patterns and flags.
+        """
+        super(Regex,self).__init__()
+
+        if isinstance(pattern, basestring):
+            if not pattern:
+                warnings.warn("null string passed to Regex; use Empty() instead",
+                        SyntaxWarning, stacklevel=2)
+
+            self.pattern = pattern
+            self.flags = flags
+
+            try:
+                self.re = re.compile(self.pattern, self.flags)
+                self.reString = self.pattern
+            except sre_constants.error:
+                warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
+                    SyntaxWarning, stacklevel=2)
+                raise
+
+        elif isinstance(pattern, Regex.compiledREtype):
+            self.re = pattern
+            self.pattern = \
+            self.reString = str(pattern)
+            self.flags = flags
+
+        else:
+            raise ValueError("Regex may only be constructed with a string or a compiled RE object")
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+        self.asGroupList = asGroupList
+        self.asMatch = asMatch
+        if self.asGroupList:
+            self.parseImpl = self.parseImplAsGroupList
+        if self.asMatch:
+            self.parseImpl = self.parseImplAsMatch
+
+    def parseImpl(self, instring, loc, doActions=True):
+        result = self.re.match(instring,loc)
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = ParseResults(result.group())
+        d = result.groupdict()
+        if d:
+            for k, v in d.items():
+                ret[k] = v
+        return loc, ret
+
+    def parseImplAsGroupList(self, instring, loc, doActions=True):
+        result = self.re.match(instring,loc)
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = result.groups()
+        return loc, ret
+
+    def parseImplAsMatch(self, instring, loc, doActions=True):
+        result = self.re.match(instring,loc)
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = result
+        return loc, ret
+
+    def __str__( self ):
+        try:
+            return super(Regex,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "Re:(%s)" % repr(self.pattern)
+
+        return self.strRepr
+
+    def sub(self, repl):
+        r"""
+        Return Regex with an attached parse action to transform the parsed
+        result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_.
+
+        Example::
+
+            make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>")
+            print(make_html.transformString("h1:main title:"))
+            # prints "<h1>main title</h1>"
+        """
+        if self.asGroupList:
+            warnings.warn("cannot use sub() with Regex(asGroupList=True)",
+                           SyntaxWarning, stacklevel=2)
+            raise SyntaxError()
+
+        if self.asMatch and callable(repl):
+            warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)",
+                           SyntaxWarning, stacklevel=2)
+            raise SyntaxError()
+
+        if self.asMatch:
+            def pa(tokens):
+                return tokens[0].expand(repl)
+        else:
+            def pa(tokens):
+                return self.re.sub(repl, tokens[0])
+        return self.addParseAction(pa)
+
+class QuotedString(Token):
+    r"""
+    Token for matching strings that are delimited by quoting characters.
+
+    Defined with the following parameters:
+
+        - quoteChar - string of one or more characters defining the
+          quote delimiting string
+        - escChar - character to escape quotes, typically backslash
+          (default= ``None`` )
+        - escQuote - special quote sequence to escape an embedded quote
+          string (such as SQL's ``""`` to escape an embedded ``"``)
+          (default= ``None`` )
+        - multiline - boolean indicating whether quotes can span
+          multiple lines (default= ``False`` )
+        - unquoteResults - boolean indicating whether the matched text
+          should be unquoted (default= ``True`` )
+        - endQuoteChar - string of one or more characters defining the
+          end of the quote delimited string (default= ``None``  => same as
+          quoteChar)
+        - convertWhitespaceEscapes - convert escaped whitespace
+          (``'\t'``, ``'\n'``, etc.) to actual whitespace
+          (default= ``True`` )
+
+    Example::
+
+        qs = QuotedString('"')
+        print(qs.searchString('lsjdf "This is the quote" sldjf'))
+        complex_qs = QuotedString('{{', endQuoteChar='}}')
+        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
+        sql_qs = QuotedString('"', escQuote='""')
+        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
+
+    prints::
+
+        [['This is the quote']]
+        [['This is the "quote"']]
+        [['This is the quote with "embedded" quotes']]
+    """
+    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True):
+        super(QuotedString,self).__init__()
+
+        # remove white space from quote chars - wont work anyway
+        quoteChar = quoteChar.strip()
+        if not quoteChar:
+            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+            raise SyntaxError()
+
+        if endQuoteChar is None:
+            endQuoteChar = quoteChar
+        else:
+            endQuoteChar = endQuoteChar.strip()
+            if not endQuoteChar:
+                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+                raise SyntaxError()
+
+        self.quoteChar = quoteChar
+        self.quoteCharLen = len(quoteChar)
+        self.firstQuoteChar = quoteChar[0]
+        self.endQuoteChar = endQuoteChar
+        self.endQuoteCharLen = len(endQuoteChar)
+        self.escChar = escChar
+        self.escQuote = escQuote
+        self.unquoteResults = unquoteResults
+        self.convertWhitespaceEscapes = convertWhitespaceEscapes
+
+        if multiline:
+            self.flags = re.MULTILINE | re.DOTALL
+            self.pattern = r'%s(?:[^%s%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        else:
+            self.flags = 0
+            self.pattern = r'%s(?:[^%s\n\r%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        if len(self.endQuoteChar) > 1:
+            self.pattern += (
+                '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
+                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
+                                    for i in range(len(self.endQuoteChar)-1,0,-1)) + ')'
+                )
+        if escQuote:
+            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
+        if escChar:
+            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
+            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
+        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))
+
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except sre_constants.error:
+            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = result.group()
+
+        if self.unquoteResults:
+
+            # strip off quotes
+            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]
+
+            if isinstance(ret,basestring):
+                # replace escaped whitespace
+                if '\\' in ret and self.convertWhitespaceEscapes:
+                    ws_map = {
+                        r'\t' : '\t',
+                        r'\n' : '\n',
+                        r'\f' : '\f',
+                        r'\r' : '\r',
+                    }
+                    for wslit,wschar in ws_map.items():
+                        ret = ret.replace(wslit, wschar)
+
+                # replace escaped characters
+                if self.escChar:
+                    ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret)
+
+                # replace escaped quotes
+                if self.escQuote:
+                    ret = ret.replace(self.escQuote, self.endQuoteChar)
+
+        return loc, ret
+
+    def __str__( self ):
+        try:
+            return super(QuotedString,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)
+
+        return self.strRepr
+
+
+class CharsNotIn(Token):
+    """Token for matching words composed of characters *not* in a given
+    set (will include whitespace in matched characters if not listed in
+    the provided exclusion set - see example). Defined with string
+    containing all disallowed characters, and an optional minimum,
+    maximum, and/or exact length.  The default value for ``min`` is
+    1 (a minimum value < 1 is not valid); the default values for
+    ``max`` and ``exact`` are 0, meaning no maximum or exact
+    length restriction.
+
+    Example::
+
+        # define a comma-separated-value as anything that is not a ','
+        csv_value = CharsNotIn(',')
+        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
+
+    prints::
+
+        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
+    """
+    def __init__( self, notChars, min=1, max=0, exact=0 ):
+        super(CharsNotIn,self).__init__()
+        self.skipWhitespace = False
+        self.notChars = notChars
+
+        if min < 1:
+            raise ValueError(
+                "cannot specify a minimum length < 1; use " +
+                "Optional(CharsNotIn()) if zero-length char group is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = ( self.minLen == 0 )
+        self.mayIndexError = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] in self.notChars:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        notchars = self.notChars
+        maxlen = min( start+self.maxLen, len(instring) )
+        while loc < maxlen and \
+              (instring[loc] not in notchars):
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(CharsNotIn, self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            if len(self.notChars) > 4:
+                self.strRepr = "!W:(%s...)" % self.notChars[:4]
+            else:
+                self.strRepr = "!W:(%s)" % self.notChars
+
+        return self.strRepr
+
+class White(Token):
+    """Special matching class for matching whitespace.  Normally,
+    whitespace is ignored by pyparsing grammars.  This class is included
+    when some whitespace structures are significant.  Define with
+    a string containing the whitespace characters to be matched; default
+    is ``" \\t\\r\\n"``.  Also takes optional ``min``,
+    ``max``, and ``exact`` arguments, as defined for the
+    :class:`Word` class.
+    """
+    whiteStrs = {
+        ' ' : '<SP>',
+        '\t': '<TAB>',
+        '\n': '<LF>',
+        '\r': '<CR>',
+        '\f': '<FF>',
+        'u\00A0': '<NBSP>',
+        'u\1680': '<OGHAM_SPACE_MARK>',
+        'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>',
+        'u\2000': '<EN_QUAD>',
+        'u\2001': '<EM_QUAD>',
+        'u\2002': '<EN_SPACE>',
+        'u\2003': '<EM_SPACE>',
+        'u\2004': '<THREE-PER-EM_SPACE>',
+        'u\2005': '<FOUR-PER-EM_SPACE>',
+        'u\2006': '<SIX-PER-EM_SPACE>',
+        'u\2007': '<FIGURE_SPACE>',
+        'u\2008': '<PUNCTUATION_SPACE>',
+        'u\2009': '<THIN_SPACE>',
+        'u\200A': '<HAIR_SPACE>',
+        'u\200B': '<ZERO_WIDTH_SPACE>',
+        'u\202F': '<NNBSP>',
+        'u\205F': '<MMSP>',
+        'u\3000': '<IDEOGRAPHIC_SPACE>',
+        }
+    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
+        super(White,self).__init__()
+        self.matchWhite = ws
+        self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) )
+        #~ self.leaveWhitespace()
+        self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite))
+        self.mayReturnEmpty = True
+        self.errmsg = "Expected " + self.name
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] not in self.matchWhite:
+            raise ParseException(instring, loc, self.errmsg, self)
+        start = loc
+        loc += 1
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, len(instring) )
+        while loc < maxloc and instring[loc] in self.matchWhite:
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+
+class _PositionToken(Token):
+    def __init__( self ):
+        super(_PositionToken,self).__init__()
+        self.name=self.__class__.__name__
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+class GoToColumn(_PositionToken):
+    """Token to advance to a specific column of input text; useful for
+    tabular report scraping.
+    """
+    def __init__( self, colno ):
+        super(GoToColumn,self).__init__()
+        self.col = colno
+
+    def preParse( self, instring, loc ):
+        if col(loc,instring) != self.col:
+            instrlen = len(instring)
+            if self.ignoreExprs:
+                loc = self._skipIgnorables( instring, loc )
+            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
+                loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        thiscol = col( loc, instring )
+        if thiscol > self.col:
+            raise ParseException( instring, loc, "Text not in expected column", self )
+        newloc = loc + self.col - thiscol
+        ret = instring[ loc: newloc ]
+        return newloc, ret
+
+
+class LineStart(_PositionToken):
+    r"""Matches if current position is at the beginning of a line within
+    the parse string
+
+    Example::
+
+        test = '''\
+        AAA this line
+        AAA and this line
+          AAA but not this one
+        B AAA and definitely not this one
+        '''
+
+        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
+            print(t)
+
+    prints::
+
+        ['AAA', ' this line']
+        ['AAA', ' and this line']
+
+    """
+    def __init__( self ):
+        super(LineStart,self).__init__()
+        self.errmsg = "Expected start of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if col(loc, instring) == 1:
+            return loc, []
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class LineEnd(_PositionToken):
+    """Matches if current position is at the end of a line within the
+    parse string
+    """
+    def __init__( self ):
+        super(LineEnd,self).__init__()
+        self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") )
+        self.errmsg = "Expected end of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc<len(instring):
+            if instring[loc] == "\n":
+                return loc+1, "\n"
+            else:
+                raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class StringStart(_PositionToken):
+    """Matches if current position is at the beginning of the parse
+    string
+    """
+    def __init__( self ):
+        super(StringStart,self).__init__()
+        self.errmsg = "Expected start of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc != 0:
+            # see if entire string up to here is just whitespace and ignoreables
+            if loc != self.preParse( instring, 0 ):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class StringEnd(_PositionToken):
+    """Matches if current position is at the end of the parse string
+    """
+    def __init__( self ):
+        super(StringEnd,self).__init__()
+        self.errmsg = "Expected end of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc < len(instring):
+            raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        elif loc > len(instring):
+            return loc, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class WordStart(_PositionToken):
+    """Matches if the current position is at the beginning of a Word,
+    and is not preceded by any character in a given set of
+    ``wordChars`` (default= ``printables``). To emulate the
+    ``\b`` behavior of regular expressions, use
+    ``WordStart(alphanums)``. ``WordStart`` will also match at
+    the beginning of the string being parsed, or at the beginning of
+    a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordStart,self).__init__()
+        self.wordChars = set(wordChars)
+        self.errmsg = "Not at the start of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        if loc != 0:
+            if (instring[loc-1] in self.wordChars or
+                instring[loc] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class WordEnd(_PositionToken):
+    """Matches if the current position is at the end of a Word, and is
+    not followed by any character in a given set of ``wordChars``
+    (default= ``printables``). To emulate the ``\b`` behavior of
+    regular expressions, use ``WordEnd(alphanums)``. ``WordEnd``
+    will also match at the end of the string being parsed, or at the end
+    of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordEnd,self).__init__()
+        self.wordChars = set(wordChars)
+        self.skipWhitespace = False
+        self.errmsg = "Not at the end of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        instrlen = len(instring)
+        if instrlen>0 and loc<instrlen:
+            if (instring[loc] in self.wordChars or
+                instring[loc-1] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+
+class ParseExpression(ParserElement):
+    """Abstract subclass of ParserElement, for combining and
+    post-processing parsed tokens.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(ParseExpression,self).__init__(savelist)
+        if isinstance( exprs, _generatorType ):
+            exprs = list(exprs)
+
+        if isinstance( exprs, basestring ):
+            self.exprs = [ ParserElement._literalStringClass( exprs ) ]
+        elif isinstance( exprs, Iterable ):
+            exprs = list(exprs)
+            # if sequence of strings provided, wrap with Literal
+            if all(isinstance(expr, basestring) for expr in exprs):
+                exprs = map(ParserElement._literalStringClass, exprs)
+            self.exprs = list(exprs)
+        else:
+            try:
+                self.exprs = list( exprs )
+            except TypeError:
+                self.exprs = [ exprs ]
+        self.callPreparse = False
+
+    def __getitem__( self, i ):
+        return self.exprs[i]
+
+    def append( self, other ):
+        self.exprs.append( other )
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on
+           all contained expressions."""
+        self.skipWhitespace = False
+        self.exprs = [ e.copy() for e in self.exprs ]
+        for e in self.exprs:
+            e.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseExpression, self).ignore( other )
+                for e in self.exprs:
+                    e.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseExpression, self).ignore( other )
+            for e in self.exprs:
+                e.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def __str__( self ):
+        try:
+            return super(ParseExpression,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
+        return self.strRepr
+
+    def streamline( self ):
+        super(ParseExpression,self).streamline()
+
+        for e in self.exprs:
+            e.streamline()
+
+        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
+        # but only if there are no parse actions or resultsNames on the nested And's
+        # (likewise for Or's and MatchFirst's)
+        if ( len(self.exprs) == 2 ):
+            other = self.exprs[0]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = other.exprs[:] + [ self.exprs[1] ]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+            other = self.exprs[-1]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = self.exprs[:-1] + other.exprs[:]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+        self.errmsg = "Expected " + _ustr(self)
+
+        return self
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        for e in self.exprs:
+            e.validate(tmp)
+        self.checkRecursion( [] )
+
+    def copy(self):
+        ret = super(ParseExpression,self).copy()
+        ret.exprs = [e.copy() for e in self.exprs]
+        return ret
+
+class And(ParseExpression):
+    """
+    Requires all given :class:`ParseExpression` s to be found in the given order.
+    Expressions may be separated by whitespace.
+    May be constructed using the ``'+'`` operator.
+    May also be constructed using the ``'-'`` operator, which will
+    suppress backtracking.
+
+    Example::
+
+        integer = Word(nums)
+        name_expr = OneOrMore(Word(alphas))
+
+        expr = And([integer("id"),name_expr("name"),integer("age")])
+        # more easily written as:
+        expr = integer("id") + name_expr("name") + integer("age")
+    """
+
+    class _ErrorStop(Empty):
+        def __init__(self, *args, **kwargs):
+            super(And._ErrorStop,self).__init__(*args, **kwargs)
+            self.name = '-'
+            self.leaveWhitespace()
+
+    def __init__( self, exprs, savelist = True ):
+        super(And,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.setWhitespaceChars( self.exprs[0].whiteChars )
+        self.skipWhitespace = self.exprs[0].skipWhitespace
+        self.callPreparse = True
+
+    def streamline(self):
+        super(And, self).streamline()
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        return self
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        # pass False as last arg to _parse for first element, since we already
+        # pre-parsed the string as part of our And pre-parsing
+        loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
+        errorStop = False
+        for e in self.exprs[1:]:
+            if isinstance(e, And._ErrorStop):
+                errorStop = True
+                continue
+            if errorStop:
+                try:
+                    loc, exprtokens = e._parse( instring, loc, doActions )
+                except ParseSyntaxException:
+                    raise
+                except ParseBaseException as pe:
+                    pe.__traceback__ = None
+                    raise ParseSyntaxException._from_exception(pe)
+                except IndexError:
+                    raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
+            else:
+                loc, exprtokens = e._parse( instring, loc, doActions )
+            if exprtokens or exprtokens.haskeys():
+                resultlist += exprtokens
+        return loc, resultlist
+
+    def __iadd__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #And( [ self, other ] )
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+            if not e.mayReturnEmpty:
+                break
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+
+class Or(ParseExpression):
+    """Requires that at least one :class:`ParseExpression` is found. If
+    two expressions match, the expression that matches the longest
+    string will be used. May be constructed using the ``'^'``
+    operator.
+
+    Example::
+
+        # construct Or using '^' operator
+
+        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789"))
+
+    prints::
+
+        [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(Or,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def streamline(self):
+        super(Or, self).streamline()
+        if __compat__.collect_all_And_tokens:
+            self.saveAsList = any(e.saveAsList for e in self.exprs)
+        return self
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        matches = []
+        for e in self.exprs:
+            try:
+                loc2 = e.tryParse( instring, loc )
+            except ParseException as err:
+                err.__traceback__ = None
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+            else:
+                # save match among all matches, to retry longest to shortest
+                matches.append((loc2, e))
+
+        if matches:
+            matches.sort(key=lambda x: -x[0])
+            for _,e in matches:
+                try:
+                    return e._parse( instring, loc, doActions )
+                except ParseException as err:
+                    err.__traceback__ = None
+                    if err.loc > maxExcLoc:
+                        maxException = err
+                        maxExcLoc = err.loc
+
+        if maxException is not None:
+            maxException.msg = self.errmsg
+            raise maxException
+        else:
+            raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+
+    def __ixor__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #Or( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class MatchFirst(ParseExpression):
+    """Requires that at least one :class:`ParseExpression` is found. If
+    two expressions match, the first one listed is the one that will
+    match. May be constructed using the ``'|'`` operator.
+
+    Example::
+
+        # construct MatchFirst using '|' operator
+
+        # watch the order of expressions to match
+        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]
+
+        # put more selective expression first
+        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
+        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(MatchFirst,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def streamline(self):
+        super(MatchFirst, self).streamline()
+        if __compat__.collect_all_And_tokens:
+            self.saveAsList = any(e.saveAsList for e in self.exprs)
+        return self
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        for e in self.exprs:
+            try:
+                ret = e._parse( instring, loc, doActions )
+                return ret
+            except ParseException as err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+
+        # only got here if no expression matched, raise exception for match that made it the furthest
+        else:
+            if maxException is not None:
+                maxException.msg = self.errmsg
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+    def __ior__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #MatchFirst( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class Each(ParseExpression):
+    """Requires all given :class:`ParseExpression` s to be found, but in
+    any order. Expressions may be separated by whitespace.
+
+    May be constructed using the ``'&'`` operator.
+
+    Example::
+
+        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
+        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
+        integer = Word(nums)
+        shape_attr = "shape:" + shape_type("shape")
+        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
+        color_attr = "color:" + color("color")
+        size_attr = "size:" + integer("size")
+
+        # use Each (using operator '&') to accept attributes in any order
+        # (shape and posn are required, color and size are optional)
+        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)
+
+        shape_spec.runTests('''
+            shape: SQUARE color: BLACK posn: 100, 120
+            shape: CIRCLE size: 50 color: BLUE posn: 50,80
+            color:GREEN size:20 shape:TRIANGLE posn:20,40
+            '''
+            )
+
+    prints::
+
+        shape: SQUARE color: BLACK posn: 100, 120
+        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
+        - color: BLACK
+        - posn: ['100', ',', '120']
+          - x: 100
+          - y: 120
+        - shape: SQUARE
+
+
+        shape: CIRCLE size: 50 color: BLUE posn: 50,80
+        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
+        - color: BLUE
+        - posn: ['50', ',', '80']
+          - x: 50
+          - y: 80
+        - shape: CIRCLE
+        - size: 50
+
+
+        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
+        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
+        - color: GREEN
+        - posn: ['20', ',', '40']
+          - x: 20
+          - y: 40
+        - shape: TRIANGLE
+        - size: 20
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(Each,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.skipWhitespace = True
+        self.initExprGroups = True
+        self.saveAsList = True
+
+    def streamline(self):
+        super(Each, self).streamline()
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        return self
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.initExprGroups:
+            self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional))
+            opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
+            opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)]
+            self.optionals = opt1 + opt2
+            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
+            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
+            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
+            self.required += self.multirequired
+            self.initExprGroups = False
+        tmpLoc = loc
+        tmpReqd = self.required[:]
+        tmpOpt  = self.optionals[:]
+        matchOrder = []
+
+        keepMatching = True
+        while keepMatching:
+            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
+            failed = []
+            for e in tmpExprs:
+                try:
+                    tmpLoc = e.tryParse( instring, tmpLoc )
+                except ParseException:
+                    failed.append(e)
+                else:
+                    matchOrder.append(self.opt1map.get(id(e),e))
+                    if e in tmpReqd:
+                        tmpReqd.remove(e)
+                    elif e in tmpOpt:
+                        tmpOpt.remove(e)
+            if len(failed) == len(tmpExprs):
+                keepMatching = False
+
+        if tmpReqd:
+            missing = ", ".join(_ustr(e) for e in tmpReqd)
+            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )
+
+        # add any unmatched Optionals, in case they have default values defined
+        matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt]
+
+        resultlist = []
+        for e in matchOrder:
+            loc,results = e._parse(instring,loc,doActions)
+            resultlist.append(results)
+
+        finalResults = sum(resultlist, ParseResults([]))
+        return loc, finalResults
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class ParseElementEnhance(ParserElement):
+    """Abstract subclass of :class:`ParserElement`, for combining and
+    post-processing parsed tokens.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(ParseElementEnhance,self).__init__(savelist)
+        if isinstance( expr, basestring ):
+            if issubclass(ParserElement._literalStringClass, Token):
+                expr = ParserElement._literalStringClass(expr)
+            else:
+                expr = ParserElement._literalStringClass(Literal(expr))
+        self.expr = expr
+        self.strRepr = None
+        if expr is not None:
+            self.mayIndexError = expr.mayIndexError
+            self.mayReturnEmpty = expr.mayReturnEmpty
+            self.setWhitespaceChars( expr.whiteChars )
+            self.skipWhitespace = expr.skipWhitespace
+            self.saveAsList = expr.saveAsList
+            self.callPreparse = expr.callPreparse
+            self.ignoreExprs.extend(expr.ignoreExprs)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr is not None:
+            return self.expr._parse( instring, loc, doActions, callPreParse=False )
+        else:
+            raise ParseException("",loc,self.errmsg,self)
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        self.expr = self.expr.copy()
+        if self.expr is not None:
+            self.expr.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseElementEnhance, self).ignore( other )
+                if self.expr is not None:
+                    self.expr.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseElementEnhance, self).ignore( other )
+            if self.expr is not None:
+                self.expr.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def streamline( self ):
+        super(ParseElementEnhance,self).streamline()
+        if self.expr is not None:
+            self.expr.streamline()
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        if self in parseElementList:
+            raise RecursiveGrammarException( parseElementList+[self] )
+        subRecCheckList = parseElementList[:] + [ self ]
+        if self.expr is not None:
+            self.expr.checkRecursion( subRecCheckList )
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        if self.expr is not None:
+            self.expr.validate(tmp)
+        self.checkRecursion( [] )
+
+    def __str__( self ):
+        try:
+            return super(ParseElementEnhance,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None and self.expr is not None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
+        return self.strRepr
+
+
+class FollowedBy(ParseElementEnhance):
+    """Lookahead matching of the given parse expression.
+    ``FollowedBy`` does *not* advance the parsing position within
+    the input string, it only verifies that the specified parse
+    expression matches at the current position.  ``FollowedBy``
+    always returns a null token list. If any results names are defined
+    in the lookahead expression, those *will* be returned for access by
+    name.
+
+    Example::
+
+        # use FollowedBy to match a label only if it is followed by a ':'
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+
+        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
+
+    prints::
+
+        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
+    """
+    def __init__( self, expr ):
+        super(FollowedBy,self).__init__(expr)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        _, ret = self.expr._parse(instring, loc, doActions=doActions)
+        del ret[:]
+        return loc, ret
+
+
+class PrecededBy(ParseElementEnhance):
+    """Lookbehind matching of the given parse expression.
+    ``PrecededBy`` does not advance the parsing position within the
+    input string, it only verifies that the specified parse expression
+    matches prior to the current position.  ``PrecededBy`` always
+    returns a null token list, but if a results name is defined on the
+    given expression, it is returned.
+
+    Parameters:
+
+     - expr - expression that must match prior to the current parse
+       location
+     - retreat - (default= ``None``) - (int) maximum number of characters
+       to lookbehind prior to the current parse location
+
+    If the lookbehind expression is a string, Literal, Keyword, or
+    a Word or CharsNotIn with a specified exact or maximum length, then
+    the retreat parameter is not required. Otherwise, retreat must be
+    specified to give a maximum number of characters to look back from
+    the current parse position for a lookbehind match.
+
+    Example::
+
+        # VB-style variable names with type prefixes
+        int_var = PrecededBy("#") + pyparsing_common.identifier
+        str_var = PrecededBy("$") + pyparsing_common.identifier
+
+    """
+    def __init__(self, expr, retreat=None):
+        super(PrecededBy, self).__init__(expr)
+        self.expr = self.expr().leaveWhitespace()
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.exact = False
+        if isinstance(expr, str):
+            retreat = len(expr)
+            self.exact = True
+        elif isinstance(expr, (Literal, Keyword)):
+            retreat = expr.matchLen
+            self.exact = True
+        elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT:
+            retreat = expr.maxLen
+            self.exact = True
+        elif isinstance(expr, _PositionToken):
+            retreat = 0
+            self.exact = True
+        self.retreat = retreat
+        self.errmsg = "not preceded by " + str(expr)
+        self.skipWhitespace = False
+
+    def parseImpl(self, instring, loc=0, doActions=True):
+        if self.exact:
+            if loc < self.retreat:
+                raise ParseException(instring, loc, self.errmsg)
+            start = loc - self.retreat
+            _, ret = self.expr._parse(instring, start)
+        else:
+            # retreat specified a maximum lookbehind window, iterate
+            test_expr = self.expr + StringEnd()
+            instring_slice = instring[:loc]
+            last_expr = ParseException(instring, loc, self.errmsg)
+            for offset in range(1, min(loc, self.retreat+1)):
+                try:
+                    _, ret = test_expr._parse(instring_slice, loc-offset)
+                except ParseBaseException as pbe:
+                    last_expr = pbe
+                else:
+                    break
+            else:
+                raise last_expr
+        # return empty list of tokens, but preserve any defined results names
+        del ret[:]
+        return loc, ret
+
+
+class NotAny(ParseElementEnhance):
+    """Lookahead to disallow matching with the given parse expression.
+    ``NotAny`` does *not* advance the parsing position within the
+    input string, it only verifies that the specified parse expression
+    does *not* match at the current position.  Also, ``NotAny`` does
+    *not* skip over leading whitespace. ``NotAny`` always returns
+    a null token list.  May be constructed using the '~' operator.
+
+    Example::
+
+        AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split())
+
+        # take care not to mistake keywords for identifiers
+        ident = ~(AND | OR | NOT) + Word(alphas)
+        boolean_term = Optional(NOT) + ident
+
+        # very crude boolean expression - to support parenthesis groups and
+        # operation hierarchy, use infixNotation
+        boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term)
+
+        # integers that are followed by "." are actually floats
+        integer = Word(nums) + ~Char(".")
+    """
+    def __init__( self, expr ):
+        super(NotAny,self).__init__(expr)
+        #~ self.leaveWhitespace()
+        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
+        self.mayReturnEmpty = True
+        self.errmsg = "Found unwanted token, "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr.canParseNext(instring, loc):
+            raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "~{" + _ustr(self.expr) + "}"
+
+        return self.strRepr
+
+class _MultipleMatch(ParseElementEnhance):
+    def __init__( self, expr, stopOn=None):
+        super(_MultipleMatch, self).__init__(expr)
+        self.saveAsList = True
+        ender = stopOn
+        if isinstance(ender, basestring):
+            ender = ParserElement._literalStringClass(ender)
+        self.not_ender = ~ender if ender is not None else None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self_expr_parse = self.expr._parse
+        self_skip_ignorables = self._skipIgnorables
+        check_ender = self.not_ender is not None
+        if check_ender:
+            try_not_ender = self.not_ender.tryParse
+
+        # must be at least one (but first see if we are the stopOn sentinel;
+        # if so, fail)
+        if check_ender:
+            try_not_ender(instring, loc)
+        loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False )
+        try:
+            hasIgnoreExprs = (not not self.ignoreExprs)
+            while 1:
+                if check_ender:
+                    try_not_ender(instring, loc)
+                if hasIgnoreExprs:
+                    preloc = self_skip_ignorables( instring, loc )
+                else:
+                    preloc = loc
+                loc, tmptokens = self_expr_parse( instring, preloc, doActions )
+                if tmptokens or tmptokens.haskeys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+
+class OneOrMore(_MultipleMatch):
+    """Repetition of one or more of the given expression.
+
+    Parameters:
+     - expr - expression that must match one or more times
+     - stopOn - (default= ``None``) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition
+          expression)
+
+    Example::
+
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: BLACK"
+        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]
+
+        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
+
+        # could also be written as
+        (attr_expr * (1,)).parseString(text).pprint()
+    """
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + _ustr(self.expr) + "}..."
+
+        return self.strRepr
+
+class ZeroOrMore(_MultipleMatch):
+    """Optional repetition of zero or more of the given expression.
+
+    Parameters:
+     - expr - expression that must match zero or more times
+     - stopOn - (default= ``None``) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition
+          expression)
+
+    Example: similar to :class:`OneOrMore`
+    """
+    def __init__( self, expr, stopOn=None):
+        super(ZeroOrMore,self).__init__(expr, stopOn=stopOn)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
+        except (ParseException,IndexError):
+            return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]..."
+
+        return self.strRepr
+
+class _NullToken(object):
+    def __bool__(self):
+        return False
+    __nonzero__ = __bool__
+    def __str__(self):
+        return ""
+
+_optionalNotMatched = _NullToken()
+class Optional(ParseElementEnhance):
+    """Optional matching of the given expression.
+
+    Parameters:
+     - expr - expression that must match zero or more times
+     - default (optional) - value to be returned if the optional expression is not found.
+
+    Example::
+
+        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
+        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
+        zip.runTests('''
+            # traditional ZIP code
+            12345
+
+            # ZIP+4 form
+            12101-0001
+
+            # invalid ZIP
+            98765-
+            ''')
+
+    prints::
+
+        # traditional ZIP code
+        12345
+        ['12345']
+
+        # ZIP+4 form
+        12101-0001
+        ['12101-0001']
+
+        # invalid ZIP
+        98765-
+             ^
+        FAIL: Expected end of text (at char 5), (line:1, col:6)
+    """
+    def __init__( self, expr, default=_optionalNotMatched ):
+        super(Optional,self).__init__( expr, savelist=False )
+        self.saveAsList = self.expr.saveAsList
+        self.defaultValue = default
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+        except (ParseException,IndexError):
+            if self.defaultValue is not _optionalNotMatched:
+                if self.expr.resultsName:
+                    tokens = ParseResults([ self.defaultValue ])
+                    tokens[self.expr.resultsName] = self.defaultValue
+                else:
+                    tokens = [ self.defaultValue ]
+            else:
+                tokens = []
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]"
+
+        return self.strRepr
+
+class SkipTo(ParseElementEnhance):
+    """Token for skipping over all undefined text until the matched
+    expression is found.
+
+    Parameters:
+     - expr - target expression marking the end of the data to be skipped
+     - include - (default= ``False``) if True, the target expression is also parsed
+          (the skipped text and target expression are returned as a 2-element list).
+     - ignore - (default= ``None``) used to define grammars (typically quoted strings and
+          comments) that might contain false matches to the target expression
+     - failOn - (default= ``None``) define expressions that are not allowed to be
+          included in the skipped test; if found before the target expression is found,
+          the SkipTo is not a match
+
+    Example::
+
+        report = '''
+            Outstanding Issues Report - 1 Jan 2000
+
+               # | Severity | Description                               |  Days Open
+            -----+----------+-------------------------------------------+-----------
+             101 | Critical | Intermittent system crash                 |          6
+              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
+              79 | Minor    | System slow when running too many reports |         47
+            '''
+        integer = Word(nums)
+        SEP = Suppress('|')
+        # use SkipTo to simply match everything up until the next SEP
+        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
+        # - parse action will call token.strip() for each matched token, i.e., the description body
+        string_data = SkipTo(SEP, ignore=quotedString)
+        string_data.setParseAction(tokenMap(str.strip))
+        ticket_expr = (integer("issue_num") + SEP
+                      + string_data("sev") + SEP
+                      + string_data("desc") + SEP
+                      + integer("days_open"))
+
+        for tkt in ticket_expr.searchString(report):
+            print tkt.dump()
+
+    prints::
+
+        ['101', 'Critical', 'Intermittent system crash', '6']
+        - days_open: 6
+        - desc: Intermittent system crash
+        - issue_num: 101
+        - sev: Critical
+        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
+        - days_open: 14
+        - desc: Spelling error on Login ('log|n')
+        - issue_num: 94
+        - sev: Cosmetic
+        ['79', 'Minor', 'System slow when running too many reports', '47']
+        - days_open: 47
+        - desc: System slow when running too many reports
+        - issue_num: 79
+        - sev: Minor
+    """
+    def __init__( self, other, include=False, ignore=None, failOn=None ):
+        super( SkipTo, self ).__init__( other )
+        self.ignoreExpr = ignore
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.includeMatch = include
+        self.saveAsList = False
+        if isinstance(failOn, basestring):
+            self.failOn = ParserElement._literalStringClass(failOn)
+        else:
+            self.failOn = failOn
+        self.errmsg = "No match found for "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        startloc = loc
+        instrlen = len(instring)
+        expr = self.expr
+        expr_parse = self.expr._parse
+        self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None
+        self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None
+
+        tmploc = loc
+        while tmploc <= instrlen:
+            if self_failOn_canParseNext is not None:
+                # break if failOn expression matches
+                if self_failOn_canParseNext(instring, tmploc):
+                    break
+
+            if self_ignoreExpr_tryParse is not None:
+                # advance past ignore expressions
+                while 1:
+                    try:
+                        tmploc = self_ignoreExpr_tryParse(instring, tmploc)
+                    except ParseBaseException:
+                        break
+
+            try:
+                expr_parse(instring, tmploc, doActions=False, callPreParse=False)
+            except (ParseException, IndexError):
+                # no match, advance loc in string
+                tmploc += 1
+            else:
+                # matched skipto expr, done
+                break
+
+        else:
+            # ran off the end of the input string without matching skipto expr, fail
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        # build up return values
+        loc = tmploc
+        skiptext = instring[startloc:loc]
+        skipresult = ParseResults(skiptext)
+
+        if self.includeMatch:
+            loc, mat = expr_parse(instring,loc,doActions,callPreParse=False)
+            skipresult += mat
+
+        return loc, skipresult
+
+class Forward(ParseElementEnhance):
+    """Forward declaration of an expression to be defined later -
+    used for recursive grammars, such as algebraic infix notation.
+    When the expression is known, it is assigned to the ``Forward``
+    variable using the '<<' operator.
+
+    Note: take care when assigning to ``Forward`` not to overlook
+    precedence of operators.
+
+    Specifically, '|' has a lower precedence than '<<', so that::
+
+        fwdExpr << a | b | c
+
+    will actually be evaluated as::
+
+        (fwdExpr << a) | b | c
+
+    thereby leaving b and c out as parseable alternatives.  It is recommended that you
+    explicitly group the values inserted into the ``Forward``::
+
+        fwdExpr << (a | b | c)
+
+    Converting to use the '<<=' operator instead will avoid this problem.
+
+    See :class:`ParseResults.pprint` for an example of a recursive
+    parser created using ``Forward``.
+    """
+    def __init__( self, other=None ):
+        super(Forward,self).__init__( other, savelist=False )
+
+    def __lshift__( self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass(other)
+        self.expr = other
+        self.strRepr = None
+        self.mayIndexError = self.expr.mayIndexError
+        self.mayReturnEmpty = self.expr.mayReturnEmpty
+        self.setWhitespaceChars( self.expr.whiteChars )
+        self.skipWhitespace = self.expr.skipWhitespace
+        self.saveAsList = self.expr.saveAsList
+        self.ignoreExprs.extend(self.expr.ignoreExprs)
+        return self
+
+    def __ilshift__(self, other):
+        return self << other
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        return self
+
+    def streamline( self ):
+        if not self.streamlined:
+            self.streamlined = True
+            if self.expr is not None:
+                self.expr.streamline()
+        return self
+
+    def validate( self, validateTrace=[] ):
+        if self not in validateTrace:
+            tmp = validateTrace[:]+[self]
+            if self.expr is not None:
+                self.expr.validate(tmp)
+        self.checkRecursion([])
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        # Avoid infinite recursion by setting a temporary name
+        self.name = self.__class__.__name__ + ": ..."
+
+        # Use the string representation of main expression.
+        try:
+            if self.expr is not None:
+                retString = _ustr(self.expr)
+            else:
+                retString = "None"
+        finally:
+            del self.name
+        return self.__class__.__name__ + ": " + retString
+
+    def copy(self):
+        if self.expr is not None:
+            return super(Forward,self).copy()
+        else:
+            ret = Forward()
+            ret <<= self
+            return ret
+
+class TokenConverter(ParseElementEnhance):
+    """
+    Abstract subclass of :class:`ParseExpression`, for converting parsed results.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(TokenConverter,self).__init__( expr )#, savelist )
+        self.saveAsList = False
+
+class Combine(TokenConverter):
+    """Converter to concatenate all matching tokens to a single string.
+    By default, the matching patterns must also be contiguous in the
+    input string; this can be disabled by specifying
+    ``'adjacent=False'`` in the constructor.
+
+    Example::
+
+        real = Word(nums) + '.' + Word(nums)
+        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
+        # will also erroneously match the following
+        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']
+
+        real = Combine(Word(nums) + '.' + Word(nums))
+        print(real.parseString('3.1416')) # -> ['3.1416']
+        # no match when there are internal spaces
+        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
+    """
+    def __init__( self, expr, joinString="", adjacent=True ):
+        super(Combine,self).__init__( expr )
+        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
+        if adjacent:
+            self.leaveWhitespace()
+        self.adjacent = adjacent
+        self.skipWhitespace = True
+        self.joinString = joinString
+        self.callPreparse = True
+
+    def ignore( self, other ):
+        if self.adjacent:
+            ParserElement.ignore(self, other)
+        else:
+            super( Combine, self).ignore( other )
+        return self
+
+    def postParse( self, instring, loc, tokenlist ):
+        retToks = tokenlist.copy()
+        del retToks[:]
+        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)
+
+        if self.resultsName and retToks.haskeys():
+            return [ retToks ]
+        else:
+            return retToks
+
+class Group(TokenConverter):
+    """Converter to return the matched tokens as a list - useful for
+    returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions.
+
+    Example::
+
+        ident = Word(alphas)
+        num = Word(nums)
+        term = ident | num
+        func = ident + Optional(delimitedList(term))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']
+
+        func = ident + Group(Optional(delimitedList(term)))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
+    """
+    def __init__( self, expr ):
+        super(Group,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        return [ tokenlist ]
+
+class Dict(TokenConverter):
+    """Converter to return a repetitive expression as a list, but also
+    as a dictionary. Each element can also be referenced using the first
+    token in the expression as its key. Useful for tabular report
+    scraping when the first column can be used as a item key.
+
+    Example::
+
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+
+        # print attributes as plain groups
+        print(OneOrMore(attr_expr).parseString(text).dump())
+
+        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
+        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
+        print(result.dump())
+
+        # access named fields as dict entries, or output as dict
+        print(result['shape'])
+        print(result.asDict())
+
+    prints::
+
+        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
+
+    See more examples at :class:`ParseResults` of accessing fields by results name.
+    """
+    def __init__( self, expr ):
+        super(Dict,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        for i,tok in enumerate(tokenlist):
+            if len(tok) == 0:
+                continue
+            ikey = tok[0]
+            if isinstance(ikey,int):
+                ikey = _ustr(tok[0]).strip()
+            if len(tok)==1:
+                tokenlist[ikey] = _ParseResultsWithOffset("",i)
+            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
+                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
+            else:
+                dictvalue = tok.copy() #ParseResults(i)
+                del dictvalue[0]
+                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()):
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
+                else:
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)
+
+        if self.resultsName:
+            return [ tokenlist ]
+        else:
+            return tokenlist
+
+
+class Suppress(TokenConverter):
+    """Converter for ignoring the results of a parsed expression.
+
+    Example::
+
+        source = "a, b, c,d"
+        wd = Word(alphas)
+        wd_list1 = wd + ZeroOrMore(',' + wd)
+        print(wd_list1.parseString(source))
+
+        # often, delimiters that are useful during parsing are just in the
+        # way afterward - use Suppress to keep them out of the parsed output
+        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
+        print(wd_list2.parseString(source))
+
+    prints::
+
+        ['a', ',', 'b', ',', 'c', ',', 'd']
+        ['a', 'b', 'c', 'd']
+
+    (See also :class:`delimitedList`.)
+    """
+    def postParse( self, instring, loc, tokenlist ):
+        return []
+
+    def suppress( self ):
+        return self
+
+
+class OnlyOnce(object):
+    """Wrapper for parse actions, to ensure they are only called once.
+    """
+    def __init__(self, methodCall):
+        self.callable = _trim_arity(methodCall)
+        self.called = False
+    def __call__(self,s,l,t):
+        if not self.called:
+            results = self.callable(s,l,t)
+            self.called = True
+            return results
+        raise ParseException(s,l,"")
+    def reset(self):
+        self.called = False
+
+def traceParseAction(f):
+    """Decorator for debugging parse actions.
+
+    When the parse action is called, this decorator will print
+    ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``.
+    When the parse action completes, the decorator will print
+    ``"<<"`` followed by the returned value, or any exception that the parse action raised.
+
+    Example::
+
+        wd = Word(alphas)
+
+        @traceParseAction
+        def remove_duplicate_chars(tokens):
+            return ''.join(sorted(set(''.join(tokens))))
+
+        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
+        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
+
+    prints::
+
+        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
+        <<leaving remove_duplicate_chars (ret: 'dfjkls')
+        ['dfjkls']
+    """
+    f = _trim_arity(f)
+    def z(*paArgs):
+        thisFunc = f.__name__
+        s,l,t = paArgs[-3:]
+        if len(paArgs)>3:
+            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
+        sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) )
+        try:
+            ret = f(*paArgs)
+        except Exception as exc:
+            sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) )
+            raise
+        sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) )
+        return ret
+    try:
+        z.__name__ = f.__name__
+    except AttributeError:
+        pass
+    return z
+
+#
+# global helpers
+#
+def delimitedList( expr, delim=",", combine=False ):
+    """Helper to define a delimited list of expressions - the delimiter
+    defaults to ','. By default, the list elements and delimiters can
+    have intervening whitespace, and comments, but this can be
+    overridden by passing ``combine=True`` in the constructor. If
+    ``combine`` is set to ``True``, the matching tokens are
+    returned as a single token string, with the delimiters included;
+    otherwise, the matching tokens are returned as a list of tokens,
+    with the delimiters suppressed.
+
+    Example::
+
+        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
+        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
+    """
+    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
+    if combine:
+        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
+    else:
+        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)
+
+def countedArray( expr, intExpr=None ):
+    """Helper to define a counted list of expressions.
+
+    This helper defines a pattern of the form::
+
+        integer expr expr expr...
+
+    where the leading integer tells how many expr expressions follow.
+    The matched tokens returns the array of expr tokens as a list - the
+    leading count token is suppressed.
+
+    If ``intExpr`` is specified, it should be a pyparsing expression
+    that produces an integer value.
+
+    Example::
+
+        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']
+
+        # in this parser, the leading integer value is given in binary,
+        # '10' indicating that 2 values are in the array
+        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
+        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
+    """
+    arrayExpr = Forward()
+    def countFieldParseAction(s,l,t):
+        n = t[0]
+        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
+        return []
+    if intExpr is None:
+        intExpr = Word(nums).setParseAction(lambda t:int(t[0]))
+    else:
+        intExpr = intExpr.copy()
+    intExpr.setName("arrayLen")
+    intExpr.addParseAction(countFieldParseAction, callDuringTry=True)
+    return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...')
+
+def _flatten(L):
+    ret = []
+    for i in L:
+        if isinstance(i,list):
+            ret.extend(_flatten(i))
+        else:
+            ret.append(i)
+    return ret
+
+def matchPreviousLiteral(expr):
+    """Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks for
+    a 'repeat' of a previous expression.  For example::
+
+        first = Word(nums)
+        second = matchPreviousLiteral(first)
+        matchExpr = first + ":" + second
+
+    will match ``"1:1"``, but not ``"1:2"``.  Because this
+    matches a previous literal, will also match the leading
+    ``"1:1"`` in ``"1:10"``. If this is not desired, use
+    :class:`matchPreviousExpr`. Do *not* use with packrat parsing
+    enabled.
+    """
+    rep = Forward()
+    def copyTokenToRepeater(s,l,t):
+        if t:
+            if len(t) == 1:
+                rep << t[0]
+            else:
+                # flatten t tokens
+                tflat = _flatten(t.asList())
+                rep << And(Literal(tt) for tt in tflat)
+        else:
+            rep << Empty()
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def matchPreviousExpr(expr):
+    """Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks for
+    a 'repeat' of a previous expression.  For example::
+
+        first = Word(nums)
+        second = matchPreviousExpr(first)
+        matchExpr = first + ":" + second
+
+    will match ``"1:1"``, but not ``"1:2"``.  Because this
+    matches by expressions, will *not* match the leading ``"1:1"``
+    in ``"1:10"``; the expressions are evaluated first, and then
+    compared, so ``"1"`` is compared with ``"10"``. Do *not* use
+    with packrat parsing enabled.
+    """
+    rep = Forward()
+    e2 = expr.copy()
+    rep <<= e2
+    def copyTokenToRepeater(s,l,t):
+        matchTokens = _flatten(t.asList())
+        def mustMatchTheseTokens(s,l,t):
+            theseTokens = _flatten(t.asList())
+            if  theseTokens != matchTokens:
+                raise ParseException("",0,"")
+        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def _escapeRegexRangeChars(s):
+    #~  escape these chars: ^-]
+    for c in r"\^-]":
+        s = s.replace(c,_bslash+c)
+    s = s.replace("\n",r"\n")
+    s = s.replace("\t",r"\t")
+    return _ustr(s)
+
+def oneOf( strs, caseless=False, useRegex=True ):
+    """Helper to quickly define a set of alternative Literals, and makes
+    sure to do longest-first testing when there is a conflict,
+    regardless of the input order, but returns
+    a :class:`MatchFirst` for best performance.
+
+    Parameters:
+
+     - strs - a string of space-delimited literals, or a collection of
+       string literals
+     - caseless - (default= ``False``) - treat all literals as
+       caseless
+     - useRegex - (default= ``True``) - as an optimization, will
+       generate a Regex object; otherwise, will generate
+       a :class:`MatchFirst` object (if ``caseless=True``, or if
+       creating a :class:`Regex` raises an exception)
+
+    Example::
+
+        comp_oper = oneOf("< = > <= >= !=")
+        var = Word(alphas)
+        number = Word(nums)
+        term = var | number
+        comparison_expr = term + comp_oper + term
+        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
+
+    prints::
+
+        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
+    """
+    if caseless:
+        isequal = ( lambda a,b: a.upper() == b.upper() )
+        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
+        parseElementClass = CaselessLiteral
+    else:
+        isequal = ( lambda a,b: a == b )
+        masks = ( lambda a,b: b.startswith(a) )
+        parseElementClass = Literal
+
+    symbols = []
+    if isinstance(strs,basestring):
+        symbols = strs.split()
+    elif isinstance(strs, Iterable):
+        symbols = list(strs)
+    else:
+        warnings.warn("Invalid argument to oneOf, expected string or iterable",
+                SyntaxWarning, stacklevel=2)
+    if not symbols:
+        return NoMatch()
+
+    i = 0
+    while i < len(symbols)-1:
+        cur = symbols[i]
+        for j,other in enumerate(symbols[i+1:]):
+            if ( isequal(other, cur) ):
+                del symbols[i+j+1]
+                break
+            elif ( masks(cur, other) ):
+                del symbols[i+j+1]
+                symbols.insert(i,other)
+                cur = other
+                break
+        else:
+            i += 1
+
+    if not caseless and useRegex:
+        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
+        try:
+            if len(symbols)==len("".join(symbols)):
+                return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols))
+            else:
+                return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols))
+        except Exception:
+            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
+                    SyntaxWarning, stacklevel=2)
+
+
+    # last resort, just use MatchFirst
+    return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols))
+
+def dictOf( key, value ):
+    """Helper to easily and clearly define a dictionary by specifying
+    the respective patterns for the key and value.  Takes care of
+    defining the :class:`Dict`, :class:`ZeroOrMore`, and
+    :class:`Group` tokens in the proper order.  The key pattern
+    can include delimiting markers or punctuation, as long as they are
+    suppressed, thereby leaving the significant key text.  The value
+    pattern can include named results, so that the :class:`Dict` results
+    can include named token fields.
+
+    Example::
+
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        print(OneOrMore(attr_expr).parseString(text).dump())
+
+        attr_label = label
+        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)
+
+        # similar to Dict, but simpler call format
+        result = dictOf(attr_label, attr_value).parseString(text)
+        print(result.dump())
+        print(result['shape'])
+        print(result.shape)  # object attribute access works too
+        print(result.asDict())
+
+    prints::
+
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        SQUARE
+        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
+    """
+    return Dict(OneOrMore(Group(key + value)))
+
+def originalTextFor(expr, asString=True):
+    """Helper to return the original, untokenized text for a given
+    expression.  Useful to restore the parsed fields of an HTML start
+    tag into the raw tag text itself, or to revert separate tokens with
+    intervening whitespace back to the original matching input text. By
+    default, returns astring containing the original parsed text.
+
+    If the optional ``asString`` argument is passed as
+    ``False``, then the return value is
+    a :class:`ParseResults` containing any results names that
+    were originally matched, and a single token containing the original
+    matched text from the input string.  So if the expression passed to
+    :class:`originalTextFor` contains expressions with defined
+    results names, you must set ``asString`` to ``False`` if you
+    want to preserve those results name values.
+
+    Example::
+
+        src = "this is test <b> bold <i>text</i> </b> normal text "
+        for tag in ("b","i"):
+            opener,closer = makeHTMLTags(tag)
+            patt = originalTextFor(opener + SkipTo(closer) + closer)
+            print(patt.searchString(src)[0])
+
+    prints::
+
+        ['<b> bold <i>text</i> </b>']
+        ['<i>text</i>']
+    """
+    locMarker = Empty().setParseAction(lambda s,loc,t: loc)
+    endlocMarker = locMarker.copy()
+    endlocMarker.callPreparse = False
+    matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
+    if asString:
+        extractText = lambda s,l,t: s[t._original_start:t._original_end]
+    else:
+        def extractText(s,l,t):
+            t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]]
+    matchExpr.setParseAction(extractText)
+    matchExpr.ignoreExprs = expr.ignoreExprs
+    return matchExpr
+
+def ungroup(expr):
+    """Helper to undo pyparsing's default grouping of And expressions,
+    even if all but one are non-empty.
+    """
+    return TokenConverter(expr).addParseAction(lambda t:t[0])
+
+def locatedExpr(expr):
+    """Helper to decorate a returned token with its starting and ending
+    locations in the input string.
+
+    This helper adds the following results names:
+
+     - locn_start = location where matched expression begins
+     - locn_end = location where matched expression ends
+     - value = the actual parsed results
+
+    Be careful if the input text contains ``<TAB>`` characters, you
+    may want to call :class:`ParserElement.parseWithTabs`
+
+    Example::
+
+        wd = Word(alphas)
+        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
+            print(match)
+
+    prints::
+
+        [[0, 'ljsdf', 5]]
+        [[8, 'lksdjjf', 15]]
+        [[18, 'lkkjj', 23]]
+    """
+    locator = Empty().setParseAction(lambda s,l,t: l)
+    return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))
+
+
+# convenience constants for positional expressions
+empty       = Empty().setName("empty")
+lineStart   = LineStart().setName("lineStart")
+lineEnd     = LineEnd().setName("lineEnd")
+stringStart = StringStart().setName("stringStart")
+stringEnd   = StringEnd().setName("stringEnd")
+
+_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
+_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16)))
+_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8)))
+_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1)
+_charRange = Group(_singleChar + Suppress("-") + _singleChar)
+_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"
+
+def srange(s):
+    r"""Helper to easily define string ranges for use in Word
+    construction. Borrows syntax from regexp '[]' string range
+    definitions::
+
+        srange("[0-9]")   -> "0123456789"
+        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
+        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
+
+    The input string must be enclosed in []'s, and the returned string
+    is the expanded character set joined into a single string. The
+    values enclosed in the []'s may be:
+
+     - a single character
+     - an escaped character with a leading backslash (such as ``\-``
+       or ``\]``)
+     - an escaped hex character with a leading ``'\x'``
+       (``\x21``, which is a ``'!'`` character) (``\0x##``
+       is also supported for backwards compatibility)
+     - an escaped octal character with a leading ``'\0'``
+       (``\041``, which is a ``'!'`` character)
+     - a range of any of the above, separated by a dash (``'a-z'``,
+       etc.)
+     - any combination of the above (``'aeiouy'``,
+       ``'a-zA-Z0-9_$'``, etc.)
+    """
+    _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1))
+    try:
+        return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body)
+    except Exception:
+        return ""
+
+def matchOnlyAtCol(n):
+    """Helper method for defining parse actions that require matching at
+    a specific column in the input text.
+    """
+    def verifyCol(strg,locn,toks):
+        if col(locn,strg) != n:
+            raise ParseException(strg,locn,"matched token not at column %d" % n)
+    return verifyCol
+
+def replaceWith(replStr):
+    """Helper method for common parse actions that simply return
+    a literal value.  Especially useful when used with
+    :class:`transformString<ParserElement.transformString>` ().
+
+    Example::
+
+        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
+        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
+        term = na | num
+
+        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
+    """
+    return lambda s,l,t: [replStr]
+
+def removeQuotes(s,l,t):
+    """Helper parse action for removing quotation marks from parsed
+    quoted strings.
+
+    Example::
+
+        # by default, quotation marks are included in parsed results
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]
+
+        # use removeQuotes to strip quotation marks from parsed results
+        quotedString.setParseAction(removeQuotes)
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
+    """
+    return t[0][1:-1]
+
+def tokenMap(func, *args):
+    """Helper to define a parse action by mapping a function to all
+    elements of a ParseResults list. If any additional args are passed,
+    they are forwarded to the given function as additional arguments
+    after the token, as in
+    ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``,
+    which will convert the parsed data to an integer using base 16.
+
+    Example (compare the last to example in :class:`ParserElement.transformString`::
+
+        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
+        hex_ints.runTests('''
+            00 11 22 aa FF 0a 0d 1a
+            ''')
+
+        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
+        OneOrMore(upperword).runTests('''
+            my kingdom for a horse
+            ''')
+
+        wd = Word(alphas).setParseAction(tokenMap(str.title))
+        OneOrMore(wd).setParseAction(' '.join).runTests('''
+            now is the winter of our discontent made glorious summer by this sun of york
+            ''')
+
+    prints::
+
+        00 11 22 aa FF 0a 0d 1a
+        [0, 17, 34, 170, 255, 10, 13, 26]
+
+        my kingdom for a horse
+        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']
+
+        now is the winter of our discontent made glorious summer by this sun of york
+        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
+    """
+    def pa(s,l,t):
+        return [func(tokn, *args) for tokn in t]
+
+    try:
+        func_name = getattr(func, '__name__',
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    pa.__name__ = func_name
+
+    return pa
+
+upcaseTokens = tokenMap(lambda t: _ustr(t).upper())
+"""(Deprecated) Helper parse action to convert tokens to upper case.
+Deprecated in favor of :class:`pyparsing_common.upcaseTokens`"""
+
+downcaseTokens = tokenMap(lambda t: _ustr(t).lower())
+"""(Deprecated) Helper parse action to convert tokens to lower case.
+Deprecated in favor of :class:`pyparsing_common.downcaseTokens`"""
+
+def _makeTags(tagStr, xml,
+              suppress_LT=Suppress("<"),
+              suppress_GT=Suppress(">")):
+    """Internal helper to construct opening and closing tag expressions, given a tag name"""
+    if isinstance(tagStr,basestring):
+        resname = tagStr
+        tagStr = Keyword(tagStr, caseless=not xml)
+    else:
+        resname = tagStr.name
+
+    tagAttrName = Word(alphas,alphanums+"_-:")
+    if (xml):
+        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
+        openTag = (suppress_LT
+                   + tagStr("tag")
+                   + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue )))
+                   + Optional("/", default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/')
+                   + suppress_GT)
+    else:
+        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printables, excludeChars=">")
+        openTag = (suppress_LT
+                   + tagStr("tag")
+                   + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens)
+                                           + Optional(Suppress("=") + tagAttrValue))))
+                   + Optional("/",default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/')
+                   + suppress_GT)
+    closeTag = Combine(_L("</") + tagStr + ">", adjacent=False)
+
+    openTag.setName("<%s>" % resname)
+    # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels
+    openTag.addParseAction(lambda t: t.__setitem__("start"+"".join(resname.replace(":"," ").title().split()), t.copy()))
+    closeTag = closeTag("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname)
+    openTag.tag = resname
+    closeTag.tag = resname
+    openTag.tag_body = SkipTo(closeTag())
+    return openTag, closeTag
+
+def makeHTMLTags(tagStr):
+    """Helper to construct opening and closing tag expressions for HTML,
+    given a tag name. Matches tags in either upper or lower case,
+    attributes with namespaces and with quoted or unquoted values.
+
+    Example::
+
+        text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>'
+        # makeHTMLTags returns pyparsing expressions for the opening and
+        # closing tags as a 2-tuple
+        a,a_end = makeHTMLTags("A")
+        link_expr = a + SkipTo(a_end)("link_text") + a_end
+
+        for link in link_expr.searchString(text):
+            # attributes in the <A> tag (like "href" shown here) are
+            # also accessible as named results
+            print(link.link_text, '->', link.href)
+
+    prints::
+
+        pyparsing -> https://github.com/pyparsing/pyparsing/wiki
+    """
+    return _makeTags( tagStr, False )
+
+def makeXMLTags(tagStr):
+    """Helper to construct opening and closing tag expressions for XML,
+    given a tag name. Matches tags only in the given upper/lower case.
+
+    Example: similar to :class:`makeHTMLTags`
+    """
+    return _makeTags( tagStr, True )
+
+def withAttribute(*args,**attrDict):
+    """Helper to create a validating parse action to be used with start
+    tags created with :class:`makeXMLTags` or
+    :class:`makeHTMLTags`. Use ``withAttribute`` to qualify
+    a starting tag with a required attribute value, to avoid false
+    matches on common tags such as ``<TD>`` or ``<DIV>``.
+
+    Call ``withAttribute`` with a series of attribute names and
+    values. Specify the list of filter attributes names and values as:
+
+     - keyword arguments, as in ``(align="right")``, or
+     - as an explicit dict with ``**`` operator, when an attribute
+       name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}``
+     - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align","right"))``
+
+    For attribute names with a namespace prefix, you must use the second
+    form.  Attribute names are matched insensitive to upper/lower case.
+
+    If just testing for ``class`` (with or without a namespace), use
+    :class:`withClass`.
+
+    To verify that the attribute exists, but without specifying a value,
+    pass ``withAttribute.ANY_VALUE`` as the value.
+
+    Example::
+
+        html = '''
+            <div>
+            Some text
+            <div type="grid">1 4 0 1 0</div>
+            <div type="graph">1,3 2,3 1,1</div>
+            <div>this has no type</div>
+            </div>
+
+        '''
+        div,div_end = makeHTMLTags("div")
+
+        # only match div tag having a type attribute with value "grid"
+        div_grid = div().setParseAction(withAttribute(type="grid"))
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+
+        # construct a match with any div tag having a type attribute, regardless of the value
+        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+
+    prints::
+
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    if args:
+        attrs = args[:]
+    else:
+        attrs = attrDict.items()
+    attrs = [(k,v) for k,v in attrs]
+    def pa(s,l,tokens):
+        for attrName,attrValue in attrs:
+            if attrName not in tokens:
+                raise ParseException(s,l,"no matching attribute " + attrName)
+            if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue:
+                raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" %
+                                            (attrName, tokens[attrName], attrValue))
+    return pa
+withAttribute.ANY_VALUE = object()
+
+def withClass(classname, namespace=''):
+    """Simplified version of :class:`withAttribute` when
+    matching on a div class - made difficult because ``class`` is
+    a reserved word in Python.
+
+    Example::
+
+        html = '''
+            <div>
+            Some text
+            <div class="grid">1 4 0 1 0</div>
+            <div class="graph">1,3 2,3 1,1</div>
+            <div>this &lt;div&gt; has no class</div>
+            </div>
+
+        '''
+        div,div_end = makeHTMLTags("div")
+        div_grid = div().setParseAction(withClass("grid"))
+
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+
+        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+
+    prints::
+
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    classattr = "%s:class" % namespace if namespace else "class"
+    return withAttribute(**{classattr : classname})
+
+opAssoc = SimpleNamespace()
+opAssoc.LEFT = object()
+opAssoc.RIGHT = object()
+
+def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ):
+    """Helper method for constructing grammars of expressions made up of
+    operators working in a precedence hierarchy.  Operators may be unary
+    or binary, left- or right-associative.  Parse actions can also be
+    attached to operator expressions. The generated parser will also
+    recognize the use of parentheses to override operator precedences
+    (see example below).
+
+    Note: if you define a deep operator list, you may see performance
+    issues when using infixNotation. See
+    :class:`ParserElement.enablePackrat` for a mechanism to potentially
+    improve your parser performance.
+
+    Parameters:
+     - baseExpr - expression representing the most basic element for the
+       nested
+     - opList - list of tuples, one for each operator precedence level
+       in the expression grammar; each tuple is of the form ``(opExpr,
+       numTerms, rightLeftAssoc, parseAction)``, where:
+
+       - opExpr is the pyparsing expression for the operator; may also
+         be a string, which will be converted to a Literal; if numTerms
+         is 3, opExpr is a tuple of two expressions, for the two
+         operators separating the 3 terms
+       - numTerms is the number of terms for this operator (must be 1,
+         2, or 3)
+       - rightLeftAssoc is the indicator whether the operator is right
+         or left associative, using the pyparsing-defined constants
+         ``opAssoc.RIGHT`` and ``opAssoc.LEFT``.
+       - parseAction is the parse action to be associated with
+         expressions matching this operator expression (the parse action
+         tuple member may be omitted); if the parse action is passed
+         a tuple or list of functions, this is equivalent to calling
+         ``setParseAction(*fn)``
+         (:class:`ParserElement.setParseAction`)
+     - lpar - expression for matching left-parentheses
+       (default= ``Suppress('(')``)
+     - rpar - expression for matching right-parentheses
+       (default= ``Suppress(')')``)
+
+    Example::
+
+        # simple example of four-function arithmetic with ints and
+        # variable names
+        integer = pyparsing_common.signed_integer
+        varname = pyparsing_common.identifier
+
+        arith_expr = infixNotation(integer | varname,
+            [
+            ('-', 1, opAssoc.RIGHT),
+            (oneOf('* /'), 2, opAssoc.LEFT),
+            (oneOf('+ -'), 2, opAssoc.LEFT),
+            ])
+
+        arith_expr.runTests('''
+            5+3*6
+            (5+3)*6
+            -2--11
+            ''', fullDump=False)
+
+    prints::
+
+        5+3*6
+        [[5, '+', [3, '*', 6]]]
+
+        (5+3)*6
+        [[[5, '+', 3], '*', 6]]
+
+        -2--11
+        [[['-', 2], '-', ['-', 11]]]
+    """
+    # captive version of FollowedBy that does not do parse actions or capture results names
+    class _FB(FollowedBy):
+        def parseImpl(self, instring, loc, doActions=True):
+            self.expr.tryParse(instring, loc)
+            return loc, []
+
+    ret = Forward()
+    lastExpr = baseExpr | ( lpar + ret + rpar )
+    for i,operDef in enumerate(opList):
+        opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4]
+        termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr
+        if arity == 3:
+            if opExpr is None or len(opExpr) != 2:
+                raise ValueError(
+                    "if numterms=3, opExpr must be a tuple or list of two expressions")
+            opExpr1, opExpr2 = opExpr
+        thisExpr = Forward().setName(termName)
+        if rightLeftAssoc == opAssoc.LEFT:
+            if arity == 1:
+                matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) )
+                else:
+                    matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) )
+            elif arity == 3:
+                matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \
+                            Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        elif rightLeftAssoc == opAssoc.RIGHT:
+            if arity == 1:
+                # try to avoid LR with this extra test
+                if not isinstance(opExpr, Optional):
+                    opExpr = Optional(opExpr)
+                matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) )
+                else:
+                    matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) )
+            elif arity == 3:
+                matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \
+                            Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        else:
+            raise ValueError("operator must indicate right or left associativity")
+        if pa:
+            if isinstance(pa, (tuple, list)):
+                matchExpr.setParseAction(*pa)
+            else:
+                matchExpr.setParseAction(pa)
+        thisExpr <<= ( matchExpr.setName(termName) | lastExpr )
+        lastExpr = thisExpr
+    ret <<= lastExpr
+    return ret
+
+operatorPrecedence = infixNotation
+"""(Deprecated) Former name of :class:`infixNotation`, will be
+dropped in a future release."""
+
+dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes")
+sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes")
+quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'|
+                       Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes")
+unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal")
+
+def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
+    """Helper method for defining nested lists enclosed in opening and
+    closing delimiters ("(" and ")" are the default).
+
+    Parameters:
+     - opener - opening character for a nested list
+       (default= ``"("``); can also be a pyparsing expression
+     - closer - closing character for a nested list
+       (default= ``")"``); can also be a pyparsing expression
+     - content - expression for items within the nested lists
+       (default= ``None``)
+     - ignoreExpr - expression for ignoring opening and closing
+       delimiters (default= :class:`quotedString`)
+
+    If an expression is not provided for the content argument, the
+    nested expression will capture all whitespace-delimited content
+    between delimiters as a list of separate values.
+
+    Use the ``ignoreExpr`` argument to define expressions that may
+    contain opening or closing characters that should not be treated as
+    opening or closing characters for nesting, such as quotedString or
+    a comment expression.  Specify multiple expressions using an
+    :class:`Or` or :class:`MatchFirst`. The default is
+    :class:`quotedString`, but if no expressions are to be ignored, then
+    pass ``None`` for this argument.
+
+    Example::
+
+        data_type = oneOf("void int short long char float double")
+        decl_data_type = Combine(data_type + Optional(Word('*')))
+        ident = Word(alphas+'_', alphanums+'_')
+        number = pyparsing_common.number
+        arg = Group(decl_data_type + ident)
+        LPAR,RPAR = map(Suppress, "()")
+
+        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))
+
+        c_function = (decl_data_type("type")
+                      + ident("name")
+                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR
+                      + code_body("body"))
+        c_function.ignore(cStyleComment)
+
+        source_code = '''
+            int is_odd(int x) {
+                return (x%2);
+            }
+
+            int dec_to_hex(char hchar) {
+                if (hchar >= '0' && hchar <= '9') {
+                    return (ord(hchar)-ord('0'));
+                } else {
+                    return (10+ord(hchar)-ord('A'));
+                }
+            }
+        '''
+        for func in c_function.searchString(source_code):
+            print("%(name)s (%(type)s) args: %(args)s" % func)
+
+
+    prints::
+
+        is_odd (int) args: [['int', 'x']]
+        dec_to_hex (int) args: [['char', 'hchar']]
+    """
+    if opener == closer:
+        raise ValueError("opening and closing strings cannot be the same")
+    if content is None:
+        if isinstance(opener,basestring) and isinstance(closer,basestring):
+            if len(opener) == 1 and len(closer)==1:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr +
+                                    CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS
+                                ).setParseAction(lambda t:t[0].strip()))
+            else:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr +
+                                    ~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+        else:
+            raise ValueError("opening and closing arguments must be strings if no content expression is given")
+    ret = Forward()
+    if ignoreExpr is not None:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) )
+    else:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content )  + Suppress(closer) )
+    ret.setName('nested %s%s expression' % (opener,closer))
+    return ret
+
+def indentedBlock(blockStatementExpr, indentStack, indent=True):
+    """Helper method for defining space-delimited indentation blocks,
+    such as those used to define block statements in Python source code.
+
+    Parameters:
+
+     - blockStatementExpr - expression defining syntax of statement that
+       is repeated within the indented block
+     - indentStack - list created by caller to manage indentation stack
+       (multiple statementWithIndentedBlock expressions within a single
+       grammar should share a common indentStack)
+     - indent - boolean indicating whether block must be indented beyond
+       the the current level; set to False for block of left-most
+       statements (default= ``True``)
+
+    A valid block must contain at least one ``blockStatement``.
+
+    Example::
+
+        data = '''
+        def A(z):
+          A1
+          B = 100
+          G = A2
+          A2
+          A3
+        B
+        def BB(a,b,c):
+          BB1
+          def BBA():
+            bba1
+            bba2
+            bba3
+        C
+        D
+        def spam(x,y):
+             def eggs(z):
+                 pass
+        '''
+
+
+        indentStack = [1]
+        stmt = Forward()
+
+        identifier = Word(alphas, alphanums)
+        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
+        func_body = indentedBlock(stmt, indentStack)
+        funcDef = Group( funcDecl + func_body )
+
+        rvalue = Forward()
+        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
+        rvalue << (funcCall | identifier | Word(nums))
+        assignment = Group(identifier + "=" + rvalue)
+        stmt << ( funcDef | assignment | identifier )
+
+        module_body = OneOrMore(stmt)
+
+        parseTree = module_body.parseString(data)
+        parseTree.pprint()
+
+    prints::
+
+        [['def',
+          'A',
+          ['(', 'z', ')'],
+          ':',
+          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
+         'B',
+         ['def',
+          'BB',
+          ['(', 'a', 'b', 'c', ')'],
+          ':',
+          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
+         'C',
+         'D',
+         ['def',
+          'spam',
+          ['(', 'x', 'y', ')'],
+          ':',
+          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]]
+    """
+    backup_stack = indentStack[:]
+
+    def reset_stack():
+        indentStack[:] = backup_stack
+
+    def checkPeerIndent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if curCol != indentStack[-1]:
+            if curCol > indentStack[-1]:
+                raise ParseException(s,l,"illegal nesting")
+            raise ParseException(s,l,"not a peer entry")
+
+    def checkSubIndent(s,l,t):
+        curCol = col(l,s)
+        if curCol > indentStack[-1]:
+            indentStack.append( curCol )
+        else:
+            raise ParseException(s,l,"not a subentry")
+
+    def checkUnindent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]):
+            raise ParseException(s,l,"not an unindent")
+        indentStack.pop()
+
+    NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress())
+    INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT')
+    PEER   = Empty().setParseAction(checkPeerIndent).setName('')
+    UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT')
+    if indent:
+        smExpr = Group( Optional(NL) +
+            #~ FollowedBy(blockStatementExpr) +
+            INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT)
+    else:
+        smExpr = Group( Optional(NL) +
+            (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) )
+    smExpr.setFailAction(lambda a, b, c, d: reset_stack())
+    blockStatementExpr.ignore(_bslash + LineEnd())
+    return smExpr.setName('indented block')
+
+alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
+punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")
+
+anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag'))
+_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\''))
+commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity")
+def replaceHTMLEntity(t):
+    """Helper parser action to replace common HTML entities with their special characters"""
+    return _htmlEntityMap.get(t.entity)
+
+# it's easy to get these comment structures wrong - they're very common, so may as well make them available
+cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment")
+"Comment of the form ``/* ... */``"
+
+htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment")
+"Comment of the form ``<!-- ... -->``"
+
+restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line")
+dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment")
+"Comment of the form ``// ... (to end of line)``"
+
+cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment")
+"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`"
+
+javaStyleComment = cppStyleComment
+"Same as :class:`cppStyleComment`"
+
+pythonStyleComment = Regex(r"#.*").setName("Python style comment")
+"Comment of the form ``# ... (to end of line)``"
+
+_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') +
+                                  Optional( Word(" \t") +
+                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
+commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList")
+"""(Deprecated) Predefined expression of 1 or more printable words or
+quoted strings, separated by commas.
+
+This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`.
+"""
+
+# some other useful expressions - using lower-case class name since we are really using this as a namespace
+class pyparsing_common:
+    """Here are some common low-level expressions that may be useful in
+    jump-starting parser development:
+
+     - numeric forms (:class:`integers<integer>`, :class:`reals<real>`,
+       :class:`scientific notation<sci_real>`)
+     - common :class:`programming identifiers<identifier>`
+     - network addresses (:class:`MAC<mac_address>`,
+       :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`)
+     - ISO8601 :class:`dates<iso8601_date>` and
+       :class:`datetime<iso8601_datetime>`
+     - :class:`UUID<uuid>`
+     - :class:`comma-separated list<comma_separated_list>`
+
+    Parse actions:
+
+     - :class:`convertToInteger`
+     - :class:`convertToFloat`
+     - :class:`convertToDate`
+     - :class:`convertToDatetime`
+     - :class:`stripHTMLTags`
+     - :class:`upcaseTokens`
+     - :class:`downcaseTokens`
+
+    Example::
+
+        pyparsing_common.number.runTests('''
+            # any int or real number, returned as the appropriate type
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.fnumber.runTests('''
+            # any int or real number, returned as float
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.hex_integer.runTests('''
+            # hex numbers
+            100
+            FF
+            ''')
+
+        pyparsing_common.fraction.runTests('''
+            # fractions
+            1/2
+            -3/4
+            ''')
+
+        pyparsing_common.mixed_integer.runTests('''
+            # mixed fractions
+            1
+            1/2
+            -3/4
+            1-3/4
+            ''')
+
+        import uuid
+        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+        pyparsing_common.uuid.runTests('''
+            # uuid
+            12345678-1234-5678-1234-567812345678
+            ''')
+
+    prints::
+
+        # any int or real number, returned as the appropriate type
+        100
+        [100]
+
+        -100
+        [-100]
+
+        +100
+        [100]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # any int or real number, returned as float
+        100
+        [100.0]
+
+        -100
+        [-100.0]
+
+        +100
+        [100.0]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # hex numbers
+        100
+        [256]
+
+        FF
+        [255]
+
+        # fractions
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        # mixed fractions
+        1
+        [1]
+
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        1-3/4
+        [1.75]
+
+        # uuid
+        12345678-1234-5678-1234-567812345678
+        [UUID('12345678-1234-5678-1234-567812345678')]
+    """
+
+    convertToInteger = tokenMap(int)
+    """
+    Parse action for converting parsed integers to Python int
+    """
+
+    convertToFloat = tokenMap(float)
+    """
+    Parse action for converting parsed numbers to Python float
+    """
+
+    integer = Word(nums).setName("integer").setParseAction(convertToInteger)
+    """expression that parses an unsigned integer, returns an int"""
+
+    hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16))
+    """expression that parses a hexadecimal integer, returns an int"""
+
+    signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger)
+    """expression that parses an integer with optional leading sign, returns an int"""
+
+    fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction")
+    """fractional expression of an integer divided by an integer, returns a float"""
+    fraction.addParseAction(lambda t: t[0]/t[-1])
+
+    mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction")
+    """mixed integer of the form 'integer - fraction', with optional leading integer, returns float"""
+    mixed_integer.addParseAction(sum)
+
+    real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat)
+    """expression that parses a floating point number and returns a float"""
+
+    sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat)
+    """expression that parses a floating point number with optional
+    scientific notation and returns a float"""
+
+    # streamlining this expression makes the docs nicer-looking
+    number = (sci_real | real | signed_integer).streamline()
+    """any numeric expression, returns the corresponding Python type"""
+
+    fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat)
+    """any int or real number, returned as float"""
+
+    identifier = Word(alphas+'_', alphanums+'_').setName("identifier")
+    """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')"""
+
+    ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address")
+    "IPv4 address (``0.0.0.0 - 255.255.255.255``)"
+
+    _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer")
+    _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address")
+    _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address")
+    _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8)
+    _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address")
+    ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address")
+    "IPv6 address (long, short, or mixed form)"
+
+    mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address")
+    "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)"
+
+    @staticmethod
+    def convertToDate(fmt="%Y-%m-%d"):
+        """
+        Helper to create a parse action for converting parsed date string to Python datetime.date
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``)
+
+        Example::
+
+            date_expr = pyparsing_common.iso8601_date.copy()
+            date_expr.setParseAction(pyparsing_common.convertToDate())
+            print(date_expr.parseString("1999-12-31"))
+
+        prints::
+
+            [datetime.date(1999, 12, 31)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt).date()
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    @staticmethod
+    def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"):
+        """Helper to create a parse action for converting parsed
+        datetime string to Python datetime.datetime
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``)
+
+        Example::
+
+            dt_expr = pyparsing_common.iso8601_datetime.copy()
+            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
+            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
+
+        prints::
+
+            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt)
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date")
+    "ISO8601 date (``yyyy-mm-dd``)"
+
+    iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime")
+    "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``"
+
+    uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID")
+    "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)"
+
+    _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress()
+    @staticmethod
+    def stripHTMLTags(s, l, tokens):
+        """Parse action to remove HTML tags from web page HTML source
+
+        Example::
+
+            # strip HTML links from normal text
+            text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>'
+            td,td_end = makeHTMLTags("TD")
+            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
+            print(table_text.parseString(text).body)
+
+        Prints::
+
+            More info at the pyparsing wiki page
+        """
+        return pyparsing_common._html_stripper.transformString(tokens[0])
+
+    _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',')
+                                        + Optional( White(" \t") ) ) ).streamline().setName("commaItem")
+    comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list")
+    """Predefined expression of 1 or more printable words or quoted strings, separated by commas."""
+
+    upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper()))
+    """Parse action to convert tokens to upper case."""
+
+    downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower()))
+    """Parse action to convert tokens to lower case."""
+
+
+class _lazyclassproperty(object):
+    def __init__(self, fn):
+        self.fn = fn
+        self.__doc__ = fn.__doc__
+        self.__name__ = fn.__name__
+
+    def __get__(self, obj, cls):
+        if cls is None:
+            cls = type(obj)
+        if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]):
+            cls._intern = {}
+        attrname = self.fn.__name__
+        if attrname not in cls._intern:
+            cls._intern[attrname] = self.fn(cls)
+        return cls._intern[attrname]
+
+
+class unicode_set(object):
+    """
+    A set of Unicode characters, for language-specific strings for
+    ``alphas``, ``nums``, ``alphanums``, and ``printables``.
+    A unicode_set is defined by a list of ranges in the Unicode character
+    set, in a class attribute ``_ranges``, such as::
+
+        _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),]
+
+    A unicode set can also be defined using multiple inheritance of other unicode sets::
+
+        class CJK(Chinese, Japanese, Korean):
+            pass
+    """
+    _ranges = []
+
+    @classmethod
+    def _get_chars_for_ranges(cls):
+        ret = []
+        for cc in cls.__mro__:
+            if cc is unicode_set:
+                break
+            for rr in cc._ranges:
+                ret.extend(range(rr[0], rr[-1]+1))
+        return [unichr(c) for c in sorted(set(ret))]
+
+    @_lazyclassproperty
+    def printables(cls):
+        "all non-whitespace characters in this range"
+        return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges()))
+
+    @_lazyclassproperty
+    def alphas(cls):
+        "all alphabetic characters in this range"
+        return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges()))
+
+    @_lazyclassproperty
+    def nums(cls):
+        "all numeric digit characters in this range"
+        return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges()))
+
+    @_lazyclassproperty
+    def alphanums(cls):
+        "all alphanumeric characters in this range"
+        return cls.alphas + cls.nums
+
+
+class pyparsing_unicode(unicode_set):
+    """
+    A namespace class for defining common language unicode_sets.
+    """
+    _ranges = [(32, sys.maxunicode)]
+
+    class Latin1(unicode_set):
+        "Unicode set for Latin-1 Unicode Character Range"
+        _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),]
+
+    class LatinA(unicode_set):
+        "Unicode set for Latin-A Unicode Character Range"
+        _ranges = [(0x0100, 0x017f),]
+
+    class LatinB(unicode_set):
+        "Unicode set for Latin-B Unicode Character Range"
+        _ranges = [(0x0180, 0x024f),]
+
+    class Greek(unicode_set):
+        "Unicode set for Greek Unicode Character Ranges"
+        _ranges = [
+            (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d),
+            (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4),
+            (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe),
+        ]
+
+    class Cyrillic(unicode_set):
+        "Unicode set for Cyrillic Unicode Character Range"
+        _ranges = [(0x0400, 0x04ff)]
+
+    class Chinese(unicode_set):
+        "Unicode set for Chinese Unicode Character Range"
+        _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ]
+
+    class Japanese(unicode_set):
+        "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges"
+        _ranges = [ ]
+
+        class Kanji(unicode_set):
+            "Unicode set for Kanji Unicode Character Range"
+            _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ]
+
+        class Hiragana(unicode_set):
+            "Unicode set for Hiragana Unicode Character Range"
+            _ranges = [(0x3040, 0x309f), ]
+
+        class Katakana(unicode_set):
+            "Unicode set for Katakana  Unicode Character Range"
+            _ranges = [(0x30a0, 0x30ff), ]
+
+    class Korean(unicode_set):
+        "Unicode set for Korean Unicode Character Range"
+        _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ]
+
+    class CJK(Chinese, Japanese, Korean):
+        "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range"
+        pass
+
+    class Thai(unicode_set):
+        "Unicode set for Thai Unicode Character Range"
+        _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ]
+
+    class Arabic(unicode_set):
+        "Unicode set for Arabic Unicode Character Range"
+        _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ]
+
+    class Hebrew(unicode_set):
+        "Unicode set for Hebrew Unicode Character Range"
+        _ranges = [(0x0590, 0x05ff), ]
+
+    class Devanagari(unicode_set):
+        "Unicode set for Devanagari Unicode Character Range"
+        _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)]
+
+pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges
+                                      + pyparsing_unicode.Japanese.Hiragana._ranges
+                                      + pyparsing_unicode.Japanese.Katakana._ranges)
+
+# define ranges in language character sets
+if PY_3:
+    setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic)
+    setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese)
+    setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic)
+    setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek)
+    setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew)
+    setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese)
+    setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji)
+    setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana)
+    setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana)
+    setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean)
+    setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai)
+    setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari)
+
+
+if __name__ == "__main__":
+
+    selectToken    = CaselessLiteral("select")
+    fromToken      = CaselessLiteral("from")
+
+    ident          = Word(alphas, alphanums + "_$")
+
+    columnName     = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    columnNameList = Group(delimitedList(columnName)).setName("columns")
+    columnSpec     = ('*' | columnNameList)
+
+    tableName      = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    tableNameList  = Group(delimitedList(tableName)).setName("tables")
+
+    simpleSQL      = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables")
+
+    # demo runTests method, including embedded comments in test string
+    simpleSQL.runTests("""
+        # '*' as column list and dotted table name
+        select * from SYS.XYZZY
+
+        # caseless match on "SELECT", and casts back to "select"
+        SELECT * from XYZZY, ABC
+
+        # list of column names, and mixed case SELECT keyword
+        Select AA,BB,CC from Sys.dual
+
+        # multiple tables
+        Select A, B, C from Sys.dual, Table2
+
+        # invalid SELECT keyword - should fail
+        Xelect A, B, C from Sys.dual
+
+        # incomplete command - should fail
+        Select
+
+        # invalid column name - should fail
+        Select ^^^ frox Sys.dual
+
+        """)
+
+    pyparsing_common.number.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    # any int or real number, returned as float
+    pyparsing_common.fnumber.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    pyparsing_common.hex_integer.runTests("""
+        100
+        FF
+        """)
+
+    import uuid
+    pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+    pyparsing_common.uuid.runTests("""
+        12345678-1234-5678-1234-567812345678
+        """)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f87a4a1e9b881b3d251c2d07063cc122a75aac21
GIT binary patch
literal 277069
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%0Ap0vq}VtjPhaDUSg(suHZ>$jHD@
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py
new file mode 100644
index 00000000..8ed060ff
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.py
@@ -0,0 +1,4 @@
+from .core import TomlError
+from .parser import load, loads
+from .test import translate_to_test
+from .writer import dump, dumps
\ No newline at end of file
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8b1aec220900b177554167e8d979d4e4381c7751
GIT binary patch
literal 448
zcmZSn%*&NH<x)&C0~9bZFfceUFfbGcFfcHrFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJsxhxD(ED%v<h8$LgTsDR%HVB`EA%~qImxCdSgCUobA&QfMF@=>OSc8p$fgzKT
zfq_8-M3itcFffGV=jON;73CLcfUGWIVPIg$$xlovVTCe^AxZ@q7#K>567!045=&C!
zOY-AOQj1FvT2e}L3&2`HjAB0xE|7ANS;_fDsX-vWm4NInNGvK&EeZlz9t5`zWKs|_
zNCQYoc~NFbYEckKZxF~08X(OGqBxI%fkD5ZD6=fFBvrpGu}D8HKPM%%s8~O{P(Qoa
z$lTnpFw4li%+SKTIHxkbJl-V5#KgeBz#u(OKSaMEvp_d9uec;JCr7tD(Xuo!10)2-
z@nxxbDfvbE1(hZFxjFjr@tJv<CGqik1(hWn3=9l5x%nxjIjMFarx%0VDZnVkD8L8+
DtFvD^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py
new file mode 100644
index 00000000..c182734e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.py
@@ -0,0 +1,13 @@
+class TomlError(RuntimeError):
+    def __init__(self, message, line, col, filename):
+        RuntimeError.__init__(self, message, line, col, filename)
+        self.message = message
+        self.line = line
+        self.col = col
+        self.filename = filename
+
+    def __str__(self):
+        return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message)
+
+    def __repr__(self):
+        return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/core.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..52fb141e447bb2003aa6cd645f2ea429d88c62aa
GIT binary patch
literal 1400
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHLF)%QsFfgPtFr+auq%bnHFfcSTFhoW%GNdpu
z1Z#lQm2fgJFofji=C~FW<rl$?U}RumZ~_^j%mCI8(!v1JAH@VUD2f?mNDBi)6bnNT
z#H?gi1_lNYW@BJra0cmiWME(@VPME&WT;_as9|KNVPdFZW~gCdXl7+#1o0Ud;+epr
z3=HwiU^xbccovX~8U}`VR*>t1H9(H>(*PM-!o$G85LB91l9`(dc5n#?0|P^Rd}dx|
zNql?>I|BnlZfbFHVtQ%`3j+f~PG(+e3CNep`8i;fX_+~xd5O8H8X#AKl@zDuqy>SL
z1c5XJfy9GAHfeyu5=<0lF)%Rb7ZhcdC6=V>mn9bIr{(9Qq!tzHXBX;c7aN(I8y036
znU@(_m>1_%rkBT?q?ni(7#J9&=jn&&7i1RbX66-_B<AGkmM2=424;YSz&O4vH7_N<
zNWY-6BtJJtKRLfBRj;5jh>3xL0fdXWKu%zkWaI?HWKbx8FvyAEz*PdpE+a!011NAI
zL7c?|W;26H7KUaPhF}elS$@TQ3=9m_wHnp6IttabnpO(cwU96X`86%SC^xYL>}{k_
z00jy-=z~DP3JwY|LFe!QM{0b0aY<2pJSQkkf&9b3NMUd&BBy$dYQ-W@xS)}m;1CJ|
zr7)~11QZzq95x`g#m5(=78J$DgR(|3ByhkE2PgRWcu;bWk1yc@=abz0l+v8k_;_$4
z3jzga5J&<XuLy$9F&qR==b)$sB}O(zPIgXaKX9@Q0tYcj8sRuFi_R_t2c-=p@a#Zt
IDh9a;0CV{_&;S4c

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py
new file mode 100644
index 00000000..3493aa64
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.py
@@ -0,0 +1,341 @@
+import string, re, sys, datetime
+from .core import TomlError
+from .utils import rfc3339_re, parse_rfc3339_re
+
+if sys.version_info[0] == 2:
+    _chr = unichr
+else:
+    _chr = chr
+
+def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict):
+    return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin)))
+
+def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict):
+    if isinstance(s, bytes):
+        s = s.decode('utf-8')
+
+    s = s.replace('\r\n', '\n')
+
+    root = object_pairs_hook()
+    tables = object_pairs_hook()
+    scope = root
+
+    src = _Source(s, filename=filename)
+    ast = _p_toml(src, object_pairs_hook=object_pairs_hook)
+
+    def error(msg):
+        raise TomlError(msg, pos[0], pos[1], filename)
+
+    def process_value(v, object_pairs_hook):
+        kind, text, value, pos = v
+        if kind == 'str' and value.startswith('\n'):
+            value = value[1:]
+        if kind == 'array':
+            if value and any(k != value[0][0] for k, t, v, p in value[1:]):
+                error('array-type-mismatch')
+            value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value]
+        elif kind == 'table':
+            value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value])
+        return translate(kind, text, value)
+
+    for kind, value, pos in ast:
+        if kind == 'kv':
+            k, v = value
+            if k in scope:
+                error('duplicate_keys. Key "{0}" was used more than once.'.format(k))
+            scope[k] = process_value(v, object_pairs_hook=object_pairs_hook)
+        else:
+            is_table_array = (kind == 'table_array')
+            cur = tables
+            for name in value[:-1]:
+                if isinstance(cur.get(name), list):
+                    d, cur = cur[name][-1]
+                else:
+                    d, cur = cur.setdefault(name, (None, object_pairs_hook()))
+
+            scope = object_pairs_hook()
+            name = value[-1]
+            if name not in cur:
+                if is_table_array:
+                    cur[name] = [(scope, object_pairs_hook())]
+                else:
+                    cur[name] = (scope, object_pairs_hook())
+            elif isinstance(cur[name], list):
+                if not is_table_array:
+                    error('table_type_mismatch')
+                cur[name].append((scope, object_pairs_hook()))
+            else:
+                if is_table_array:
+                    error('table_type_mismatch')
+                old_scope, next_table = cur[name]
+                if old_scope is not None:
+                    error('duplicate_tables')
+                cur[name] = (scope, next_table)
+
+    def merge_tables(scope, tables):
+        if scope is None:
+            scope = object_pairs_hook()
+        for k in tables:
+            if k in scope:
+                error('key_table_conflict')
+            v = tables[k]
+            if isinstance(v, list):
+                scope[k] = [merge_tables(sc, tbl) for sc, tbl in v]
+            else:
+                scope[k] = merge_tables(v[0], v[1])
+        return scope
+
+    return merge_tables(root, tables)
+
+class _Source:
+    def __init__(self, s, filename=None):
+        self.s = s
+        self._pos = (1, 1)
+        self._last = None
+        self._filename = filename
+        self.backtrack_stack = []
+
+    def last(self):
+        return self._last
+
+    def pos(self):
+        return self._pos
+
+    def fail(self):
+        return self._expect(None)
+
+    def consume_dot(self):
+        if self.s:
+            self._last = self.s[0]
+            self.s = self[1:]
+            self._advance(self._last)
+            return self._last
+        return None
+
+    def expect_dot(self):
+        return self._expect(self.consume_dot())
+
+    def consume_eof(self):
+        if not self.s:
+            self._last = ''
+            return True
+        return False
+
+    def expect_eof(self):
+        return self._expect(self.consume_eof())
+
+    def consume(self, s):
+        if self.s.startswith(s):
+            self.s = self.s[len(s):]
+            self._last = s
+            self._advance(s)
+            return True
+        return False
+
+    def expect(self, s):
+        return self._expect(self.consume(s))
+
+    def consume_re(self, re):
+        m = re.match(self.s)
+        if m:
+            self.s = self.s[len(m.group(0)):]
+            self._last = m
+            self._advance(m.group(0))
+            return m
+        return None
+
+    def expect_re(self, re):
+        return self._expect(self.consume_re(re))
+
+    def __enter__(self):
+        self.backtrack_stack.append((self.s, self._pos))
+
+    def __exit__(self, type, value, traceback):
+        if type is None:
+            self.backtrack_stack.pop()
+        else:
+            self.s, self._pos = self.backtrack_stack.pop()
+        return type == TomlError
+
+    def commit(self):
+        self.backtrack_stack[-1] = (self.s, self._pos)
+
+    def _expect(self, r):
+        if not r:
+            raise TomlError('msg', self._pos[0], self._pos[1], self._filename)
+        return r
+
+    def _advance(self, s):
+        suffix_pos = s.rfind('\n')
+        if suffix_pos == -1:
+            self._pos = (self._pos[0], self._pos[1] + len(s))
+        else:
+            self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos)
+
+_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*')
+def _p_ews(s):
+    s.expect_re(_ews_re)
+
+_ws_re = re.compile(r'[ \t]*')
+def _p_ws(s):
+    s.expect_re(_ws_re)
+
+_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"',
+    '\\': '\\', 'f': '\f' }
+
+_basicstr_re = re.compile(r'[^"\\\000-\037]*')
+_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})')
+_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})')
+_escapes_re = re.compile(r'[btnfr\"\\]')
+_newline_esc_re = re.compile('\n[ \t\n]*')
+def _p_basicstr_content(s, content=_basicstr_re):
+    res = []
+    while True:
+        res.append(s.expect_re(content).group(0))
+        if not s.consume('\\'):
+            break
+        if s.consume_re(_newline_esc_re):
+            pass
+        elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re):
+            v = int(s.last().group(1), 16)
+            if 0xd800 <= v < 0xe000:
+                s.fail()
+            res.append(_chr(v))
+        else:
+            s.expect_re(_escapes_re)
+            res.append(_escapes[s.last().group(0)])
+    return ''.join(res)
+
+_key_re = re.compile(r'[0-9a-zA-Z-_]+')
+def _p_key(s):
+    with s:
+        s.expect('"')
+        r = _p_basicstr_content(s, _basicstr_re)
+        s.expect('"')
+        return r
+    if s.consume('\''):
+        if s.consume('\'\''):
+            r = s.expect_re(_litstr_ml_re).group(0)
+            s.expect('\'\'\'')
+        else:
+            r = s.expect_re(_litstr_re).group(0)
+            s.expect('\'')
+        return r
+    return s.expect_re(_key_re).group(0)
+
+_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?')
+
+_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*')
+_litstr_re = re.compile(r"[^'\000\010\012-\037]*")
+_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*")
+def _p_value(s, object_pairs_hook):
+    pos = s.pos()
+
+    if s.consume('true'):
+        return 'bool', s.last(), True, pos
+    if s.consume('false'):
+        return 'bool', s.last(), False, pos
+
+    if s.consume('"'):
+        if s.consume('""'):
+            r = _p_basicstr_content(s, _basicstr_ml_re)
+            s.expect('"""')
+        else:
+            r = _p_basicstr_content(s, _basicstr_re)
+            s.expect('"')
+        return 'str', r, r, pos
+
+    if s.consume('\''):
+        if s.consume('\'\''):
+            r = s.expect_re(_litstr_ml_re).group(0)
+            s.expect('\'\'\'')
+        else:
+            r = s.expect_re(_litstr_re).group(0)
+            s.expect('\'')
+        return 'str', r, r, pos
+
+    if s.consume_re(rfc3339_re):
+        m = s.last()
+        return 'datetime', m.group(0), parse_rfc3339_re(m), pos
+
+    if s.consume_re(_float_re):
+        m = s.last().group(0)
+        r = m.replace('_','')
+        if '.' in m or 'e' in m or 'E' in m:
+            return 'float', m, float(r), pos
+        else:
+            return 'int', m, int(r, 10), pos
+
+    if s.consume('['):
+        items = []
+        with s:
+            while True:
+                _p_ews(s)
+                items.append(_p_value(s, object_pairs_hook=object_pairs_hook))
+                s.commit()
+                _p_ews(s)
+                s.expect(',')
+                s.commit()
+        _p_ews(s)
+        s.expect(']')
+        return 'array', None, items, pos
+
+    if s.consume('{'):
+        _p_ws(s)
+        items = object_pairs_hook()
+        if not s.consume('}'):
+            k = _p_key(s)
+            _p_ws(s)
+            s.expect('=')
+            _p_ws(s)
+            items[k] = _p_value(s, object_pairs_hook=object_pairs_hook)
+            _p_ws(s)
+            while s.consume(','):
+                _p_ws(s)
+                k = _p_key(s)
+                _p_ws(s)
+                s.expect('=')
+                _p_ws(s)
+                items[k] = _p_value(s, object_pairs_hook=object_pairs_hook)
+                _p_ws(s)
+            s.expect('}')
+        return 'table', None, items, pos
+
+    s.fail()
+
+def _p_stmt(s, object_pairs_hook):
+    pos = s.pos()
+    if s.consume(   '['):
+        is_array = s.consume('[')
+        _p_ws(s)
+        keys = [_p_key(s)]
+        _p_ws(s)
+        while s.consume('.'):
+            _p_ws(s)
+            keys.append(_p_key(s))
+            _p_ws(s)
+        s.expect(']')
+        if is_array:
+            s.expect(']')
+        return 'table_array' if is_array else 'table', keys, pos
+
+    key = _p_key(s)
+    _p_ws(s)
+    s.expect('=')
+    _p_ws(s)
+    value = _p_value(s, object_pairs_hook=object_pairs_hook)
+    return 'kv', (key, value), pos
+
+_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*')
+def _p_toml(s, object_pairs_hook):
+    stmts = []
+    _p_ews(s)
+    with s:
+        stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook))
+        while True:
+            s.commit()
+            s.expect_re(_stmtsep_re)
+            stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook))
+    _p_ews(s)
+    s.expect_eof()
+    return stmts
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/parser.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6a430c3f9e5480e1f65f3715f0e261d107d4d9bf
GIT binary patch
literal 14699
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py
new file mode 100644
index 00000000..ec8abfc6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.py
@@ -0,0 +1,30 @@
+import datetime
+from .utils import format_rfc3339
+
+try:
+    _string_types = (str, unicode)
+    _int_types = (int, long)
+except NameError:
+    _string_types = str
+    _int_types = int
+
+def translate_to_test(v):
+    if isinstance(v, dict):
+        return { k: translate_to_test(v) for k, v in v.items() }
+    if isinstance(v, list):
+        a = [translate_to_test(x) for x in v]
+        if v and isinstance(v[0], dict):
+            return a
+        else:
+            return {'type': 'array', 'value': a}
+    if isinstance(v, datetime.datetime):
+        return {'type': 'datetime', 'value': format_rfc3339(v)}
+    if isinstance(v, bool):
+        return {'type': 'bool', 'value': 'true' if v else 'false'}
+    if isinstance(v, _int_types):
+        return {'type': 'integer', 'value': str(v)}
+    if isinstance(v, float):
+        return {'type': 'float', 'value': '{:.17}'.format(v)}
+    if isinstance(v, _string_types):
+        return {'type': 'string', 'value': v}
+    raise RuntimeError('unexpected value: {!r}'.format(v))
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/test.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c2a0b54dde27432b23f373a79abb001f72b874af
GIT binary patch
literal 1551
zcmZSn%*&NH<x)&C0~D|_FfceUFfbISGB7ZtFfgPrGUPBYL@_X=FfpVsGvqKb<T5ct
zF)=V!$}prdGo-RGq%ko>u`;BxF{HAC*&Gbvd9n;FshkYiTnt6w42+D7smxF%Q5+0;
zj0_PeEDS9S3{hMl(}OiYR%ZVH|Np;VCL;p_g9eBw;bUN6NXswEO)QBoN=r62HnvO#
zi8C`WFt9K%FgSyq$jHD@!oX0&z)-@-(9Fb8qzp2!1uT-q#L&#Z;L^;<5DZnq3|7+2
zkPeo2i4|g~Wn?H}VW?qbXl7)HV`3<@WT<5VnO2ksH8zEbK@w_o9zzWiLvSWI5K>qe
z%xahzQdk+xg7e@`U}eZ+1zWL}0i=wL0i>*i4P;<5BSbOOCG22jx4_ES!OChF7>X`2
zq;N3gF*BraqA2D7D`sQ_naKrKT*8UPOfIl8ZLl(Ku(A{$hAeI@DtW*veZVSt!76JQ
zpf>U{r0^j$H8V0aF@n-Sum(Q^1A`w*1O$U3K$U@kArl;&vC<4NOrQX*WdesC6DUk;
z7#SurF%+^f1Z#j&7bIc@85kH!iW2jRa}rBZ<4f}6OHzwVG(hoM!o<M9pl475isx)F
zSq9Mu(p;Ryz`&qiP?TAgSdyw=mRO{pmY<W7T2!o`U8tX3Y-Db3SeRvGUS?=vUYt{z
zULJ3fVq#)oU|^7*ryrtUkXfLcnO9trn3JPho@iMbm;n+3<M^`Fyp;SR{esGp{M;OU
zkZbe`DvP-o7#M6)GLuV^^K%RActO4eIgb<MUj~K}P?}9FDoU&@0j0*0%7Rp|P+4M5
zX=(`vDC;Daq?Tmnrh?^@^7C`RjFO^Kh{CkQoZ{3Hc2M}`m87Pp7J;>=<>V)p6tgif
zFjQOV8JgFYfSAQ4MVWc&#bOK$45fLg6$PouC8;S2V4JKIsuhcBHTXb53UY8}G1!xN
z$q;Kn&Ig;DS(2Jt40b?HW^qXnD1d`Njtl~YY!D|*dwgbINj%6e#U-HlC@v`q0(l(l
z3P@fo0rBG@E`qA$VPIegD$N7=)wQT7zX%+aLEumU*;4_I$ixAQNU&$QLD8oI@+>1i
zqX;8EqdcP|BMXx#qY$G6BR``YBR`myX5?oSV$=Ys1_uu~>`F^AbBZAWB?1a4P@I+K
zWhUpRqy~ZF1RPYEc_onG&Cg2@5(X&)1*%_SZYnrTz>Yu!0hmSS1PxA<Ho5sJr8%i~
cpol3JU|?Y2VH99uX5?WMVB}?FW8`8209vz4%>V!Z

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py
new file mode 100644
index 00000000..636a680b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.py
@@ -0,0 +1,67 @@
+import datetime
+import re
+
+rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))')
+
+def parse_rfc3339(v):
+    m = rfc3339_re.match(v)
+    if not m or m.group(0) != v:
+        return None
+    return parse_rfc3339_re(m)
+
+def parse_rfc3339_re(m):
+    r = map(int, m.groups()[:6])
+    if m.group(7):
+        micro = float(m.group(7))
+    else:
+        micro = 0
+
+    if m.group(8):
+        g = int(m.group(8), 10) * 60 + int(m.group(9), 10)
+        tz = _TimeZone(datetime.timedelta(0, g * 60))
+    else:
+        tz = _TimeZone(datetime.timedelta(0, 0))
+
+    y, m, d, H, M, S = r
+    return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz)
+
+
+def format_rfc3339(v):
+    offs = v.utcoffset()
+    offs = int(offs.total_seconds()) // 60 if offs is not None else 0
+
+    if offs == 0:
+        suffix = 'Z'
+    else:
+        if offs > 0:
+            suffix = '+'
+        else:
+            suffix = '-'
+            offs = -offs
+        suffix = '{0}{1:02}:{2:02}'.format(suffix, offs // 60, offs % 60)
+
+    if v.microsecond:
+        return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix
+    else:
+        return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix
+
+class _TimeZone(datetime.tzinfo):
+    def __init__(self, offset):
+        self._offset = offset
+
+    def utcoffset(self, dt):
+        return self._offset
+
+    def dst(self, dt):
+        return None
+
+    def tzname(self, dt):
+        m = self._offset.total_seconds() // 60
+        if m < 0:
+            res = '-'
+            m = -m
+        else:
+            res = '+'
+        h = m // 60
+        m = m - h * 60
+        return '{}{:.02}{:.02}'.format(res, h, m)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1945d4d77c47abc05a9bc9e2678e53dec8517244
GIT binary patch
literal 3298
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py
new file mode 100644
index 00000000..73b5089c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.py
@@ -0,0 +1,106 @@
+from __future__ import unicode_literals
+import io, datetime, math, string, sys
+
+from .utils import format_rfc3339
+
+if sys.version_info[0] == 3:
+    long = int
+    unicode = str
+
+
+def dumps(obj, sort_keys=False):
+    fout = io.StringIO()
+    dump(obj, fout, sort_keys=sort_keys)
+    return fout.getvalue()
+
+
+_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'}
+
+
+def _escape_string(s):
+    res = []
+    start = 0
+
+    def flush():
+        if start != i:
+            res.append(s[start:i])
+        return i + 1
+
+    i = 0
+    while i < len(s):
+        c = s[i]
+        if c in '"\\\n\r\t\b\f':
+            start = flush()
+            res.append('\\' + _escapes[c])
+        elif ord(c) < 0x20:
+            start = flush()
+            res.append('\\u%04x' % ord(c))
+        i += 1
+
+    flush()
+    return '"' + ''.join(res) + '"'
+
+
+_key_chars = string.digits + string.ascii_letters + '-_'
+def _escape_id(s):
+    if any(c not in _key_chars for c in s):
+        return _escape_string(s)
+    return s
+
+
+def _format_value(v):
+    if isinstance(v, bool):
+        return 'true' if v else 'false'
+    if isinstance(v, int) or isinstance(v, long):
+        return unicode(v)
+    if isinstance(v, float):
+        if math.isnan(v) or math.isinf(v):
+            raise ValueError("{0} is not a valid TOML value".format(v))
+        else:
+            return repr(v)
+    elif isinstance(v, unicode) or isinstance(v, bytes):
+        return _escape_string(v)
+    elif isinstance(v, datetime.datetime):
+        return format_rfc3339(v)
+    elif isinstance(v, list):
+        return '[{0}]'.format(', '.join(_format_value(obj) for obj in v))
+    elif isinstance(v, dict):
+        return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items()))
+    else:
+        raise RuntimeError(v)
+
+
+def dump(obj, fout, sort_keys=False):
+    tables = [((), obj, False)]
+
+    while tables:
+        name, table, is_array = tables.pop()
+        if name:
+            section_name = '.'.join(_escape_id(c) for c in name)
+            if is_array:
+                fout.write('[[{0}]]\n'.format(section_name))
+            else:
+                fout.write('[{0}]\n'.format(section_name))
+
+        table_keys = sorted(table.keys()) if sort_keys else table.keys()
+        new_tables = []
+        has_kv = False
+        for k in table_keys:
+            v = table[k]
+            if isinstance(v, dict):
+                new_tables.append((name + (k,), v, False))
+            elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v):
+                new_tables.extend((name + (k,), d, True) for d in v)
+            elif v is None:
+                # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344
+                fout.write(
+                    '#{} = null  # To use: uncomment and replace null with value\n'.format(_escape_id(k)))
+                has_kv = True
+            else:
+                fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v)))
+                has_kv = True
+
+        tables.extend(reversed(new_tables))
+
+        if (name or has_kv) and tables:
+            fout.write('\n')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/pytoml/writer.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e73bb0e032059102d85950aa1d054c2e16baf011
GIT binary patch
literal 5606
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
Y1ek;w*%&#QdDzUEIVD6GIoUYH0GEEGCjbBd

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py
new file mode 100644
index 00000000..80c4ce1d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+
+#   __
+#  /__)  _  _     _   _ _/   _
+# / (   (- (/ (/ (- _)  /  _)
+#          /
+
+"""
+Requests HTTP Library
+~~~~~~~~~~~~~~~~~~~~~
+
+Requests is an HTTP library, written in Python, for human beings. Basic GET
+usage:
+
+   >>> import requests
+   >>> r = requests.get('https://www.python.org')
+   >>> r.status_code
+   200
+   >>> 'Python is a programming language' in r.content
+   True
+
+... or POST:
+
+   >>> payload = dict(key1='value1', key2='value2')
+   >>> r = requests.post('https://httpbin.org/post', data=payload)
+   >>> print(r.text)
+   {
+     ...
+     "form": {
+       "key2": "value2",
+       "key1": "value1"
+     },
+     ...
+   }
+
+The other HTTP methods are supported - see `requests.api`. Full documentation
+is at <http://python-requests.org>.
+
+:copyright: (c) 2017 by Kenneth Reitz.
+:license: Apache 2.0, see LICENSE for more details.
+"""
+
+from pip._vendor import urllib3
+from pip._vendor import chardet
+import warnings
+from .exceptions import RequestsDependencyWarning
+
+
+def check_compatibility(urllib3_version, chardet_version):
+    urllib3_version = urllib3_version.split('.')
+    assert urllib3_version != ['dev']  # Verify urllib3 isn't installed from git.
+
+    # Sometimes, urllib3 only reports its version as 16.1.
+    if len(urllib3_version) == 2:
+        urllib3_version.append('0')
+
+    # Check urllib3 for compatibility.
+    major, minor, patch = urllib3_version  # noqa: F811
+    major, minor, patch = int(major), int(minor), int(patch)
+    # urllib3 >= 1.21.1, <= 1.24
+    assert major == 1
+    assert minor >= 21
+    assert minor <= 24
+
+    # Check chardet for compatibility.
+    major, minor, patch = chardet_version.split('.')[:3]
+    major, minor, patch = int(major), int(minor), int(patch)
+    # chardet >= 3.0.2, < 3.1.0
+    assert major == 3
+    assert minor < 1
+    assert patch >= 2
+
+
+def _check_cryptography(cryptography_version):
+    # cryptography < 1.3.4
+    try:
+        cryptography_version = list(map(int, cryptography_version.split('.')))
+    except ValueError:
+        return
+
+    if cryptography_version < [1, 3, 4]:
+        warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version)
+        warnings.warn(warning, RequestsDependencyWarning)
+
+# Check imported dependencies for compatibility.
+try:
+    check_compatibility(urllib3.__version__, chardet.__version__)
+except (AssertionError, ValueError):
+    warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
+                  "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:
+    try:
+        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
+
+# urllib3's DependencyWarnings should be silenced.
+from pip._vendor.urllib3.exceptions import DependencyWarning
+warnings.simplefilter('ignore', DependencyWarning)
+
+from .__version__ import __title__, __description__, __url__, __version__
+from .__version__ import __build__, __author__, __author_email__, __license__
+from .__version__ import __copyright__, __cake__
+
+from . import utils
+from . import packages
+from .models import Request, Response, PreparedRequest
+from .api import request, get, head, post, patch, put, delete, options
+from .sessions import session, Session
+from .status_codes import codes
+from .exceptions import (
+    RequestException, Timeout, URLRequired,
+    TooManyRedirects, HTTPError, ConnectionError,
+    FileModeWarning, ConnectTimeout, ReadTimeout
+)
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+from logging import NullHandler
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+# FileModeWarnings go off per the default.
+warnings.simplefilter('default', FileModeWarning, append=True)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..476faf5bac0aa0f9d4d9791c7e7bc76b5896e897
GIT binary patch
literal 4332
zcmZSn%*&NH<x)&C0~D|^FfceUFfbHvWMW`QVPJ@2U`SzPNMT~gVPwc<Vu)g5U<C1*
z!F*<hC}s$sg&~K9A&P||g_R+NjUk7XA(xFIij9FWg`J^=fgy^WA%z3X;9#f}XGmpd
zNM&Nk;$%o=29eE742<D<mJBSZTnwq)3~5XZ*<1`o%NQ6L8B<vpvUnI$I2p2d(Y2(q
zF@QAYF)~De9K^+t!^e=z&k)7Wz?jO<P|U+vX#sXQH$#p9L#`l0lpq6Rsvtv_5JNKq
z#LYYmIl>INoD5MS42-E945=av&5R6;;e|YmEUBVkH*hdAGBOtOFh=A-LV=edM~op?
zoFPh_0qishh7>-ARB^CFKtAVZ$l+wjm1KyLWXP3bh>~K+m1c;N2HU~Ozz9+y09GNx
z5GBKqE6Wfi%aAL_5GBWuE6)%m4^bfqR-wQUrNEG@$PlFn5fx&{QDVqdW{6UT@P)yA
z6^1Ak2w#LDN0lL0jUh^nAy=ItN}VBBgCR--A}7j_qsfq~#So>%kgLrQrOlA5!w{vz
zkgLlOrOS}3#}K8*kgLxSrO%LSzz}7?kZZ^gWeCwJ#*kygkZa5kWz3Lk!VqNw5fx|1
zF=fa#V~8??@Fl?UZO#y7&X8-t5M{xTYsnC0$&hQs5M{-XYt0a4&5&!u5M{%VYs(O2
z%aCiw5M{@ZYtIm64~YjBh8zcmC<kzCNrKq9jto(b42-D`3|USLsm`Ei$#P*xbp*v6
zD2hO-LV_VhiXqjOAw`-Y)s>-{iIFjdg&|l&29$KaFflN21*I02rWThJD|m#21St4q
zCKV+XRdUr~16&BjnZ*i;c@Ql*5G^_i<wcn#C8>D|nRyBUl_eSZc{&Pd`9%sDrMZcD
z3Q4J%dFjP^3Qmc|naK+7t|45d#fj;uR$N>P3JP|1b_$uf1^GoK3Pn)oz=VqwY~f;h
z>8T|e>KP>^1;tkS`sL;2dIey6^zw_+)ivQd^omOoOG=C5lk-zjL4rmG1|SM#i8{n#
z3Lxhz6cpvB7bWKAX6B_U<Rs>$mnNpCs)Jl#q?eqZSCX1n0@4;zRGP}grKhK-kYA(_
z;2#`<aB@LnWlnx#ih`{|N@jA2Ms{kYp{;sZVoqtQp}LMjc50;&lxu|KI%NM8<QF4(
z2;{M(%sh~9^g%M}ItnR?C5g6BYv3L%D9X$$(J0a@Nv$XW3s!^Nsi2^zrw3surR5jp
zDp@H&#T68kKyFd8Qcwar&PYiIq7EWq2$wKaf{52b<)H@Fa&d)Zq$=c>WTX~BqC7XX
zBqKkiSRt_}RiU`F02FblDGIs@#i^+Z39uN{ODxDt&{J?L&B;+n$xklLP0cGwEXmBz
z;{t_#iGmHtzgGJCkT}$ZYs)W6x6|X|vP#Y`s4U7%&nU4{&`8!)FfuSSS4gT<@J`Lk
zOD)Mz2ujT?snX-J%E?Sl%_~l|QgAFtOwLGEFw!&70XxLU)7jN8*cF@xbMuQ*6;e`5
z5;Jp(^|&(s|NsAAgOP!Op@f}*fuXc0Cnqz>7$K0Hkyw<HTH==pQUVc{WME)`<rJ6H
zg4Dc})V$=%@Wi6L%)InuCI$uuRt5$J76t|eXHd@4Wn^HeVPMDt7l+M^47Ffx3KK&*
zBSSVbL$L}&2_r)jBSQ%jNLe!@LkcrPHWNdU8;G05%#gwY%FK*;U~MtX47E%Qwag5)
zEDR+q3^hz3IS_*x#sI5kW`e7#VFFb!*-Q+@y-<s4m_hYTHY-E%d?XQehHOTL;*Bs7
zMudY?I2aVjvzG(pkz!UxhzCLTvNB{dFcgc!L|DL{Wo0PVgo>mvFa&FGGB7asm4E_V
zuY{R_fgvTeEE5#0U?Br=Ok|2OFfe3FfC!KZ4N!=efQaIPoXnCEJ_ZH`$KvADB2XH0
zEh@?{0vnW*npXm<tP=}Bu?7|bWgn2f5`IMN$CsrR6=&w>fyJN+04@enoST@HUj();
zH!}~)Do89z&d>n02*5;f0RsbrenC-YSz<}5epzCXep-G`N@`KDes-aLcCnGUxnW_J
zk$IV+g?VvKWqNtMNs5Vyfq{WRdY*oWenDn|Zf0I_Nn%cpZh4|*X<!CO2#n*)Qu9*s
zi}Yc6L_a=0GcU6wJ|0v63NtV;Bxj^1XU8Y!=N2TEWF}?iWR_GKg3=+Vm}g+*XB1@?
zViaKJXH;VnViaN&VwQojl0g9u3TBWG!6~<hfq|h?iJ^o6lqev{6O<kqK}oF{obqZJ
z7{c>}7+6YJz;(YFsQm$o!iX9MQ2QqZoO;ulL6KgR2TF%ote{j4$_0!JC2R~?><l%G
z3?&@k)&Qu%0E&K44EY6tq7@R=U=}Dl6`L?HF!<-BC_v*!AwNwaxu~+B1XOkxWK=3>
zRM%=M<R(@sBqx>@rz#ZZ<d>)9m*?q$Q&b7ah@8yg5^%idCKd#7fig14wh|C43{+S{
z(h5inRBk4glyERGFqA{Gb}`rl5GM!}Od24fL<AJ#NN#|q6HsXaQk$8V4o(nYV&GCm
zJTzG#In@i4DnL1ffr*(>iIJC)l}VJ5pRw2;krN;xnqQ;<%>@vCN`7i_o_dKwE-1+>
zBqA02(1=ll6qKMK2>0}J@edD%2yikmFcehg7o_GD7w15PxEUB2;$eXn9}f`}WME*x
zC|SWdH#0pizbI7$6qO|))8gYxGD~t&<Kw}3H9kHiwK%ybvjCLs<Kw|4dVG9oQBHh(
z5GeU0>q{!l%t?ul2S<H;d}3)yMt)Ize2D<qJy33HZenIme0&MSk<i*DJ{}VDykM2^
znkhaWoL1uFlM}O3VIBcxrP7kjoMMQ-K#8d!F*!RiJ+)W^l&rxngw`cs?Ln!<1^Ic!
zsbKE}6r~m<7Nw>@6=;C8gLOdjJ~$z#r<Q=zWkzaZ3YY<EE(C!}Gq7|)X$d&sQc`nL
zOH#qQ^TEMW4Dkghj*3%@!Nnbj9SmVZ+zWC(sO3})$v~j6fx5-DA~_Xo4A{hw%-q!c
z(h_hug$DV6)MOT=rho%8BtPFbF|RTxH6^nsHMyi19BrWXB_ykX9O|5(mzSChiZg_m
zTV_tGZ+=QDv|0t1=umaYwgsgora<`+CxfEOuQVseBQY-}C$$Ldyp+_m#L}FSAW(wQ
zaD!F#@$o77$<W9x$Slx<7OX*_B0LCG76yUp7;ySXh55D^ob!Xg0Re6XfKpWuDBOZT
zMQ@N8s6+u32_;gXqz*DQGp{7IC@(Qb51bD4AmwrpNV-HCrUp`^>p>eI;1*|5W>OGH
zz64}$W?oima!Gt<UP(SEHG^6xB|K;aPmnmsV<7K)f?Lm!pp?U51(J_sLHa<Z6=&ua
z<fNu$=9Hus1<8Yaq5vWkL4*>BPzDhyAVL*HsDTJ|kZy30feN@FO%NAUeCFn-q~;U{
zX@S&eg9sgv3@FVf7GwtLf<*K{gg%Hc01=>+5Cp2Jf{Z|1V~~1Kiif7o;vi7zA7ly=
z2D=u~urCfW1L-ga5f&iA5=2;m2x|~w10rlegdK<gm2cp5k&~aEo|%^(1nRqklVy5p
ziBEoddTJ3kFUH5`CFX*P7EtYwn34iZQlP>I)Dr-Cm;pfyOxX?!A)DO%l+v73J5b;k
zgGzNaCILnPMjl21W==^?9%e>yMqx%CMt(+aW&uVvMrK9<MlNOnMm|PfMs{WaMgb-z
aMkPiuupSvkD@HL!0Y(RQ9!3EsNoD{+7yAzY

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py
new file mode 100644
index 00000000..f5b5d036
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py
@@ -0,0 +1,14 @@
+# .-. .-. .-. . . .-. .-. .-. .-.
+# |(  |-  |.| | | |-  `-.  |  `-.
+# ' ' `-' `-`.`-' `-' `-'  '  `-'
+
+__title__ = 'requests'
+__description__ = 'Python HTTP for Humans.'
+__url__ = 'http://python-requests.org'
+__version__ = '2.21.0'
+__build__ = 0x022100
+__author__ = 'Kenneth Reitz'
+__author_email__ = 'me@kennethreitz.org'
+__license__ = 'Apache 2.0'
+__copyright__ = 'Copyright 2018 Kenneth Reitz'
+__cake__ = u'\u2728 \U0001f370 \u2728'
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..76b6f577f7abd1ae2c81e212cfb2c7f970557fdb
GIT binary patch
literal 634
zcmZSn%*&NH<x)&C0~9baFfceUFfbH@h!h5fC<cZUMusRxh7=}-C?<v!W`-zch7=Zt
zC>DkkR)#26h7>l2C^m)^c7`Z+h7=BlC=P}cPKGE>h7>M_U=3~t28I$21_p+r)WXu#
z;*#QGaRvs4fXb4L{5%DZkdOd{wEQ9kkJ8-4ykfm#DFz0HjFOT9D}DU}uo7LEHog3!
z^kOy!1_mQNBSSrdOa?_JhGJd@1_tlcyu8$s427W7%#x~NVFm_<+*F5bh+q*&46Kuj
zfq}uXATc>3Rl!Klpjd{1fx$Vypt2}4J)=ay$iUD-0mYnB9tH-6M{`yve3;+6LE+Jy
z6@D5Z6G}K47#QN?OEODxQsd)G_`$rC)Z*l#%z~24{Ji-15_YgyX;Dsmd<n?!@$qG;
zMa2*~i0-7)%$$_?_!5wT@$reJB^mie@$n@BV2x02YHngC!i1d6<kY-kkc}V@$Hynb
zTpk|}4%+zm<izaM_;?La3?hi)Vg?2V{eq&*vc!^9{j$U&{j~g?l+>bP{p>>h>|!Hx
zbHl<cBl9vt3-jWf%JlMhlN1vZ0|Ntt^gR6#{esK_-ORk=lEj=G-SR}s(!dOm5E#do
prRJsN7wN;|Mjy$OdIgnWH`(Oor<CTT+OdLCk`My}0~;ec1OV$issI20

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py
new file mode 100644
index 00000000..759d9a56
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests._internal_utils
+~~~~~~~~~~~~~~
+
+Provides utility functions that are consumed internally by Requests
+which depend on extremely few external helpers (such as compat)
+"""
+
+from .compat import is_py2, builtin_str, str
+
+
+def to_native_string(string, encoding='ascii'):
+    """Given a string object, regardless of type, returns a representation of
+    that string in the native string type, encoding and decoding where
+    necessary. This assumes ASCII unless told otherwise.
+    """
+    if isinstance(string, builtin_str):
+        out = string
+    else:
+        if is_py2:
+            out = string.encode(encoding)
+        else:
+            out = string.decode(encoding)
+
+    return out
+
+
+def unicode_is_ascii(u_string):
+    """Determine if unicode string only contains ASCII characters.
+
+    :param str u_string: unicode string to check. Must be unicode
+        and not Python 2 `str`.
+    :rtype: bool
+    """
+    assert isinstance(u_string, str)
+    try:
+        u_string.encode('ascii')
+        return True
+    except UnicodeEncodeError:
+        return False
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a03c94c1a24aec8a8423dd0e872204ee613069b8
GIT binary patch
literal 1676
zcmZSn%*&NH<x)&C0~9bZFfceUFfbHbGcYiuFfc?hFr+Xtq%bk$Ff!yaF+?#j<T5iv
zF*D?{FhsF1Fs3jwq_8lwFfv53GNiCFv@kG4u`#5uF$8O{gA7^6z`(#&lv-GtT3k}B
z7oV9|l3J9Pm=j-Gl9^M?Rfht&xB`mu%Q90^ixoi9nI)A9X{C9|C7Jno#R?@Ei6sh&
zMX3tO`FX{qxv41%Ftc(h6_P3yf}nPAm1kroXDFnk7Nq8-DCFlUq*jy^rRJvQR4SyU
zmV<a;2PkBu<`kqB6)R{ImnLT@Bo-?q=jRqAmS}QiGBPkQXfQJ{FqE({Ffe2m#}`x@
zm2fjKFeH^`=9FaS#TS<pm4M_yG%EuGLt=4qW@a)d+(4or><scch$vxTs9|6zVPt4#
zVknXTv1^$a^3)khm>7x-K-?^5h8jkOW<~~(I6qi~1tC(y#1O0ja!>JT1_lQA%(B!x
zg+ztolA_GKbcOt+tkmQZ9fhLQ^u(f+oYdlCh5R&ylFEWqkXT7+QC_h^qC!z>K~ZXP
zYF<eqC>#~?)3_8A6d<7qH77Gqp(G<!Auq8cvn&;6IK-ILyyW~8kX?y+DGDj6P)>P9
zYEdfKn7q{F)Z*gAqDno5kc`Y?g~Vb|)D$Z?20MFtDwO7d9aWN_lcJDcl95_eo>`o#
z2iB+o3bzt2aQJ5C6_+IDC8q{~JQ@T_h2Ve(+now#f^AMk#0kXVB^(S43}986dFkK?
z$uBL@0O<!4#pMhP4EhB{nPrJ3srqG!Mfz#^IVq_{#roNW`q{-s=H`ZlSw`k%h8E_<
zIhE<<@g^xICI$uu2I+bFA^HWG1-f8|<>cs=Ct8*UW`KmiIKC`3FD1W7AC{{1(NeWu
zL1l>mDEZ{aL&6l4U^4U4`9O(+2jo6henw6vHbx;Pex_uQr$HDLAfOae3?h(|O|d8_
zwKOp@REmO=2Qw%;HZw9Xmas4chvx|~u#~VeWOFeT*)cFOGM2D01V^NRk_{*w7H?r-
zU~ow-NiE9F%u7|sOj9V$%S_Hsfk$(GUQQ(_N0lUI=E0&ZIU}(sF}WnQs928+99dQc
ziA9OIpp>Cd3iXQ>x<MuR3dtF%$=P}ezNN(_3Q4Ij1z;0ENe+~R^72a*0xC-~^79mo
z6cUO{iV`5n!Kw(9-mDao^7C`R8iGKs_X8IpK`aam3_+mWRRRh@$KvADB2ZFxEh@?{
z3IYXN2}ngqQE6(45Ca24D8z@Zpro4$R#XB~<d&FIoC?lM;B*7?2so*Li2+Y9(5Q*e
zERF}4D01-h!Y<0l%*e~g!N|)936l~~*%}|8lAjzO56&Tw!V8>vAlV2MUO}Mz6$DC(
hU=JdQ0re^<*V^Rfr<CTT+Hr!s2r6aSm}HoF1OU4($rk_s

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py
new file mode 100644
index 00000000..c30e7c92
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py
@@ -0,0 +1,533 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.adapters
+~~~~~~~~~~~~~~~~~
+
+This module contains the transport adapters that Requests uses to define
+and maintain connections.
+"""
+
+import os.path
+import socket
+
+from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url
+from pip._vendor.urllib3.response import HTTPResponse
+from pip._vendor.urllib3.util import parse_url
+from pip._vendor.urllib3.util import Timeout as TimeoutSauce
+from pip._vendor.urllib3.util.retry import Retry
+from pip._vendor.urllib3.exceptions import ClosedPoolError
+from pip._vendor.urllib3.exceptions import ConnectTimeoutError
+from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError
+from pip._vendor.urllib3.exceptions import MaxRetryError
+from pip._vendor.urllib3.exceptions import NewConnectionError
+from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError
+from pip._vendor.urllib3.exceptions import ProtocolError
+from pip._vendor.urllib3.exceptions import ReadTimeoutError
+from pip._vendor.urllib3.exceptions import SSLError as _SSLError
+from pip._vendor.urllib3.exceptions import ResponseError
+from pip._vendor.urllib3.exceptions import LocationValueError
+
+from .models import Response
+from .compat import urlparse, basestring
+from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths,
+                    get_encoding_from_headers, prepend_scheme_if_needed,
+                    get_auth_from_url, urldefragauth, select_proxy)
+from .structures import CaseInsensitiveDict
+from .cookies import extract_cookies_to_jar
+from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError,
+                         ProxyError, RetryError, InvalidSchema, InvalidProxyURL,
+                         InvalidURL)
+from .auth import _basic_auth_str
+
+try:
+    from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager
+except ImportError:
+    def SOCKSProxyManager(*args, **kwargs):
+        raise InvalidSchema("Missing dependencies for SOCKS support.")
+
+DEFAULT_POOLBLOCK = False
+DEFAULT_POOLSIZE = 10
+DEFAULT_RETRIES = 0
+DEFAULT_POOL_TIMEOUT = None
+
+
+class BaseAdapter(object):
+    """The Base Transport Adapter"""
+
+    def __init__(self):
+        super(BaseAdapter, self).__init__()
+
+    def send(self, request, stream=False, timeout=None, verify=True,
+             cert=None, proxies=None):
+        """Sends PreparedRequest object. Returns Response object.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param stream: (optional) Whether to stream the request content.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple
+        :param verify: (optional) Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
+        :param proxies: (optional) The proxies dictionary to apply to the request.
+        """
+        raise NotImplementedError
+
+    def close(self):
+        """Cleans up adapter specific items."""
+        raise NotImplementedError
+
+
+class HTTPAdapter(BaseAdapter):
+    """The built-in HTTP Adapter for urllib3.
+
+    Provides a general-case interface for Requests sessions to contact HTTP and
+    HTTPS urls by implementing the Transport Adapter interface. This class will
+    usually be created by the :class:`Session <Session>` class under the
+    covers.
+
+    :param pool_connections: The number of urllib3 connection pools to cache.
+    :param pool_maxsize: The maximum number of connections to save in the pool.
+    :param max_retries: The maximum number of retries each connection
+        should attempt. Note, this applies only to failed DNS lookups, socket
+        connections and connection timeouts, never to requests where data has
+        made it to the server. By default, Requests does not retry failed
+        connections. If you need granular control over the conditions under
+        which we retry a request, import urllib3's ``Retry`` class and pass
+        that instead.
+    :param pool_block: Whether the connection pool should block for connections.
+
+    Usage::
+
+      >>> import requests
+      >>> s = requests.Session()
+      >>> a = requests.adapters.HTTPAdapter(max_retries=3)
+      >>> s.mount('http://', a)
+    """
+    __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize',
+                 '_pool_block']
+
+    def __init__(self, pool_connections=DEFAULT_POOLSIZE,
+                 pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,
+                 pool_block=DEFAULT_POOLBLOCK):
+        if max_retries == DEFAULT_RETRIES:
+            self.max_retries = Retry(0, read=False)
+        else:
+            self.max_retries = Retry.from_int(max_retries)
+        self.config = {}
+        self.proxy_manager = {}
+
+        super(HTTPAdapter, self).__init__()
+
+        self._pool_connections = pool_connections
+        self._pool_maxsize = pool_maxsize
+        self._pool_block = pool_block
+
+        self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)
+
+    def __getstate__(self):
+        return {attr: getattr(self, attr, None) for attr in self.__attrs__}
+
+    def __setstate__(self, state):
+        # Can't handle by adding 'proxy_manager' to self.__attrs__ because
+        # self.poolmanager uses a lambda function, which isn't pickleable.
+        self.proxy_manager = {}
+        self.config = {}
+
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+        self.init_poolmanager(self._pool_connections, self._pool_maxsize,
+                              block=self._pool_block)
+
+    def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs):
+        """Initializes a urllib3 PoolManager.
+
+        This method should not be called from user code, and is only
+        exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param connections: The number of urllib3 connection pools to cache.
+        :param maxsize: The maximum number of connections to save in the pool.
+        :param block: Block when no free connections are available.
+        :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager.
+        """
+        # save these values for pickling
+        self._pool_connections = connections
+        self._pool_maxsize = maxsize
+        self._pool_block = block
+
+        self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize,
+                                       block=block, strict=True, **pool_kwargs)
+
+    def proxy_manager_for(self, proxy, **proxy_kwargs):
+        """Return urllib3 ProxyManager for the given proxy.
+
+        This method should not be called from user code, and is only
+        exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param proxy: The proxy to return a urllib3 ProxyManager for.
+        :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager.
+        :returns: ProxyManager
+        :rtype: urllib3.ProxyManager
+        """
+        if proxy in self.proxy_manager:
+            manager = self.proxy_manager[proxy]
+        elif proxy.lower().startswith('socks'):
+            username, password = get_auth_from_url(proxy)
+            manager = self.proxy_manager[proxy] = SOCKSProxyManager(
+                proxy,
+                username=username,
+                password=password,
+                num_pools=self._pool_connections,
+                maxsize=self._pool_maxsize,
+                block=self._pool_block,
+                **proxy_kwargs
+            )
+        else:
+            proxy_headers = self.proxy_headers(proxy)
+            manager = self.proxy_manager[proxy] = proxy_from_url(
+                proxy,
+                proxy_headers=proxy_headers,
+                num_pools=self._pool_connections,
+                maxsize=self._pool_maxsize,
+                block=self._pool_block,
+                **proxy_kwargs)
+
+        return manager
+
+    def cert_verify(self, conn, url, verify, cert):
+        """Verify a SSL certificate. This method should not be called from user
+        code, and is only exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param conn: The urllib3 connection object associated with the cert.
+        :param url: The requested URL.
+        :param verify: Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use
+        :param cert: The SSL certificate to verify.
+        """
+        if url.lower().startswith('https') and verify:
+
+            cert_loc = None
+
+            # Allow self-specified cert location.
+            if verify is not True:
+                cert_loc = verify
+
+            if not cert_loc:
+                cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH)
+
+            if not cert_loc or not os.path.exists(cert_loc):
+                raise IOError("Could not find a suitable TLS CA certificate bundle, "
+                              "invalid path: {}".format(cert_loc))
+
+            conn.cert_reqs = 'CERT_REQUIRED'
+
+            if not os.path.isdir(cert_loc):
+                conn.ca_certs = cert_loc
+            else:
+                conn.ca_cert_dir = cert_loc
+        else:
+            conn.cert_reqs = 'CERT_NONE'
+            conn.ca_certs = None
+            conn.ca_cert_dir = None
+
+        if cert:
+            if not isinstance(cert, basestring):
+                conn.cert_file = cert[0]
+                conn.key_file = cert[1]
+            else:
+                conn.cert_file = cert
+                conn.key_file = None
+            if conn.cert_file and not os.path.exists(conn.cert_file):
+                raise IOError("Could not find the TLS certificate file, "
+                              "invalid path: {}".format(conn.cert_file))
+            if conn.key_file and not os.path.exists(conn.key_file):
+                raise IOError("Could not find the TLS key file, "
+                              "invalid path: {}".format(conn.key_file))
+
+    def build_response(self, req, resp):
+        """Builds a :class:`Response <requests.Response>` object from a urllib3
+        response. This should not be called from user code, and is only exposed
+        for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`
+
+        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.
+        :param resp: The urllib3 response object.
+        :rtype: requests.Response
+        """
+        response = Response()
+
+        # Fallback to None if there's no status_code, for whatever reason.
+        response.status_code = getattr(resp, 'status', None)
+
+        # Make headers case-insensitive.
+        response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))
+
+        # Set encoding.
+        response.encoding = get_encoding_from_headers(response.headers)
+        response.raw = resp
+        response.reason = response.raw.reason
+
+        if isinstance(req.url, bytes):
+            response.url = req.url.decode('utf-8')
+        else:
+            response.url = req.url
+
+        # Add new cookies from the server.
+        extract_cookies_to_jar(response.cookies, req, resp)
+
+        # Give the Response some context.
+        response.request = req
+        response.connection = self
+
+        return response
+
+    def get_connection(self, url, proxies=None):
+        """Returns a urllib3 connection for the given URL. This should not be
+        called from user code, and is only exposed for use when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param url: The URL to connect to.
+        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
+        :rtype: urllib3.ConnectionPool
+        """
+        proxy = select_proxy(url, proxies)
+
+        if proxy:
+            proxy = prepend_scheme_if_needed(proxy, 'http')
+            proxy_url = parse_url(proxy)
+            if not proxy_url.host:
+                raise InvalidProxyURL("Please check proxy URL. It is malformed"
+                                      " and could be missing the host.")
+            proxy_manager = self.proxy_manager_for(proxy)
+            conn = proxy_manager.connection_from_url(url)
+        else:
+            # Only scheme should be lower case
+            parsed = urlparse(url)
+            url = parsed.geturl()
+            conn = self.poolmanager.connection_from_url(url)
+
+        return conn
+
+    def close(self):
+        """Disposes of any internal state.
+
+        Currently, this closes the PoolManager and any active ProxyManager,
+        which closes any pooled connections.
+        """
+        self.poolmanager.clear()
+        for proxy in self.proxy_manager.values():
+            proxy.clear()
+
+    def request_url(self, request, proxies):
+        """Obtain the url to use when making the final request.
+
+        If the message is being sent through a HTTP proxy, the full URL has to
+        be used. Otherwise, we should only use the path portion of the URL.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs.
+        :rtype: str
+        """
+        proxy = select_proxy(request.url, proxies)
+        scheme = urlparse(request.url).scheme
+
+        is_proxied_http_request = (proxy and scheme != 'https')
+        using_socks_proxy = False
+        if proxy:
+            proxy_scheme = urlparse(proxy).scheme.lower()
+            using_socks_proxy = proxy_scheme.startswith('socks')
+
+        url = request.path_url
+        if is_proxied_http_request and not using_socks_proxy:
+            url = urldefragauth(request.url)
+
+        return url
+
+    def add_headers(self, request, **kwargs):
+        """Add any headers needed by the connection. As of v2.0 this does
+        nothing by default, but is left for overriding by users that subclass
+        the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.
+        :param kwargs: The keyword arguments from the call to send().
+        """
+        pass
+
+    def proxy_headers(self, proxy):
+        """Returns a dictionary of the headers to add to any request sent
+        through a proxy. This works with urllib3 magic to ensure that they are
+        correctly sent to the proxy, rather than in a tunnelled request if
+        CONNECT is being used.
+
+        This should not be called from user code, and is only exposed for use
+        when subclassing the
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
+
+        :param proxy: The url of the proxy being used for this request.
+        :rtype: dict
+        """
+        headers = {}
+        username, password = get_auth_from_url(proxy)
+
+        if username:
+            headers['Proxy-Authorization'] = _basic_auth_str(username,
+                                                             password)
+
+        return headers
+
+    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
+        """Sends PreparedRequest object. Returns Response object.
+
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
+        :param stream: (optional) Whether to stream the request content.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple or urllib3 Timeout object
+        :param verify: (optional) Either a boolean, in which case it controls whether
+            we verify the server's TLS certificate, or a string, in which case it
+            must be a path to a CA bundle to use
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
+        :param proxies: (optional) The proxies dictionary to apply to the request.
+        :rtype: requests.Response
+        """
+
+        try:
+            conn = self.get_connection(request.url, proxies)
+        except LocationValueError as e:
+            raise InvalidURL(e, request=request)
+
+        self.cert_verify(conn, request.url, verify, cert)
+        url = self.request_url(request, proxies)
+        self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies)
+
+        chunked = not (request.body is None or 'Content-Length' in request.headers)
+
+        if isinstance(timeout, tuple):
+            try:
+                connect, read = timeout
+                timeout = TimeoutSauce(connect=connect, read=read)
+            except ValueError as e:
+                # this may raise a string formatting error.
+                err = ("Invalid timeout {}. Pass a (connect, read) "
+                       "timeout tuple, or a single float to set "
+                       "both timeouts to the same value".format(timeout))
+                raise ValueError(err)
+        elif isinstance(timeout, TimeoutSauce):
+            pass
+        else:
+            timeout = TimeoutSauce(connect=timeout, read=timeout)
+
+        try:
+            if not chunked:
+                resp = conn.urlopen(
+                    method=request.method,
+                    url=url,
+                    body=request.body,
+                    headers=request.headers,
+                    redirect=False,
+                    assert_same_host=False,
+                    preload_content=False,
+                    decode_content=False,
+                    retries=self.max_retries,
+                    timeout=timeout
+                )
+
+            # Send the request.
+            else:
+                if hasattr(conn, 'proxy_pool'):
+                    conn = conn.proxy_pool
+
+                low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)
+
+                try:
+                    low_conn.putrequest(request.method,
+                                        url,
+                                        skip_accept_encoding=True)
+
+                    for header, value in request.headers.items():
+                        low_conn.putheader(header, value)
+
+                    low_conn.endheaders()
+
+                    for i in request.body:
+                        low_conn.send(hex(len(i))[2:].encode('utf-8'))
+                        low_conn.send(b'\r\n')
+                        low_conn.send(i)
+                        low_conn.send(b'\r\n')
+                    low_conn.send(b'0\r\n\r\n')
+
+                    # Receive the response from the server
+                    try:
+                        # For Python 2.7, use buffering of HTTP responses
+                        r = low_conn.getresponse(buffering=True)
+                    except TypeError:
+                        # For compatibility with Python 3.3+
+                        r = low_conn.getresponse()
+
+                    resp = HTTPResponse.from_httplib(
+                        r,
+                        pool=conn,
+                        connection=low_conn,
+                        preload_content=False,
+                        decode_content=False
+                    )
+                except:
+                    # If we hit any problems here, clean up the connection.
+                    # Then, reraise so that we can handle the actual exception.
+                    low_conn.close()
+                    raise
+
+        except (ProtocolError, socket.error) as err:
+            raise ConnectionError(err, request=request)
+
+        except MaxRetryError as e:
+            if isinstance(e.reason, ConnectTimeoutError):
+                # TODO: Remove this in 3.0.0: see #2811
+                if not isinstance(e.reason, NewConnectionError):
+                    raise ConnectTimeout(e, request=request)
+
+            if isinstance(e.reason, ResponseError):
+                raise RetryError(e, request=request)
+
+            if isinstance(e.reason, _ProxyError):
+                raise ProxyError(e, request=request)
+
+            if isinstance(e.reason, _SSLError):
+                # This branch is for urllib3 v1.22 and later.
+                raise SSLError(e, request=request)
+
+            raise ConnectionError(e, request=request)
+
+        except ClosedPoolError as e:
+            raise ConnectionError(e, request=request)
+
+        except _ProxyError as e:
+            raise ProxyError(e)
+
+        except (_SSLError, _HTTPError) as e:
+            if isinstance(e, _SSLError):
+                # This branch is for urllib3 versions earlier than v1.22
+                raise SSLError(e, request=request)
+            elif isinstance(e, ReadTimeoutError):
+                raise ReadTimeout(e, request=request)
+            else:
+                raise
+
+        return self.build_response(request, resp)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cd8377a163f9113db8f200d18eb1ea2d89c058e5
GIT binary patch
literal 20399
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py
new file mode 100644
index 00000000..abada96d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py
@@ -0,0 +1,158 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.api
+~~~~~~~~~~~~
+
+This module implements the Requests API.
+
+:copyright: (c) 2012 by Kenneth Reitz.
+:license: Apache2, see LICENSE for more details.
+"""
+
+from . import sessions
+
+
+def request(method, url, **kwargs):
+    """Constructs and sends a :class:`Request <Request>`.
+
+    :param method: method for the new :class:`Request` object.
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary, list of tuples or bytes to send
+        in the body of the :class:`Request`.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
+    :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
+    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
+    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
+    :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
+        ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
+        or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
+        defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
+        to add for the file.
+    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
+    :param timeout: (optional) How many seconds to wait for the server to send data
+        before giving up, as a float, or a :ref:`(connect timeout, read
+        timeout) <timeouts>` tuple.
+    :type timeout: float or tuple
+    :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
+    :type allow_redirects: bool
+    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
+    :param verify: (optional) Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use. Defaults to ``True``.
+    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
+    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.request('GET', 'https://httpbin.org/get')
+      <Response [200]>
+    """
+
+    # By using the 'with' statement we are sure the session is closed, thus we
+    # avoid leaving sockets open which can trigger a ResourceWarning in some
+    # cases, and look like a memory leak in others.
+    with sessions.Session() as session:
+        return session.request(method=method, url=url, **kwargs)
+
+
+def get(url, params=None, **kwargs):
+    r"""Sends a GET request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param params: (optional) Dictionary, list of tuples or bytes to send
+        in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('get', url, params=params, **kwargs)
+
+
+def options(url, **kwargs):
+    r"""Sends an OPTIONS request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', True)
+    return request('options', url, **kwargs)
+
+
+def head(url, **kwargs):
+    r"""Sends a HEAD request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    kwargs.setdefault('allow_redirects', False)
+    return request('head', url, **kwargs)
+
+
+def post(url, data=None, json=None, **kwargs):
+    r"""Sends a POST request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('post', url, data=data, json=json, **kwargs)
+
+
+def put(url, data=None, **kwargs):
+    r"""Sends a PUT request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('put', url, data=data, **kwargs)
+
+
+def patch(url, data=None, **kwargs):
+    r"""Sends a PATCH request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
+    :param json: (optional) json data to send in the body of the :class:`Request`.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('patch', url, data=data, **kwargs)
+
+
+def delete(url, **kwargs):
+    r"""Sends a DELETE request.
+
+    :param url: URL for the new :class:`Request` object.
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
+    :return: :class:`Response <Response>` object
+    :rtype: requests.Response
+    """
+
+    return request('delete', url, **kwargs)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f205ddaf3e4a8806329ba878415bec1b91eb506
GIT binary patch
literal 7499
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
a#USUgF$pkp>hth(@^bR>^YifY@B;vc_MD{v

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py
new file mode 100644
index 00000000..bdde51c7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py
@@ -0,0 +1,305 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.auth
+~~~~~~~~~~~~~
+
+This module contains the authentication handlers for Requests.
+"""
+
+import os
+import re
+import time
+import hashlib
+import threading
+import warnings
+
+from base64 import b64encode
+
+from .compat import urlparse, str, basestring
+from .cookies import extract_cookies_to_jar
+from ._internal_utils import to_native_string
+from .utils import parse_dict_header
+
+CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
+CONTENT_TYPE_MULTI_PART = 'multipart/form-data'
+
+
+def _basic_auth_str(username, password):
+    """Returns a Basic Auth string."""
+
+    # "I want us to put a big-ol' comment on top of it that
+    # says that this behaviour is dumb but we need to preserve
+    # it because people are relying on it."
+    #    - Lukasa
+    #
+    # These are here solely to maintain backwards compatibility
+    # for things like ints. This will be removed in 3.0.0.
+    if not isinstance(username, basestring):
+        warnings.warn(
+            "Non-string usernames will no longer be supported in Requests "
+            "3.0.0. Please convert the object you've passed in ({!r}) to "
+            "a string or bytes object in the near future to avoid "
+            "problems.".format(username),
+            category=DeprecationWarning,
+        )
+        username = str(username)
+
+    if not isinstance(password, basestring):
+        warnings.warn(
+            "Non-string passwords will no longer be supported in Requests "
+            "3.0.0. Please convert the object you've passed in ({!r}) to "
+            "a string or bytes object in the near future to avoid "
+            "problems.".format(password),
+            category=DeprecationWarning,
+        )
+        password = str(password)
+    # -- End Removal --
+
+    if isinstance(username, str):
+        username = username.encode('latin1')
+
+    if isinstance(password, str):
+        password = password.encode('latin1')
+
+    authstr = 'Basic ' + to_native_string(
+        b64encode(b':'.join((username, password))).strip()
+    )
+
+    return authstr
+
+
+class AuthBase(object):
+    """Base class that all auth implementations derive from"""
+
+    def __call__(self, r):
+        raise NotImplementedError('Auth hooks must be callable.')
+
+
+class HTTPBasicAuth(AuthBase):
+    """Attaches HTTP Basic Authentication to the given Request object."""
+
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+
+    def __eq__(self, other):
+        return all([
+            self.username == getattr(other, 'username', None),
+            self.password == getattr(other, 'password', None)
+        ])
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __call__(self, r):
+        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    """Attaches HTTP Proxy Authentication to a given Request object."""
+
+    def __call__(self, r):
+        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)
+        return r
+
+
+class HTTPDigestAuth(AuthBase):
+    """Attaches HTTP Digest Authentication to the given Request object."""
+
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+        # Keep state in per-thread local storage
+        self._thread_local = threading.local()
+
+    def init_per_thread_state(self):
+        # Ensure state is initialized just once per-thread
+        if not hasattr(self._thread_local, 'init'):
+            self._thread_local.init = True
+            self._thread_local.last_nonce = ''
+            self._thread_local.nonce_count = 0
+            self._thread_local.chal = {}
+            self._thread_local.pos = None
+            self._thread_local.num_401_calls = None
+
+    def build_digest_header(self, method, url):
+        """
+        :rtype: str
+        """
+
+        realm = self._thread_local.chal['realm']
+        nonce = self._thread_local.chal['nonce']
+        qop = self._thread_local.chal.get('qop')
+        algorithm = self._thread_local.chal.get('algorithm')
+        opaque = self._thread_local.chal.get('opaque')
+        hash_utf8 = None
+
+        if algorithm is None:
+            _algorithm = 'MD5'
+        else:
+            _algorithm = algorithm.upper()
+        # lambdas assume digest modules are imported at the top level
+        if _algorithm == 'MD5' or _algorithm == 'MD5-SESS':
+            def md5_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.md5(x).hexdigest()
+            hash_utf8 = md5_utf8
+        elif _algorithm == 'SHA':
+            def sha_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.sha1(x).hexdigest()
+            hash_utf8 = sha_utf8
+        elif _algorithm == 'SHA-256':
+            def sha256_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.sha256(x).hexdigest()
+            hash_utf8 = sha256_utf8
+        elif _algorithm == 'SHA-512':
+            def sha512_utf8(x):
+                if isinstance(x, str):
+                    x = x.encode('utf-8')
+                return hashlib.sha512(x).hexdigest()
+            hash_utf8 = sha512_utf8
+
+        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))
+
+        if hash_utf8 is None:
+            return None
+
+        # XXX not implemented yet
+        entdig = None
+        p_parsed = urlparse(url)
+        #: path is request-uri defined in RFC 2616 which should not be empty
+        path = p_parsed.path or "/"
+        if p_parsed.query:
+            path += '?' + p_parsed.query
+
+        A1 = '%s:%s:%s' % (self.username, realm, self.password)
+        A2 = '%s:%s' % (method, path)
+
+        HA1 = hash_utf8(A1)
+        HA2 = hash_utf8(A2)
+
+        if nonce == self._thread_local.last_nonce:
+            self._thread_local.nonce_count += 1
+        else:
+            self._thread_local.nonce_count = 1
+        ncvalue = '%08x' % self._thread_local.nonce_count
+        s = str(self._thread_local.nonce_count).encode('utf-8')
+        s += nonce.encode('utf-8')
+        s += time.ctime().encode('utf-8')
+        s += os.urandom(8)
+
+        cnonce = (hashlib.sha1(s).hexdigest()[:16])
+        if _algorithm == 'MD5-SESS':
+            HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))
+
+        if not qop:
+            respdig = KD(HA1, "%s:%s" % (nonce, HA2))
+        elif qop == 'auth' or 'auth' in qop.split(','):
+            noncebit = "%s:%s:%s:%s:%s" % (
+                nonce, ncvalue, cnonce, 'auth', HA2
+            )
+            respdig = KD(HA1, noncebit)
+        else:
+            # XXX handle auth-int.
+            return None
+
+        self._thread_local.last_nonce = nonce
+
+        # XXX should the partial digests be encoded too?
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
+               'response="%s"' % (self.username, realm, nonce, path, respdig)
+        if opaque:
+            base += ', opaque="%s"' % opaque
+        if algorithm:
+            base += ', algorithm="%s"' % algorithm
+        if entdig:
+            base += ', digest="%s"' % entdig
+        if qop:
+            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)
+
+        return 'Digest %s' % (base)
+
+    def handle_redirect(self, r, **kwargs):
+        """Reset num_401_calls counter on redirects."""
+        if r.is_redirect:
+            self._thread_local.num_401_calls = 1
+
+    def handle_401(self, r, **kwargs):
+        """
+        Takes the given response and tries digest-auth, if needed.
+
+        :rtype: requests.Response
+        """
+
+        # If response is not 4xx, do not auth
+        # See https://github.com/requests/requests/issues/3772
+        if not 400 <= r.status_code < 500:
+            self._thread_local.num_401_calls = 1
+            return r
+
+        if self._thread_local.pos is not None:
+            # Rewind the file position indicator of the body to where
+            # it was to resend the request.
+            r.request.body.seek(self._thread_local.pos)
+        s_auth = r.headers.get('www-authenticate', '')
+
+        if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2:
+
+            self._thread_local.num_401_calls += 1
+            pat = re.compile(r'digest ', flags=re.IGNORECASE)
+            self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1))
+
+            # Consume content and release the original connection
+            # to allow our new request to reuse the same one.
+            r.content
+            r.close()
+            prep = r.request.copy()
+            extract_cookies_to_jar(prep._cookies, r.request, r.raw)
+            prep.prepare_cookies(prep._cookies)
+
+            prep.headers['Authorization'] = self.build_digest_header(
+                prep.method, prep.url)
+            _r = r.connection.send(prep, **kwargs)
+            _r.history.append(r)
+            _r.request = prep
+
+            return _r
+
+        self._thread_local.num_401_calls = 1
+        return r
+
+    def __call__(self, r):
+        # Initialize per-thread state, if needed
+        self.init_per_thread_state()
+        # If we have a saved nonce, skip the 401
+        if self._thread_local.last_nonce:
+            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
+        try:
+            self._thread_local.pos = r.body.tell()
+        except AttributeError:
+            # In the case of HTTPDigestAuth being reused and the body of
+            # the previous request was a file-like object, pos has the
+            # file position of the previous body. Ensure it's set to
+            # None.
+            self._thread_local.pos = None
+        r.register_hook('response', self.handle_401)
+        r.register_hook('response', self.handle_redirect)
+        self._thread_local.num_401_calls = 1
+
+        return r
+
+    def __eq__(self, other):
+        return all([
+            self.username == getattr(other, 'username', None),
+            self.password == getattr(other, 'password', None)
+        ])
+
+    def __ne__(self, other):
+        return not self == other
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..526984e22b169417a1ac8e2c3983a485d8650431
GIT binary patch
literal 11699
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
MoQ@c~n5Y;B0In1p!2kdN

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py
new file mode 100644
index 00000000..06a594e5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+requests.certs
+~~~~~~~~~~~~~~
+
+This module returns the preferred default CA certificate bundle. There is
+only one — the one from the certifi package.
+
+If you are packaging Requests, e.g., for a Linux distribution or a managed
+environment, you can change the definition of where() to return a separately
+packaged CA bundle.
+"""
+from pip._vendor.certifi import where
+
+if __name__ == '__main__':
+    print(where())
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..eb93919451c4ba3d6f71b7256bd4785546506b32
GIT binary patch
literal 665
zcmZSn%*&NH<x)&C0~9bZFfceUFfbGwGB7ZtFfc?hFr+Xtq%bk$Ff!yaF+?#jFs3py
zq%bpNGcgqDGNdvwG&3-`d*m@Nq_8jqYp{Z}x-l{^a22H%mZlb$6ze6Y7L^op)u8|`
zu8@q(VujrNl+v73g`(7w(xSX#g_4X^g@U5gwA7-a)D(r3)U?FXoDv0RM+J}(nQ58H
zi6yBDNu_xyIjMRIAsMMfsS26JT={u9l?wTJsS1x8rhttAvD1q3bHN;_R)vDZ<m|-s
zR6Q;(&oqU~{8EL)qEx70W?s5N5Y)9g3aNVOdO8Ye`9%te3O<>6r4<S(nZ+eVnMtK3
znfZANVDa3<yu|d>6t2{~vdp6Vyxi2h5*@Ii$%%Oi$r*`x>8W7LQ&Q71^D-g&(iF-;
zF4oXgD9MNVSRqlNIJF?LD6u3pr;-cm!W58)p`PT*{Qv*|e+@<k28I$)$bwBM;b353
zh>y=r%*>0A_tRhjNwR~5Qu34I<4c4Y7#IpN3-sd4Qu9*si@@QZnU)y@ieRYTyu{qp
z_;?MF2!bfiWnf^?FDS|^ODsv%FH0=aPs`6qNi8bY&o0!@E;ceZH!RFDGA}c<FfY!j
zOfQc&Nii`oFfcGk&(jalFUTy=&CDw<NzBR7El;#84a@)ufict}`mhwC4~mmwy@E=x
YYix4CiNKBzlycY@7#P?X1(<jk0gJ}TOaK4?

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py
new file mode 100644
index 00000000..6a86893d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.compat
+~~~~~~~~~~~~~~~
+
+This module handles import compatibility issues between Python 2 and
+Python 3.
+"""
+
+from pip._vendor import chardet
+
+import sys
+
+# -------
+# Pythons
+# -------
+
+# Syntax sugar.
+_ver = sys.version_info
+
+#: Python 2.x?
+is_py2 = (_ver[0] == 2)
+
+#: Python 3.x?
+is_py3 = (_ver[0] == 3)
+
+# Note: We've patched out simplejson support in pip because it prevents
+#       upgrading simplejson on Windows.
+# try:
+#     import simplejson as json
+# except (ImportError, SyntaxError):
+#     # simplejson does not support Python 3.2, it throws a SyntaxError
+#     # because of u'...' Unicode literals.
+import json
+
+# ---------
+# Specifics
+# ---------
+
+if is_py2:
+    from urllib import (
+        quote, unquote, quote_plus, unquote_plus, urlencode, getproxies,
+        proxy_bypass, proxy_bypass_environment, getproxies_environment)
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag
+    from urllib2 import parse_http_list
+    import cookielib
+    from Cookie import Morsel
+    from StringIO import StringIO
+    from collections import Callable, Mapping, MutableMapping, OrderedDict
+
+
+    builtin_str = str
+    bytes = str
+    str = unicode
+    basestring = basestring
+    numeric_types = (int, long, float)
+    integer_types = (int, long)
+
+elif is_py3:
+    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
+    from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment
+    from http import cookiejar as cookielib
+    from http.cookies import Morsel
+    from io import StringIO
+    from collections import OrderedDict
+    from collections.abc import Callable, Mapping, MutableMapping
+
+    builtin_str = str
+    str = str
+    bytes = bytes
+    basestring = (str, bytes)
+    numeric_types = (int, float)
+    integer_types = (int,)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7d11a7cf89a8d9f59de61c18de7b9f6a859ac5ee
GIT binary patch
literal 2003
zcmZSn%*&NH<x)&C0~9bbFfceUFfbG+GchovFfc?hFr+Xtq%bk$Ff!yaF+?#jFoO8Z
z3^~jUQOpdf%nVs93{k8MsjLhsEDVw<tPI&q3{h-wJ{y?N4mO0DA%}w@ii07QjiD$K
zYz#X?4ktq{7ef>mLoPQ%6gNXI4?`3WLoP2v6fZ+AA43!$LoPo<6hA|*07H}jL#`l0
zlpsT{5JQv@#2Fk6Il>IN!VFQu47nl<Q6dbvq6|@@47p+qQDO|a;tWyZ5OtgkIT8%H
zk_=Ij5I!?Qjub<b6xdZ<3^~#axiSn<G7vd#h8$UjTv>)FSqPtpAxDlOSDqnCo*`F(
zAxeQESCJt~ks()!AxepXF;$r%N`(PLsxqXiF+?ddq^dJSsWYT%Fr;cSq-rswF*8JI
zL%C^83{g4^d2EcS><mTmOrU_|WysOR?E^>%;0hmv|M(bk^q~I38(#bjIr<E_1|YA4
z!=H;G#}Li$M#z2_0Q(){Q;=%~8FGxVgauM4C^Mw0GDN9@LL^m{0pwvwSZIOS;DAVD
z1cw3xLkcrPu!ayQu@y2fFmM&67M7+KmlW$I=jRqAmT=Xf0xqtQjLc$%-29Z%oK%I3
z#JrT8)MACq+=Bd~5(S8s%%sem%#uol%;MtG)MACC)ROYl)I5cN%94!yJOv|##Jm(P
zD92cjEA#*V|Nk`@85kH!*cliYk~0#EQc_F&GC?^ZlZk<WArq7tG&n&DSQ!`?3QO}#
zQo%|~^B`<4m}q=KPHAxo4+8@OR0<*h(pp-SlbV;DpORVvQk|Y!Qc#p%k(mln4PsZu
zCsh_C78jRDFfcG63&f}9m1P#?=jEp6m6V7vFfbrABTH$3+*ZN?vb!j!AhD<zVpC~R
zPH7&53-VoQQBGEVW*$skaY0UINeR?_DXD2iiRqA#;0HMZWJr8QNl8I`PG)flM1qZh
zfx$Pws5mtT!UtIxTvC*om+tAW!2${+kce|)PEKM{4kVa-6AKD5^U_QBKw3*nK;keV
zZUzPh|Du%CqSO?Z%;XXcP}l^436M+>C?tb;85kIXK%NT%#ZeF_MuI>w5(Kg>2xKVO
z>p>tV2Z5Xy1oCJQ$QeN(pF!LSVkPJ2XJ@8nB^H5&f<ze@7&O2pff8SkFvuPekeCU`
z8z4jC<5TjJ<Ks&}jw#42(2Fli%}dEI3IZjK5|GZ~N=O8jr4|)u=I6y{=B4GAfZP>d
zmReK-a!h7%d_koVf@utv&MMB&1B;aw<>X{0Vf7i<%OE4r{DU=oK*0b>lVAglz@Y(-
zScs={GLyjeIfH{BNC4zlL6A2=UQ5o;$w^Hv$;{6y4nhqIa2P>+T2cfKhNRNWoRZAE
z_~MeH5|9g%Doav}AvWh_!qazBVsUCQI8}f(XXcfFy`7Vvmk!pImXn`YQUZ$Eywcp%
zqRiy@lFEYAVz5YNUP)?tY7tZflmsAwqz6gGAfG}7pd|&^Xizc@0_6^H_5<<sAU-cH
z0i~GC{1Q<5K=P?xVp6gOC?XL=aUKH$gML9#W?5oMs(x8wk$zf!PD*M~v3_=;es-~u
zxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4fo^7AaY<rMj&6CPWocjrNC=Ff
z=|&&w;9`A9Ii*)n3C@T%x!}Ug4wOcVT^JY`*q8*Ec-T3a1(*dmdDz$(9hfy31sHi4
k1sDYwm6+KWA&{SupNWmpjS(aVk`Z8(VS>o;F!C@00IapHtN;K2

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py
new file mode 100644
index 00000000..56fccd9c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py
@@ -0,0 +1,549 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.cookies
+~~~~~~~~~~~~~~~~
+
+Compatibility code to be able to use `cookielib.CookieJar` with requests.
+
+requests.utils imports from here, so be careful with imports.
+"""
+
+import copy
+import time
+import calendar
+
+from ._internal_utils import to_native_string
+from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+
+
+class MockRequest(object):
+    """Wraps a `requests.Request` to mimic a `urllib2.Request`.
+
+    The code in `cookielib.CookieJar` expects this interface in order to correctly
+    manage cookie policies, i.e., determine whether a cookie can be set, given the
+    domains of the request and the cookie.
+
+    The original request object is read-only. The client is responsible for collecting
+    the new headers via `get_new_headers()` and interpreting them appropriately. You
+    probably want `get_cookie_header`, defined below.
+    """
+
+    def __init__(self, request):
+        self._r = request
+        self._new_headers = {}
+        self.type = urlparse(self._r.url).scheme
+
+    def get_type(self):
+        return self.type
+
+    def get_host(self):
+        return urlparse(self._r.url).netloc
+
+    def get_origin_req_host(self):
+        return self.get_host()
+
+    def get_full_url(self):
+        # Only return the response's URL if the user hadn't set the Host
+        # header
+        if not self._r.headers.get('Host'):
+            return self._r.url
+        # If they did set it, retrieve it and reconstruct the expected domain
+        host = to_native_string(self._r.headers['Host'], encoding='utf-8')
+        parsed = urlparse(self._r.url)
+        # Reconstruct the URL as we expect it
+        return urlunparse([
+            parsed.scheme, host, parsed.path, parsed.params, parsed.query,
+            parsed.fragment
+        ])
+
+    def is_unverifiable(self):
+        return True
+
+    def has_header(self, name):
+        return name in self._r.headers or name in self._new_headers
+
+    def get_header(self, name, default=None):
+        return self._r.headers.get(name, self._new_headers.get(name, default))
+
+    def add_header(self, key, val):
+        """cookielib has no legitimate use for this method; add it back if you find one."""
+        raise NotImplementedError("Cookie headers should be added with add_unredirected_header()")
+
+    def add_unredirected_header(self, name, value):
+        self._new_headers[name] = value
+
+    def get_new_headers(self):
+        return self._new_headers
+
+    @property
+    def unverifiable(self):
+        return self.is_unverifiable()
+
+    @property
+    def origin_req_host(self):
+        return self.get_origin_req_host()
+
+    @property
+    def host(self):
+        return self.get_host()
+
+
+class MockResponse(object):
+    """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.
+
+    ...what? Basically, expose the parsed HTTP headers from the server response
+    the way `cookielib` expects to see them.
+    """
+
+    def __init__(self, headers):
+        """Make a MockResponse for `cookielib` to read.
+
+        :param headers: a httplib.HTTPMessage or analogous carrying the headers
+        """
+        self._headers = headers
+
+    def info(self):
+        return self._headers
+
+    def getheaders(self, name):
+        self._headers.getheaders(name)
+
+
+def extract_cookies_to_jar(jar, request, response):
+    """Extract the cookies from the response into a CookieJar.
+
+    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
+    :param request: our own requests.Request object
+    :param response: urllib3.HTTPResponse object
+    """
+    if not (hasattr(response, '_original_response') and
+            response._original_response):
+        return
+    # the _original_response field is the wrapped httplib.HTTPResponse object,
+    req = MockRequest(request)
+    # pull out the HTTPMessage with the headers and put it in the mock:
+    res = MockResponse(response._original_response.msg)
+    jar.extract_cookies(res, req)
+
+
+def get_cookie_header(jar, request):
+    """
+    Produce an appropriate Cookie header string to be sent with `request`, or None.
+
+    :rtype: str
+    """
+    r = MockRequest(request)
+    jar.add_cookie_header(r)
+    return r.get_new_headers().get('Cookie')
+
+
+def remove_cookie_by_name(cookiejar, name, domain=None, path=None):
+    """Unsets a cookie by name, by default over all domains and paths.
+
+    Wraps CookieJar.clear(), is O(n).
+    """
+    clearables = []
+    for cookie in cookiejar:
+        if cookie.name != name:
+            continue
+        if domain is not None and domain != cookie.domain:
+            continue
+        if path is not None and path != cookie.path:
+            continue
+        clearables.append((cookie.domain, cookie.path, cookie.name))
+
+    for domain, path, name in clearables:
+        cookiejar.clear(domain, path, name)
+
+
+class CookieConflictError(RuntimeError):
+    """There are two cookies that meet the criteria specified in the cookie jar.
+    Use .get and .set and include domain and path args in order to be more specific.
+    """
+
+
+class RequestsCookieJar(cookielib.CookieJar, MutableMapping):
+    """Compatibility class; is a cookielib.CookieJar, but exposes a dict
+    interface.
+
+    This is the CookieJar we create by default for requests and sessions that
+    don't specify one, since some clients may expect response.cookies and
+    session.cookies to support dict operations.
+
+    Requests does not use the dict interface internally; it's just for
+    compatibility with external client code. All requests code should work
+    out of the box with externally provided instances of ``CookieJar``, e.g.
+    ``LWPCookieJar`` and ``FileCookieJar``.
+
+    Unlike a regular CookieJar, this class is pickleable.
+
+    .. warning:: dictionary operations that are normally O(1) may be O(n).
+    """
+
+    def get(self, name, default=None, domain=None, path=None):
+        """Dict-like get() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains.
+
+        .. warning:: operation is O(n), not O(1).
+        """
+        try:
+            return self._find_no_duplicates(name, domain, path)
+        except KeyError:
+            return default
+
+    def set(self, name, value, **kwargs):
+        """Dict-like set() that also supports optional domain and path args in
+        order to resolve naming collisions from using one cookie jar over
+        multiple domains.
+        """
+        # support client code that unsets cookies by assignment of a None value:
+        if value is None:
+            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))
+            return
+
+        if isinstance(value, Morsel):
+            c = morsel_to_cookie(value)
+        else:
+            c = create_cookie(name, value, **kwargs)
+        self.set_cookie(c)
+        return c
+
+    def iterkeys(self):
+        """Dict-like iterkeys() that returns an iterator of names of cookies
+        from the jar.
+
+        .. seealso:: itervalues() and iteritems().
+        """
+        for cookie in iter(self):
+            yield cookie.name
+
+    def keys(self):
+        """Dict-like keys() that returns a list of names of cookies from the
+        jar.
+
+        .. seealso:: values() and items().
+        """
+        return list(self.iterkeys())
+
+    def itervalues(self):
+        """Dict-like itervalues() that returns an iterator of values of cookies
+        from the jar.
+
+        .. seealso:: iterkeys() and iteritems().
+        """
+        for cookie in iter(self):
+            yield cookie.value
+
+    def values(self):
+        """Dict-like values() that returns a list of values of cookies from the
+        jar.
+
+        .. seealso:: keys() and items().
+        """
+        return list(self.itervalues())
+
+    def iteritems(self):
+        """Dict-like iteritems() that returns an iterator of name-value tuples
+        from the jar.
+
+        .. seealso:: iterkeys() and itervalues().
+        """
+        for cookie in iter(self):
+            yield cookie.name, cookie.value
+
+    def items(self):
+        """Dict-like items() that returns a list of name-value tuples from the
+        jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a
+        vanilla python dict of key value pairs.
+
+        .. seealso:: keys() and values().
+        """
+        return list(self.iteritems())
+
+    def list_domains(self):
+        """Utility method to list all the domains in the jar."""
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain not in domains:
+                domains.append(cookie.domain)
+        return domains
+
+    def list_paths(self):
+        """Utility method to list all the paths in the jar."""
+        paths = []
+        for cookie in iter(self):
+            if cookie.path not in paths:
+                paths.append(cookie.path)
+        return paths
+
+    def multiple_domains(self):
+        """Returns True if there are multiple domains in the jar.
+        Returns False otherwise.
+
+        :rtype: bool
+        """
+        domains = []
+        for cookie in iter(self):
+            if cookie.domain is not None and cookie.domain in domains:
+                return True
+            domains.append(cookie.domain)
+        return False  # there is only one domain in jar
+
+    def get_dict(self, domain=None, path=None):
+        """Takes as an argument an optional domain and path and returns a plain
+        old Python dict of name-value pairs of cookies that meet the
+        requirements.
+
+        :rtype: dict
+        """
+        dictionary = {}
+        for cookie in iter(self):
+            if (
+                (domain is None or cookie.domain == domain) and
+                (path is None or cookie.path == path)
+            ):
+                dictionary[cookie.name] = cookie.value
+        return dictionary
+
+    def __contains__(self, name):
+        try:
+            return super(RequestsCookieJar, self).__contains__(name)
+        except CookieConflictError:
+            return True
+
+    def __getitem__(self, name):
+        """Dict-like __getitem__() for compatibility with client code. Throws
+        exception if there are more than one cookie with name. In that case,
+        use the more explicit get() method instead.
+
+        .. warning:: operation is O(n), not O(1).
+        """
+        return self._find_no_duplicates(name)
+
+    def __setitem__(self, name, value):
+        """Dict-like __setitem__ for compatibility with client code. Throws
+        exception if there is already a cookie of that name in the jar. In that
+        case, use the more explicit set() method instead.
+        """
+        self.set(name, value)
+
+    def __delitem__(self, name):
+        """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s
+        ``remove_cookie_by_name()``.
+        """
+        remove_cookie_by_name(self, name)
+
+    def set_cookie(self, cookie, *args, **kwargs):
+        if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'):
+            cookie.value = cookie.value.replace('\\"', '')
+        return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs)
+
+    def update(self, other):
+        """Updates this jar with cookies from another CookieJar or dict-like"""
+        if isinstance(other, cookielib.CookieJar):
+            for cookie in other:
+                self.set_cookie(copy.copy(cookie))
+        else:
+            super(RequestsCookieJar, self).update(other)
+
+    def _find(self, name, domain=None, path=None):
+        """Requests uses this method internally to get cookie values.
+
+        If there are conflicting cookies, _find arbitrarily chooses one.
+        See _find_no_duplicates if you want an exception thrown if there are
+        conflicting cookies.
+
+        :param name: a string containing name of cookie
+        :param domain: (optional) string containing domain of cookie
+        :param path: (optional) string containing path of cookie
+        :return: cookie.value
+        """
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        return cookie.value
+
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def _find_no_duplicates(self, name, domain=None, path=None):
+        """Both ``__get_item__`` and ``get`` call this function: it's never
+        used elsewhere in Requests.
+
+        :param name: a string containing name of cookie
+        :param domain: (optional) string containing domain of cookie
+        :param path: (optional) string containing path of cookie
+        :raises KeyError: if cookie is not found
+        :raises CookieConflictError: if there are multiple cookies
+            that match name and optionally domain and path
+        :return: cookie.value
+        """
+        toReturn = None
+        for cookie in iter(self):
+            if cookie.name == name:
+                if domain is None or cookie.domain == domain:
+                    if path is None or cookie.path == path:
+                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria
+                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))
+                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict
+
+        if toReturn:
+            return toReturn
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
+
+    def __getstate__(self):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        state = self.__dict__.copy()
+        # remove the unpickleable RLock object
+        state.pop('_cookies_lock')
+        return state
+
+    def __setstate__(self, state):
+        """Unlike a normal CookieJar, this class is pickleable."""
+        self.__dict__.update(state)
+        if '_cookies_lock' not in self.__dict__:
+            self._cookies_lock = threading.RLock()
+
+    def copy(self):
+        """Return a copy of this RequestsCookieJar."""
+        new_cj = RequestsCookieJar()
+        new_cj.set_policy(self.get_policy())
+        new_cj.update(self)
+        return new_cj
+
+    def get_policy(self):
+        """Return the CookiePolicy instance used."""
+        return self._policy
+
+
+def _copy_cookie_jar(jar):
+    if jar is None:
+        return None
+
+    if hasattr(jar, 'copy'):
+        # We're dealing with an instance of RequestsCookieJar
+        return jar.copy()
+    # We're dealing with a generic CookieJar instance
+    new_jar = copy.copy(jar)
+    new_jar.clear()
+    for cookie in jar:
+        new_jar.set_cookie(copy.copy(cookie))
+    return new_jar
+
+
+def create_cookie(name, value, **kwargs):
+    """Make a cookie from underspecified parameters.
+
+    By default, the pair of `name` and `value` will be set for the domain ''
+    and sent on every request (this is sometimes called a "supercookie").
+    """
+    result = {
+        'version': 0,
+        'name': name,
+        'value': value,
+        'port': None,
+        'domain': '',
+        'path': '/',
+        'secure': False,
+        'expires': None,
+        'discard': True,
+        'comment': None,
+        'comment_url': None,
+        'rest': {'HttpOnly': None},
+        'rfc2109': False,
+    }
+
+    badargs = set(kwargs) - set(result)
+    if badargs:
+        err = 'create_cookie() got unexpected keyword arguments: %s'
+        raise TypeError(err % list(badargs))
+
+    result.update(kwargs)
+    result['port_specified'] = bool(result['port'])
+    result['domain_specified'] = bool(result['domain'])
+    result['domain_initial_dot'] = result['domain'].startswith('.')
+    result['path_specified'] = bool(result['path'])
+
+    return cookielib.Cookie(**result)
+
+
+def morsel_to_cookie(morsel):
+    """Convert a Morsel object into a Cookie containing the one k/v pair."""
+
+    expires = None
+    if morsel['max-age']:
+        try:
+            expires = int(time.time() + int(morsel['max-age']))
+        except ValueError:
+            raise TypeError('max-age: %s must be integer' % morsel['max-age'])
+    elif morsel['expires']:
+        time_template = '%a, %d-%b-%Y %H:%M:%S GMT'
+        expires = calendar.timegm(
+            time.strptime(morsel['expires'], time_template)
+        )
+    return create_cookie(
+        comment=morsel['comment'],
+        comment_url=bool(morsel['comment']),
+        discard=False,
+        domain=morsel['domain'],
+        expires=expires,
+        name=morsel.key,
+        path=morsel['path'],
+        port=None,
+        rest={'HttpOnly': morsel['httponly']},
+        rfc2109=False,
+        secure=bool(morsel['secure']),
+        value=morsel.value,
+        version=morsel['version'] or 0,
+    )
+
+
+def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    :param cookiejar: (optional) A cookiejar to add the cookies to.
+    :param overwrite: (optional) If False, will not replace cookies
+        already in the jar with new ones.
+    :rtype: CookieJar
+    """
+    if cookiejar is None:
+        cookiejar = RequestsCookieJar()
+
+    if cookie_dict is not None:
+        names_from_jar = [cookie.name for cookie in cookiejar]
+        for name in cookie_dict:
+            if overwrite or (name not in names_from_jar):
+                cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
+
+    return cookiejar
+
+
+def merge_cookies(cookiejar, cookies):
+    """Add cookies to cookiejar and returns a merged CookieJar.
+
+    :param cookiejar: CookieJar object to add the cookies to.
+    :param cookies: Dictionary or CookieJar object to be added.
+    :rtype: CookieJar
+    """
+    if not isinstance(cookiejar, cookielib.CookieJar):
+        raise ValueError('You can only merge into CookieJar')
+
+    if isinstance(cookies, dict):
+        cookiejar = cookiejar_from_dict(
+            cookies, cookiejar=cookiejar, overwrite=False)
+    elif isinstance(cookies, cookielib.CookieJar):
+        try:
+            cookiejar.update(cookies)
+        except AttributeError:
+            for cookie_in_jar in cookies:
+                cookiejar.set_cookie(cookie_in_jar)
+
+    return cookiejar
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f1652041a9fa9b5f6629132e9cc602e28ec7a326
GIT binary patch
literal 25235
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py
new file mode 100644
index 00000000..a91e1fd1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.exceptions
+~~~~~~~~~~~~~~~~~~~
+
+This module contains the set of Requests' exceptions.
+"""
+from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError
+
+
+class RequestException(IOError):
+    """There was an ambiguous exception that occurred while handling your
+    request.
+    """
+
+    def __init__(self, *args, **kwargs):
+        """Initialize RequestException with `request` and `response` objects."""
+        response = kwargs.pop('response', None)
+        self.response = response
+        self.request = kwargs.pop('request', None)
+        if (response is not None and not self.request and
+                hasattr(response, 'request')):
+            self.request = self.response.request
+        super(RequestException, self).__init__(*args, **kwargs)
+
+
+class HTTPError(RequestException):
+    """An HTTP error occurred."""
+
+
+class ConnectionError(RequestException):
+    """A Connection error occurred."""
+
+
+class ProxyError(ConnectionError):
+    """A proxy error occurred."""
+
+
+class SSLError(ConnectionError):
+    """An SSL error occurred."""
+
+
+class Timeout(RequestException):
+    """The request timed out.
+
+    Catching this error will catch both
+    :exc:`~requests.exceptions.ConnectTimeout` and
+    :exc:`~requests.exceptions.ReadTimeout` errors.
+    """
+
+
+class ConnectTimeout(ConnectionError, Timeout):
+    """The request timed out while trying to connect to the remote server.
+
+    Requests that produced this error are safe to retry.
+    """
+
+
+class ReadTimeout(Timeout):
+    """The server did not send any data in the allotted amount of time."""
+
+
+class URLRequired(RequestException):
+    """A valid URL is required to make a request."""
+
+
+class TooManyRedirects(RequestException):
+    """Too many redirects."""
+
+
+class MissingSchema(RequestException, ValueError):
+    """The URL schema (e.g. http or https) is missing."""
+
+
+class InvalidSchema(RequestException, ValueError):
+    """See defaults.py for valid schemas."""
+
+
+class InvalidURL(RequestException, ValueError):
+    """The URL provided was somehow invalid."""
+
+
+class InvalidHeader(RequestException, ValueError):
+    """The header value provided was somehow invalid."""
+
+
+class InvalidProxyURL(InvalidURL):
+    """The proxy URL provided is invalid."""
+
+
+class ChunkedEncodingError(RequestException):
+    """The server declared chunked encoding but sent an invalid chunk."""
+
+
+class ContentDecodingError(RequestException, BaseHTTPError):
+    """Failed to decode response content"""
+
+
+class StreamConsumedError(RequestException, TypeError):
+    """The content for this response was already consumed"""
+
+
+class RetryError(RequestException):
+    """Custom retries logic failed"""
+
+
+class UnrewindableBodyError(RequestException):
+    """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/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1d7f2f295cbb5d7701ebbe325b5102451584fd12
GIT binary patch
literal 8345
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
MF%~g4F;+=d0C#B@%K!iX

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py
new file mode 100644
index 00000000..3c3072ba
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py
@@ -0,0 +1,119 @@
+"""Module containing bug report helper(s)."""
+from __future__ import print_function
+
+import json
+import platform
+import sys
+import ssl
+
+from pip._vendor import idna
+from pip._vendor import urllib3
+from pip._vendor import chardet
+
+from . import __version__ as requests_version
+
+try:
+    from pip._vendor.urllib3.contrib import pyopenssl
+except ImportError:
+    pyopenssl = None
+    OpenSSL = None
+    cryptography = None
+else:
+    import OpenSSL
+    import cryptography
+
+
+def _implementation():
+    """Return a dict with the Python implementation and version.
+
+    Provide both the name and the version of the Python implementation
+    currently running. For example, on CPython 2.7.5 it will return
+    {'name': 'CPython', 'version': '2.7.5'}.
+
+    This function works best on CPython and PyPy: in particular, it probably
+    doesn't work for Jython or IronPython. Future investigation should be done
+    to work out the correct shape of the code for those platforms.
+    """
+    implementation = platform.python_implementation()
+
+    if implementation == 'CPython':
+        implementation_version = platform.python_version()
+    elif implementation == 'PyPy':
+        implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,
+                                               sys.pypy_version_info.minor,
+                                               sys.pypy_version_info.micro)
+        if sys.pypy_version_info.releaselevel != 'final':
+            implementation_version = ''.join([
+                implementation_version, sys.pypy_version_info.releaselevel
+            ])
+    elif implementation == 'Jython':
+        implementation_version = platform.python_version()  # Complete Guess
+    elif implementation == 'IronPython':
+        implementation_version = platform.python_version()  # Complete Guess
+    else:
+        implementation_version = 'Unknown'
+
+    return {'name': implementation, 'version': implementation_version}
+
+
+def info():
+    """Generate information for a bug report."""
+    try:
+        platform_info = {
+            'system': platform.system(),
+            'release': platform.release(),
+        }
+    except IOError:
+        platform_info = {
+            'system': 'Unknown',
+            'release': 'Unknown',
+        }
+
+    implementation_info = _implementation()
+    urllib3_info = {'version': urllib3.__version__}
+    chardet_info = {'version': chardet.__version__}
+
+    pyopenssl_info = {
+        'version': None,
+        'openssl_version': '',
+    }
+    if OpenSSL:
+        pyopenssl_info = {
+            'version': OpenSSL.__version__,
+            'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER,
+        }
+    cryptography_info = {
+        'version': getattr(cryptography, '__version__', ''),
+    }
+    idna_info = {
+        'version': getattr(idna, '__version__', ''),
+    }
+
+    system_ssl = ssl.OPENSSL_VERSION_NUMBER
+    system_ssl_info = {
+        'version': '%x' % system_ssl if system_ssl is not None else ''
+    }
+
+    return {
+        'platform': platform_info,
+        'implementation': implementation_info,
+        'system_ssl': system_ssl_info,
+        'using_pyopenssl': pyopenssl is not None,
+        'pyOpenSSL': pyopenssl_info,
+        'urllib3': urllib3_info,
+        'chardet': chardet_info,
+        'cryptography': cryptography_info,
+        'idna': idna_info,
+        'requests': {
+            'version': requests_version,
+        },
+    }
+
+
+def main():
+    """Pretty-print the bug information as JSON."""
+    print(json.dumps(info(), sort_keys=True, indent=2))
+
+
+if __name__ == '__main__':
+    main()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8801c9a0b1e132cb1a7f54a5de2d3ed8cfd28dc0
GIT binary patch
literal 3572
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py
new file mode 100644
index 00000000..7a51f212
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.hooks
+~~~~~~~~~~~~~~
+
+This module provides the capabilities for the Requests hooks system.
+
+Available hooks:
+
+``response``:
+    The response generated from a Request.
+"""
+HOOKS = ['response']
+
+
+def default_hooks():
+    return {event: [] for event in HOOKS}
+
+# TODO: response is the only one
+
+
+def dispatch_hook(key, hooks, hook_data, **kwargs):
+    """Dispatches a hook dictionary on a given piece of data."""
+    hooks = hooks or {}
+    hooks = hooks.get(key)
+    if hooks:
+        if hasattr(hooks, '__call__'):
+            hooks = [hooks]
+        for hook in hooks:
+            _hook_data = hook(hook_data, **kwargs)
+            if _hook_data is not None:
+                hook_data = _hook_data
+    return hook_data
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e4d9647beb72e01ff67104bc234c325569f2a0fa
GIT binary patch
literal 1398
zcmZSn%*&NH<x)&C0~9baFfceUFfbIWGB7ZtFfc?hFr+Xtq%$%^F*2kuF|;r+L@_a>
zFoPM)3@I!O!5XX}<r^6o7`Td33rkarON#X}^7FHcx#~~=7gtC|X0bwUeoARhszO0g
zepzNpYOz8|Myf(`VnJe3W=>{FW@@oQT7D5&FbHax0@yHx;>zNZ)LcC-F2}OO%$&re
zoK%Q}6&F`RLQ!gQL4ICwYC?h)mx6+VLP$oc0!&OHJvA@2D6u3pMIo&yKUX190cx@y
zR|y9L0|QJQJP4Q=7#N%x7#NEAKtaF=@@feKgG)0bL$C%&&Mz4hNFWvq0|P@aNTnnL
z14AYQLk$B%EI&gnBSSg^Lk%OtWG03}HilpgP|!jMkfst4p=VG63bxd;)Vvai6i88V
zE&~IDenC-YSz<}5epzCXep-G`N@`KDes-aLcCnGUxnW_Jk$IV+g?VvKWqNtMNs5Vy
zfq{WRdY*oWenDn|Zf0I_Nn%cpZh4|*X<!CO2#n*)Qu9*si}Ya;qz?{Ly@JYOE(Qh$
zo0QDtlH~l{0y`m)XF%@bWY7S466{D1e}8XePYjGpOL#%Ck(!oRno|-FcD^9Yu?&pK
z%nS?+YzzzxpcwH6iB~Xyqo9Bj6fd=mpy<c~M^G~(D1vGj8H!36O2FbNj10|83`I5|
zHR)j4JO+jeQxMlBR*RvQg`tLpp@xZ}hMA$4k)f8Ap@tQd6|y-Qikw00S|)}<XAla{
zV*sfO)&RMt*o=XJ!6mb}Ah9GlBehr|5u98VKtY|EpO;uvsgR$ikf@NJS(cioP>`9L
zoT`wYrjU|YlBfqxmhth)i8(p(@qS>_N<c=Yr<RnkGcYh@Bo-%@loXYKJnNUAm#P8s
zIaoz@Y9%<zz~NKE2~wM%pB)b}wFIOnyF9Tdy%?+!q@)BC`{2L?D;day2#H>3aDkm9
z4vIz*P-0`^VdQ6IW8`P#VdMpq0*rndAkTwCBR)PQKRG@=2oyp=AkiRx1_lO%U%)K-
a=PYm}+T?;uJ3CO?Ee1sZ8zUz(CmR67%VQJ(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py
new file mode 100644
index 00000000..08399574
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py
@@ -0,0 +1,953 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.models
+~~~~~~~~~~~~~~~
+
+This module contains the primary objects that power Requests.
+"""
+
+import datetime
+import sys
+
+# Import encoding now, to avoid implicit import later.
+# Implicit import within threads may cause LookupError when standard library is in a ZIP,
+# such as in Embedded Python. See https://github.com/requests/requests/issues/3578.
+import encodings.idna
+
+from pip._vendor.urllib3.fields import RequestField
+from pip._vendor.urllib3.filepost import encode_multipart_formdata
+from pip._vendor.urllib3.util import parse_url
+from pip._vendor.urllib3.exceptions import (
+    DecodeError, ReadTimeoutError, ProtocolError, LocationParseError)
+
+from io import UnsupportedOperation
+from .hooks import default_hooks
+from .structures import CaseInsensitiveDict
+
+from .auth import HTTPBasicAuth
+from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar
+from .exceptions import (
+    HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError,
+    ContentDecodingError, ConnectionError, StreamConsumedError)
+from ._internal_utils import to_native_string, unicode_is_ascii
+from .utils import (
+    guess_filename, get_auth_from_url, requote_uri,
+    stream_decode_response_unicode, to_key_val_list, parse_header_links,
+    iter_slices, guess_json_utf, super_len, check_header_validity)
+from .compat import (
+    Callable, Mapping,
+    cookielib, urlunparse, urlsplit, urlencode, str, bytes,
+    is_py2, chardet, builtin_str, basestring)
+from .compat import json as complexjson
+from .status_codes import codes
+
+#: The set of HTTP status codes that indicate an automatically
+#: processable redirect.
+REDIRECT_STATI = (
+    codes.moved,               # 301
+    codes.found,               # 302
+    codes.other,               # 303
+    codes.temporary_redirect,  # 307
+    codes.permanent_redirect,  # 308
+)
+
+DEFAULT_REDIRECT_LIMIT = 30
+CONTENT_CHUNK_SIZE = 10 * 1024
+ITER_CHUNK_SIZE = 512
+
+
+class RequestEncodingMixin(object):
+    @property
+    def path_url(self):
+        """Build the path URL to use."""
+
+        url = []
+
+        p = urlsplit(self.url)
+
+        path = p.path
+        if not path:
+            path = '/'
+
+        url.append(path)
+
+        query = p.query
+        if query:
+            url.append('?')
+            url.append(query)
+
+        return ''.join(url)
+
+    @staticmethod
+    def _encode_params(data):
+        """Encode parameters in a piece of data.
+
+        Will successfully encode parameters when passed as a dict or a list of
+        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
+        if parameters are supplied as a dict.
+        """
+
+        if isinstance(data, (str, bytes)):
+            return data
+        elif hasattr(data, 'read'):
+            return data
+        elif hasattr(data, '__iter__'):
+            result = []
+            for k, vs in to_key_val_list(data):
+                if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
+                    vs = [vs]
+                for v in vs:
+                    if v is not None:
+                        result.append(
+                            (k.encode('utf-8') if isinstance(k, str) else k,
+                             v.encode('utf-8') if isinstance(v, str) else v))
+            return urlencode(result, doseq=True)
+        else:
+            return data
+
+    @staticmethod
+    def _encode_files(files, data):
+        """Build the body for a multipart/form-data request.
+
+        Will successfully encode files when passed as a dict or a list of
+        tuples. Order is retained if data is a list of tuples but arbitrary
+        if parameters are supplied as a dict.
+        The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype)
+        or 4-tuples (filename, fileobj, contentype, custom_headers).
+        """
+        if (not files):
+            raise ValueError("Files must be provided.")
+        elif isinstance(data, basestring):
+            raise ValueError("Data must not be a string.")
+
+        new_fields = []
+        fields = to_key_val_list(data or {})
+        files = to_key_val_list(files or {})
+
+        for field, val in fields:
+            if isinstance(val, basestring) or not hasattr(val, '__iter__'):
+                val = [val]
+            for v in val:
+                if v is not None:
+                    # Don't call str() on bytestrings: in Py3 it all goes wrong.
+                    if not isinstance(v, bytes):
+                        v = str(v)
+
+                    new_fields.append(
+                        (field.decode('utf-8') if isinstance(field, bytes) else field,
+                         v.encode('utf-8') if isinstance(v, str) else v))
+
+        for (k, v) in files:
+            # support for explicit filename
+            ft = None
+            fh = None
+            if isinstance(v, (tuple, list)):
+                if len(v) == 2:
+                    fn, fp = v
+                elif len(v) == 3:
+                    fn, fp, ft = v
+                else:
+                    fn, fp, ft, fh = v
+            else:
+                fn = guess_filename(v) or k
+                fp = v
+
+            if isinstance(fp, (str, bytes, bytearray)):
+                fdata = fp
+            elif hasattr(fp, 'read'):
+                fdata = fp.read()
+            elif fp is None:
+                continue
+            else:
+                fdata = fp
+
+            rf = RequestField(name=k, data=fdata, filename=fn, headers=fh)
+            rf.make_multipart(content_type=ft)
+            new_fields.append(rf)
+
+        body, content_type = encode_multipart_formdata(new_fields)
+
+        return body, content_type
+
+
+class RequestHooksMixin(object):
+    def register_hook(self, event, hook):
+        """Properly register a hook."""
+
+        if event not in self.hooks:
+            raise ValueError('Unsupported event specified, with event name "%s"' % (event))
+
+        if isinstance(hook, Callable):
+            self.hooks[event].append(hook)
+        elif hasattr(hook, '__iter__'):
+            self.hooks[event].extend(h for h in hook if isinstance(h, Callable))
+
+    def deregister_hook(self, event, hook):
+        """Deregister a previously registered hook.
+        Returns True if the hook existed, False if not.
+        """
+
+        try:
+            self.hooks[event].remove(hook)
+            return True
+        except ValueError:
+            return False
+
+
+class Request(RequestHooksMixin):
+    """A user-created :class:`Request <Request>` object.
+
+    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.
+
+    :param method: HTTP method to use.
+    :param url: URL to send.
+    :param headers: dictionary of headers to send.
+    :param files: dictionary of {filename: fileobject} files to multipart upload.
+    :param data: the body to attach to the request. If a dictionary or
+        list of tuples ``[(key, value)]`` is provided, form-encoding will
+        take place.
+    :param json: json for the body to attach to the request (if files or data is not specified).
+    :param params: URL parameters to append to the URL. If a dictionary or
+        list of tuples ``[(key, value)]`` is provided, form-encoding will
+        take place.
+    :param auth: Auth handler or (user, pass) tuple.
+    :param cookies: dictionary or CookieJar of cookies to attach to this request.
+    :param hooks: dictionary of callback hooks, for internal usage.
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.Request('GET', 'https://httpbin.org/get')
+      >>> req.prepare()
+      <PreparedRequest [GET]>
+    """
+
+    def __init__(self,
+            method=None, url=None, headers=None, files=None, data=None,
+            params=None, auth=None, cookies=None, hooks=None, json=None):
+
+        # Default empty dicts for dict params.
+        data = [] if data is None else data
+        files = [] if files is None else files
+        headers = {} if headers is None else headers
+        params = {} if params is None else params
+        hooks = {} if hooks is None else hooks
+
+        self.hooks = default_hooks()
+        for (k, v) in list(hooks.items()):
+            self.register_hook(event=k, hook=v)
+
+        self.method = method
+        self.url = url
+        self.headers = headers
+        self.files = files
+        self.data = data
+        self.json = json
+        self.params = params
+        self.auth = auth
+        self.cookies = cookies
+
+    def __repr__(self):
+        return '<Request [%s]>' % (self.method)
+
+    def prepare(self):
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it."""
+        p = PreparedRequest()
+        p.prepare(
+            method=self.method,
+            url=self.url,
+            headers=self.headers,
+            files=self.files,
+            data=self.data,
+            json=self.json,
+            params=self.params,
+            auth=self.auth,
+            cookies=self.cookies,
+            hooks=self.hooks,
+        )
+        return p
+
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+    """The fully mutable :class:`PreparedRequest <PreparedRequest>` object,
+    containing the exact bytes that will be sent to the server.
+
+    Generated from either a :class:`Request <Request>` object or manually.
+
+    Usage::
+
+      >>> import requests
+      >>> req = requests.Request('GET', 'https://httpbin.org/get')
+      >>> r = req.prepare()
+      <PreparedRequest [GET]>
+
+      >>> s = requests.Session()
+      >>> s.send(r)
+      <Response [200]>
+    """
+
+    def __init__(self):
+        #: HTTP verb to send to the server.
+        self.method = None
+        #: HTTP URL to send the request to.
+        self.url = None
+        #: dictionary of HTTP headers.
+        self.headers = None
+        # The `CookieJar` used to create the Cookie header will be stored here
+        # after prepare_cookies is called
+        self._cookies = None
+        #: request body to send to the server.
+        self.body = None
+        #: dictionary of callback hooks, for internal usage.
+        self.hooks = default_hooks()
+        #: integer denoting starting position of a readable file-like body.
+        self._body_position = None
+
+    def prepare(self,
+            method=None, url=None, headers=None, files=None, data=None,
+            params=None, auth=None, cookies=None, hooks=None, json=None):
+        """Prepares the entire request with the given parameters."""
+
+        self.prepare_method(method)
+        self.prepare_url(url, params)
+        self.prepare_headers(headers)
+        self.prepare_cookies(cookies)
+        self.prepare_body(data, files, json)
+        self.prepare_auth(auth, url)
+
+        # Note that prepare_auth must be last to enable authentication schemes
+        # such as OAuth to work on a fully prepared request.
+
+        # This MUST go after prepare_auth. Authenticators could add a hook
+        self.prepare_hooks(hooks)
+
+    def __repr__(self):
+        return '<PreparedRequest [%s]>' % (self.method)
+
+    def copy(self):
+        p = PreparedRequest()
+        p.method = self.method
+        p.url = self.url
+        p.headers = self.headers.copy() if self.headers is not None else None
+        p._cookies = _copy_cookie_jar(self._cookies)
+        p.body = self.body
+        p.hooks = self.hooks
+        p._body_position = self._body_position
+        return p
+
+    def prepare_method(self, method):
+        """Prepares the given HTTP method."""
+        self.method = method
+        if self.method is not None:
+            self.method = to_native_string(self.method.upper())
+
+    @staticmethod
+    def _get_idna_encoded_host(host):
+        from pip._vendor import idna
+
+        try:
+            host = idna.encode(host, uts46=True).decode('utf-8')
+        except idna.IDNAError:
+            raise UnicodeError
+        return host
+
+    def prepare_url(self, url, params):
+        """Prepares the given HTTP URL."""
+        #: Accept objects that have string representations.
+        #: We're unable to blindly call unicode/str functions
+        #: as this will include the bytestring indicator (b'')
+        #: on python 3.x.
+        #: https://github.com/requests/requests/pull/2238
+        if isinstance(url, bytes):
+            url = url.decode('utf8')
+        else:
+            url = unicode(url) if is_py2 else str(url)
+
+        # Remove leading whitespaces from url
+        url = url.lstrip()
+
+        # Don't do any URL preparation for non-HTTP schemes like `mailto`,
+        # `data` etc to work around exceptions from `url_parse`, which
+        # handles RFC 3986 only.
+        if ':' in url and not url.lower().startswith('http'):
+            self.url = url
+            return
+
+        # Support for unicode domain names and paths.
+        try:
+            scheme, auth, host, port, path, query, fragment = parse_url(url)
+        except LocationParseError as e:
+            raise InvalidURL(*e.args)
+
+        if not scheme:
+            error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?")
+            error = error.format(to_native_string(url, 'utf8'))
+
+            raise MissingSchema(error)
+
+        if not host:
+            raise InvalidURL("Invalid URL %r: No host supplied" % url)
+
+        # In general, we want to try IDNA encoding the hostname if the string contains
+        # non-ASCII characters. This allows users to automatically get the correct IDNA
+        # behaviour. For strings containing only ASCII characters, we need to also verify
+        # it doesn't start with a wildcard (*), before allowing the unencoded hostname.
+        if not unicode_is_ascii(host):
+            try:
+                host = self._get_idna_encoded_host(host)
+            except UnicodeError:
+                raise InvalidURL('URL has an invalid label.')
+        elif host.startswith(u'*'):
+            raise InvalidURL('URL has an invalid label.')
+
+        # Carefully reconstruct the network location
+        netloc = auth or ''
+        if netloc:
+            netloc += '@'
+        netloc += host
+        if port:
+            netloc += ':' + str(port)
+
+        # Bare domains aren't valid URLs.
+        if not path:
+            path = '/'
+
+        if is_py2:
+            if isinstance(scheme, str):
+                scheme = scheme.encode('utf-8')
+            if isinstance(netloc, str):
+                netloc = netloc.encode('utf-8')
+            if isinstance(path, str):
+                path = path.encode('utf-8')
+            if isinstance(query, str):
+                query = query.encode('utf-8')
+            if isinstance(fragment, str):
+                fragment = fragment.encode('utf-8')
+
+        if isinstance(params, (str, bytes)):
+            params = to_native_string(params)
+
+        enc_params = self._encode_params(params)
+        if enc_params:
+            if query:
+                query = '%s&%s' % (query, enc_params)
+            else:
+                query = enc_params
+
+        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
+        self.url = url
+
+    def prepare_headers(self, headers):
+        """Prepares the given HTTP headers."""
+
+        self.headers = CaseInsensitiveDict()
+        if headers:
+            for header in headers.items():
+                # Raise exception on invalid header value.
+                check_header_validity(header)
+                name, value = header
+                self.headers[to_native_string(name)] = value
+
+    def prepare_body(self, data, files, json=None):
+        """Prepares the given HTTP body data."""
+
+        # Check if file, fo, generator, iterator.
+        # If not, run through normal process.
+
+        # Nottin' on you.
+        body = None
+        content_type = None
+
+        if not data and json is not None:
+            # urllib3 requires a bytes-like body. Python 2's json.dumps
+            # provides this natively, but Python 3 gives a Unicode string.
+            content_type = 'application/json'
+            body = complexjson.dumps(json)
+            if not isinstance(body, bytes):
+                body = body.encode('utf-8')
+
+        is_stream = all([
+            hasattr(data, '__iter__'),
+            not isinstance(data, (basestring, list, tuple, Mapping))
+        ])
+
+        try:
+            length = super_len(data)
+        except (TypeError, AttributeError, UnsupportedOperation):
+            length = None
+
+        if is_stream:
+            body = data
+
+            if getattr(body, 'tell', None) is not None:
+                # Record the current file position before reading.
+                # This will allow us to rewind a file in the event
+                # of a redirect.
+                try:
+                    self._body_position = body.tell()
+                except (IOError, OSError):
+                    # This differentiates from None, allowing us to catch
+                    # a failed `tell()` later when trying to rewind the body
+                    self._body_position = object()
+
+            if files:
+                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')
+
+            if length:
+                self.headers['Content-Length'] = builtin_str(length)
+            else:
+                self.headers['Transfer-Encoding'] = 'chunked'
+        else:
+            # Multi-part file uploads.
+            if files:
+                (body, content_type) = self._encode_files(files, data)
+            else:
+                if data:
+                    body = self._encode_params(data)
+                    if isinstance(data, basestring) or hasattr(data, 'read'):
+                        content_type = None
+                    else:
+                        content_type = 'application/x-www-form-urlencoded'
+
+            self.prepare_content_length(body)
+
+            # Add content-type if it wasn't explicitly provided.
+            if content_type and ('content-type' not in self.headers):
+                self.headers['Content-Type'] = content_type
+
+        self.body = body
+
+    def prepare_content_length(self, body):
+        """Prepare Content-Length header based on request method and body"""
+        if body is not None:
+            length = super_len(body)
+            if length:
+                # If length exists, set it. Otherwise, we fallback
+                # to Transfer-Encoding: chunked.
+                self.headers['Content-Length'] = builtin_str(length)
+        elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None:
+            # Set Content-Length to 0 for methods that can have a body
+            # but don't provide one. (i.e. not GET or HEAD)
+            self.headers['Content-Length'] = '0'
+
+    def prepare_auth(self, auth, url=''):
+        """Prepares the given HTTP auth data."""
+
+        # If no Auth is explicitly provided, extract it from the URL first.
+        if auth is None:
+            url_auth = get_auth_from_url(self.url)
+            auth = url_auth if any(url_auth) else None
+
+        if auth:
+            if isinstance(auth, tuple) and len(auth) == 2:
+                # special-case basic HTTP auth
+                auth = HTTPBasicAuth(*auth)
+
+            # Allow auth to make its changes.
+            r = auth(self)
+
+            # Update self to reflect the auth changes.
+            self.__dict__.update(r.__dict__)
+
+            # Recompute Content-Length
+            self.prepare_content_length(self.body)
+
+    def prepare_cookies(self, cookies):
+        """Prepares the given HTTP cookie data.
+
+        This function eventually generates a ``Cookie`` header from the
+        given cookies using cookielib. Due to cookielib's design, the header
+        will not be regenerated if it already exists, meaning this function
+        can only be called once for the life of the
+        :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls
+        to ``prepare_cookies`` will have no actual effect, unless the "Cookie"
+        header is removed beforehand.
+        """
+        if isinstance(cookies, cookielib.CookieJar):
+            self._cookies = cookies
+        else:
+            self._cookies = cookiejar_from_dict(cookies)
+
+        cookie_header = get_cookie_header(self._cookies, self)
+        if cookie_header is not None:
+            self.headers['Cookie'] = cookie_header
+
+    def prepare_hooks(self, hooks):
+        """Prepares the given hooks."""
+        # hooks can be passed as None to the prepare method and to this
+        # method. To prevent iterating over None, simply use an empty list
+        # if hooks is False-y
+        hooks = hooks or []
+        for event in hooks:
+            self.register_hook(event, hooks[event])
+
+
+class Response(object):
+    """The :class:`Response <Response>` object, which contains a
+    server's response to an HTTP request.
+    """
+
+    __attrs__ = [
+        '_content', 'status_code', 'headers', 'url', 'history',
+        'encoding', 'reason', 'cookies', 'elapsed', 'request'
+    ]
+
+    def __init__(self):
+        self._content = False
+        self._content_consumed = False
+        self._next = None
+
+        #: Integer Code of responded HTTP Status, e.g. 404 or 200.
+        self.status_code = None
+
+        #: Case-insensitive Dictionary of Response Headers.
+        #: For example, ``headers['content-encoding']`` will return the
+        #: value of a ``'Content-Encoding'`` response header.
+        self.headers = CaseInsensitiveDict()
+
+        #: File-like object representation of response (for advanced usage).
+        #: Use of ``raw`` requires that ``stream=True`` be set on the request.
+        # This requirement does not apply for use internally to Requests.
+        self.raw = None
+
+        #: Final URL location of Response.
+        self.url = None
+
+        #: Encoding to decode with when accessing r.text.
+        self.encoding = None
+
+        #: A list of :class:`Response <Response>` objects from
+        #: the history of the Request. Any redirect responses will end
+        #: up here. The list is sorted from the oldest to the most recent request.
+        self.history = []
+
+        #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK".
+        self.reason = None
+
+        #: A CookieJar of Cookies the server sent back.
+        self.cookies = cookiejar_from_dict({})
+
+        #: The amount of time elapsed between sending the request
+        #: and the arrival of the response (as a timedelta).
+        #: This property specifically measures the time taken between sending
+        #: the first byte of the request and finishing parsing the headers. It
+        #: is therefore unaffected by consuming the response content or the
+        #: value of the ``stream`` keyword argument.
+        self.elapsed = datetime.timedelta(0)
+
+        #: The :class:`PreparedRequest <PreparedRequest>` object to which this
+        #: is a response.
+        self.request = None
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+    def __getstate__(self):
+        # Consume everything; accessing the content attribute makes
+        # sure the content has been fully read.
+        if not self._content_consumed:
+            self.content
+
+        return {attr: getattr(self, attr, None) for attr in self.__attrs__}
+
+    def __setstate__(self, state):
+        for name, value in state.items():
+            setattr(self, name, value)
+
+        # pickled objects do not have .raw
+        setattr(self, '_content_consumed', True)
+        setattr(self, 'raw', None)
+
+    def __repr__(self):
+        return '<Response [%s]>' % (self.status_code)
+
+    def __bool__(self):
+        """Returns True if :attr:`status_code` is less than 400.
+
+        This attribute checks if the status code of the response is between
+        400 and 600 to see if there was a client error or a server error. If
+        the status code, is between 200 and 400, this will return True. This
+        is **not** a check to see if the response code is ``200 OK``.
+        """
+        return self.ok
+
+    def __nonzero__(self):
+        """Returns True if :attr:`status_code` is less than 400.
+
+        This attribute checks if the status code of the response is between
+        400 and 600 to see if there was a client error or a server error. If
+        the status code, is between 200 and 400, this will return True. This
+        is **not** a check to see if the response code is ``200 OK``.
+        """
+        return self.ok
+
+    def __iter__(self):
+        """Allows you to use a response as an iterator."""
+        return self.iter_content(128)
+
+    @property
+    def ok(self):
+        """Returns True if :attr:`status_code` is less than 400, False if not.
+
+        This attribute checks if the status code of the response is between
+        400 and 600 to see if there was a client error or a server error. If
+        the status code is between 200 and 400, this will return True. This
+        is **not** a check to see if the response code is ``200 OK``.
+        """
+        try:
+            self.raise_for_status()
+        except HTTPError:
+            return False
+        return True
+
+    @property
+    def is_redirect(self):
+        """True if this Response is a well-formed HTTP redirect that could have
+        been processed automatically (by :meth:`Session.resolve_redirects`).
+        """
+        return ('location' in self.headers and self.status_code in REDIRECT_STATI)
+
+    @property
+    def is_permanent_redirect(self):
+        """True if this Response one of the permanent versions of redirect."""
+        return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect))
+
+    @property
+    def next(self):
+        """Returns a PreparedRequest for the next request in a redirect chain, if there is one."""
+        return self._next
+
+    @property
+    def apparent_encoding(self):
+        """The apparent encoding, provided by the chardet library."""
+        return chardet.detect(self.content)['encoding']
+
+    def iter_content(self, chunk_size=1, decode_unicode=False):
+        """Iterates over the response data.  When stream=True is set on the
+        request, this avoids reading the content at once into memory for
+        large responses.  The chunk size is the number of bytes it should
+        read into memory.  This is not necessarily the length of each item
+        returned as decoding can take place.
+
+        chunk_size must be of type int or None. A value of None will
+        function differently depending on the value of `stream`.
+        stream=True will read data as it arrives in whatever size the
+        chunks are received. If stream=False, data is returned as
+        a single chunk.
+
+        If decode_unicode is True, content will be decoded using the best
+        available encoding based on the response.
+        """
+
+        def generate():
+            # Special case for urllib3.
+            if hasattr(self.raw, 'stream'):
+                try:
+                    for chunk in self.raw.stream(chunk_size, decode_content=True):
+                        yield chunk
+                except ProtocolError as e:
+                    raise ChunkedEncodingError(e)
+                except DecodeError as e:
+                    raise ContentDecodingError(e)
+                except ReadTimeoutError as e:
+                    raise ConnectionError(e)
+            else:
+                # Standard file-like object.
+                while True:
+                    chunk = self.raw.read(chunk_size)
+                    if not chunk:
+                        break
+                    yield chunk
+
+            self._content_consumed = True
+
+        if self._content_consumed and isinstance(self._content, bool):
+            raise StreamConsumedError()
+        elif chunk_size is not None and not isinstance(chunk_size, int):
+            raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size))
+        # simulate reading small chunks of the content
+        reused_chunks = iter_slices(self._content, chunk_size)
+
+        stream_chunks = generate()
+
+        chunks = reused_chunks if self._content_consumed else stream_chunks
+
+        if decode_unicode:
+            chunks = stream_decode_response_unicode(chunks, self)
+
+        return chunks
+
+    def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None):
+        """Iterates over the response data, one line at a time.  When
+        stream=True is set on the request, this avoids reading the
+        content at once into memory for large responses.
+
+        .. note:: This method is not reentrant safe.
+        """
+
+        pending = None
+
+        for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
+
+            if pending is not None:
+                chunk = pending + chunk
+
+            if delimiter:
+                lines = chunk.split(delimiter)
+            else:
+                lines = chunk.splitlines()
+
+            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:
+                pending = lines.pop()
+            else:
+                pending = None
+
+            for line in lines:
+                yield line
+
+        if pending is not None:
+            yield pending
+
+    @property
+    def content(self):
+        """Content of the response, in bytes."""
+
+        if self._content is False:
+            # Read the contents.
+            if self._content_consumed:
+                raise RuntimeError(
+                    'The content for this response was already consumed')
+
+            if self.status_code == 0 or self.raw is None:
+                self._content = None
+            else:
+                self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
+
+        self._content_consumed = True
+        # don't need to release the connection; that's been handled by urllib3
+        # since we exhausted the data.
+        return self._content
+
+    @property
+    def text(self):
+        """Content of the response, in unicode.
+
+        If Response.encoding is None, encoding will be guessed using
+        ``chardet``.
+
+        The encoding of the response content is determined based solely on HTTP
+        headers, following RFC 2616 to the letter. If you can take advantage of
+        non-HTTP knowledge to make a better guess at the encoding, you should
+        set ``r.encoding`` appropriately before accessing this property.
+        """
+
+        # Try charset from content-type
+        content = None
+        encoding = self.encoding
+
+        if not self.content:
+            return str('')
+
+        # Fallback to auto-detected encoding.
+        if self.encoding is None:
+            encoding = self.apparent_encoding
+
+        # Decode unicode from given encoding.
+        try:
+            content = str(self.content, encoding, errors='replace')
+        except (LookupError, TypeError):
+            # A LookupError is raised if the encoding was not found which could
+            # indicate a misspelling or similar mistake.
+            #
+            # A TypeError can be raised if encoding is None
+            #
+            # So we try blindly encoding.
+            content = str(self.content, errors='replace')
+
+        return content
+
+    def json(self, **kwargs):
+        r"""Returns the json-encoded content of a response, if any.
+
+        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
+        :raises ValueError: If the response body does not contain valid json.
+        """
+
+        if not self.encoding and self.content and len(self.content) > 3:
+            # No encoding set. JSON RFC 4627 section 3 states we should expect
+            # UTF-8, -16 or -32. Detect which one to use; If the detection or
+            # decoding fails, fall back to `self.text` (using chardet to make
+            # a best guess).
+            encoding = guess_json_utf(self.content)
+            if encoding is not None:
+                try:
+                    return complexjson.loads(
+                        self.content.decode(encoding), **kwargs
+                    )
+                except UnicodeDecodeError:
+                    # Wrong UTF codec detected; usually because it's not UTF-8
+                    # but some other 8-bit codec.  This is an RFC violation,
+                    # and the server didn't bother to tell us what codec *was*
+                    # used.
+                    pass
+        return complexjson.loads(self.text, **kwargs)
+
+    @property
+    def links(self):
+        """Returns the parsed header links of the response, if any."""
+
+        header = self.headers.get('link')
+
+        # l = MultiDict()
+        l = {}
+
+        if header:
+            links = parse_header_links(header)
+
+            for link in links:
+                key = link.get('rel') or link.get('url')
+                l[key] = link
+
+        return l
+
+    def raise_for_status(self):
+        """Raises stored :class:`HTTPError`, if one occurred."""
+
+        http_error_msg = ''
+        if isinstance(self.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. (See PR #3538)
+            try:
+                reason = self.reason.decode('utf-8')
+            except UnicodeDecodeError:
+                reason = self.reason.decode('iso-8859-1')
+        else:
+            reason = self.reason
+
+        if 400 <= self.status_code < 500:
+            http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url)
+
+        elif 500 <= self.status_code < 600:
+            http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url)
+
+        if http_error_msg:
+            raise HTTPError(http_error_msg, response=self)
+
+    def close(self):
+        """Releases the connection back to the pool. Once this method has been
+        called the underlying ``raw`` object must not be accessed again.
+
+        *Note: Should not normally need to be called explicitly.*
+        """
+        if not self._content_consumed:
+            self.raw.close()
+
+        release_conn = getattr(self.raw, 'release_conn', None)
+        if release_conn is not None:
+            release_conn()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bec49caea8b45c2fc22adca6d890857c77724dc2
GIT binary patch
literal 31856
zcmZSn%*&NH<x)&C0~D|_FfceUFfbH%GBGfuFfc?hFr+Xtq%bk$Ffv3j!q`j<QA{v4
zGeZ;$n9a<P!^)7$#t_BEzzEXA!jQwxkjudk#R1{7GURYF<Z>}YaY6WO3_08kxjYO}
zJPf(K3{kucxqJ*!d<?n#3{m_L73>T-0t~r=3{ip%j42!pDVz*BLJYaW3{k=mJ{Lod
z2t%$YLzF0l&&`k{#*iz{5G4-b^DyK{Fyu-yL`gE_N-;!9G2}`!L`g&Bco}kJ7;<G9
zqGTCz<rt#m7;@zqqU0HJ6&Ruv7;+UEq7)f&l^CLw7;=>vqLd+e_!x3j7;;q^qEs1j
z)fl4GAfo&XIqD3#8Vpey47r*NQJM_7S`1NI47u72QQ8c-It)=d47s`tQMwGddJIu|
z47vIYQThzI1`JUK47r93QHBsx1Q>FR7;=pnqKp}GO&Fp~7;;S+qD&cb%^0H07;?=S
zqRbg`Ef}IK7;-HcqAVG5tr()L7;>!{qO2KmZ5X0#7;<eHqHGy*?HHo$ASMceO|)l-
za)9uK7;+pLa-A5WoER8Wofxv589<~9m~;h`ZeY@#A&r$G%7Y<Am?6rOAw`5CMU+7#
z%8MaIj3LUKAw`@a)rTRCks(Ebp@o5=nSmiP%9kNU5+*7I7xiOEk!DEs1FMyRi~2L9
z$TFn*f+d(3Qsm$g0SqbfFhdmJqJf~a7p$QON|Ff-3=CXFsfDGf#U;ghx%nxnImKLc
zsDO(rBqOs}AvZszG$&OdIX|x?F*C1Np(G<!p`a);H?gQvAwMZAHMs;NmRO=tkYAo!
zq!0u%lq>W9|NsB}G#D8e7)p2;7#N^3Zkee$DG*Uf1_p-IyyX0p)cD-eoRZ9f#G;b;
zwEUvnl*E!mh!Rc)28M#fqT<x}(xMy<7LZxo3=9k|sUTghMMe2VB?4fx6H`Jmb5rw6
zOCW;03=9kbMfoN9$@w`D5g`T!2A}-o#FEVXya14iU}1<YA`A=+p?Srn1qJy<C8;U?
z1*t_~b(tW?LzI9FOi4{kEX^s2&&bcuE`|sTGcYhXCl;rA<`t*r6=#-YmZiF6CYL}Y
zL3%twLIRu;i!+lQOG`2|m_Z%@=}FGd&(2KEN-T;`E6UG}PsvO!DG_8~U`S6biHFF=
zXQU>kq(ZzGpPXM%2@}ssEYe^HnF9(Nknv!Tlz=Sr%`7g?%u5eW&PdHoEa75cVDQW<
zOU%hk2@Uco0eR9nqckr&HN_Pa=$U!x5S?I&{JfIXyb^G@!X@}Yp3Be6OHBp^8bmS3
z@xdiUsfoGH`FX{qxv42&aSbMri$GCPk{_R!2nvVz;*z4wymWB<l;&lEA}l_$I6kpB
zIWtoO<hBw%kcUfCi;LsaGILV%5_41GVUSo_k^u>t(xRLaP?UpGYkmnR9b}fsfzmM8
z5%DSDln`H(T3nEy2TCRon@T`#FUgP3POXeDOU#MS$t*4@0VM%QVuFNid`@Owb}`uW
z%#zfi_~M+*<kVs$XJr-V=f#(nq?Lezy129;wJ1I(HLpaJfq@}8BQ-f28b=@-GE*{3
zDm6gqyo3W3Y>7EJiAg!BC7_t{O)Mw?g#^eHNaW^ZCV``;v?!-E59}ncuF|5M;)0ya
z60m)xMLCenQ36Ue#U({0pc*BqvLv;*gpGlLA+tEXpwb9zL2^c7QA%nF*e6M)nK>ny
zd7#h-TalDloC=8vNTLMgA&|cyJdlx~m?_Q#g=r=zS~3|}7#K1cm>3wqNd}s2VM)d}
zvm!GOUdMrA-3b&Krl73M0IJtgnLw2ts61n2h+<|)1=na$E-RSJ1TK;oLA6^@FgQyj
zgYp^3DIoKlLFN^Mk_H1qEh9q-149i1Llz@LGb2MS6GIIXLlzT5Ei*$6Gefa1sJ5(S
zX2@e;s9|Kt0t+@XGBAP^u`txKFx0Rx6s1AsQkXzSFhUiwfH`>#3@OYES*#!>&5R7e
z;1Z@-ih+T_sWdYu1ya~0mSiY|2KgwI<SUdGr|Ok}9IFo|?Mpy)y#^>Yf>c2n02EW8
z1Pcn}g2a*xa6}~*6r|>*fMc()G_|O*1SFf4pP8ot@-moLoSKssWDGI^WOzZ438+jn
zV_;y=09ybeit`v481xH@GRqQ6QuWIci}cg-b5c@^iuJP#^|OnO%*_o8vy9Bk3@yxy
zb1Kuz<4sabObiSR4AS%TL-Y$W3v@H{ic1o6a&*fRElUG4Ktf;~UzVDel3%0`%3z@C
zKp#>a=oM6g(<I0npu*P{6fI&Pm$0xg@iTEUvN3Wp@q%eyMgb;x6oL{wI0^+A8K99@
z!pKm<#E{0s(9Fb8BngVn;1XsKmBI)X(gCqyLJ(CPjOpOmuh_y+!UB?RW@K=QUB(c@
z1WE+8%wUt58A@0|1{7B^fXrhCRdCHr3_L}xpwyAh2udb-3=9=HAg)Vn3N%Heurg$G
zG8FZIB0Y;8Y!VYg3B)OfzzK{4lq#AT8S<DxTu=&Rfhl+lN>f?L3Ru8CV`N|~>|rSE
zVF)kuV+b$d1R0*f!cfA+(9FmfT*JT+oWjZw3{EP=e;61T!1*avp&+pcRP3b|6)R-s
zDI_WsWTqykD&(grfT}<}E-nQq2+z#PQ7A4=PEIW@PAkpHsZ@ZJ4af$RXQbvS6eJcG
zr=}<*7AqtwfNB+m{33-!1yJ#)ke>!O&PcbUv>+$7SWm&fC?&N>A+uPaC>2z{r=}=m
zLM#V~!8IztG$<sMmMA0^C1sWrB^Fh}&C5(fc1U7TssgAo&B;V|i5^@vILQ~KCZ>QB
zSbRLV@Qp79<%ZIdG+hgDR!PY(PA&A);09$1aIsVjPQQ7{sX^+X+@S%I0427J#Nxz~
zlA<7Kkf;tw6qLXG^7B%IK&28m3qk@bNDU?%QdF9X$bF!&1}iH{EiTO|0cY*(5>Q!G
zRt)Bpfh>dM#ev9%pn5VM;)Qr{f+-FHWkv;1X5<uQWMSk7V>U)fMtMdaMqWl9Mm9!8
zMq^O61o;9~ErWs(oGsg#zy)ftC@A5BG9V*E6C*>O94LX;fHNv6ml}g*!6hb0mVp73
z9htz{jFF+hl_8S>RDOc;Au}j<7KFn@7#J$fK(gBraAsv;sAUBk%?c_5nwc1i`@uPy
z6`aLDnRPZp4J!jEv$BH9@ro`G*Cn=zp_YxIhK(VG7o1rafz4oJC}9I<_)82W>>ycC
zoxldt1}gD6z-m~aYKp#rb1El83b?2TWo2+Cu3-b|1^H2&v4)Kyiwj8s8$2s7Vklh1
z5MG$V5ME)!Si`{J5^KT;Dtp*L&Pw5BsO12;td<jOB^yHtH>iyZE#Y=CmheIy2P$fq
z7>XJ}Hi5KrG1PK16kbA7z{Zfx#89*ptbm!J7ObF_1Ei*gjUk2wAyUi9kSD=V!Ur|E
z;3Q)WJ4m*M4P<5sBSQ^0$YUjJ3?=*wY0RKtD*DV=!_833!;ohN4s&jX6n3z<AX5!D
zLzV!j%K?&=0O<t<GzUYGGE<>3V;&nwq?U)FM35ncgQ12U)M2dQVMyU(sNrHr;by4e
zWN2n!spVy;;bq7YVo2d(sNrB}W?%%@yc{4=P&Hg=%otuG3@SpK8NrExkD->Ip@xs4
zh94Br!5W~1UA&YLxwcKpPpMQ$0~cEGK7l@{PoN9Rr3%nWikOlS)TS&}AfZqsu}Fj{
zr%Hhsl98$aH7+-?QXwf7QQm5Rya8$&>nMO&`AJ!tIts?n;#&bzRtMZuOU)~(EJ)Ra
zm$>;w3MRzq(NRb)EiTE=g*I)AH4(*ju{Z+*gIi`!YOz9YX>ke2nFU4pWtl0dDSF^G
zlS^VrB19@LA1s}y0BL#Z1=)ZKEO-H*2`ZH`L5-y#YgmyC@?#LFgaTIzAish{z|C7o
zYrPoUiv;yUQ}asVLH_g80Cio!t=zE0oYGWqPbA0=Ru4dG1bYw{G!7F4D#Rgm2fSW@
z^d5p7L5={q4jc*K>Iqb1f*amBsd+&lkAvIfpw@R{QBh(g*xjH~7?dL!7;+P{k@~Pf
zphlbqsMH15WFWs3L%aqmh4WI&<I_N$U`R6_$^_XCW`Zp(OUwy!2RYmo<T6lbrImmy
zq_hkOl?R~;AQphK23Vjd4eWSOCJOQy@a7|^OA4#Ez=4npN(BL+YKx1Fkskz^*cgQv
zg_wk46&DjfBR><k@?sKZVq;`u6lD}*<Oiz}WfEd!W0GLx1nC1+aZGGXii`q`f=oh8
zkPb1Z;}stdN;dKF;8YPGp9>znh>r&+s)C~Yg4Cjt${;IHsPcduQ<7McnVg$il98Vh
z<N*qB(8vfVp+IVTFlzv+{2+Y>1_p4R0rf4|82Lr{rAt8L1JK@>2WSKWwJQcnbKtI+
z6uc{z!T{=NLB<zb7(l(TpkQ!EJsFhsU>KC=ifb6aT_{jbi-94VouNnxRI{Zpf|{{n
z&5$Mn1E>bC0XG6b)u#uj;?DwWlgwg)mhy~w2B1cH4HL92UQ~gsiValhw=jUzx-^4(
zbc~=L7z;x%xG`1?8W0KqM^a9uLQ!gZW^qX>sQC&SaM3F^L>;A3NG(gvD^VyeNKMX6
z%S=ttQ7F$W$$*N25`lt}YOxZy<N<e1K)DFiG6Z!ki&a4WWnhSvf^{(&LH-4Kiy7qQ
zFvdb=P&YOh+)MTY2O6YcQ3T~GkWt|Lre^?dA7+5l378mw#8M0zSFlM>%}cE)D6-oD
zO4c9;vN8BUvIVGU0fk_3kS{2OgUd&dH^9x~AW-=TZv3WJl%(dRfcxV?7N86Q(gzM>
zaG3%!0qjFCF#z5Kk8r^f1$Yc@J;<w|Y|OyS&nV2q&nV8w&j?T3Am@YAHmJ0(ltE61
zjGz<<YN3=cF$9O_2{EvgFf(LxF%%gvFfuZhurLHiq%bl-@=9?gc)Ss2F{qDLlv<XV
zUs{ZmMpIK1K;eU^D}z!?N{jM}6+j&gP>%{UY6?=JkXivs)G0a&ZizX?sUWGm{1Svd
zKX66}$^eBwDC-xc=H{2B27xj*IQGEhJy<IuqJpwO(V7iPn4qF{z~Toq<d%{O3n*|5
z?E=LRsM2F#Wo8s%<Y44w1P`$UC4!us1R`=kL_Uh+2g(OQsSFGZ>p)Hhl@n}?oZR5%
z2eizE4|;KfhKE3^Ks9tKc+d+py~70RNTjgfCK(x8xWF?!-~q5Ga1RJnEVD5LLCe2t
z76t}K&>&NhZgNp-Vo7R>f>m-(VsWum0@M)-Hc*CL0(A5p+7u22_4-Tl6$*+{3qbwv
zM7YiXh)4=lqk;{ZfL(%)LU~4Jat5f!UkoZzOY*@3U&X0KWvN9_^R2)gPX$O-X{7)f
zcZPCc<6_{(CRABzQH~XC%&a&yF9njop_0(%oE3O{A~Qb^Jd=>702KxqhoJ@BdO+7u
z4H5+v^j5H@acXi&Etp*lG6mj$P$(_P$xlRe1gObm1@<PWu>?|{SW=RhoB?8iGApd3
zq2QSY9Z7+?v<U1`(6|h!jR+d60k;~96%rDnHL_DHbri}#jZw|mgalBC!kWlBpk7U`
zF1Q<?nU}6mo|%&aH>o5sJ5`||Cowq{C8R*(v{nir5~P{1YZWvy)1dy(F9HuCfm{G;
zjKgb5XnP(S72rrMhC~&Zomv7KiYm!hfDBr~LL)TDM{htw0yH0Br2v{kQOHQlOUX$s
z0u5|wloqEJ>43+)G$9=*l;DGmwHKqNn<52g@Z5`6Vi73rplU!KMNR<V0Wt9O7>bFY
zA{@=UG==2EoSdY@<ZN&iPz;V|h0MH?)S|q^9EH;2#Pn2X9ts7qt*l_9dUkep3Yoc}
zDJNLBwiucqKr%(Cg$lNC2|Z};)lheL4N=!oP|qkSDJZtm*9Xx_nR$BoMd|wKsU_;L
zJ|ENwJ!pBL0TV~h{R+|Ut|75@V2hJMB^#*G4yt*;Ri_Xm186uVg@GZPgP}+WGztV7
zNMQvH>eR4+T1X&qEtoiD%pKfv0*O0;28BTCnL#75purr7IZ-fiHqdBF4JXW;BA7TQ
z17u{S89Y=K&%{t+1|E9iWXNIx4O)N)gO$KT3gGb#P_va4G#60A4QhAR@GvwpFfkTR
zX9%xh1l9ZTY@iCihJhiT9W*utVsL;)hd>NYkOx5w@Yn{3!3`Q>0Wo+$BOf3JFKBoJ
z#NY!t6*6bxhg9u?YQ7+F9~0CC0oUF^0iY@z)CS2cNzE+|0#$S1W)`Fb1rPQId4uY{
z5D)<h?I2x{7EsuOvtlv0*#%1Y;93ZpP&GjD18$!M6@fH@CJoTd0kv?0KvNSzr647s
z#st{xAW&}-+^+=JuwY^!8gigOijU9C%PfhHe*~&Xl|bzlRtZKZWa43zXOv>%WJHDF
zRy?Si18UuZ0<0L6UO{~n28JvK1~Eu`&94|VssyVh6{1y(W9`7LcyM?@SfJ)D*!N&!
z;DVqiwV)_I{x>KHKz?Fi1bY$01Whr5y;ulJ6X3-GwcyTJ7I@_dD8YlfSRe*7s8<DI
zfZHA*1}j4fD=6J(u`#5uff?+ep+Arm2Y5h_fgy_%Jf_D09suP6tKnv7X5a$Nj|GEA
z-HRhY^O*U0#U(|hph<pGS`?7#swgq9I2SY}ou8+Wn3n>YVgNUaGfVWqk%2Q41Yt?R
zkhxV*PD5+IfO7}5m?OhjP-sK)lO;+cbO2ICP$dHc!#_}J0QKP+FfsrnJ8&^U`gMpl
zG&ls}<5TjJ<KrR4P#GxSmxBn9k>FI0AO^x`1q=)f$3Q*<bq3g^*qHelCB!+IgDOB%
z>7d*X!l3L7>gg1(MIORH9=}N8XTXP;z%6W~hII-Hcm#wUlpjD%Z4QQ1PEeMB&PQ{B
zas^178<Z<R3?8ugoD40Dpk-7kTwv{dpds%R9<U%kLkcfgP=FzY56ln*HQzyleZ|Ka
z85lrAxsVCE+|m-z3IGz?;m{Vn4x}=MEVuzR6+!LM)QZI95(UusBXqe9sQm~Ug2mZl
zcTdd&En`VdQ2;G5QAo`!$p8<g5bRNaT2{G<d8LUtIh6y|a)C5`h;F@rLrg&d)aWUO
zXoak73QjF9&dkq)w|>A1^g!JUjUsr9C<wZCL?PP9zyQ`10@X7h3@RSL1+g0gcoiS0
z6~G8;1%Mdfr4AqlxXA-zfZIeM1}k_P3etXIhpFcPF<@g#oS^IpZZx1)<lv!7=whGZ
zpm>lfP=yI@Re;x~#DjV)@df#y<wp5=gQP|a0u?z*j0_Cm>X(6u69kz-Bo7m~T?xwE
zpl&rdFhPSApxOvLdI%bb0dc^iGBw}{KG2j~789tg29sn4HNjvU7I2%51vDAe%*+5*
z%nEL+ffo;e`E1}hDn{_?M@Yk<7_^=OT6ci*P^v;|UP)$ADy)qS89oH%we-v~@Ju>v
zYF-ag;DQ4mTG7NqnsMM2H!va4!VggW1mi<HwBV&kFfnK=4m_0s69YvjiU7FH$IHOL
z08;_(c7Q8oNKJ*BV1f`WNG$axxaBvng+HhcGKMD&R$fK{MqWl<Mqx$)HgJOnC7*%P
z31*uPwD1J8>oO?Yc0r(e*A?VlP}zahrUP-oslN%OO$T1wRKv&+&j@aXF@eUP<C(y0
zaIpeft6~r3X0d|0KY3trkQQc8DFezo?4ap*kO(_iB?s6L4lo<M6eXS$%;o}%gGpF1
z1PX6(HH_YN0u@c*E(mDxVGt-e233O!BXEfX?o)s!4Io3~payl&z_*`T7#J8lKp`&#
zYECe6GV(C;Fsd^OfoUGbWKayiFgPa6LDK->aE}KU)mh**+Mp0O22XZ?I~G~Ypg?bi
zDFe+|zz2ur!Rt)HLvD~V1yXh(4Ug&hK}I~mc@`9=L7=uhcpSI1pdhsfDF8uA1~#YG
zGB7X%g8~rL3k5Ym`4L?bP+t}tXu+VG5VDe;fgzU>G=suesRT+{pduT*qOOD)wCpJh
z+#vz2(O_T*&y!+c0j<4b1rN0Qfd|^zz)MdU86rUIqrfBIe&AKZ;5rSQ_A*oQ5+Pw#
zQfy*|SR$kWTKNMheKQO6pi9_-+Cb?OG?@z-F!uxHGfvPdSQkG>@Z>PKm<@$25d{l?
zLmzBYMt*S#*nk0zff7(b7Y|wm4Dva2@-!tL<hV#syntsrm;{)Z8I>3X7`Y&`9efN7
z44@_gIClPn7H)#;Rp^p7MQF@G*80>!*7`6r6d8lpgn(z^@;Jehc3?KNo5==B^R?hu
zu3==zW@9L-0-M7Q5{IvU<AI2R8a&{IHo=vupe1iLV3T6lLBl?^;1xi%Yz(#Rpj9)q
zoDAW4N(?L|+~9O@n1QjDi-EC(2UM45@iO!<z>@?sL-BV|yS<hhv=}9e545hO2Hg8?
z2Cqx1<z^@m07=28Cu>+4iUmMsfjYg63`p~qf}jRNGb2NB5M!k<xFi&Uiqx_)gclYt
zvXlse-Q&jyngHSf^$Q@z78Wo@<jH{)gFMXvDrSocz;=L(T*%_68Wx6vO2!mU&{~@s
z9)_ZRM#y3rbI|G<28J3QkbV%ShK-?U8(5MF9O7&s^Ta_ipe3yA48=zoQ@BAPmB#=Y
z@G2^10xdp-t#d4T!&t-2kR<|IZv)Cz;DxUs1w0_bK$DleOf@`63V1+Eqd*GSVG8t^
zYS@t!u)`E^z!dm1)o>sw;D9Lrrx1`8#Y{DvND4R^3X7RQt_9EPmVnoKLDxY|XDZ<b
zjk|%I$^<e8R8fh-M8Io@iq3(oD>}-Q0vTfC1+5Db1Fe5L$5aDeWd$-?jG;sv)D{GV
zBRgn*rG^94x=RO#9>{d?$Os}4Le>?@;3=9x<JsU`Us{r80iMFO0&_v5seZ*SpdtgZ
za2`B~QEi}DRBNT+m#<I^URe)c+^DAzkXn?HSWv7`nO~}qo0^zcq5v|&N?*U)pw_-v
z0nH%QBCsi-+zdAZJn0QuUYr41vze!m3AH#UF)1}iuN2fa(h4#Hm1H2MLy!Te7Y!<l
z!Am8<C8BDvnrg8IX!0B~M-3{$f<T2|kS0hUsHlW4zz+f~odgd<=73h_K$ef>fHrP`
z*Gm+aBo>tvgQn3TLo=YdG6+-^1POo)0yW<gi_)R%R`QE-6HCCASr9*{+y#|fK|LT=
z7l;5C!{8+qV27!I#6Z;_IC3D(Sn${-sL2X;5jbp9A>)?aFzZ00<A~MJ;I2_xQDS;-
zY93^nW-7RHNCj^M0XZ};wInA$8SI(VykzKVNl<t|)^iNR&_^9;hyzr1gW60C?EH*E
zOmfUTtV)cWj4aH|jH-;Fxogl;7YQcN(idSi9!6$HVQ~AHpOK##w3d^Xk&BUyQJfjH
z<QlYa2C^guv@8aKMVUky`I-0`L8b^ZaWbhunmV9V0>a>WArcg%;DJO?MgixTqELnk
z2XLv*1S-{CV)a3bt3gYt!38X6F&}8rA~ST|G${Krf-4PB?ap9RD9;d%(ij3Ica#nm
zQez0(8PbDJaD!@P$gnkNfHMfB6P%R5jQ~jM01b|V69z<UkSE9kAn$;u*9JCD>lqjr
zc7oy*TpxquNSKL>k%uuElt(~yF$jahoe8x2j~5h#pk<@rod!Hb5uoA>wBnMJp(p}0
zaRFH*3u-@s!?u<MRQ%VlfI=IzW;OyeTam>In%n@DcPtEr5e%S`5xkZaR4IbjdxBz)
zk)ecxp@b7u3zu*+q_Ke3d-9}%<Fl5Hp;7>}P8Cu;*RnH&=P59-l<<Pqut64$g4RIn
z1~tt<Ze?f412xUq7>Z&+qrxCJ34q)In&akWXl4eDgn^pMGT=Iug&|82l!`#9ONb%7
zPzGG5mWY5#bda$U;F?twp`=iTF#=TUF)<VwGM0#es(MJ33ld~!DDq_lmHOaX7L@WN
zK;w2cg<ly{*ufRJ1Zc?4CT|9)J}IgL_xUA3Y>?-ez*9ruhDV+&D1jFp1}l&Pu^|Bn
z4=YgcZe#>4CuRhVh=Z!QU5p^_voaJOW=!D%O?81>#K4dx4e~vB41$%R=qsqEhByqg
zUg|4j4J*uDJPbA<9V{SzybLIqpi5mr^BlM`2xt@lJY}m_3@U6B3kq^FA-mP|K@-5>
zf*xGtgI6?xYpasfoE-3~D9DDa)D(rJ{FKbpV(?%)XmY$*0kjk#x3mO2mZy+fk(^Un
zoLQEt2OgwxhV1#$^-0Z3FUbH8A}2%khZPGlFffFGhVRo-i*&(T6*BYE!D}9iK`V!l
z9ao`SUS6&XUZGnG+p&~V%mXU)pyroU7Nmj&U>1f{7Nq)V$iiv_a5FwRKer$!wF2Z-
zaFL!;np;qeRGopU6Y$c=#GD-Pnx!DnQh)F)TaZ7<Bv9A}fx2Vhg_<BMzzuxxpp9cm
zNl|7}X$f?ND5ydNdpA9`1iW=%0muMQZx$@-=?~EfQsy5FVT0-x$Zp3H&<;4i{1Q))
zdqMRObO&6JHpmcAp%nyLLkM0?2yV^826133S98F@4IbFj0F@Gu(hgKs1c3)~K(l~g
zS?~%@ux~PpLEE`f6LZ1kA;f@zEdU!C7#NO#3P3MVPn(^Mk&Q{18B{g#Gm0`XGx9Jh
zF*7p?Fp4p9fmU%cNw9#bG+}1Ynodw9C&nbe%*H6q1kxeL2pT2iWfp~PS3p^q2<j7q
z3OLA~9dpnsJx~sZ?FB2!1NYOx<r^q7GJ^_Jo5DPXJabU)1NA`J!0Q?Fz+CWNFGxoS
zv^1ZCp(qdBo@4-R9!p^a=UebT9Z=jCgI3Bxv#SCu?LsmObg_y8XmeePLVg~63=uLc
z2+n|@42><HfxPGL8UoJ29<Giq;O3_Rbd4csNn6kc&_om{#X%->K#3YDb%8<zoD<Sh
zOOO_Ufrn*4i<bsAVXR?bVBln8U;t-$1}4w|3>&i~qdGIV4GUhJ2dcwCfdESK#fu;#
zFeyyn6$WPD_+<cX@dFjp%-~uOTq73gf~ri=$QKi6zyVagGBOm+167cqT`S;yU`09L
z;V^LLGldbnu_6bwC!&TC)UO2fe8K(V8pz%i7I2E-0L_HfurOqSyLRAOf(tCc4eFYK
zm!~o@KxX`lK}8HSJzxy>fW~Yg#W#3yyB~PE5)ywBpn?I^)&<8}VqPVrSOb?@fgm|9
zP|F5X6vTr!0>{ULvw3MjN@7WB5GX*w#Q{>&2t2nBHW8$&v?wPYWIZ?`6%B0kgN8Q6
zK+!J*Di>II82Q1uT#<>NnTJ`J89V|9ihB?S$3H09f_kXn^|x8z@%th<P&Ex|M=&$w
z@k3)6I{XIi3PUnFC>p`L0U?WxK`oJJa07sWA&VVc41gM^@W|s}0__OLK2ir6m4`$h
zY;}%;0(kp-T4^45_cLT&F{B;^EwwF5ECE%t3JD32<wOYyurdKW+g6g13Z0WuP=K_8
zA$Alil!A6>D?oTTnMryIE~TlU)kkm<^<ssT)Z)zaJRR_YFG%YbZWwsl5455y2{ds5
za|w9YUS^3xVh(6qT_t3dX|WEtOA47m%q&)bc?E7(a$=rBeqIiE!wF~+Q!1z^OHPGM
z-e;sL<YcCS_aY*D1~z*L%?Ef^6+&k-^%NZQDiw-LlZrtn1LTz`fNX*-bW#BMJRt#5
zMS^z47bhfuSH~%2B$lNr<mD?QCW9I<3aM#nsmUce3Z;2Dsl|{Cs00aoCAgO$p#@s?
z23a|qqL7rDmS2<#S~Lb($pu=t2hLv*t$vU?7*x~;DTDGMsAmF^@=7d%jCg~G$az3H
z71V(RcUzDOUeFpF@Y-ZZ3_>@~3~V-RU|?X-0cAsws~Nb37<riZnLxwf@C*nlguxjQ
zv^u(mk)ePSw1}&gk)Z-SlIsFm8P5bR2*Cq8pmkJC43f=E42*@s4B?2?(V)&fG%Y})
z1d`gpGgf+#(;vWVpO69!)DH$Po*LLNY6hLp0tzEgP0PRv+BfN^0V=i-3oC-EK#^Vs
zBET^Zn#clA?*xHn8iGKh<v}SRS@5t2sG}bQ>KO)sT1SwA8&n<!fnp;FWF5l8VAep4
zMt~MvfOcjVgZBHg39vD73h^^a2yilUa&xlrb8&`oa`U)y^74prihxI3V3XtU)z4h8
z)z9XP3=Al%pBX{j(-dY<gDQm;)LTno2ldfXI6?ac)44$VPg1zSOD0%ABbcD&7ObGo
z5s1OY09{SN4qAW#65(J-5dbUZWJnPNGq@O1guo1L(19u-H9QQdyr5%MpvyV<z+6#~
znr24O(KjGjF&I|>EGrJ<3WB*3Fs=~z;1ywp6e)%lCWa^xhE!38RAGh`CD73;EzF>U
za6qO(PG4bUh>`$nmxXDUgr2_=B?T6jhlxuwq<~LgiIQPRQ3MG_$%2-PfJ&NTP(A=H
z7l9S2u%HI5@rImc0bk?|TcHi=Lx4|VNd%X8kQLhMpv~J54WQyQF%Pmj8@7TOtP&iT
z@gVJ>kuy+%R$P);Qd%4jI{X1#qJc;J!2O?$%;J*#BFOH4*m7lXiCL7ISe%~+UQ`HH
zn3|JVP@I|qW<zbmoX-Uh<$)*H;$eq5#KYH35V2eW)D8fz5Ct)~K!p^D!3|nT0b=kl
zl<<O<jY8W8;8}t!0Z{c16%mA~6aq0IO9A{qdpa02Ks~u2(6I_Zdq5>WsM8AzA`lHe
z-2~i(1NTVd^HM8Hg7$*4JE)ET2O79VSCm)|4!ofKAh~@Y;sA&Mg)$_tK&>=TW3D7K
zHx=BW12Ixkb4n6}4uVu30yX$S!@J<VAh>J*69Z8|fJ(a%P_YPJg9cfG$;`>h!^+9b
z$;=5R`8kAG;1LaSHn<`IjeLRU@jxPeVE2RP@dn;c;2@8WPX(>Xj*o8!c@8wPjWjh6
za<V&UV4V-t9Rbh!HZw3VrZ6zTrpZAnz{wyvC%-rqJZ%W}SkP2Z+<_XqU>^@aj6t$?
zd};+~Ic*!7=RnQ|`4!aOF4kgTVCVpQu2>k%U}OMwaM~Hb2TL(Bv_Yhq7(kozpg9E`
z&ma>(wWKg8h(HIOWP&qvtTd=ARsz-q>Z3D&1_f&v874C^6tclX4x~9~IVhQf>QG3?
zrGfGrD8Yb+U(iy?00dz%s8X{59hU(bhO+C21tKQ{q}g&9<Xq5@0IUE76#((^AjcQS
z$D_F)!5sjffG4=)K@-TJ@;x;^9(4FzF(~dBm^m4_n858nP{706f1n;{g%+sCl?9$1
zaEX-xkDh`L*#R9Z0BQd*gW{I4ke4AGB9;O<DuS7T5y}Ub>7dnE;7kKbZ+=0ba0@yL
z${-*sgFr+5;L4&HI_?Hq><KPlAxk7ct4P3k4D5FBfPc_@knRD^UZ5s)e0*_g3D{Nf
z@e@I*15~0jFiJ9tFbhCdNWd~0xF`gb{FrN)_(6Mm;gvkn!gNrbf=D&sas*5aK>7i<
zZfAmg2+Fq55)$M$5C;1Vlnp=~a9Gh;oXrS2+pPq=vKzMD(F&9`tP(&W25n;`fcj+6
zep_Omf{B3vbZIH5KL+k;gS3DLX%)a{YZZg`MuJx3K@3p<HB>+wc0fX~)4o7vCZ(2?
zr>5qCTR9-JObiUb!*6B=2B6kZaVmI|C1~wyszNzvid7*wClj>G4LoTGTI-sq0BJ`l
zfJH$2oZyCmEJLzi2gyPOBdA3t1_q#>dS)@C(^>@H`3c_msRtfHfE$)ste~ZpmtUf#
zrH}~mBdP-x;NAlJH50U>3}lJFcR~W9?+Q*R;LXSR*<d!f8Um*mFfjm$23i9p<>%+b
z$IpQ$9u9Eb0ZKR^Jeqh0OX3N-1S(TOaWV*!4ydS%kI&1`t4b}(kB?u5CG~(xB5>;A
zg*VP1L->#;N-=06$T24;zZ|j*19D88LLwqNfpUGG0_c>f#FG3Xy-ZMl9GrE)wIxU#
z)Z7Q1e+U*G_)q~)@oj(y1>|rwP=vv2ZO}T7N<QfL45+CJ*~QKXUc{sXn!yEaZI38n
zhBm{BE66OR(Ko8YOS7R;W)Fs32WtI*&%rE8%q&g?9dQ~Dsa1kN{S8PL6x0?PEXfa4
zKx_deKTx}vfs>h$kCB&=6-z@0w8jeF(8*?F$d?8uNpRaR8`K2=<=x_0;MwF-Xhob^
ztN?EWWrB{WD^JbI0Z$;OrocunQZkEDlS>pzG7?J^lJiS*Qov)u@U)kd3R<6Eln*)$
z4|K#_X-R%A=pYx+jui!sq)G)V&^(+~0(AR_UQudseok3xd{HXI;Nk@6HfT_T0bG0K
zKu?B+wD-ZYxS&=Uc=kBR)x|T&)j1?SIK(l;bCARlc+xzx81ALRpy&dHHUlfX+66Vj
z!38I%VSo}%>WFB{Vg}8iW`R#JL_`^=s|IV#m4J=`hDTX`9&AoPp&+#=H!%;?mMTjv
z0`0RY1~t%%pn<FxbRAUBfQl^eSP5k4L=V)J0*$nQ&b3I1hZ~Vo2|1n>W+dEWgC)E{
ztF}Q$u3|Xw6g=da;UNzytHB|U(OL#i@q?R)prj8SIfu`pfDS$bwK+jUP4GEo@WGI<
zP*q6INX*RBfi{kdQbEOAeqO2`B$$qXLL6lIz}I2m`E8It&SME5P(lTV5BLBt$PNhD
ztZxb<gCw+O2QAMBjgTf5fX=kYD}fw(nVFZaqX0WrK_RIUJWU2Y0#_j?GYNDur5<=N
z4w9Qe!ye%A%aqiT)Z~(&GlM9QKsf>CJIHG9%)Im~h!6vxKn<QX2c;xXJp#(q#h`Ol
z+8G$y89}S7QotiOwag41jG%qcMV6pRbPyYURFfrW615q!wAvIj@{__0K2<RftdapV
zYYsj)H4ijfp27rLLe>GEBu838%?UQ138cH33ACK82D~kzmK7|{z)&;;v^om3+n*J@
ztDlLXXd7r1S`8aW0Z0qvphi%w0P;ui4<-f%&l2z!#bSm0veY7QJi_}xpaVMe6coZi
zhng0H&w93n6iCGi#i=ErH5bU!lF;F2Xh$ruEI%^^G%B8$0-61UoL>$qsS-h2lT$$l
zG~_Gfrsn1sfsY%6S1mb-Md_*Vrem=lXc{<G0lY3sp*XV&oZrAXv@|yfbO=QnbWdhx
zi9&G(sHTFO1e%FOwgzleW-%zkg641YQbDy>Vo_!eBmqNK^?(Y{RM0Ubpi={oi~@D9
zK{Xv{Za6s~>?_dhE%Lb`aMfVP#)BOTJEt!{O#!qD3*;P7j~8?}s-A))<e(Cel^_9d
z_Z4mkY_eD(B{MB8wJ0^OB&Sj#B^7j%F(^p$^T4qMUWy4aAOR9ZNc~iZ03^=9lh)wy
z0L3cka9Yq@bx~1fSt|J4+wzRWl2lL%06Q8vUcr8WEMqH5O-{`$OHBcF&_U-4rY7dv
zf=@!y0Z-h6!nFuou!6%0?vX?V(1bha1bfihHl#rZ&ol+d@qh8q#nB)WKuHXKgd#XZ
zKznQ<>QbO{_n_!cN-ZuySW%Xk2|n!`UOpif27wgA(lnwI51vf}6@sAJ5wwt__!g*M
zWB_Fq$PRzdI>h-5l{yR+s!+i!aNYyuPSAoFMweJ_hFb72Y#3vq9z%F|;aLWj5*Ba=
zAfAD-mXU$61iac5vZxX)%LbOMh03yn2K|s^Il!{Bp|ap@V{qAsJUxaAZP0R@qBAh}
zaDmGLMyM-_k1zy)R^>1-gfW87PAvhKNAci^8p!$?KX4%oNf+RT6(m^UeJ{{J8)Ru8
zXvi?=0cgk=)G7`F1yT^GqznQTenH?lT2K)Z1R9S9uSx`uG=hhg!Q+SER1*Yhc0$BJ
z%~-G)I9DL*#(^3ufi2s31uE!4Yo8gIgcz9_<r#UwXB&b~Mr0Ib=42FNWMgDu<YX!a
zHJcDVfE==!l&X*j+AmO|qmWqwO1z*0l2a2?6cQCwi}fH!CxZh9vfc<h#{~*D&^S#H
zsNw|=y@IE(GV@A;mV#0sNFG#D1c6s)f~J7LJFUP$7W5dT0@P!HMjSNX1U&(XgF5F$
zsinoKDe+*37K7JBKw=vv0vd;gNP=3V4B*HCn+i660AeHPDgy(<O;9X|fyS5xg~X&8
zc^G9FC7FbnIGIF2r&BV)mvn=YAt>V(gW9zz;InQjwm}=xpw=~b{<{XWl%B~Yb`EIW
zFzARJ7H~~#2dW%vSQ*4?!KWP8Ff$Z|fi?wY!8SS9vN7a=w+TUZ8$u30E}9QIiYA4b
zK@!AbWdM=jGZZC3Vm07{4kSV62ZPl?&c>-_VaQ_x&B52QFjNSG^n*(ZcF_LlFvh|)
z4B?=4`v{j^2DvN@G!K*lKZo%vXx|F{s#!+?)Dg(Z%u7{BEKx{Q0L^GZt7~|<2#I`1
z6_ANsZNr+jIIC;85zq-2kRADXnANrddUcIhy``t8ke6SQYGnl;goT||mRSrERVYeL
z%_}JaZPzJIOoN`e1?mez65|Wd?Fx|FOF(fB&L-fL0xn!2H#C5X6fg@E1jXP?RFGc)
zSxf|)$3U0_o_$P7&B@FKjWmJhKcKZ}5a{q5u$d4;K$#E3f@BU*f*gP>0p2?Uaw+I`
zjMQQQW(J00P&c1}gN;d^iHDIFoGEyi^gsu-GVwC<GVve=20-OAxLw~0AF3;11h4EY
z1!oi{h9Y%PB?1}0gKnN<0G;XtS^&z#Q0xj;#tKTmpcAA5K@89|KLbNyDd?D+EOxL0
z@D>Ni38Do#AaRHq(3S`;kOJubY0w-6C<ehRH=!$dL9G?!N?8YV@O~2LRt>#k&^9Yj
ze*>24Al)(WSzyrh72p{J=pwsh=mjX?#RTBxt<W+TRMJ8QbwCqf;6cWq(mYTO0WT(p
zbcDfm9H^Te1nT8Ll9v$Z#2tUX5LdsDcxR7LKkxWp&nQ>$W>!f54wSM6G<ASGPx_!V
z0dgw?3+N&UW=0++IYu5P6(&wd4;YjRKt(+`CG>!H3$uVGib1nRkagSOu3oVcA|-$>
zNC35aSiot;78He9ETGLuc?=AdG9Yyz&EVTVQkX#T-OL1P;e_YuFtC939D)yS2kkOx
z2M>KRgAD*5kdy*$EP>Ykg7&h2_HBa`!~sSI27CzuTD74z7hz){dazY7ph_3ibk;#M
z{K`QWH6*1fq=W9YNrg5U;l)`(0<@nBn$dxaf|4BENKjKfBNg5QfgR@!vI^9HEy~Tz
z18ww31fBO-oS&1LQwiz|fi|4O&4Vn01fN6)8Wsn&*Mr=g6^zUb%|J6wpwyp}T2hi)
z1a3-$wl2c^5{W5giFqZ7>7X$lxOsW`dAcAA6teU3%X3mw(!mQ>L1$hoBq}6<O@jCr
zR7`_Rhj~T^ye|^1Uj*vCB_tHV12G{1bl6}~enC-YVhPAQkQJK>iQvmFK#m6wK*0`g
zMl_<qSq|K$1W()*gNxRp)B?~kijWgKASE|=Sq`Yv58nM4bRX1O;RfFZm7iT&0LhY|
z#t&q)0F=eRsT?wb04jySIc^||Vo-%pl3G#X49ale778C|3m_*W7c)O24>L2P45Ki+
zBxHI3l<7c88#H!VJON((@)XsAGXo<-Q7veo50sDK3*=eAg3M3_pcVJ9ECyOlUCU6Z
z0NNIu#RgRXDtsY3Ef^Vk85x4Z3#%AdN+8{aGEl}VtYU~LtOf5(V`YG91NS39s=>iq
zd;`>~2Y1sT%SAyOejtZprl!EtdOqmPO<1o9Jl2(%2Rn)gR82!quZ+=((aJ6d?MSs!
z@Gk(}QI(jZkXV#n3fh(fGCr|HAt3=|gC6MoPtdwzP=~n~k%X+k1M<ZRh~wj}6g<<w
zU0ay-3ZQ))3Mu)ikd_0eYDmn?19hD<Q@}@aB1{9HXzvHU+X|d`Ajt@{z#<5=+7gl)
zK^q<*b$)(gN-=nwE_mb<dMW|<1}^A6rJtaIDp0(Fo5$dk4)HG7ba1K!69bSm!KccA
z{96pJ2iP@O`58g`R@oS(n0Q&aAT0t=9RNzg;CcXbNHHk!fd~5_^?xlRXyqR0QYS{x
zHBBW<&<<%WGed<XXuF3?tR8rzi3N236XgD;f*??P6;xM%3U+8CyM_tWmbNK01aC;K
z0j>E5*;@?G%See0eA8A6Y@t5*_Ae~WfiwkBY6Fj7f|P*Uc15W<;5B~WL<||u-ULd?
zpq3H%QXg;>1<eDMEuit&97q&{?iUOC3laoHV|HpKIKIHdKtvh?BY24xLosNFAp?sL
zGaC~dBM%cVqa33kYAFJaGEg@l1$@2-Xom(k;z}SpG{PAw#bAX3<k}^0#U5Um03U-0
z1{DaP2nS!x1+Ioc6?$O;Lqr}YRBtW#%w&)vRt6U4Y(|FsD$q92YzBrrCI%+PqS>HT
z#1Lsv6f=Ozlr&}rF;I1G4N?h_gJ|6fI<x_<^%`jDF+>_eD|i=B(MQl=CurFk*fq_J
zjF9GN3Ks+P{6kP{FbFhZSF8Y95Q}seGpI5I*Bc4o!U@z9%1=%%Eh<V)(F4~?h~1jt
zrDd7L`MMSsrk1*fnG+Zp7&5;wGBA{awsol%D>y?|qkxUGQcx`h@4f(^pR8J(8Nq~5
z7z{p+Splm;@EjJb#6sTE0A7d+N^jtTCJ1!YB&7KX8gv5BK0;D7D5rqOWI)Fk#DnY8
z_}t?3Adr5L_JP|ze~p2GVJfKp0}VznFtafVu`)A?G4e7>GI27=Gs=K58>GMiji`Y#
zJ~;J)&K>|I00xF)NoaZl?Jr^guXzM*{{<&#(DkZJptWs~b5B6s5Ke|77jQ`gQJMlO
zPC(fgT6g87f^O6U*AdC^%Mlg82LMA4&MwH$&(Txx2lZFMO&8E)WIkvLvseK%a|v%(
zfp)^ALN1vr%}Yrw%Bcjkb`lbb63Y`{$9qGDdO!olpy3{HlL$1vnVy)LhtxRL@&k2s
z6@tMd(BK|!9_V-m&^=*!sUR!zLBp6(`%)`FTZ=PGaw_$-;BEo;Qi@W+o&$}@<v};<
zgL*LFC450ALFFCVI!;is31VR!;Ct%8PFn{`BcNV60~;r!0Fx*q52K%k9LUXxv*y9u
zInIK_K&zaCPJmdaK*Tu^aS=p-4(|%O3}RgY5uiIbf<S{l;6*b*H$h@|K*U`T0cuJ@
zI(ndSB=A9Ro*}M5$bC0(5AQQbF}MW^s?x!AXAr0?4gw`^u<H?d49psc%3(JH1A`Z6
zC=68Yu`z>==oDq<)CVv7=HTSuWai}J<l<!E=jUhVX9YuZA$figel<=hej!dt4bW{k
zkPS1SgFeBvW^rXPxKM%h2a5GTry79=MBqXtpnP3`IK)Y>v?wPhGs##Fd>an<rZa{T
zP&JEPO-^b7=-?($om&FhXo*c#X-Q^I5U6YbUmS`}MQTNID!2hz3>jhu6(W#fXHXjk
zyxJ}^KL|7h7X;e15d>QP2_7hc9FALBlv*4FS`!R8y#$mB!3+O`xIqyQ9@hp9kAig|
zS;YsE<p&X<`WQ084Qft7#<f8swBRHa4?9de9^{c?@HrVlpxywujR6q@-B1(+@_!I$
zLsk$dOd;1FfkF;4m<!Geph^dP+6K5a30m!(SQ4ZNasp^`D|iQ75csGT&?;~6eR+^h
z6DU=JPm>7(&89+jBZJmmLDDj~O$+iSWK|1zQ%P|UXv`YyMDSEUn3a}a3cU$4AG9J9
z-0&?)1)YJOSX2q0@(;QVauBGe0Nz0F;_BuY>Jt(VUx(r2>FXI1^cAFt6|}5r6^Nw|
zB0v{71cA<)g`8*yO41;gLuxNDYXEW<xN^411>Zzu2TD1`phAHSv^ScShe?1D1eKUU
tqyUouqYR@7vlycrOAw0yqW~-DL>Ca|VP*rJ0mCd-Bqkx|CHbGh8UPxB0`>p^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py
new file mode 100644
index 00000000..9582fa73
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py
@@ -0,0 +1,16 @@
+import sys
+
+# This code exists for backwards compatibility reasons.
+# I don't like it either. Just look the other way. :)
+
+for package in ('urllib3', 'idna', 'chardet'):
+    vendored_package = "pip._vendor." + package
+    locals()[package] = __import__(vendored_package)
+    # This traversal is apparently necessary such that the identities are
+    # preserved (requests.packages.urllib3.* is urllib3.*)
+    for mod in list(sys.modules):
+        if mod == vendored_package or mod.startswith(vendored_package + '.'):
+            unprefixed_mod = mod[len("pip._vendor."):]
+            sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod]
+
+# Kinda cool, though, right?
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..eb825922a594d4ce36ab503877f156557c8676cd
GIT binary patch
literal 625
zcmZSn%*&NH<x)&C0~D|^FfceUFfbG^VqjoMVPHsMWXNG)h+<%<=x0dbU~q|TXNY2C
zNMU72Wn>VKVq!>TW=LgXXl7(cWnpM$0EyaEBr>G3GNdvvWU+xHTw((lqSzTy*+B}k
znHY+*LF_CJ5I2R5LA;rfp~wv+l*$P*x0#VaK8g#fJ(Zn75@JvaJ3}fLgSbth8$+QR
zLwKPuLwE`!L$C%X0|P_m|NsC0`<1XWFff!B<>X{08JDntgj4bo!Gg&diA5=?CB-}p
z3=9RC1$yyisd*{+MS3NS3=9l<#d2uEMX80Qsl_G5dIgEe*@@|?#d;dd3=9lGpb!cI
zX$fLtU|`VTW?*0_0Z9~B7K5#UDlZXWU|@jQkeU(?6XarGV2F>;%q_?-Dv6IT0R?kT
zesW??G1#d&nZ+ewGjj7&N^??+!RF@Xr<8!S6_+Fyl@ym}mSlj1b5iq4_&{FGD=11$
z%dALEiO<bX(Ezy)K@=A-FfiyB6lInrmZa*JB^K$Y<>#cN78UDf7wTsh8=0FM7G@cl
zml;}^7w1%_m&co=n3xzC7#O7I>4)eSWESXV<`tJD=H%#>Ct8*UW`Kmi7#eo^ut3s>
ndazippt6L6fq}sW;srZUKox`B$-~Oa$i*nkEXF9$D8L8+QBsyZ

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py
new file mode 100644
index 00000000..d73d700f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py
@@ -0,0 +1,770 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.session
+~~~~~~~~~~~~~~~~
+
+This module provides a Session object to manage and persist settings across
+requests (cookies, auth, proxies).
+"""
+import os
+import sys
+import time
+from datetime import timedelta
+
+from .auth import _basic_auth_str
+from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping
+from .cookies import (
+    cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies)
+from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT
+from .hooks import default_hooks, dispatch_hook
+from ._internal_utils import to_native_string
+from .utils import to_key_val_list, default_headers, DEFAULT_PORTS
+from .exceptions import (
+    TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError)
+
+from .structures import CaseInsensitiveDict
+from .adapters import HTTPAdapter
+
+from .utils import (
+    requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies,
+    get_auth_from_url, rewind_body
+)
+
+from .status_codes import codes
+
+# formerly defined here, reexposed here for backward compatibility
+from .models import REDIRECT_STATI
+
+# Preferred clock, based on which one is more accurate on a given system.
+if sys.platform == 'win32':
+    try:  # Python 3.4+
+        preferred_clock = time.perf_counter
+    except AttributeError:  # Earlier than Python 3.
+        preferred_clock = time.clock
+else:
+    preferred_clock = time.time
+
+
+def merge_setting(request_setting, session_setting, dict_class=OrderedDict):
+    """Determines appropriate setting for a given request, taking into account
+    the explicit setting on that request, and the setting in the session. If a
+    setting is a dictionary, they will be merged together using `dict_class`
+    """
+
+    if session_setting is None:
+        return request_setting
+
+    if request_setting is None:
+        return session_setting
+
+    # Bypass if not a dictionary (e.g. verify)
+    if not (
+            isinstance(session_setting, Mapping) and
+            isinstance(request_setting, Mapping)
+    ):
+        return request_setting
+
+    merged_setting = dict_class(to_key_val_list(session_setting))
+    merged_setting.update(to_key_val_list(request_setting))
+
+    # Remove keys that are set to None. Extract keys first to avoid altering
+    # the dictionary during iteration.
+    none_keys = [k for (k, v) in merged_setting.items() if v is None]
+    for key in none_keys:
+        del merged_setting[key]
+
+    return merged_setting
+
+
+def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict):
+    """Properly merges both requests and session hooks.
+
+    This is necessary because when request_hooks == {'response': []}, the
+    merge breaks Session hooks entirely.
+    """
+    if session_hooks is None or session_hooks.get('response') == []:
+        return request_hooks
+
+    if request_hooks is None or request_hooks.get('response') == []:
+        return session_hooks
+
+    return merge_setting(request_hooks, session_hooks, dict_class)
+
+
+class SessionRedirectMixin(object):
+
+    def get_redirect_target(self, resp):
+        """Receives a Response. Returns a redirect URI or ``None``"""
+        # Due to the nature of how requests processes redirects this method will
+        # be called at least once upon the original response and at least twice
+        # on each subsequent redirect response (if any).
+        # If a custom mixin is used to handle this logic, it may be advantageous
+        # to cache the redirect location onto the response object as a private
+        # attribute.
+        if resp.is_redirect:
+            location = resp.headers['location']
+            # Currently the underlying http module on py3 decode headers
+            # in latin1, but empirical evidence suggests that latin1 is very
+            # rarely used with non-ASCII characters in HTTP headers.
+            # It is more likely to get UTF8 header rather than latin1.
+            # This causes incorrect handling of UTF8 encoded location headers.
+            # To solve this, we re-encode the location in latin1.
+            if is_py3:
+                location = location.encode('latin1')
+            return to_native_string(location, 'utf8')
+        return None
+
+    def should_strip_auth(self, old_url, new_url):
+        """Decide whether Authorization header should be removed when redirecting"""
+        old_parsed = urlparse(old_url)
+        new_parsed = urlparse(new_url)
+        if old_parsed.hostname != new_parsed.hostname:
+            return True
+        # Special case: allow http -> https redirect when using the standard
+        # ports. This isn't specified by RFC 7235, but is kept to avoid
+        # breaking backwards compatibility with older versions of requests
+        # that allowed any redirects on the same host.
+        if (old_parsed.scheme == 'http' and old_parsed.port in (80, None)
+                and new_parsed.scheme == 'https' and new_parsed.port in (443, None)):
+            return False
+
+        # Handle default port usage corresponding to scheme.
+        changed_port = old_parsed.port != new_parsed.port
+        changed_scheme = old_parsed.scheme != new_parsed.scheme
+        default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None)
+        if (not changed_scheme and old_parsed.port in default_port
+                and new_parsed.port in default_port):
+            return False
+
+        # Standard case: root URI must match
+        return changed_port or changed_scheme
+
+    def resolve_redirects(self, resp, req, stream=False, timeout=None,
+                          verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs):
+        """Receives a Response. Returns a generator of Responses or Requests."""
+
+        hist = []  # keep track of history
+
+        url = self.get_redirect_target(resp)
+        previous_fragment = urlparse(req.url).fragment
+        while url:
+            prepared_request = req.copy()
+
+            # Update history and keep track of redirects.
+            # resp.history must ignore the original request in this loop
+            hist.append(resp)
+            resp.history = hist[1:]
+
+            try:
+                resp.content  # Consume socket so it can be released
+            except (ChunkedEncodingError, ContentDecodingError, RuntimeError):
+                resp.raw.read(decode_content=False)
+
+            if len(resp.history) >= self.max_redirects:
+                raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp)
+
+            # Release the connection back into the pool.
+            resp.close()
+
+            # Handle redirection without scheme (see: RFC 1808 Section 4)
+            if url.startswith('//'):
+                parsed_rurl = urlparse(resp.url)
+                url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url)
+
+            # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2)
+            parsed = urlparse(url)
+            if parsed.fragment == '' and previous_fragment:
+                parsed = parsed._replace(fragment=previous_fragment)
+            elif parsed.fragment:
+                previous_fragment = parsed.fragment
+            url = parsed.geturl()
+
+            # Facilitate relative 'location' headers, as allowed by RFC 7231.
+            # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
+            # Compliant with RFC3986, we percent encode the url.
+            if not parsed.netloc:
+                url = urljoin(resp.url, requote_uri(url))
+            else:
+                url = requote_uri(url)
+
+            prepared_request.url = to_native_string(url)
+
+            self.rebuild_method(prepared_request, resp)
+
+            # https://github.com/requests/requests/issues/1084
+            if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect):
+                # https://github.com/requests/requests/issues/3490
+                purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding')
+                for header in purged_headers:
+                    prepared_request.headers.pop(header, None)
+                prepared_request.body = None
+
+            headers = prepared_request.headers
+            try:
+                del headers['Cookie']
+            except KeyError:
+                pass
+
+            # Extract any cookies sent on the response to the cookiejar
+            # in the new request. Because we've mutated our copied prepared
+            # request, use the old one that we haven't yet touched.
+            extract_cookies_to_jar(prepared_request._cookies, req, resp.raw)
+            merge_cookies(prepared_request._cookies, self.cookies)
+            prepared_request.prepare_cookies(prepared_request._cookies)
+
+            # Rebuild auth and proxy information.
+            proxies = self.rebuild_proxies(prepared_request, proxies)
+            self.rebuild_auth(prepared_request, resp)
+
+            # A failed tell() sets `_body_position` to `object()`. This non-None
+            # value ensures `rewindable` will be True, allowing us to raise an
+            # UnrewindableBodyError, instead of hanging the connection.
+            rewindable = (
+                prepared_request._body_position is not None and
+                ('Content-Length' in headers or 'Transfer-Encoding' in headers)
+            )
+
+            # Attempt to rewind consumed file-like object.
+            if rewindable:
+                rewind_body(prepared_request)
+
+            # Override the original request.
+            req = prepared_request
+
+            if yield_requests:
+                yield req
+            else:
+
+                resp = self.send(
+                    req,
+                    stream=stream,
+                    timeout=timeout,
+                    verify=verify,
+                    cert=cert,
+                    proxies=proxies,
+                    allow_redirects=False,
+                    **adapter_kwargs
+                )
+
+                extract_cookies_to_jar(self.cookies, prepared_request, resp.raw)
+
+                # extract redirect url, if any, for the next loop
+                url = self.get_redirect_target(resp)
+                yield resp
+
+    def rebuild_auth(self, prepared_request, response):
+        """When being redirected we may want to strip authentication from the
+        request to avoid leaking credentials. This method intelligently removes
+        and reapplies authentication where possible to avoid credential loss.
+        """
+        headers = prepared_request.headers
+        url = prepared_request.url
+
+        if 'Authorization' in headers and self.should_strip_auth(response.request.url, url):
+            # If we get redirected to a new host, we should strip out any
+            # authentication headers.
+            del headers['Authorization']
+
+        # .netrc might have more auth for us on our new host.
+        new_auth = get_netrc_auth(url) if self.trust_env else None
+        if new_auth is not None:
+            prepared_request.prepare_auth(new_auth)
+
+        return
+
+    def rebuild_proxies(self, prepared_request, proxies):
+        """This method re-evaluates the proxy configuration by considering the
+        environment variables. If we are redirected to a URL covered by
+        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
+        proxy keys for this URL (in case they were stripped by a previous
+        redirect).
+
+        This method also replaces the Proxy-Authorization header where
+        necessary.
+
+        :rtype: dict
+        """
+        proxies = proxies if proxies is not None else {}
+        headers = prepared_request.headers
+        url = prepared_request.url
+        scheme = urlparse(url).scheme
+        new_proxies = proxies.copy()
+        no_proxy = proxies.get('no_proxy')
+
+        bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy)
+        if self.trust_env and not bypass_proxy:
+            environ_proxies = get_environ_proxies(url, no_proxy=no_proxy)
+
+            proxy = environ_proxies.get(scheme, environ_proxies.get('all'))
+
+            if proxy:
+                new_proxies.setdefault(scheme, proxy)
+
+        if 'Proxy-Authorization' in headers:
+            del headers['Proxy-Authorization']
+
+        try:
+            username, password = get_auth_from_url(new_proxies[scheme])
+        except KeyError:
+            username, password = None, None
+
+        if username and password:
+            headers['Proxy-Authorization'] = _basic_auth_str(username, password)
+
+        return new_proxies
+
+    def rebuild_method(self, prepared_request, response):
+        """When being redirected we may want to change the method of the request
+        based on certain specs or browser behavior.
+        """
+        method = prepared_request.method
+
+        # https://tools.ietf.org/html/rfc7231#section-6.4.4
+        if response.status_code == codes.see_other and method != 'HEAD':
+            method = 'GET'
+
+        # Do what the browsers do, despite standards...
+        # First, turn 302s into GETs.
+        if response.status_code == codes.found and method != 'HEAD':
+            method = 'GET'
+
+        # Second, if a POST is responded to with a 301, turn it into a GET.
+        # This bizarre behaviour is explained in Issue 1704.
+        if response.status_code == codes.moved and method == 'POST':
+            method = 'GET'
+
+        prepared_request.method = method
+
+
+class Session(SessionRedirectMixin):
+    """A Requests session.
+
+    Provides cookie persistence, connection-pooling, and configuration.
+
+    Basic Usage::
+
+      >>> import requests
+      >>> s = requests.Session()
+      >>> s.get('https://httpbin.org/get')
+      <Response [200]>
+
+    Or as a context manager::
+
+      >>> with requests.Session() as s:
+      >>>     s.get('https://httpbin.org/get')
+      <Response [200]>
+    """
+
+    __attrs__ = [
+        'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify',
+        'cert', 'prefetch', 'adapters', 'stream', 'trust_env',
+        'max_redirects',
+    ]
+
+    def __init__(self):
+
+        #: A case-insensitive dictionary of headers to be sent on each
+        #: :class:`Request <Request>` sent from this
+        #: :class:`Session <Session>`.
+        self.headers = default_headers()
+
+        #: Default Authentication tuple or object to attach to
+        #: :class:`Request <Request>`.
+        self.auth = None
+
+        #: Dictionary mapping protocol or protocol and host to the URL of the proxy
+        #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to
+        #: be used on each :class:`Request <Request>`.
+        self.proxies = {}
+
+        #: Event-handling hooks.
+        self.hooks = default_hooks()
+
+        #: Dictionary of querystring data to attach to each
+        #: :class:`Request <Request>`. The dictionary values may be lists for
+        #: representing multivalued query parameters.
+        self.params = {}
+
+        #: Stream response content default.
+        self.stream = False
+
+        #: SSL Verification default.
+        self.verify = True
+
+        #: SSL client certificate default, if String, path to ssl client
+        #: cert file (.pem). If Tuple, ('cert', 'key') pair.
+        self.cert = None
+
+        #: Maximum number of redirects allowed. If the request exceeds this
+        #: limit, a :class:`TooManyRedirects` exception is raised.
+        #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is
+        #: 30.
+        self.max_redirects = DEFAULT_REDIRECT_LIMIT
+
+        #: Trust environment settings for proxy configuration, default
+        #: authentication and similar.
+        self.trust_env = True
+
+        #: A CookieJar containing all currently outstanding cookies set on this
+        #: session. By default it is a
+        #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but
+        #: may be any other ``cookielib.CookieJar`` compatible object.
+        self.cookies = cookiejar_from_dict({})
+
+        # Default connection adapters.
+        self.adapters = OrderedDict()
+        self.mount('https://', HTTPAdapter())
+        self.mount('http://', HTTPAdapter())
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
+    def prepare_request(self, request):
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for
+        transmission and returns it. The :class:`PreparedRequest` has settings
+        merged from the :class:`Request <Request>` instance and those of the
+        :class:`Session`.
+
+        :param request: :class:`Request` instance to prepare with this
+            session's settings.
+        :rtype: requests.PreparedRequest
+        """
+        cookies = request.cookies or {}
+
+        # Bootstrap CookieJar.
+        if not isinstance(cookies, cookielib.CookieJar):
+            cookies = cookiejar_from_dict(cookies)
+
+        # Merge with session cookies
+        merged_cookies = merge_cookies(
+            merge_cookies(RequestsCookieJar(), self.cookies), cookies)
+
+        # Set environment's basic authentication if not explicitly set.
+        auth = request.auth
+        if self.trust_env and not auth and not self.auth:
+            auth = get_netrc_auth(request.url)
+
+        p = PreparedRequest()
+        p.prepare(
+            method=request.method.upper(),
+            url=request.url,
+            files=request.files,
+            data=request.data,
+            json=request.json,
+            headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),
+            params=merge_setting(request.params, self.params),
+            auth=merge_setting(auth, self.auth),
+            cookies=merged_cookies,
+            hooks=merge_hooks(request.hooks, self.hooks),
+        )
+        return p
+
+    def request(self, method, url,
+            params=None, data=None, headers=None, cookies=None, files=None,
+            auth=None, timeout=None, allow_redirects=True, proxies=None,
+            hooks=None, stream=None, verify=None, cert=None, json=None):
+        """Constructs a :class:`Request <Request>`, prepares it and sends it.
+        Returns :class:`Response <Response>` object.
+
+        :param method: method for the new :class:`Request` object.
+        :param url: URL for the new :class:`Request` object.
+        :param params: (optional) Dictionary or bytes to be sent in the query
+            string for the :class:`Request`.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
+        :param json: (optional) json to send in the body of the
+            :class:`Request`.
+        :param headers: (optional) Dictionary of HTTP Headers to send with the
+            :class:`Request`.
+        :param cookies: (optional) Dict or CookieJar object to send with the
+            :class:`Request`.
+        :param files: (optional) Dictionary of ``'filename': file-like-objects``
+            for multipart encoding upload.
+        :param auth: (optional) Auth tuple or callable to enable
+            Basic/Digest/Custom HTTP Auth.
+        :param timeout: (optional) How long to wait for the server to send
+            data before giving up, as a float, or a :ref:`(connect timeout,
+            read timeout) <timeouts>` tuple.
+        :type timeout: float or tuple
+        :param allow_redirects: (optional) Set to True by default.
+        :type allow_redirects: bool
+        :param proxies: (optional) Dictionary mapping protocol or protocol and
+            hostname to the URL of the proxy.
+        :param stream: (optional) whether to immediately download the response
+            content. Defaults to ``False``.
+        :param verify: (optional) Either a boolean, in which case it controls whether we verify
+            the server's TLS certificate, or a string, in which case it must be a path
+            to a CA bundle to use. Defaults to ``True``.
+        :param cert: (optional) if String, path to ssl client cert file (.pem).
+            If Tuple, ('cert', 'key') pair.
+        :rtype: requests.Response
+        """
+        # Create the Request.
+        req = Request(
+            method=method.upper(),
+            url=url,
+            headers=headers,
+            files=files,
+            data=data or {},
+            json=json,
+            params=params or {},
+            auth=auth,
+            cookies=cookies,
+            hooks=hooks,
+        )
+        prep = self.prepare_request(req)
+
+        proxies = proxies or {}
+
+        settings = self.merge_environment_settings(
+            prep.url, proxies, stream, verify, cert
+        )
+
+        # Send the request.
+        send_kwargs = {
+            'timeout': timeout,
+            'allow_redirects': allow_redirects,
+        }
+        send_kwargs.update(settings)
+        resp = self.send(prep, **send_kwargs)
+
+        return resp
+
+    def get(self, url, **kwargs):
+        r"""Sends a GET request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('GET', url, **kwargs)
+
+    def options(self, url, **kwargs):
+        r"""Sends a OPTIONS request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        kwargs.setdefault('allow_redirects', True)
+        return self.request('OPTIONS', url, **kwargs)
+
+    def head(self, url, **kwargs):
+        r"""Sends a HEAD request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        kwargs.setdefault('allow_redirects', False)
+        return self.request('HEAD', url, **kwargs)
+
+    def post(self, url, data=None, json=None, **kwargs):
+        r"""Sends a POST request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
+        :param json: (optional) json to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('POST', url, data=data, json=json, **kwargs)
+
+    def put(self, url, data=None, **kwargs):
+        r"""Sends a PUT request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('PUT', url, data=data, **kwargs)
+
+    def patch(self, url, data=None, **kwargs):
+        r"""Sends a PATCH request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('PATCH', url, data=data, **kwargs)
+
+    def delete(self, url, **kwargs):
+        r"""Sends a DELETE request. Returns :class:`Response` object.
+
+        :param url: URL for the new :class:`Request` object.
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
+        :rtype: requests.Response
+        """
+
+        return self.request('DELETE', url, **kwargs)
+
+    def send(self, request, **kwargs):
+        """Send a given PreparedRequest.
+
+        :rtype: requests.Response
+        """
+        # Set defaults that the hooks can utilize to ensure they always have
+        # the correct parameters to reproduce the previous request.
+        kwargs.setdefault('stream', self.stream)
+        kwargs.setdefault('verify', self.verify)
+        kwargs.setdefault('cert', self.cert)
+        kwargs.setdefault('proxies', self.proxies)
+
+        # It's possible that users might accidentally send a Request object.
+        # Guard against that specific failure case.
+        if isinstance(request, Request):
+            raise ValueError('You can only send PreparedRequests.')
+
+        # Set up variables needed for resolve_redirects and dispatching of hooks
+        allow_redirects = kwargs.pop('allow_redirects', True)
+        stream = kwargs.get('stream')
+        hooks = request.hooks
+
+        # Get the appropriate adapter to use
+        adapter = self.get_adapter(url=request.url)
+
+        # Start time (approximately) of the request
+        start = preferred_clock()
+
+        # Send the request
+        r = adapter.send(request, **kwargs)
+
+        # Total elapsed time of the request (approximately)
+        elapsed = preferred_clock() - start
+        r.elapsed = timedelta(seconds=elapsed)
+
+        # Response manipulation hooks
+        r = dispatch_hook('response', hooks, r, **kwargs)
+
+        # Persist cookies
+        if r.history:
+
+            # If the hooks create history then we want those cookies too
+            for resp in r.history:
+                extract_cookies_to_jar(self.cookies, resp.request, resp.raw)
+
+        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 []
+
+        # Shuffle things around if there's history.
+        if history:
+            # Insert the first (original) request at the start
+            history.insert(0, r)
+            # Get the last request made
+            r = history.pop()
+            r.history = history
+
+        # If redirects aren't being followed, store the response on the Request for Response.next().
+        if not allow_redirects:
+            try:
+                r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs))
+            except StopIteration:
+                pass
+
+        if not stream:
+            r.content
+
+        return r
+
+    def merge_environment_settings(self, url, proxies, stream, verify, cert):
+        """
+        Check the environment and merge it with some settings.
+
+        :rtype: dict
+        """
+        # Gather clues from the surrounding environment.
+        if self.trust_env:
+            # Set environment's proxies.
+            no_proxy = proxies.get('no_proxy') if proxies is not None else None
+            env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
+            for (k, v) in env_proxies.items():
+                proxies.setdefault(k, v)
+
+            # Look for requests environment configuration and be compatible
+            # with cURL.
+            if verify is True or verify is None:
+                verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
+                          os.environ.get('CURL_CA_BUNDLE'))
+
+        # Merge all the kwargs.
+        proxies = merge_setting(proxies, self.proxies)
+        stream = merge_setting(stream, self.stream)
+        verify = merge_setting(verify, self.verify)
+        cert = merge_setting(cert, self.cert)
+
+        return {'verify': verify, 'proxies': proxies, 'stream': stream,
+                'cert': cert}
+
+    def get_adapter(self, url):
+        """
+        Returns the appropriate connection adapter for the given URL.
+
+        :rtype: requests.adapters.BaseAdapter
+        """
+        for (prefix, adapter) in self.adapters.items():
+
+            if url.lower().startswith(prefix.lower()):
+                return adapter
+
+        # Nothing matches :-/
+        raise InvalidSchema("No connection adapters were found for '%s'" % url)
+
+    def close(self):
+        """Closes all adapters and as such the session"""
+        for v in self.adapters.values():
+            v.close()
+
+    def mount(self, prefix, adapter):
+        """Registers a connection adapter to a prefix.
+
+        Adapters are sorted in descending order by prefix length.
+        """
+        self.adapters[prefix] = adapter
+        keys_to_move = [k for k in self.adapters if len(k) < len(prefix)]
+
+        for key in keys_to_move:
+            self.adapters[key] = self.adapters.pop(key)
+
+    def __getstate__(self):
+        state = {attr: getattr(self, attr, None) for attr in self.__attrs__}
+        return state
+
+    def __setstate__(self, state):
+        for attr, value in state.items():
+            setattr(self, attr, value)
+
+
+def session():
+    """
+    Returns a :class:`Session` for context-management.
+
+    .. deprecated:: 1.0.0
+
+        This method has been deprecated since version 1.0.0 and is only kept for
+        backwards compatibility. New code should use :class:`~requests.sessions.Session`
+        to create a session. This may be removed at a future date.
+
+    :rtype: Session
+    """
+    return Session()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7e082744826c23d029301e89b5512a38975e7484
GIT binary patch
literal 24341
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
YKO-|EFL*aQCo_*c55L$~vHuK<0hPp*jQ{`u

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py
new file mode 100644
index 00000000..813e8c4e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+
+r"""
+The ``codes`` object defines a mapping from common names for HTTP statuses
+to their numerical codes, accessible either as attributes or as dictionary
+items.
+
+>>> requests.codes['temporary_redirect']
+307
+>>> requests.codes.teapot
+418
+>>> requests.codes['\o/']
+200
+
+Some codes have multiple names, and both upper- and lower-case versions of
+the names are allowed. For example, ``codes.ok``, ``codes.OK``, and
+``codes.okay`` all correspond to the HTTP status code 200.
+"""
+
+from .structures import LookupDict
+
+_codes = {
+
+    # Informational.
+    100: ('continue',),
+    101: ('switching_protocols',),
+    102: ('processing',),
+    103: ('checkpoint',),
+    122: ('uri_too_long', 'request_uri_too_long'),
+    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
+    201: ('created',),
+    202: ('accepted',),
+    203: ('non_authoritative_info', 'non_authoritative_information'),
+    204: ('no_content',),
+    205: ('reset_content', 'reset'),
+    206: ('partial_content', 'partial'),
+    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
+    208: ('already_reported',),
+    226: ('im_used',),
+
+    # Redirection.
+    300: ('multiple_choices',),
+    301: ('moved_permanently', 'moved', '\\o-'),
+    302: ('found',),
+    303: ('see_other', 'other'),
+    304: ('not_modified',),
+    305: ('use_proxy',),
+    306: ('switch_proxy',),
+    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
+    308: ('permanent_redirect',
+          'resume_incomplete', 'resume',),  # These 2 to be removed in 3.0
+
+    # Client Error.
+    400: ('bad_request', 'bad'),
+    401: ('unauthorized',),
+    402: ('payment_required', 'payment'),
+    403: ('forbidden',),
+    404: ('not_found', '-o-'),
+    405: ('method_not_allowed', 'not_allowed'),
+    406: ('not_acceptable',),
+    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
+    408: ('request_timeout', 'timeout'),
+    409: ('conflict',),
+    410: ('gone',),
+    411: ('length_required',),
+    412: ('precondition_failed', 'precondition'),
+    413: ('request_entity_too_large',),
+    414: ('request_uri_too_large',),
+    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
+    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
+    417: ('expectation_failed',),
+    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
+    421: ('misdirected_request',),
+    422: ('unprocessable_entity', 'unprocessable'),
+    423: ('locked',),
+    424: ('failed_dependency', 'dependency'),
+    425: ('unordered_collection', 'unordered'),
+    426: ('upgrade_required', 'upgrade'),
+    428: ('precondition_required', 'precondition'),
+    429: ('too_many_requests', 'too_many'),
+    431: ('header_fields_too_large', 'fields_too_large'),
+    444: ('no_response', 'none'),
+    449: ('retry_with', 'retry'),
+    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
+    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
+    499: ('client_closed_request',),
+
+    # Server Error.
+    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
+    501: ('not_implemented',),
+    502: ('bad_gateway',),
+    503: ('service_unavailable', 'unavailable'),
+    504: ('gateway_timeout',),
+    505: ('http_version_not_supported', 'http_version'),
+    506: ('variant_also_negotiates',),
+    507: ('insufficient_storage',),
+    509: ('bandwidth_limit_exceeded', 'bandwidth'),
+    510: ('not_extended',),
+    511: ('network_authentication_required', 'network_auth', 'network_authentication'),
+}
+
+codes = LookupDict(name='status_codes')
+
+def _init():
+    for code, titles in _codes.items():
+        for title in titles:
+            setattr(codes, title, code)
+            if not title.startswith(('\\', '/')):
+                setattr(codes, title.upper(), code)
+
+    def doc(code):
+        names = ', '.join('``%s``' % n for n in _codes[code])
+        return '* %d: %s' % (code, names)
+
+    global __doc__
+    __doc__ = (__doc__ + '\n' +
+               '\n'.join(doc(code) for code in sorted(_codes))
+               if __doc__ is not None else None)
+
+_init()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0a6bda464ff26d90ddfb39242cfdd6c29b672706
GIT binary patch
literal 6277
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
RqaVB3SWVz!=4av*0050HHZcGI

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py
new file mode 100644
index 00000000..da930e28
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.structures
+~~~~~~~~~~~~~~~~~~~
+
+Data structures that power Requests.
+"""
+
+from .compat import OrderedDict, Mapping, MutableMapping
+
+
+class CaseInsensitiveDict(MutableMapping):
+    """A case-insensitive ``dict``-like object.
+
+    Implements all methods and operations of
+    ``MutableMapping`` as well as dict's ``copy``. Also
+    provides ``lower_items``.
+
+    All keys are expected to be strings. The structure remembers the
+    case of the last key to be set, and ``iter(instance)``,
+    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
+    will contain case-sensitive keys. However, querying and contains
+    testing is case insensitive::
+
+        cid = CaseInsensitiveDict()
+        cid['Accept'] = 'application/json'
+        cid['aCCEPT'] == 'application/json'  # True
+        list(cid) == ['Accept']  # True
+
+    For example, ``headers['content-encoding']`` will return the
+    value of a ``'Content-Encoding'`` response header, regardless
+    of how the header name was originally stored.
+
+    If the constructor, ``.update``, or equality comparison
+    operations are given keys that have equal ``.lower()``s, the
+    behavior is undefined.
+    """
+
+    def __init__(self, data=None, **kwargs):
+        self._store = OrderedDict()
+        if data is None:
+            data = {}
+        self.update(data, **kwargs)
+
+    def __setitem__(self, key, value):
+        # Use the lowercased key for lookups, but store the actual
+        # key alongside the value.
+        self._store[key.lower()] = (key, value)
+
+    def __getitem__(self, key):
+        return self._store[key.lower()][1]
+
+    def __delitem__(self, key):
+        del self._store[key.lower()]
+
+    def __iter__(self):
+        return (casedkey for casedkey, mappedvalue in self._store.values())
+
+    def __len__(self):
+        return len(self._store)
+
+    def lower_items(self):
+        """Like iteritems(), but with all lowercase keys."""
+        return (
+            (lowerkey, keyval[1])
+            for (lowerkey, keyval)
+            in self._store.items()
+        )
+
+    def __eq__(self, other):
+        if isinstance(other, Mapping):
+            other = CaseInsensitiveDict(other)
+        else:
+            return NotImplemented
+        # Compare insensitively
+        return dict(self.lower_items()) == dict(other.lower_items())
+
+    # Copy is required
+    def copy(self):
+        return CaseInsensitiveDict(self._store.values())
+
+    def __repr__(self):
+        return str(dict(self.items()))
+
+
+class LookupDict(dict):
+    """Dictionary lookup object."""
+
+    def __init__(self, name=None):
+        self.name = name
+        super(LookupDict, self).__init__()
+
+    def __repr__(self):
+        return '<lookup \'%s\'>' % (self.name)
+
+    def __getitem__(self, key):
+        # We allow fall-through here, so values default to None
+
+        return self.__dict__.get(key, None)
+
+    def get(self, key, default=None):
+        return self.__dict__.get(key, default)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..db2af66cb6cb11b44d6c4e21afe892b49b01e824
GIT binary patch
literal 6281
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py b/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py
new file mode 100644
index 00000000..8170a8d2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py
@@ -0,0 +1,977 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.utils
+~~~~~~~~~~~~~~
+
+This module provides utility functions that are used within Requests
+that are also useful for external consumption.
+"""
+
+import codecs
+import contextlib
+import io
+import os
+import re
+import socket
+import struct
+import sys
+import tempfile
+import warnings
+import zipfile
+
+from .__version__ import __version__
+from . import certs
+# to_native_string is unused here, but imported here for backwards compatibility
+from ._internal_utils import to_native_string
+from .compat import parse_http_list as _parse_list_header
+from .compat import (
+    quote, urlparse, bytes, str, OrderedDict, unquote, getproxies,
+    proxy_bypass, urlunparse, basestring, integer_types, is_py3,
+    proxy_bypass_environment, getproxies_environment, Mapping)
+from .cookies import cookiejar_from_dict
+from .structures import CaseInsensitiveDict
+from .exceptions import (
+    InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError)
+
+NETRC_FILES = ('.netrc', '_netrc')
+
+DEFAULT_CA_BUNDLE_PATH = certs.where()
+
+DEFAULT_PORTS = {'http': 80, 'https': 443}
+
+
+if sys.platform == 'win32':
+    # provide a proxy_bypass version on Windows without DNS lookups
+
+    def proxy_bypass_registry(host):
+        try:
+            if is_py3:
+                import winreg
+            else:
+                import _winreg as winreg
+        except ImportError:
+            return False
+
+        try:
+            internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
+                r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
+            # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it
+            proxyEnable = int(winreg.QueryValueEx(internetSettings,
+                                              'ProxyEnable')[0])
+            # ProxyOverride is almost always a string
+            proxyOverride = winreg.QueryValueEx(internetSettings,
+                                                'ProxyOverride')[0]
+        except OSError:
+            return False
+        if not proxyEnable or not proxyOverride:
+            return False
+
+        # make a check value list from the registry entry: replace the
+        # '<local>' string by the localhost entry and the corresponding
+        # canonical entry.
+        proxyOverride = proxyOverride.split(';')
+        # now check if we match one of the registry values.
+        for test in proxyOverride:
+            if test == '<local>':
+                if '.' not in host:
+                    return True
+            test = test.replace(".", r"\.")     # mask dots
+            test = test.replace("*", r".*")     # change glob sequence
+            test = test.replace("?", r".")      # change glob char
+            if re.match(test, host, re.I):
+                return True
+        return False
+
+    def proxy_bypass(host):  # noqa
+        """Return True, if the host should be bypassed.
+
+        Checks proxy settings gathered from the environment, if specified,
+        or the registry.
+        """
+        if getproxies_environment():
+            return proxy_bypass_environment(host)
+        else:
+            return proxy_bypass_registry(host)
+
+
+def dict_to_sequence(d):
+    """Returns an internal sequence dictionary update."""
+
+    if hasattr(d, 'items'):
+        d = d.items()
+
+    return d
+
+
+def super_len(o):
+    total_length = None
+    current_position = 0
+
+    if hasattr(o, '__len__'):
+        total_length = len(o)
+
+    elif hasattr(o, 'len'):
+        total_length = o.len
+
+    elif hasattr(o, 'fileno'):
+        try:
+            fileno = o.fileno()
+        except io.UnsupportedOperation:
+            pass
+        else:
+            total_length = os.fstat(fileno).st_size
+
+            # Having used fstat to determine the file length, we need to
+            # confirm that this file was opened up in binary mode.
+            if 'b' not in o.mode:
+                warnings.warn((
+                    "Requests has determined the content-length for this "
+                    "request using the binary size of the file: however, the "
+                    "file has been opened in text mode (i.e. without the 'b' "
+                    "flag in the mode). This may lead to an incorrect "
+                    "content-length. In Requests 3.0, support will be removed "
+                    "for files in text mode."),
+                    FileModeWarning
+                )
+
+    if hasattr(o, 'tell'):
+        try:
+            current_position = o.tell()
+        except (OSError, IOError):
+            # This can happen in some weird situations, such as when the file
+            # is actually a special file descriptor like stdin. In this
+            # instance, we don't know what the length is, so set it to zero and
+            # let requests chunk it instead.
+            if total_length is not None:
+                current_position = total_length
+        else:
+            if hasattr(o, 'seek') and total_length is None:
+                # StringIO and BytesIO have seek but no useable fileno
+                try:
+                    # seek to end of file
+                    o.seek(0, 2)
+                    total_length = o.tell()
+
+                    # seek back to current position to support
+                    # partially read file-like objects
+                    o.seek(current_position or 0)
+                except (OSError, IOError):
+                    total_length = 0
+
+    if total_length is None:
+        total_length = 0
+
+    return max(0, total_length - current_position)
+
+
+def get_netrc_auth(url, raise_errors=False):
+    """Returns the Requests tuple auth for a given url from netrc."""
+
+    try:
+        from netrc import netrc, NetrcParseError
+
+        netrc_path = None
+
+        for f in NETRC_FILES:
+            try:
+                loc = os.path.expanduser('~/{}'.format(f))
+            except KeyError:
+                # os.path.expanduser can fail when $HOME is undefined and
+                # getpwuid fails. See https://bugs.python.org/issue20164 &
+                # https://github.com/requests/requests/issues/1846
+                return
+
+            if os.path.exists(loc):
+                netrc_path = loc
+                break
+
+        # Abort early if there isn't one.
+        if netrc_path is None:
+            return
+
+        ri = urlparse(url)
+
+        # Strip port numbers from netloc. This weird `if...encode`` dance is
+        # used for Python 3.2, which doesn't support unicode literals.
+        splitstr = b':'
+        if isinstance(url, str):
+            splitstr = splitstr.decode('ascii')
+        host = ri.netloc.split(splitstr)[0]
+
+        try:
+            _netrc = netrc(netrc_path).authenticators(host)
+            if _netrc:
+                # Return with login / password
+                login_i = (0 if _netrc[0] else 1)
+                return (_netrc[login_i], _netrc[2])
+        except (NetrcParseError, IOError):
+            # If there was a parsing error or a permissions issue reading the file,
+            # we'll just skip netrc auth unless explicitly asked to raise errors.
+            if raise_errors:
+                raise
+
+    # AppEngine hackiness.
+    except (ImportError, AttributeError):
+        pass
+
+
+def guess_filename(obj):
+    """Tries to guess the filename of the given object."""
+    name = getattr(obj, 'name', None)
+    if (name and isinstance(name, basestring) and name[0] != '<' and
+            name[-1] != '>'):
+        return os.path.basename(name)
+
+
+def extract_zipped_paths(path):
+    """Replace nonexistent paths that look like they refer to a member of a zip
+    archive with the location of an extracted copy of the target, or else
+    just return the provided path unchanged.
+    """
+    if os.path.exists(path):
+        # this is already a valid path, no need to do anything further
+        return path
+
+    # find the first valid part of the provided path and treat that as a zip archive
+    # assume the rest of the path is the name of a member in the archive
+    archive, member = os.path.split(path)
+    while archive and not os.path.exists(archive):
+        archive, prefix = os.path.split(archive)
+        member = '/'.join([prefix, member])
+
+    if not zipfile.is_zipfile(archive):
+        return path
+
+    zip_file = zipfile.ZipFile(archive)
+    if member not in zip_file.namelist():
+        return path
+
+    # we have a valid zip archive and a valid member of that archive
+    tmp = tempfile.gettempdir()
+    extracted_path = os.path.join(tmp, *member.split('/'))
+    if not os.path.exists(extracted_path):
+        extracted_path = zip_file.extract(member, path=tmp)
+
+    return extracted_path
+
+
+def from_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. Unless it can not be represented as such, return an
+    OrderedDict, e.g.,
+
+    ::
+
+        >>> from_key_val_list([('key', 'val')])
+        OrderedDict([('key', 'val')])
+        >>> from_key_val_list('string')
+        ValueError: cannot encode objects that are not 2-tuples
+        >>> from_key_val_list({'key': 'val'})
+        OrderedDict([('key', 'val')])
+
+    :rtype: OrderedDict
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    return OrderedDict(value)
+
+
+def to_key_val_list(value):
+    """Take an object and test to see if it can be represented as a
+    dictionary. If it can be, return a list of tuples, e.g.,
+
+    ::
+
+        >>> to_key_val_list([('key', 'val')])
+        [('key', 'val')]
+        >>> to_key_val_list({'key': 'val'})
+        [('key', 'val')]
+        >>> to_key_val_list('string')
+        ValueError: cannot encode objects that are not 2-tuples.
+
+    :rtype: list
+    """
+    if value is None:
+        return None
+
+    if isinstance(value, (str, bytes, bool, int)):
+        raise ValueError('cannot encode objects that are not 2-tuples')
+
+    if isinstance(value, Mapping):
+        value = value.items()
+
+    return list(value)
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_list_header(value):
+    """Parse lists as described by RFC 2068 Section 2.
+
+    In particular, parse comma-separated lists where the elements of
+    the list may include quoted-strings.  A quoted-string could
+    contain a comma.  A non-quoted string could have quotes in the
+    middle.  Quotes are removed automatically after parsing.
+
+    It basically works like :func:`parse_set_header` just that items
+    may appear multiple times and case sensitivity is preserved.
+
+    The return value is a standard :class:`list`:
+
+    >>> parse_list_header('token, "quoted value"')
+    ['token', 'quoted value']
+
+    To create a header from the :class:`list` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a list header.
+    :return: :class:`list`
+    :rtype: list
+    """
+    result = []
+    for item in _parse_list_header(value):
+        if item[:1] == item[-1:] == '"':
+            item = unquote_header_value(item[1:-1])
+        result.append(item)
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def parse_dict_header(value):
+    """Parse lists of key, value pairs as described by RFC 2068 Section 2 and
+    convert them into a python dict:
+
+    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
+    >>> type(d) is dict
+    True
+    >>> sorted(d.items())
+    [('bar', 'as well'), ('foo', 'is a fish')]
+
+    If there is no value for a key it will be `None`:
+
+    >>> parse_dict_header('key_without_value')
+    {'key_without_value': None}
+
+    To create a header from the :class:`dict` again, use the
+    :func:`dump_header` function.
+
+    :param value: a string with a dict header.
+    :return: :class:`dict`
+    :rtype: dict
+    """
+    result = {}
+    for item in _parse_list_header(value):
+        if '=' not in item:
+            result[item] = None
+            continue
+        name, value = item.split('=', 1)
+        if value[:1] == value[-1:] == '"':
+            value = unquote_header_value(value[1:-1])
+        result[name] = value
+    return result
+
+
+# From mitsuhiko/werkzeug (used with permission).
+def unquote_header_value(value, is_filename=False):
+    r"""Unquotes a header value.  (Reversal of :func:`quote_header_value`).
+    This does not use the real unquoting but what browsers are actually
+    using for quoting.
+
+    :param value: the header value to unquote.
+    :rtype: str
+    """
+    if value and value[0] == value[-1] == '"':
+        # this is not the real unquoting, but fixing this so that the
+        # RFC is met will result in bugs with internet explorer and
+        # probably some other browsers as well.  IE for example is
+        # uploading files with "C:\foo\bar.txt" as filename
+        value = value[1:-1]
+
+        # if this is a filename and the starting characters look like
+        # a UNC path, then just return the value without quotes.  Using the
+        # replace sequence below on a UNC path has the effect of turning
+        # the leading double slash into a single slash and then
+        # _fix_ie_filename() doesn't work correctly.  See #458.
+        if not is_filename or value[:2] != '\\\\':
+            return value.replace('\\\\', '\\').replace('\\"', '"')
+    return value
+
+
+def dict_from_cookiejar(cj):
+    """Returns a key/value dictionary from a CookieJar.
+
+    :param cj: CookieJar object to extract cookies from.
+    :rtype: dict
+    """
+
+    cookie_dict = {}
+
+    for cookie in cj:
+        cookie_dict[cookie.name] = cookie.value
+
+    return cookie_dict
+
+
+def add_dict_to_cookiejar(cj, cookie_dict):
+    """Returns a CookieJar from a key/value dictionary.
+
+    :param cj: CookieJar to insert cookies into.
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
+    :rtype: CookieJar
+    """
+
+    return cookiejar_from_dict(cookie_dict, cj)
+
+
+def get_encodings_from_content(content):
+    """Returns encodings from given content string.
+
+    :param content: bytestring to extract encodings from.
+    """
+    warnings.warn((
+        'In requests 3.0, get_encodings_from_content will be removed. For '
+        'more information, please see the discussion on issue #2266. (This'
+        ' warning should only appear once.)'),
+        DeprecationWarning)
+
+    charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I)
+    pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I)
+    xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]')
+
+    return (charset_re.findall(content) +
+            pragma_re.findall(content) +
+            xml_re.findall(content))
+
+
+def _parse_content_type_header(header):
+    """Returns content type and parameters from given header
+
+    :param header: string
+    :return: tuple containing content type and dictionary of
+         parameters
+    """
+
+    tokens = header.split(';')
+    content_type, params = tokens[0].strip(), tokens[1:]
+    params_dict = {}
+    items_to_strip = "\"' "
+
+    for param in params:
+        param = param.strip()
+        if param:
+            key, value = param, True
+            index_of_equals = param.find("=")
+            if index_of_equals != -1:
+                key = param[:index_of_equals].strip(items_to_strip)
+                value = param[index_of_equals + 1:].strip(items_to_strip)
+            params_dict[key.lower()] = value
+    return content_type, params_dict
+
+
+def get_encoding_from_headers(headers):
+    """Returns encodings from given HTTP Header Dict.
+
+    :param headers: dictionary to extract encoding from.
+    :rtype: str
+    """
+
+    content_type = headers.get('content-type')
+
+    if not content_type:
+        return None
+
+    content_type, params = _parse_content_type_header(content_type)
+
+    if 'charset' in params:
+        return params['charset'].strip("'\"")
+
+    if 'text' in content_type:
+        return 'ISO-8859-1'
+
+
+def stream_decode_response_unicode(iterator, r):
+    """Stream decodes a iterator."""
+
+    if r.encoding is None:
+        for item in iterator:
+            yield item
+        return
+
+    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
+    for chunk in iterator:
+        rv = decoder.decode(chunk)
+        if rv:
+            yield rv
+    rv = decoder.decode(b'', final=True)
+    if rv:
+        yield rv
+
+
+def iter_slices(string, slice_length):
+    """Iterate over slices of a string."""
+    pos = 0
+    if slice_length is None or slice_length <= 0:
+        slice_length = len(string)
+    while pos < len(string):
+        yield string[pos:pos + slice_length]
+        pos += slice_length
+
+
+def get_unicode_from_response(r):
+    """Returns the requested content back in unicode.
+
+    :param r: Response object to get unicode content from.
+
+    Tried:
+
+    1. charset from content-type
+    2. fall back and replace all unicode characters
+
+    :rtype: str
+    """
+    warnings.warn((
+        'In requests 3.0, get_unicode_from_response will be removed. For '
+        'more information, please see the discussion on issue #2266. (This'
+        ' warning should only appear once.)'),
+        DeprecationWarning)
+
+    tried_encodings = []
+
+    # Try charset from content-type
+    encoding = get_encoding_from_headers(r.headers)
+
+    if encoding:
+        try:
+            return str(r.content, encoding)
+        except UnicodeError:
+            tried_encodings.append(encoding)
+
+    # Fall back:
+    try:
+        return str(r.content, encoding, errors='replace')
+    except TypeError:
+        return r.content
+
+
+# The unreserved URI characters (RFC 3986)
+UNRESERVED_SET = frozenset(
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~")
+
+
+def unquote_unreserved(uri):
+    """Un-escape any percent-escape sequences in a URI that are unreserved
+    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
+
+    :rtype: str
+    """
+    parts = uri.split('%')
+    for i in range(1, len(parts)):
+        h = parts[i][0:2]
+        if len(h) == 2 and h.isalnum():
+            try:
+                c = chr(int(h, 16))
+            except ValueError:
+                raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)
+
+            if c in UNRESERVED_SET:
+                parts[i] = c + parts[i][2:]
+            else:
+                parts[i] = '%' + parts[i]
+        else:
+            parts[i] = '%' + parts[i]
+    return ''.join(parts)
+
+
+def requote_uri(uri):
+    """Re-quote the given URI.
+
+    This function passes the given URI through an unquote/quote cycle to
+    ensure that it is fully and consistently quoted.
+
+    :rtype: str
+    """
+    safe_with_percent = "!#$%&'()*+,/:;=?@[]~"
+    safe_without_percent = "!#$&'()*+,/:;=?@[]~"
+    try:
+        # Unquote only the unreserved characters
+        # Then quote only illegal characters (do not quote reserved,
+        # unreserved, or '%')
+        return quote(unquote_unreserved(uri), safe=safe_with_percent)
+    except InvalidURL:
+        # We couldn't unquote the given URI, so let's try quoting it, but
+        # there may be unquoted '%'s in the URI. We need to make sure they're
+        # properly quoted so they do not cause issues elsewhere.
+        return quote(uri, safe=safe_without_percent)
+
+
+def address_in_network(ip, net):
+    """This function allows you to check if an IP belongs to a network subnet
+
+    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
+             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24
+
+    :rtype: bool
+    """
+    ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0]
+    netaddr, bits = net.split('/')
+    netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0]
+    network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask
+    return (ipaddr & netmask) == (network & netmask)
+
+
+def dotted_netmask(mask):
+    """Converts mask from /xx format to xxx.xxx.xxx.xxx
+
+    Example: if mask is 24 function returns 255.255.255.0
+
+    :rtype: str
+    """
+    bits = 0xffffffff ^ (1 << 32 - mask) - 1
+    return socket.inet_ntoa(struct.pack('>I', bits))
+
+
+def is_ipv4_address(string_ip):
+    """
+    :rtype: bool
+    """
+    try:
+        socket.inet_aton(string_ip)
+    except socket.error:
+        return False
+    return True
+
+
+def is_valid_cidr(string_network):
+    """
+    Very simple check of the cidr format in no_proxy variable.
+
+    :rtype: bool
+    """
+    if string_network.count('/') == 1:
+        try:
+            mask = int(string_network.split('/')[1])
+        except ValueError:
+            return False
+
+        if mask < 1 or mask > 32:
+            return False
+
+        try:
+            socket.inet_aton(string_network.split('/')[0])
+        except socket.error:
+            return False
+    else:
+        return False
+    return True
+
+
+@contextlib.contextmanager
+def set_environ(env_name, value):
+    """Set the environment variable 'env_name' to 'value'
+
+    Save previous value, yield, and then restore the previous value stored in
+    the environment variable 'env_name'.
+
+    If 'value' is None, do nothing"""
+    value_changed = value is not None
+    if value_changed:
+        old_value = os.environ.get(env_name)
+        os.environ[env_name] = value
+    try:
+        yield
+    finally:
+        if value_changed:
+            if old_value is None:
+                del os.environ[env_name]
+            else:
+                os.environ[env_name] = old_value
+
+
+def should_bypass_proxies(url, no_proxy):
+    """
+    Returns whether we should bypass proxies or not.
+
+    :rtype: bool
+    """
+    # Prioritize lowercase environment variables over uppercase
+    # to keep a consistent behaviour with other http projects (curl, wget).
+    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())
+
+    # First check whether no_proxy is defined. If it is, check that the URL
+    # we're getting isn't in the no_proxy list.
+    no_proxy_arg = no_proxy
+    if no_proxy is None:
+        no_proxy = get_proxy('no_proxy')
+    parsed = urlparse(url)
+
+    if parsed.hostname is None:
+        # URLs don't always have hostnames, e.g. file:/// urls.
+        return True
+
+    if no_proxy:
+        # We need to check whether we match here. We need to see if we match
+        # the end of the hostname, both with and without the port.
+        no_proxy = (
+            host for host in no_proxy.replace(' ', '').split(',') if host
+        )
+
+        if is_ipv4_address(parsed.hostname):
+            for proxy_ip in no_proxy:
+                if is_valid_cidr(proxy_ip):
+                    if address_in_network(parsed.hostname, proxy_ip):
+                        return True
+                elif parsed.hostname == proxy_ip:
+                    # If no_proxy ip was defined in plain IP notation instead of cidr notation &
+                    # matches the IP of the index
+                    return True
+        else:
+            host_with_port = parsed.hostname
+            if parsed.port:
+                host_with_port += ':{}'.format(parsed.port)
+
+            for host in no_proxy:
+                if parsed.hostname.endswith(host) or host_with_port.endswith(host):
+                    # The URL does match something in no_proxy, so we don't want
+                    # to apply the proxies on this URL.
+                    return True
+
+    with set_environ('no_proxy', no_proxy_arg):
+        # parsed.hostname can be `None` in cases such as a file URI.
+        try:
+            bypass = proxy_bypass(parsed.hostname)
+        except (TypeError, socket.gaierror):
+            bypass = False
+
+    if bypass:
+        return True
+
+    return False
+
+
+def get_environ_proxies(url, no_proxy=None):
+    """
+    Return a dict of environment proxies.
+
+    :rtype: dict
+    """
+    if should_bypass_proxies(url, no_proxy=no_proxy):
+        return {}
+    else:
+        return getproxies()
+
+
+def select_proxy(url, proxies):
+    """Select a proxy for the url, if applicable.
+
+    :param url: The url being for the request
+    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
+    """
+    proxies = proxies or {}
+    urlparts = urlparse(url)
+    if urlparts.hostname is None:
+        return proxies.get(urlparts.scheme, proxies.get('all'))
+
+    proxy_keys = [
+        urlparts.scheme + '://' + urlparts.hostname,
+        urlparts.scheme,
+        'all://' + urlparts.hostname,
+        'all',
+    ]
+    proxy = None
+    for proxy_key in proxy_keys:
+        if proxy_key in proxies:
+            proxy = proxies[proxy_key]
+            break
+
+    return proxy
+
+
+def default_user_agent(name="python-requests"):
+    """
+    Return a string representing the default user agent.
+
+    :rtype: str
+    """
+    return '%s/%s' % (name, __version__)
+
+
+def default_headers():
+    """
+    :rtype: requests.structures.CaseInsensitiveDict
+    """
+    return CaseInsensitiveDict({
+        'User-Agent': default_user_agent(),
+        'Accept-Encoding': ', '.join(('gzip', 'deflate')),
+        'Accept': '*/*',
+        'Connection': 'keep-alive',
+    })
+
+
+def parse_header_links(value):
+    """Return a list of parsed link headers proxies.
+
+    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"
+
+    :rtype: list
+    """
+
+    links = []
+
+    replace_chars = ' \'"'
+
+    value = value.strip(replace_chars)
+    if not value:
+        return links
+
+    for val in re.split(', *<', value):
+        try:
+            url, params = val.split(';', 1)
+        except ValueError:
+            url, params = val, ''
+
+        link = {'url': url.strip('<> \'"')}
+
+        for param in params.split(';'):
+            try:
+                key, value = param.split('=')
+            except ValueError:
+                break
+
+            link[key.strip(replace_chars)] = value.strip(replace_chars)
+
+        links.append(link)
+
+    return links
+
+
+# Null bytes; no need to recreate these on each call to guess_json_utf
+_null = '\x00'.encode('ascii')  # encoding to ASCII for Python 3
+_null2 = _null * 2
+_null3 = _null * 3
+
+
+def guess_json_utf(data):
+    """
+    :rtype: str
+    """
+    # JSON always starts with two ASCII characters, so detection is as
+    # easy as counting the nulls and from their location and count
+    # determine the encoding. Also detect a BOM, if present.
+    sample = data[:4]
+    if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE):
+        return 'utf-32'     # BOM included
+    if sample[:3] == codecs.BOM_UTF8:
+        return 'utf-8-sig'  # BOM included, MS style (discouraged)
+    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
+        return 'utf-16'     # BOM included
+    nullcount = sample.count(_null)
+    if nullcount == 0:
+        return 'utf-8'
+    if nullcount == 2:
+        if sample[::2] == _null2:   # 1st and 3rd are null
+            return 'utf-16-be'
+        if sample[1::2] == _null2:  # 2nd and 4th are null
+            return 'utf-16-le'
+        # Did not detect 2 valid UTF-16 ascii-range characters
+    if nullcount == 3:
+        if sample[:3] == _null3:
+            return 'utf-32-be'
+        if sample[1:] == _null3:
+            return 'utf-32-le'
+        # Did not detect a valid UTF-32 ascii-range character
+    return None
+
+
+def prepend_scheme_if_needed(url, new_scheme):
+    """Given a URL that may or may not have a scheme, prepend the given scheme.
+    Does not replace a present scheme with the one provided as an argument.
+
+    :rtype: str
+    """
+    scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme)
+
+    # urlparse is a finicky beast, and sometimes decides that there isn't a
+    # netloc present. Assume that it's being over-cautious, and switch netloc
+    # and path if urlparse decided there was no netloc.
+    if not netloc:
+        netloc, path = path, netloc
+
+    return urlunparse((scheme, netloc, path, params, query, fragment))
+
+
+def get_auth_from_url(url):
+    """Given a url with authentication components, extract them into a tuple of
+    username,password.
+
+    :rtype: (str,str)
+    """
+    parsed = urlparse(url)
+
+    try:
+        auth = (unquote(parsed.username), unquote(parsed.password))
+    except (AttributeError, TypeError):
+        auth = ('', '')
+
+    return auth
+
+
+# Moved outside of function to avoid recompile every call
+_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$')
+_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$')
+
+
+def check_header_validity(header):
+    """Verifies that header value is a string which doesn't contain
+    leading whitespace or return characters. This prevents unintended
+    header injection.
+
+    :param header: tuple, in the format (name, value).
+    """
+    name, value = header
+
+    if isinstance(value, bytes):
+        pat = _CLEAN_HEADER_REGEX_BYTE
+    else:
+        pat = _CLEAN_HEADER_REGEX_STR
+    try:
+        if not pat.match(value):
+            raise InvalidHeader("Invalid return character or leading space in header: %s" % name)
+    except TypeError:
+        raise InvalidHeader("Value for header {%s: %s} must be of type str or "
+                            "bytes, not %s" % (name, value, type(value)))
+
+
+def urldefragauth(url):
+    """
+    Given a url remove the fragment and the authentication part.
+
+    :rtype: str
+    """
+    scheme, netloc, path, params, query, fragment = urlparse(url)
+
+    # see func:`prepend_scheme_if_needed`
+    if not netloc:
+        netloc, path = path, netloc
+
+    netloc = netloc.rsplit('@', 1)[-1]
+
+    return urlunparse((scheme, netloc, path, params, query, ''))
+
+
+def rewind_body(prepared_request):
+    """Move file pointer back to its recorded starting position
+    so it can be read again on redirect.
+    """
+    body_seek = getattr(prepared_request.body, 'seek', None)
+    if body_seek is not None and isinstance(prepared_request._body_position, integer_types):
+        try:
+            body_seek(prepared_request._body_position)
+        except (IOError, OSError):
+            raise UnrewindableBodyError("An error occurred when rewinding request "
+                                        "body for redirect.")
+    else:
+        raise UnrewindableBodyError("Unable to rewind request body for redirect.")
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..74adad63f1cbe0f1eb5cf15ff968a941f03d82dc
GIT binary patch
literal 29347
zcmZSn%*&NH<x)&C0~9bbFfceUFfbGsGBYrwFfc?hFr+Xtq%bk$Ffv3j!q`j<QA{v4
zGeZ<JjLpIj#R6lqGDNY$*lY|@Y%n%ELlirV&A|}G0b_GAL~+8{TntfMFg7<s6gNW(
zGeZgsLk<r^E)PQ#4+A5J&&rU)%aF^*5XA@KvoYlGGvo>|L<vCn><l@A47oxKQNj>D
z2beFy5GBHpE6NZh%8)C@5GBTtE6xxl&X6m?5GBEoE6ETg$&f3>5GBQsE6ork&5$d@
z5GBKqE6Wfi%aAL_5GBWuE6)%m&ycIY5T(G7tH=<g$dIeV5TyjMgOedgnITt&AxZ_p
z=VHiFWyn=yh*E>_xfycQ8FDokqBIzCH5sBb8FIB4qO=%twHczc85mQX7@~9-Qu!FN
zbQzi%7^3tTGMN}s_!v_78O%}y7*Yfo%%b!eQaKp13>Z>`7_yldigq!k2s5-WFhm(L
zq=<kS(hPYF3@M^uwh=>$7?@$qkZQt^BF@ml$Pi`9kRkyVG-F7S1T)MTQl!8P3x*VF
zFvF4|MFz~UVn~q%GpxZT$bn6;VMvh&3)(WID1aGu3@M6WhCM@y5}4t@kfID`I5MQD
zfEi8<DXL(GGee3RnBl^Z>dKI!&XA(PAl}T#5aq^@q6wC8XGqZkGdvhlw80Edh7=tz
z!;2wB7tHWxNYMi`d>B%h7_xjBQuIMwkU4$~DFz^Rls_otrWk@99mtSk1QrZpNHJze
zF#!t(Go+Y;1w$B8%)pFLh7@y#tT2WY3kHx;;S8za3@MfjB2f`wmKB3YR3t-+HCSyF
zLy8TU5zUZd3ueSHq_Q$(#WJMWfpy2Ba^o3N?7_+s7*ZU-j6{YMM=&D^<kDabXHeFg
z!oa}5Rg_v-np#{^tXEo+nN!SFhXS~`LNYRo6>{@aN^?>b3X1Z}GE-8E6+lWeODYx8
zO7oISGV}9_6-qJ^OB51|QWZ*zQ&SYmGfOfu^Av)hMsvYs6LX65K}ym}a}?6@ixg5T
zN>YpR5_1%i^Ye;Ja|=L*>2YQL|NsBLUnV011A_*LDB)&cV2F<|OD!tS%+HIDhX}GV
zFfb&i7L^o3xB?6e3?=#Td5I;NWvTJSB}JKe=@1!y1_p+L#G>NV_>7X0g7}=w;t~yz
zSP964!qWVb)DjK`28Pn29Iz^|a8hMSYH<mukSZ=I0^9Fjl#*JMn&Og~TvEagQl1CV
z%EiFIke*snP?TShnOa=J1G20rzoIfesj?ukxVQu)Us{w?ng=l)#7#;pPK7wIgqMMV
zAv3QeH9fT`zNE4swYY>0BvKq-P-$Eufo4{GYF=4pQGQ--YF<f+7>d0pQXuE~CKeRH
zLqHf5RQdVYnW<TcMe%7x`ML2anaL%P-~mZGCl;rA<`t*r6=#Bi59CP=7EpkKoa>oa
zmY9>75*p+Kb}p3bk(!v2T2ulGNVm+KRNwrR)bPZjyv)4x5>W;QhS0pC)bh-{l*FW*
zRHyuuO4p*I{Gwuz=k)SYONx@g{)`7RGXp?2fvf|?Pv&k$1_p2(fOy4VR(WQgu~9N8
zDS!+BMH@K%Ix;daRH`zRFfbHJfJ<=(Q0-C6$dJba<1#VSGBSkc2{EvgFf(LxF%(%c
zFfuZhurLHiRC+ViFfwGZf=M<|wrFNzsAXa(VF!zFFw`)Cs)J@GP>mqj%*as7j3mLz
z0F|g^ftt?=Hh(7E{2FEkp5he@H7pD~MQa#9R@SgEWN|U1uz|8{Eek_MJxJ0eww$4s
zm7#`}A%z`W(mrQM;b5p?V8~`?D0<FN!p#tz#{iPf;sHsdaDps`XaI?DF{E&#ihz}Y
zyu!**!po4w2hv-^0A}+uG&3_49ReF#c!(h!<R}eL67&OSxngSu28Q7Lw370~qSP4Q
z%;ci{;{3FdnDETJl>GAI80XTWqSU;SFi1X(@yr8d-qaF>;M9_m%)Insa6SnDC4SdD
zP`qb?>UwaR0So$<r4|)srlgjDBGS4TluB)K@{<#D?7$*=#Y_wg3^96Ojux1srv>KN
zYX~qfFa&{;8aUaMXXX{9rh{`~Jd_P8Av|*n@{3Bq2@RZT+!Aw&Q^BhI3sUpEQ!7gZ
z85kHmyj>&XokN3yT>V1gLxWv|z_~m#uLPWR14~njD#H?UN>g1cAX<YF1{N3OWR{eG
z5^6|MDa7QW)PkJE<kS+7(~DBU*5)RbBxiu#?WqAuu3!xr`Nbtc%Aj-(@(L)&7v-gv
zpadMK1gV4s95~Fte0Z3FYy}lb8lW%*6UDg<3=H}OMVV!ZC8_#liADNp`8g@6MaBBr
zh5FgWM&{;*g;_@CWrh~!#W|Jf<?$vdCME_31_tSQ`XTxSnFYF;dBr7(IXSxJiI$~-
z86Y7rjxS5iOUW<Nht&-FpyIw*ub>i~vBA!Q7H;uHsp*-;B}J9`pz6c|<TOTRMm9!%
zCILoXMph<fMjl2^CLTrsCQe2{kO(6mBMU1(6E7nVBM&1xqYxNMFmf=0GdCz*fC3Vn
zxfMZy#Q<ua6bUnwFoJSKGb2NA2@{N!!pIP;0a9K(3zRxiOG=CK6hIN9qmY@VP?C|V
z019-4;*9*#oD_wmR0T+ZoSLG?#ialR&Kar6*~OrWt)fz)7@CX~(i2NEKxMrGsH6m&
zgjDc?O)oA;P0mcqOij^&8<k%KRtXCcJ-CFQ2B;bd0;RnmP~-=h!|JslBM=J|Y6BFZ
zL7;3C28ugSLS<m%WaMIk#{|gL;FwT?#6%6ah2G4>P$UP6f-FW*+|)9FT7fkTu&4kf
zgdlKK6e}d=DL@i>Vva&Fs40+_oT>n-cQW(y5{oJoN()jFOH%c~nI^L&HMbZXo8VlR
zkyxBqQc@HIN>Y$o3Y0cdz`+D21|ac+;tu5c_>%m1n0J!kVaLqR$PWoSP)-E}Cphe8
zF@k$Hwcs8NsB!@(<P;`QkzJ(408h=JN~;5!%u|@bvaaAz23KHtxiBdfu+%1oN&&De
zGdK>I8N%~K7+6YJK(!gDlB)t$LWP?cB1+g8ve+4Fm_ap876+&<Oko9U<OEkQn;1&C
z7_zuQRZ<BL$YjRCO`!OMWVaM{kWf(xBh)fpuw_gP;dwd?EG2vlCHxF&OyElIKghls
zMo>R4o0Flakg<jlRFf7KG8UFFMnFyDfSLwX$H4$H*%<5^0dRE<uGtuC7#Ol3Hi3gG
zO8`_47kDzJFoHb67+zS&h-!H*BO@b7ww95hu#hpLu!Ip*UqT$i!BEr*mCIvbC=mqN
zQ^N={QKFfNAy|Wpfq}sfQcZ!Xqxkro)V%n3aE*|Yng_0I(lT>W^YX#vc~Y?|BLf4h
zRjZJZSgeqeT9R6no0*rI0?z%(`FSO&c_q3zsd?!o8Q>;v38(=LElL$ii!<}m!77t7
z!FixKvno{~A5vU_Y_d|w$S+SVOD)m?s{#pu?MX^a%~QxPNCjDxnWs>aT2TUOm8U9b
zWa_2rfg9ZUr6piJ>PhMfX*r4M3LteEsbFQAdJ2$+d}5_SPHJL`LP<U(dnV@>6{RMZ
zfZE?k4%bugM6})&jP(q36pBj=K((tvd1g)ys4y)`&CM@MO#yom<jP{Obuee?fh)a|
z)SMhJqc}A+I}=n?YY2hL5>O8D%g;*<vIG^}wjja|Bo0!MnO`CTZazXSOil4GNG(bP
zbqv6jY(At#m{wep2x*5Gm&Aht5o}LxehQ>5Uk+)B7K24WoFH+KEuaC1AZ?IUpxE~G
z2UqPujvxV0X_uQ=0crJu3Y&azd!Qu0Bryk+D$+|bN<bw*GNcU@Uyu)KD(B|~fm{wQ
zlEB0OluMkTGN`m5wFu<QY!C<JO$J6bMm8o;p~TO~!^F?X%qYMpz{tWR#KO<W#>mXZ
z%M1|{X60ezWs+uMW)fiJVG(B(W)xroRocm*$N+U_;6+&~sI~15%1xkA8U}`322dW)
z1-FYCQ&<>4E!sGS5@rUM*f3Cwwo)F{=*?nf$YKMvqe0~mD<}(tTGDLLHZupf_=pD;
zA1R<VIiv{7;$)}+H<F9gK#W=zhJZpfhC(%l@ER6SV?3LKp=bh#5nRFrDnCFbvNNQx
zGSqT_nzo?EF1R!+I?PbR0V++PO>PcQ*;d02Y7=MigQS`nL5*(7T26*acTk~F!vb<3
zsL0_2F>1LOYPcAR<QZ$Y!0L+F8B^F9@|Z#G@LFz=Tn#saBuJ8zK{AbrAviownSrH-
z8C1|fOGZ~v;Z(!OP~^tg#K2JK#+b**5D}gy&cIS4#84s(D?k%K%0N<}Pym-o;I=rd
zCIvNS;Kfc!X+ch^LSiYjd`VPD&n!#LQz$LUfwWh^eJVY0gC0_$g8EBfL2zfy57he#
z0Ck7KslOPM8SC_`YyH4QoE5k>PApE&%mf#U;7&Ls>w>anP#`E91%U`BP_6;BAN*WH
zf}G>sJbhe)gIqy^AQKA`OESP+-_(kN#JrT!;?$xNP)bV6FUn0U0r$7PQz4x~uy|@k
zW^qYz5Xh-uZJEX3#%W%1Y7i)^g4Lv?CWG=f$e6s;lAQeHARUl(d<+Z>pwLLoE6Gew
zEXgk_4)O*$P!%TWSW;4ynN(Vm3ihxDC{cq;_|l>ra2_v8%q&igPX%{S5gr6P0~~De
zV9$Wcgfy_eocv^PQB;%(_6N9EP+U?3Zp{Trf@}pjIVV3oGcP_9Tq=Nx0Vo<kL6e?Z
z0_kSQg92#<sC)pmsu-A=8O4~`n0OhP8RZ#ySy-8b7}*#(n0Xjkn0Q#&82K567{!>F
z8ATb{n8X;x7=@YH82OlmAq{m<*#L@Va1$pQ<YNX<J_HTmvVppowTz&ia#1+AeZvSU
z6F|+zaFAdM6N6+5Geb5rLlK0}!XTN#3gttyKO0CPsIi~I#t^Il3d~{y1_p+ZqRiA{
zP|cNInpzARa!OSI)jWBLx$r6!k`?lkvQm>vAaxK(7Mzm7$=e2;Ex=4WKd{N*=4N^-
zs5U7I0;TC7kbi=BK`987nu9>iV{kl!Mr}Z*K{6GnzQ|9?3Idr8j$SY^P;m?jka$>N
z+y=!lXhe&FNr+LEQ2-KWpkRc@88>K*g@GZ9ks*r-6m!jt3`JrfMsNv4lo`ZnW@Lx~
zw?Au{7%IF#ky2Cz8f}4U12@Qc5JKSL5riJ_V0{(~sP$RH#E{MeE>W2n3Jn>;OTd*v
z4cLI<K9E(xAR+L;3#c$>ffmMD9H1sAXdq-WL=h)w0Hv7$RJ}kQ$^stVU}DGuTi49U
z(8I`3%ZB7ia79wg&IlTO;RczT!UWRN%*a^F2Cff4X$%yb#YaGK4(ZP;<mKmqi=@=N
z5(QB92PL<}5`~=n{A`7s%<NQ9ORG|$C^ap$2$Uid6>?K^lTwR7O}Rvcs>}j#?=P_^
zIU}<y72G-lX;1)-c7R$kU}brr(a)m9<dW1Bh2;E#N{}F^pf5=*N>44(Q2-5(<`k!b
zP0A`QE>S1~_p87LK}TX!z;070%}dTm%u5ILY!ws~6u`+_ADnQ(g&nw526Ka=Kwbow
znxLeRm7kdhPXASz1)#(OF7h&q<6&G-l8MSJ01fYfa{wsygGNumoRZXBgr@Y=5)eNn
zvj}WnYDEdiW8e%1wiql54GwTw4hb$Wv!Ez7Ewch_W>sbZI2D77*^=CX5>NpKH7qp+
zTn>Y?8JHM=yauWQq0RvXQUTOW#g9QbP65=BXBA>%VUb{zVU%E$Wa4LJVFHz-EX+KN
za*RTZ5|9oes3rkbV&Kx#g#l7@GBJQ!H3Fbv$Y4l^se}nsaF(!u21C;z{XQ#(5;jm5
zrkRnUi4l}|L1UE+po|p^9%LxKz{tQ5l9-(eYTQFgL50M;6a~=05h$4!r>26&Mlwqj
zk`wbFt@whX)Z)}UP#R1uR!9UVHc%%Q(nZ%(2+hj@m9<bEdHE$+bQPB-XXwCEXJQ`M
z45ZO=9fefAbUhu&po^6iga)NkJ3BjYizPlgwKBd8)XWBr%tvdeXQx)G>nNy~CFZDW
z#%hAi1F1(cQv<gu?53(i#@p2qra=bzK$X4~C^SG`OU(l{FccsG2hH)IISr7UkuJF1
zRSb6xc6+M9j<<q1z7}B{ez$`SwJHKl09Yv?DFurcgE}n9iFqJb5aU8W4N%#SRF{FW
zaS$lMfqO$q`T03PnxHzHi-Caw5eh*dU68RBP%EqqGzJRJXJBFgG8<^X3^V|Tl029h
z85oK|4rdSmwN#{GgDxm}3N$JM8m%HTPcee(ni9z1M+ArssfHj!T_v0#5m4g<lH+=)
zo#Q;y6ri~+DHV~c6hP%JxP}0={)_SEsgit@Aj6Ya&~p(uy@9eCC~>13gDYv1WC+#r
zA#@NImT5r219m;>xdoJ(u;rGZ22f=Q$|*sOAeIn_05zS#*$8AIIJX2f4e%f?xL1c3
zSu&t(0;)V2_+i-uG!y_H+Xc0CKsg*-{bYb<5g9-OgB8)BMpF&AHgSpd1@-Mg6JU%C
z3LuJ!L7s&<n~5Rc0@Rn!W@5-=Vqjt{3I>l$!j@<#g4%9Opn3^3vBm^yY&A17Fcu0k
zgx7!u>p^XfVkTw=25|QioTQ5tz=LST$wiq-sVNFcl?p*_&I(2bW)=#;so=R~1tVxw
zd*&$=Bo>uqCYR<U7U_W4#i<I(`MJ4?y2YsliA9N^N(>Y&#R}!1;d^jHDK#e*G+SD%
zke>!l9-symNR2{nVx>Z6UUE)pN~%I3Xbw0<7g9wO>nSKWq6#S_gQgI``auJHiJ5r{
zi4dE?YV-2*bRkA4K#YK>SI9^#gPIK)9Ls>T<#IDqQgTxD6chqM))s?j&0(WyiKQj^
zxrv~DY)($4LSkA;Y7y9@nR)53P$*GIN-WMyP6R0^&o9a@hO|emKy&d{3E)ZQ_~O)(
z_zdv;Y=Q!~=?I>H2amCXeF5@(VnIP_Vv#~_X--KdXh5MPGdC49W}l*voLHQy0GkU2
zP4j1hW=K+tQ;W(#O-!%}AsMN#8XsI!C}b8ZBq|h_B<7_g7NsayCFdj-7h5HOf;s_O
z<%7x;i1R?AQ1@x5m*i)s=IJOXK|>I1ni900j)usB8Ux7E>ambUL`c3ua#3nxNvcAk
z0>r!E_5?WMQCy&qn4XxKrvqAf0Fngz02*K^rMU%Aw<N&VGeE=I3Y4mH6~Ioi0(%d%
zr~uNOPXs4lsI`#E9;+g71KkSM_YljVbvwxCU;)Uu3TT}JxV5eXu1rcmMNB+K7=Z^w
zOCie*piTufmr7H?&1X<N=B0r3gNq`tU{PvuX%1wn5)|v;DjZA<P(6;}Cks#k1saKA
z5NBf)W>jGmV-$q+Q$d9Uym*=kS_}axo_dgrr#evalmZ^e2lWn3L4$vgaebRYVQ>M&
z1nSv>1|+~!Eud~JGea$`sjUEN9WcX+v>eb-BD_dz2erCE^5EHjaFGU^;{w^h%mA_h
zQl5d@RK;;jsO4FHnnHGJr4A(3C=?`S77<g%ftu;ygpr(|SC(1?9?8!IO`qi}Bq|hC
zmSp7Tfv3)p@=}U|Ex2q*1+V3RCJYVrwETQqC2(#`%Ph`N(oslCEV5NfELJE_&B=jf
zEKptqwKg?UG(kBR)Zz!*4w^m%Ge8Q8^NUJSQ#4ZaGQpE`nvm9Pw1#?8Vi71yLd{gy
z)KSm?Sql<_Tdb}L&7_{-$&I2^kUe?%&|m?r{YeCc6R52Nn^H&s%?V(Z79hvLeFy3)
zfL0gfmzF^C0JNk4H%{VFWvmoH2G$Z^R)B0uph;N)G8una0aB3w4tiLV1|$L&0GAN9
zh!P{H4K!;7o~a0G2Q^B-!&abPeNYFeEdt6x;G!U?3nbeOA_jbzN)WV`2{h`AoLVD5
zr2wc?%^(IU1$Y>_7}*#lz@-5nBX|Y^G}6e-z`y`*tQ11}%0;=LCU^=XgCr!IN<vyD
zswgcJh#D49e_9cg?-?0*iv7U)SQ!*j*uVphU^Q6`py^M@TqlUl0Wt<OIS86X1kG!6
zf;#ul!E;jJN(fZZL2Dau&7h~Cpb-R`vMWx^0kzPf6$@A`G~GgyYJw)Do&e9prR1j;
zD}cImrN!XEB!!~X#2f`kDG!<>Oe!r=C<iU7ODf7QFHQv&B1NeRiOD6Upqd|?E+CVM
zpsWP43(-VCt+qfd9%Sc&#sMJKq(YnnOK-&`MPOq=NreGCP6|$FkaP!%2k?@dn3!Tv
zUn>T}QGzsq^+3rEqy(Joz{`L#i@_r~pdll0#RDejU;BV_L^UXxftvXY99pcr?Ba~_
zkg5ihut1pwoVY-}>`X{i176?Y5-SF(WNMfgvKT-^pCAS!gH0hXv@r_`g<^0Q0bJ{Y
zQbl%Zr9L=GfQxF#5DKJ4lBnPeUVi75ScKZPNY1iCNI^#)KrsXzWl~56Ybyquf*M`$
z;sHD!4Gwt7U^K{A;Q5K<EO1Ofi~wglaN7XF2ge7Ppns&4fR-GB+z(lb2yswWV$l>(
zJb{KG7}!A*6CzBQMF41Az625<450M{!Qcc~d<ay=!Q%lQ*5F`M09P~^5rZ!tO7ayl
z^FUKp@bJ&fE6In3KcrCzaWptotrS4(B|%vqo&dnp6i_2TS`l#!H3Zrogu4`+^T2)y
z0tF5vPA7nTH4&7zKtqcI6<MIwoQWwZV6TGKzCe7Ql~}YG6kVWP&%gohSc0+=2!pdz
z8EAwFJeQEd2$}|JW@2D0VP?nzm&hs1phi{}XgZj&7Cb)$5@!LGydX6Yaq#dbNF2n4
zExu#}72(a`hF=zpEndS6nq!7^UB!dJi|&eZKw$?>5#UiX&;mtBdVow4fqHVF(S1ml
z4J|c5mT_1qK$Zc6Tm2>Zu<?2YRP!J)TD*jTfx$CR0lLzo7_w>tH2DTs4NL9dB_ikx
zDfATF@{1I5^Fa-zJjg6*W`3TILP1U{q&o(wB~mhrlS_+1%b*qV^As|Ri%U}#l#Ptc
z%=8pA!1W4fu>+|7D26P1%g+P#BOzVA{Ji8;J<Vd!!aAGW)RII!E&JpQP?cO_8?6+h
z9;>CHr){qZV%o)mr-4DMNQ%J&Dsc6XfPt#FhU-VtS**gqzz}B>V_%V*qo-vL^F34x
zl0psexTGg2p1eSb1=RU*Ni8T!O$M*_fG#Eu0<9<mPah=b=N4q<qy`y+6od4pftDBN
z<bWGOP!-^yEddqvP@lyYrIvsy@PeYm^xQ-c57cO{$jyl_N(E;qFfjl{pcH7}CAB0T
z7Cyx&sbd`|Yk`)VFtD;QGBdL?Nia$<@-s_9>MfA};2G^Sq)`NFx`5}?Aak#vX;#Pz
zJ<xJ1W(IktS|(5)0@ZNfH59e13>6)qxjC2E2GE3A4I5}S5Hz*M23m7bWD6oom>8I9
z*%@j%KpfBv8zd`oGSqN_8cm={+*Kf{8cqg<EJnz*8bd8RR49d+L0ldo3|W1_0b276
zT7$s?n%c7|v}Gu?WeBff0tthbP=HfK@iI`VfaYFUMg{d(K;0xzrzbHNwC)O0Ekf5n
zK-xHv#y+$K1QD`=j>>?GSa=^DJem()_LP_jTC@&kg31H9HJ}O#T8Bdik3b`%NVbCw
z43dX*Q5hJ(4W(jG?W?4&5Y!722KDbXK%H60N(B%LRNNE<>4MTQC<;Mo7@XH~^2<|;
zz$-t%l{CcZU?zBg1hTOJ8WiB20$@3CT?AQo4Pk;yY4EgJCaBW}DzCvdg6#k+0ne>v
zr&fYn4B)ZD%)FG;iunAr_|(GE#GGPqjsOz_lr5kmAjqDDwxbV$vV{z&GUVWAlm@SG
z0xczGW8`JzXXIfNW|U$Shhz~@G=Qoma9tFGHH#EWg3>T}K`}VvfW`>G%N9Ws#7qp?
zYz##npdn0fR$>O#O`uW#6c$ip5F{A^8gvLoEK#UMO0)1>ja=h+goFerK(<YQTMVdm
z4kX5lt&rP}Sn3?GfsiT(z2ROA8c%_Snl30ALkdMm5f5&!t1E%Wu0g8@!ILPS!T!1y
z7N(ZEhJKJz6clXfsU?u%@KqoW%>y+*K*C_dppFb$43YxXc;IvbCI%p}fY#a|*RYTx
z6zay?ptJ%mLfQG5*gz}an0OcknRp=mN>D8T%738!h{d2$CeVmAc!4u$8dj5`LKxK0
zaEaxH_5s2e3&j}1K}*g{z-tX4%0cVLz{5n%42-qR3>DfCP0FCPaG*vB3#e2B4T^*J
zcNBSpO2{zALT`pbZ-#J)f)o}|GAaQTtc;Ld9Ys?i%0Rp8K%?d$rxt^%i{O%?)Wlo`
z$TBEUe<QO5v@$ZkNY4*k7(iDrfjVO)pgaQ3^J$rRi8<gV5qO3jmN3CF4Aupj@=PuU
zFYQlHEy>JFE&`93C+0xxDGCDR9&mw$Fa>5Ycx0j|2sFX~P99J#V2hJ8O7pV8{g9$E
zZ~_4n1CUDO7#J9e!9f=fabJ8<YH>k+UU6!CX<jDC`yW6_MFJFL%>0bJjGT-tOw!;Y
zg^iI1v;Yc{WI&k!o@7!Oz=@@n2~--SfF~M@<-lx4hHOTLB3<yr2zW9Dw6vRnp~3)E
zmOy6qn;99h85oM<L8%2)^MMT!R}5nWaTpoQYnd1d4H&{xKr56%wibhy7I=aqJ5?dS
zEVW3XI43hX6*Q><AC=Yvcia6S9S87$5NKU3cvu)5&7fK!FTDg*M1VDe7K?(`w1Uhp
z$RF53pBq$HmZTQNgI!k4#Kgb=F3T90K%+tYjH0kLOd!XCDp7E$4$8HVML>uiMmo3y
zU&0Iu*(~s4PEZUnF%%^;REmHWQh-*Mvw>m)G{O^Jn9RUZ!j4#j3d+^seP7^dt7L|V
zJO+kJDHMGvko?ZX7#yA_%D_?r+4VIAw1O34c5noE4JXK%#g9P6B(xa=8i#>)4!{e3
zz)e+!q{QTG(8_6ON<^&^imViZph*>JXdpecL;<QC-e>{MlSB1_R>`G6hlvgK6rk;3
zaJ2zb4z3))trsIbg|tM_f^LvAKr2O{`<WC#f^bVR5<#nZQj3bAtt)8f6*gd045|&V
zc732GK+0uUt{bqPPtXQXbbyLSKX5}U2;TPyng)_t4<goq2vF}L2%Nq^`6U!mN`P07
z26cj3ZlE4TNM!+ZK`AIz25kq4gLkMEWu~Sen)N}OK@}*dY#FHX4^~TJjSL=8UIVwN
zcpx1OHfB(5$;>Fi$jd0g%*-go$jew_!oa}b=;Z9;>gMj@>E-R?>*pU37!({58WtWA
z8I_onoRXTBo{^cAos*lFUr<<7TvA$AUQt<9%*VjMU|?uuY+`C=Zegjb7heY+DF9^-
zP_+im$6qj8XBAgL#b*i=Xy5>{O0b!U!6kMdxH1NJ{y}R<Q&<=jYnj1nz#CjrSit)y
zFM@hCS>T;9MHd+=B^e+~sA`x&6>T$Q86s%UrXmAN2^%=?PXp!N5_V8?u!fmI47$3C
zks+dng`tE4+!EXas>wm~KcMBSEDZAE5VlR>W6*jm2uBhwsES=MJcXSBw6-1G+zbXU
z(<ufm$PLZYO)XANEC4Ors#GXQElLLMA%P0Pwi<!wkP{U`gFKNoTjzmRZ-J&|!MPcf
z*FozEi;AJ!J#tbL%RrO5IXMb2g*pnEIXS86i8<h|6lm(&G1%GD6Ee~P8QFkO@}f5|
z!PUJgxSs>AZNTfoGeK>vV$fo1=*D1N9<WkSS1nc#+6c-IpdKuuPgDe2ych(kufVN{
z%;LnHywY57M<qF<2)tMcvIGM(6b0_wg!%=!2D=7@xw^y$yM_dTCI-O$EU=!^qD*iL
z1hiV980_XuFbUa|nGDW{U}69oBcMSJ=;(WVDLnQ}LAemr#A9INXOv+SWRzoMW|Rcw
zKqekWNhVPyF+{Hhly|`S2DHdMg%PxLBL%!~8B|d*fbtDwAS?yC92Znk$uY2$Kz3@m
zfs;C99+Vke4>B?$*H~*n#a}99IRj{_9NM`K4f2FlFQDyAptT0zb*!Kr?w~c<8L0?`
z3MCmu`K9R@pf!k4uj+#)C{h)YE0c3l6-x5Ki8VE^xU>i~sFhd(ngq-&R!A!at!V(&
zLZH(CGK))6^Gb3mp-VBK)}trMV$kf7qOyvrn!1LjmbQ+*m9?$CLv(CiF=!Z7QCS6D
z9NYmaPE1RMZp#F<=z`9Jd<{xm;Pz6`DNtDsny><?15YZ(Lo+3KDjqHhnuLT(fYTG0
z7=T2@&A`9_YFgx%q{f#PW%`0r6R6^1;9vvo^<j}><YfU5rGx4<c)1HY{Q<fCl*J5c
zH8nGWhSfoRUQo-45j<cEE?q(0V`fmt22D>1D?<qzsB{GB1ea`}jqywjlC`X$8T%~o
z&PQmc32YElx`vg(p%&Z}1F>q@K%E|kY*3RI6eY#)K@0v-(pq9pPJVf@LS=rbLP@?t
zGHB;6XfbPIo`Pq9LQ-l@eqK6w*ga7pFSP`;GDe}eG$}8&1kz}6tw_u*$Vs(=u39Mu
z?-T~<&n!@|RWP(P(la!(&@<FCgp`Y^B`Bf>`bH+;R0|#g0uhk49>ogaP3FX!V_={M
zHVJGLEGdH)WP%02U36O?aM2o604gRy@dazWmnN5hnV^FtlC#0g;{4?7)DrOcW@cV$
zNqk~SejcP$1=YJL`6VT(DWJU{xrxQu;8GMkxCZW%Wfp*o%DhyFp_v7VDJhV(+j*%a
zU^XZgk}^w*!9{XjY6-{?7#kG2;KU9l1|Y?Qicyd&Q;Un^GxI=x1UU(m#=+wn3>@-|
zqKw*%%8+6cG!O*x4!GC^jVD9ag@8&(1_lYc6eb1<N6<6`c)9|TR3XDWkk&#lxN0c|
zEdq3gtj;J_0EGsmO|4&10onwan^*!$mK7BhdPo>8?PaDxG-ehn7@5FV8^M#Lk*TR3
z3>!eS!V(Frt?daKQUtXoA+<25V+c+*cAnq?oS<u<q6^eK1t*BSlKjM=D<C0|_X`q}
zv%&pCa2W{lLC{@LDgzleKoJ>q15|W@$}5lq8Q7uq9B6J8UeAHXN-G7SWeKEiV}$g*
z7(i=$K>M9Fz_l7PLvRH6L<^AiV$k_0;A{m8LU=v{M<+O>g06$Y24oX>>?BAHR1bjc
z1JA^PGZv)Z9G_VL4k0ix0O=jnvB)fr&nzf2iHD~9T2QEg+EENF%#4DJ0*tJP#18Ti
zII)9<=s?|4@L&aGv<h^X(;S9MS!hck3%qy}A_YF=1ogNSNP7XaH4`+Czyun%D2@k@
zb1*Yxvw-^5pb)Q=1ND(16LJUxSr|YDGKLo}U|@l4?*YZt3~*e5Ow3~eHO+%dI2fQg
z47Ak>9A#mtMU@K0nV<q2TF^tcNGE5e6v1*^W}ZS`emwX%3Wc)7qD;_<BWSGzc$9;S
zQ$&^l7qJ?kYyxg5Cg+#tm4FLKaOnwYYl71PC_8}@NzfB`(g2kv;6^AkX+Ue6AkZcd
zaQXlf1CU5SbK{xCptUBMDe<6?>HsAXNV8Iuk(p5zbOHyH1S1O*Gou`%03!zz3uI&q
zl=nc*0`OocXy_0W*NhC=oZ$Wz6GM>+D6wQg20kHUTHwZI32ghAO&$Y775GrKFh<ZI
zX$=!YQ9h^}mcj_$))EiZU&Fv)TL_jw(Ha37R|S_$#pf6p7=ly5%ik1`4&8u9u!4GO
zURgY7Rf#&NxCQMIDNR*}l$F7t^|l2?sb!h@rNxkiW;zO$nW;G`I^asZBqJ3xKU-V^
znq&nH$DpcJ086AOWI}eZfD{mL0W`IFrh&J6l%}eK*0_Pzoarc}<bxLXWMt;0Lq^uY
z<E`M0Sl~JoYH-k6Q27fAe(2yV#A}eL8BlbBSChm;cXxryqx_r{Pz;w2?Cd2sXiOD6
zdkH>}Y5^#rfm-4W96XF{j6#e8jLeLjOrYUYUdSR2P+kKSR^U>p7j!5FBj`9XNE;J!
zuu=*KIIU=bdL^I(GQeFM(5VfK&~|ApcsLzYzCcuZf))`3gEm(igU;z|0WS*yEf@d~
zsW&r$PQ!rg{B{A2!81bJsafD5fTHsZ6{|o6nM<r4csn6Gr~wMv2e}p0=LhW;gzOV!
zVkkNRwy3ZR)XD|zmt+NxGjzd3!wZeUy9=4X^QbJKE`HH3&>SeJyUzvI1l~?=4%u*6
zVFs~Q8$46W0;<EZxEX5LLEE^BH5fq?u`q5CBWTS;a3LdOI4B@^K&#n6hj}nD^jkA9
zRtkd-b%MAQ<UtOG@H_?B$sAb%u)XCKpuOcKf}mMk&<^wP6b^>Kh#K(87$wXM!6kwW
z!Qi5>*avhR9H?yz+jd@_ky?_GTBJ~(3O_{$e5M)ryd2P8-25U?Du-qRjCvM4)B~!E
zK_zA|D8+zEMo9Mo6pY}Kq(B{7vqMB6<2Im)HgFXT%{<_ZxUWDZFet--%k0vEg480g
z8gSn}8)P&Cm>7VP7qn){CMPjBDJ9WvA1E(?npEH{4XdHRVF3yU5H1FVg*0T?D^?KH
zg9jyIaFH6uSjY@IMg_92$q(!yaLEX6wd)yxH<?33L3YsJuf?1U3=B5usd=dt1x0q}
zL7oM9i49c3GcYKChj+j+q63}^x2mr710VVUDF8tY6L7eIj%EUt;^2v;AkdgBr0RVJ
zisY9d;sK~>1}Yjs$BqO=fOw!_PR&ax1}*aqdIwSjDu;p&f>@xM8f<cUVkV+72Ts^Q
z2_OZZKqi1351KIqw;I5cA+QLFPb^9YcdEck)l<MmfmOw4LbjoTTnrrx$S*1Z#{*bB
z<W#AFj1utN9b~-^>|8F8%QI7pw}GO^29!`ZI9WiYG59PHCKe_(7FF<67Z0NlBReBM
zGdB|_BPXLI6ECA8GdGg}6EmYQqZp$Ac-|D$t6~7fF(@*?<u_;r5oi$}xK#-rpJgl(
zW5{G+0PS3DW?%?L%v^!aRslEZAZ3a|B6xZmv{nvU1%h_xz{(S}f&{bx1ELocchIRV
z2G9vSpqd1nD-cmTpb-EXYXT)JsGq=%(#+K2&!FH3HLMuegcw;M6(NWV56DHJGJuhx
zfD;sWkRB+cg9EA;nLrD2Kx5h*3`NeMDg!h?!vq?T0ZmiEw!4Gou|P{x!RzY8K`cfF
zFa=&s2j!<QGNiMBmj6JHY0&_+&0Jy?KowsN_y9!Ef`%%PB{i%JlHdbZsu&8Zzz42C
z8|R>sH#jv1bXZU#IKnDH4RP=oVQEng_*AsSf`XjPWaM@@c*P0mXc8+0(2gO{86`=n
zpyg?xRm-3j7HHTiwYUTv&Cpdl(6no%;0R7D@Fh43#mO0|pgl_YMQ|o)un?3n!2>@a
zjg<<aK|YX8y5Iqh#GD*RIi#--K72AUC&x-(-w)CS1eHcX-#~=}c)}FqLvWUcSOlK#
z1}89ZlMQ4#=zvd9Ap|)pv;=avCrF|awBr(TG7*>yZmNM<Ac+A@o1lTfVsN~HlV#<9
zP@)9S_^^Qv;p1nNVHRX$W8?z2*FdXjxEMK@ia{Mt$hH$*XcQHLt1wV?4w~-*mjir|
zNpR44I}D)Kh8XlbK7Z7P1bmKKp$N3R547DJlmtN0pOTuESejD;+L%?OkeHsDSAtds
zz{Wj_L2;#8tgi|=?G<za4diTC$eL$R5eE)s`d5hHO<PcZ#DmVci3j^bl9_=4JTk+;
z2I^LU9LNCj132J7=l+#2Fl4fTYRzVFF>00q*|Ee0Y6hmTGMJ^XfzBK<OW|Nh;bbra
zw}?QsT`}m)EJ${NPQ$|DN3Xb~s5H5xv?#S$56gM3U_Ic`vC!hwB3(yNV1pf~qW~Tc
zO0UW+04Ma6)U=$$l2mXKa7<24Ehy1-1#OH6EuaNOy_UWfIF~@=z$Rv=rWWWX=46(o
zg4bR;=jY`?Hg7@-Y0zmSK|G8M43Ob<P)8w%3sjDS=WRei1CBc|F#r(=O6#x)gf1RZ
z0>vJvmSJE4WeovFcF5ogsQmyMlm*8k$P17K2cT&fCQvU0v{eAyy#Q@FVPGg$1r@2m
z756~#4C=Um6@lk6Pl1Z#N*Pc=43YpJJKoF$K5vBuR4j+*fhKJrXV!v`^MlM^GSz}*
zK@Is#MsU{xynO{Ue#6dSR?EgvkqGL?K#Xi=WN?WM0Ch7eB|#kwkSGTzeSyaEIY8Ut
z!jVqKy#gAT2>_W488NB>djvEv&jH>70p{8iE(Gs?0G;asK3Rpa&;l#~?L+JVm8Reo
z4+_v7lKE+%C6l02p>s0xvK62K46Z>kQ;VV59ejwLPi9`Wm4XfE*k3DsJv}}Bw4(gH
z61}W~)O0&*g`(6PTd;t&0%&cUtx{%gVtT4RNLEP)stK$Mw4?%A6Nqn(p#?Hz0PC~B
z_ho`B3k7v0@Ud7r3R*Uh^_`$%58Si`mqRvo3hGMWngP7b6H=Lg7RrGaD?=KxpwVLR
zVgX1K6tqbk+;0H|LNWM!SLjj;Q18A7a@2HLVh+Sq(6AjiQ-V|nEeC}uXr36HLBPZS
z<Py-3JGgBOU5gnHa$B(;D5HRe${0A<m_X;vfmYf{GBPvDF!C}AGKn#XL1!{qnG~1=
znZSF87=l7T3w}UN%1ls!0<Ks<40yW;)W`$v?P6q5fGlT*bQ(b<6R4sAwN}(XoncV#
zKZTh=0VKl=?v>kuHgkf7Ss}tK;Ql2mOj|5ymLDXa#RfX*8PsnEZ&ZgKzFY%3+btNh
z;~mn;KMKmgDV(4(IE9s=m6<^jv><?qp=c>X3Ks*&oD^<M$)gM@Jdk6X!K;NpL#}_o
z27#Q)33lgGh7?|yetFO;A|{5SKcF-CL8m>Za54mgk0>t&O-h1GZdgi%Rfw6OzyddE
zN=wpojg7z|3GSSM_!hdwnd#u^dAJfoGw`S<I01u|_`y{hn&~E`f=5S@g>q8iJYyr>
zBotmwss^Ys3fcndRDoI;PX4~}p&@R@M)5wb;C>ZCz{wTdnSu&fAj=w>p(!^si+6Gj
z0&TVfXO{T9(wrP{WdmjzA(+PC{v^0Q0cVty#F9j?Y%zG658VC&X$BANg0l>m7=U~O
zY9xUVEQ`-7&d-Z4ElG<6<rytdwa3oID8b0WD9p&hD8tACUc=17$ipbf$igVe$PPL<
znURH2fRP>2bpW+I;gt_)JO$DR19iZd7-HB!gSEBb8QNM_&`1<$9X>Ndu{o%gs9|Pc
zg2;i!k-#fxYM8+ite}Ca8g_;>aA^)1b|?m|{B;MPDhOI|;saT50y;DRv_&Pc5;W)o
zIo%);+7j1MC@4xTNCh1=1YZgOX+=YpD!agTJ3<RR(57b4ij=$(r~!~o^`ItUejfay
zffUf;5Q%vTiACw9pnf8>vOv!YkVXcmaTNqgir{rM;Bpk)7|Ba5kB2xV2y}Q%P%Nl4
z1<f=BflFDCw!+fXqDpWgO#^KcNzE$(Cl)X<04WBv5)~SpP?yJNrp4!_rlzE(RD#kD
zC?PPgDYCLL3P4Vj0u`R1jwQHR0%{vWQU<7SV`QjQ0<}IseMWE%4qAfB2s$pUnGsYb
z)`HISl?5LjTmmU1xfqIkK}`Y3suFN}05mHPvZJ_~fq?;*FhHF-&`1pUC`#zzi<$X(
zpo1|A^7B&jN<gR7Kn?-}^%CK`*&#bGpj#?H4Q9|dkPc`iNqK$|>~L;a9BUMp6zLR~
z6hZc$gR5Xjbc2==LAW4~gAa}j0=3S-(FijY%z>F46c37d&|nd`*Z`-Hpg*7j3{;eY
z4o3t>IG7lKSO={)0gWMm90FM|Sz46S1&VG^qGn*@VPa-fViacNf^^Q}VuGXNVv1t&
zVzpFi;#9zOD99h6&;Ta`(9ZB025^HCysH6}B$z-c0dy3j3TV|_Ei*$N8)y)_mYJba
z4crn1AH3Jh$WZJLn$QCsu)qjk568d|o@W4GGuH%4A|<S#N*J>G4RjP4IDw_1ETKzb
zW(WpPO&4DU9XFL)1UfbydbSp%EeM&Z0ZpBN4iEwFwJXoaOwLdMZIRAXhn!8E2%VJy
z9bOFTJeFr<mZTOJBqpbV&dGx;#!$dm{|1`i0VPDxdRfqV+mzH4aAgX$I5Q7)PGn|&
z9;{%23|By8trWlsRR^>>7gR1m_T(vOfKw~P&Cvba#h?S-VT<3;odR+m%+V0{X68W~
z!Bz^Y#l@iGgTaSzfk#syRx4Di7K0>f6>>r6{v|<<x2!Bk1?^-483^8%r~@vBRg0nL
zeSwdy1jRo1+K_l>A6G}ecn?=c7uTTpAXj(Sh<K;S5Z4mWImp-~gF}LXK!<Dwf#%J@
zL#p6<71VA9M_<rFQ0@UWAt19;pyHq)abOEdP~!-^4hYsH1>aMWSyDM4lx;xWOa^w)
z*~g%nC}u`}MsY@7Mm9)C4pfhVFgUBEfeHcenmEwum298^dB|=#NM{SON~zccltXGj
zJL14Q=|IN=K!)hR*H$$%fp!Q<f{u6xFXyje0xJg}Pnp63uU<jbO>sDEd<3~Dg&Y9{
zDk&9UwGeF961{{4Eo_7(S?C}DtXT*idUpV~<se)5LFFW*yaQPcZXy+dPppO1m7p+y
zl!RC+#~>w8CtVrTaR;?l2C8HPO@x*f<)oy7!Ua@3ZUIFv7syF$a?GGgPz+KHf_fC7
z8~~0~&~_|PnFn6f16uIIf;gELG^)zUP?QTQ{6L*u@EMDsaxs^oQV`TohX{gp0fZM;
zg3G)Tc2I2zTELJAF8Me>B_Cv^aA74wL>>=l)(~`ZKlo@y#1;Th+VagWgB(?>Pyjk{
zGqnh^>>sqtyrfv6C^b31C?z!obb3+|=pGdX*xBOXvZ^>Av^+8yc3xv*3gmzi(DvV=
z)Raun>Ftm<7Wf=<@UhX3c?#eu5QY3?@NwlSpaZc$Q{SKqc|fHnbjU~{DL(}=iVHUh
zyxTVve0z&RNxlN)4j<U2W-RLcAl+NgZfkIP0WuNXGzTA}3tlD>4-!M1mkw$VLk?&L
zowyJLYV3e(bnxlwpk_~EQEEy&)P>-7JXk;I2zhV<1QW&dzxxE#-+=@N*h5D_X%OTW
z1{P89a$P}2VMbwQuvfr+F32@U;Paq0KqG+Qv9<X4l>FrQcu2nql!C$A^(snoGLwQp
zsTRCK05XaIn$Uu*-2xT0#g)ZDpe^-~JqtykvKW;9!7ZR5(C7qsCucnDzKwYBl`TP_
z3<1vapuN+HB|#vQAV<c4nhKCc6DY%g&)5zEH7mhws34Hbz;}ay3kk?!$RNLhui$}P
zVghQe1cAl`!2W`q2~Z3^y8ztkMvO%Ufy!a9SZW1mFcEZJSP-b>hSW5m`Uso|f<i&1
zFsP6MpWX((-^#_+%`wy`B;MIE-YL}2#m6;1z%j%FJbD6?3h)mK0WBe7U?|8*ECE&0
z;QLjAtU*Bpx>yRbs0(z?T~IzqtR6%(gNRlT(E}p-Km_RQoS?}d7HDN`&|DA;)Da3=
z4`S^G5&J>JVURmPP0h5T{HoNv;?$C$lOS>MBI3&+7HH}cys|9_KAj293DC&SP0UM7
zPc4GXV1kA^AQ^@cRM>KY2++V{5I=||0y?J|6hq*Bd#OQEAVFym0XpF?NCCuB0TG~?
z@Sy1+%QZn<EfAp#A`C!;DM}GOP&o*czHD;ASIOCd!mk)~JP{icXchtkGYK#XfG}eU
z3+UbgC1y4z9wrfHer8T}9v)6kPFo&hP7Y25PDxG~P6bY79!XAqPHs*SPDxHtP9aV%
zPE}?`US>`SPBE}JH>ZS<7^f`{52q9lCnpc58b2c!BNsEL0;eFSAU`8NGp8u0AOJe1
BPZa<F

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/retrying.py b/venv/lib/python2.7/site-packages/pip/_vendor/retrying.py
new file mode 100644
index 00000000..6d1e627a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/retrying.py
@@ -0,0 +1,267 @@
+## Copyright 2013-2014 Ray Holder
+##
+## Licensed under the Apache License, Version 2.0 (the "License");
+## you may not use this file except in compliance with the License.
+## You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+
+import random
+from pip._vendor import six
+import sys
+import time
+import traceback
+
+
+# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint...
+MAX_WAIT = 1073741823
+
+
+def retry(*dargs, **dkw):
+    """
+    Decorator function that instantiates the Retrying object
+    @param *dargs: positional arguments passed to Retrying object
+    @param **dkw: keyword arguments passed to the Retrying object
+    """
+    # support both @retry and @retry() as valid syntax
+    if len(dargs) == 1 and callable(dargs[0]):
+        def wrap_simple(f):
+
+            @six.wraps(f)
+            def wrapped_f(*args, **kw):
+                return Retrying().call(f, *args, **kw)
+
+            return wrapped_f
+
+        return wrap_simple(dargs[0])
+
+    else:
+        def wrap(f):
+
+            @six.wraps(f)
+            def wrapped_f(*args, **kw):
+                return Retrying(*dargs, **dkw).call(f, *args, **kw)
+
+            return wrapped_f
+
+        return wrap
+
+
+class Retrying(object):
+
+    def __init__(self,
+                 stop=None, wait=None,
+                 stop_max_attempt_number=None,
+                 stop_max_delay=None,
+                 wait_fixed=None,
+                 wait_random_min=None, wait_random_max=None,
+                 wait_incrementing_start=None, wait_incrementing_increment=None,
+                 wait_exponential_multiplier=None, wait_exponential_max=None,
+                 retry_on_exception=None,
+                 retry_on_result=None,
+                 wrap_exception=False,
+                 stop_func=None,
+                 wait_func=None,
+                 wait_jitter_max=None):
+
+        self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number
+        self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay
+        self._wait_fixed = 1000 if wait_fixed is None else wait_fixed
+        self._wait_random_min = 0 if wait_random_min is None else wait_random_min
+        self._wait_random_max = 1000 if wait_random_max is None else wait_random_max
+        self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start
+        self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment
+        self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier
+        self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max
+        self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max
+
+        # TODO add chaining of stop behaviors
+        # stop behavior
+        stop_funcs = []
+        if stop_max_attempt_number is not None:
+            stop_funcs.append(self.stop_after_attempt)
+
+        if stop_max_delay is not None:
+            stop_funcs.append(self.stop_after_delay)
+
+        if stop_func is not None:
+            self.stop = stop_func
+
+        elif stop is None:
+            self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs)
+
+        else:
+            self.stop = getattr(self, stop)
+
+        # TODO add chaining of wait behaviors
+        # wait behavior
+        wait_funcs = [lambda *args, **kwargs: 0]
+        if wait_fixed is not None:
+            wait_funcs.append(self.fixed_sleep)
+
+        if wait_random_min is not None or wait_random_max is not None:
+            wait_funcs.append(self.random_sleep)
+
+        if wait_incrementing_start is not None or wait_incrementing_increment is not None:
+            wait_funcs.append(self.incrementing_sleep)
+
+        if wait_exponential_multiplier is not None or wait_exponential_max is not None:
+            wait_funcs.append(self.exponential_sleep)
+
+        if wait_func is not None:
+            self.wait = wait_func
+
+        elif wait is None:
+            self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs)
+
+        else:
+            self.wait = getattr(self, wait)
+
+        # retry on exception filter
+        if retry_on_exception is None:
+            self._retry_on_exception = self.always_reject
+        else:
+            self._retry_on_exception = retry_on_exception
+
+        # TODO simplify retrying by Exception types
+        # retry on result filter
+        if retry_on_result is None:
+            self._retry_on_result = self.never_reject
+        else:
+            self._retry_on_result = retry_on_result
+
+        self._wrap_exception = wrap_exception
+
+    def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Stop after the previous attempt >= stop_max_attempt_number."""
+        return previous_attempt_number >= self._stop_max_attempt_number
+
+    def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Stop after the time from the first attempt >= stop_max_delay."""
+        return delay_since_first_attempt_ms >= self._stop_max_delay
+
+    def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Don't sleep at all before retrying."""
+        return 0
+
+    def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Sleep a fixed amount of time between each retry."""
+        return self._wait_fixed
+
+    def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """Sleep a random amount of time between wait_random_min and wait_random_max"""
+        return random.randint(self._wait_random_min, self._wait_random_max)
+
+    def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        """
+        Sleep an incremental amount of time after each attempt, starting at
+        wait_incrementing_start and incrementing by wait_incrementing_increment
+        """
+        result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1))
+        if result < 0:
+            result = 0
+        return result
+
+    def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms):
+        exp = 2 ** previous_attempt_number
+        result = self._wait_exponential_multiplier * exp
+        if result > self._wait_exponential_max:
+            result = self._wait_exponential_max
+        if result < 0:
+            result = 0
+        return result
+
+    def never_reject(self, result):
+        return False
+
+    def always_reject(self, result):
+        return True
+
+    def should_reject(self, attempt):
+        reject = False
+        if attempt.has_exception:
+            reject |= self._retry_on_exception(attempt.value[1])
+        else:
+            reject |= self._retry_on_result(attempt.value)
+
+        return reject
+
+    def call(self, fn, *args, **kwargs):
+        start_time = int(round(time.time() * 1000))
+        attempt_number = 1
+        while True:
+            try:
+                attempt = Attempt(fn(*args, **kwargs), attempt_number, False)
+            except:
+                tb = sys.exc_info()
+                attempt = Attempt(tb, attempt_number, True)
+
+            if not self.should_reject(attempt):
+                return attempt.get(self._wrap_exception)
+
+            delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time
+            if self.stop(attempt_number, delay_since_first_attempt_ms):
+                if not self._wrap_exception and attempt.has_exception:
+                    # get() on an attempt with an exception should cause it to be raised, but raise just in case
+                    raise attempt.get()
+                else:
+                    raise RetryError(attempt)
+            else:
+                sleep = self.wait(attempt_number, delay_since_first_attempt_ms)
+                if self._wait_jitter_max:
+                    jitter = random.random() * self._wait_jitter_max
+                    sleep = sleep + max(0, jitter)
+                time.sleep(sleep / 1000.0)
+
+            attempt_number += 1
+
+
+class Attempt(object):
+    """
+    An Attempt encapsulates a call to a target function that may end as a
+    normal return value from the function or an Exception depending on what
+    occurred during the execution.
+    """
+
+    def __init__(self, value, attempt_number, has_exception):
+        self.value = value
+        self.attempt_number = attempt_number
+        self.has_exception = has_exception
+
+    def get(self, wrap_exception=False):
+        """
+        Return the return value of this Attempt instance or raise an Exception.
+        If wrap_exception is true, this Attempt is wrapped inside of a
+        RetryError before being raised.
+        """
+        if self.has_exception:
+            if wrap_exception:
+                raise RetryError(self)
+            else:
+                six.reraise(self.value[0], self.value[1], self.value[2])
+        else:
+            return self.value
+
+    def __repr__(self):
+        if self.has_exception:
+            return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2])))
+        else:
+            return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value)
+
+
+class RetryError(Exception):
+    """
+    A RetryError encapsulates the last Attempt instance right before giving up.
+    """
+
+    def __init__(self, last_attempt):
+        self.last_attempt = last_attempt
+
+    def __str__(self):
+        return "RetryError[{0}]".format(self.last_attempt)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b21ad20b08c06772f0d0bb646a1daaf361391b10
GIT binary patch
literal 11662
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
N3mY@1oY+b+MF47umYo0q

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/six.py b/venv/lib/python2.7/site-packages/pip/_vendor/six.py
new file mode 100644
index 00000000..89b2188f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/six.py
@@ -0,0 +1,952 @@
+# Copyright (c) 2010-2018 Benjamin Peterson
+#
+# 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.
+
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.12.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("getoutput", "commands", "subprocess"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("splitvalue", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+    MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
+    MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        try:
+            if value is None:
+                value = tp()
+            if value.__traceback__ is not tb:
+                raise value.with_traceback(tb)
+            raise value
+        finally:
+            value = None
+            tb = None
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    try:
+        raise tp, value, tb
+    finally:
+        tb = None
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    try:
+        if from_value is None:
+            raise value
+        raise value from from_value
+    finally:
+        value = None
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    try:
+        raise value from from_value
+    finally:
+        value = None
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """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(type):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+
+        @classmethod
+        def __prepare__(cls, name, this_bases):
+            return meta.__prepare__(name, bases)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        if hasattr(cls, '__qualname__'):
+            orig_vars['__qualname__'] = cls.__qualname__
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def ensure_binary(s, encoding='utf-8', errors='strict'):
+    """Coerce **s** to six.binary_type.
+
+    For Python 2:
+      - `unicode` -> encoded to `str`
+      - `str` -> `str`
+
+    For Python 3:
+      - `str` -> encoded to `bytes`
+      - `bytes` -> `bytes`
+    """
+    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))
+
+
+def ensure_str(s, encoding='utf-8', errors='strict'):
+    """Coerce *s* to `str`.
+
+    For Python 2:
+      - `unicode` -> encoded to `str`
+      - `str` -> `str`
+
+    For Python 3:
+      - `str` -> `str`
+      - `bytes` -> decoded to `str`
+    """
+    if not isinstance(s, (text_type, binary_type)):
+        raise TypeError("not expecting type '%s'" % type(s))
+    if PY2 and isinstance(s, text_type):
+        s = s.encode(encoding, errors)
+    elif PY3 and isinstance(s, binary_type):
+        s = s.decode(encoding, errors)
+    return s
+
+
+def ensure_text(s, encoding='utf-8', errors='strict'):
+    """Coerce *s* to six.text_type.
+
+    For Python 2:
+      - `unicode` -> `unicode`
+      - `str` -> `unicode`
+
+    For Python 3:
+      - `str` -> `str`
+      - `bytes` -> decoded to `str`
+    """
+    if isinstance(s, binary_type):
+        return s.decode(encoding, errors)
+    elif isinstance(s, text_type):
+        return s
+    else:
+        raise TypeError("not expecting type '%s'" % type(s))
+
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/six.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/six.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8b864d69eeee2fecaab47cdab816a528a7f60ddf
GIT binary patch
literal 37306
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
YQIJUzj65uyj54gCIOJmFVB};109Kag>i_@%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py
new file mode 100644
index 00000000..148a9c31
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py
@@ -0,0 +1,92 @@
+"""
+urllib3 - Thread-safe connection pooling and re-using.
+"""
+
+from __future__ import absolute_import
+import warnings
+
+from .connectionpool import (
+    HTTPConnectionPool,
+    HTTPSConnectionPool,
+    connection_from_url
+)
+
+from . import exceptions
+from .filepost import encode_multipart_formdata
+from .poolmanager import PoolManager, ProxyManager, proxy_from_url
+from .response import HTTPResponse
+from .util.request import make_headers
+from .util.url import get_host
+from .util.timeout import Timeout
+from .util.retry import Retry
+
+
+# Set default logging handler to avoid "No handler found" warnings.
+import logging
+from logging import NullHandler
+
+__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
+__license__ = 'MIT'
+__version__ = '1.24.1'
+
+__all__ = (
+    'HTTPConnectionPool',
+    'HTTPSConnectionPool',
+    'PoolManager',
+    'ProxyManager',
+    'HTTPResponse',
+    'Retry',
+    'Timeout',
+    'add_stderr_logger',
+    'connection_from_url',
+    'disable_warnings',
+    'encode_multipart_formdata',
+    'get_host',
+    'make_headers',
+    'proxy_from_url',
+)
+
+logging.getLogger(__name__).addHandler(NullHandler())
+
+
+def add_stderr_logger(level=logging.DEBUG):
+    """
+    Helper for quickly adding a StreamHandler to the logger. Useful for
+    debugging.
+
+    Returns the handler after adding it.
+    """
+    # This method needs to be in this __init__.py to get the __name__ correct
+    # even if urllib3 is vendored within another package.
+    logger = logging.getLogger(__name__)
+    handler = logging.StreamHandler()
+    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
+    logger.addHandler(handler)
+    logger.setLevel(level)
+    logger.debug('Added a stderr logging handler to logger: %s', __name__)
+    return handler
+
+
+# ... Clean up.
+del NullHandler
+
+
+# All warning filters *must* be appended unless you're really certain that they
+# shouldn't be: otherwise, it's very hard for users to use most Python
+# mechanisms to silence them.
+# SecurityWarning's always go off by default.
+warnings.simplefilter('always', exceptions.SecurityWarning, append=True)
+# SubjectAltNameWarning's should go off once per host
+warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True)
+# InsecurePlatformWarning's don't vary between requests, so we keep it default.
+warnings.simplefilter('default', exceptions.InsecurePlatformWarning,
+                      append=True)
+# SNIMissingWarnings should go off only once.
+warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True)
+
+
+def disable_warnings(category=exceptions.HTTPWarning):
+    """
+    Helper for quickly disabling all urllib3 warnings.
+    """
+    warnings.simplefilter('ignore', category)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8df9abb3a305f0ecb8ab17cb4c13ff77fadbc1f5
GIT binary patch
literal 2817
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py
new file mode 100644
index 00000000..34f23811
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py
@@ -0,0 +1,329 @@
+from __future__ import absolute_import
+try:
+    from collections.abc import Mapping, MutableMapping
+except ImportError:
+    from collections import Mapping, MutableMapping
+try:
+    from threading import RLock
+except ImportError:  # Platform-specific: No threads available
+    class RLock:
+        def __enter__(self):
+            pass
+
+        def __exit__(self, exc_type, exc_value, traceback):
+            pass
+
+
+from collections import OrderedDict
+from .exceptions import InvalidHeader
+from .packages.six import iterkeys, itervalues, PY3
+
+
+__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict']
+
+
+_Null = object()
+
+
+class RecentlyUsedContainer(MutableMapping):
+    """
+    Provides a thread-safe dict-like container which maintains up to
+    ``maxsize`` keys while throwing away the least-recently-used keys beyond
+    ``maxsize``.
+
+    :param maxsize:
+        Maximum number of recent elements to retain.
+
+    :param dispose_func:
+        Every time an item is evicted from the container,
+        ``dispose_func(value)`` is called.  Callback which will get called
+    """
+
+    ContainerCls = OrderedDict
+
+    def __init__(self, maxsize=10, dispose_func=None):
+        self._maxsize = maxsize
+        self.dispose_func = dispose_func
+
+        self._container = self.ContainerCls()
+        self.lock = RLock()
+
+    def __getitem__(self, key):
+        # Re-insert the item, moving it to the end of the eviction line.
+        with self.lock:
+            item = self._container.pop(key)
+            self._container[key] = item
+            return item
+
+    def __setitem__(self, key, value):
+        evicted_value = _Null
+        with self.lock:
+            # Possibly evict the existing value of 'key'
+            evicted_value = self._container.get(key, _Null)
+            self._container[key] = value
+
+            # If we didn't evict an existing value, we might have to evict the
+            # least recently used item from the beginning of the container.
+            if len(self._container) > self._maxsize:
+                _key, evicted_value = self._container.popitem(last=False)
+
+        if self.dispose_func and evicted_value is not _Null:
+            self.dispose_func(evicted_value)
+
+    def __delitem__(self, key):
+        with self.lock:
+            value = self._container.pop(key)
+
+        if self.dispose_func:
+            self.dispose_func(value)
+
+    def __len__(self):
+        with self.lock:
+            return len(self._container)
+
+    def __iter__(self):
+        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')
+
+    def clear(self):
+        with self.lock:
+            # Copy pointers to all values, then wipe the mapping
+            values = list(itervalues(self._container))
+            self._container.clear()
+
+        if self.dispose_func:
+            for value in values:
+                self.dispose_func(value)
+
+    def keys(self):
+        with self.lock:
+            return list(iterkeys(self._container))
+
+
+class HTTPHeaderDict(MutableMapping):
+    """
+    :param headers:
+        An iterable of field-value pairs. Must not contain multiple field names
+        when compared case-insensitively.
+
+    :param kwargs:
+        Additional field-value pairs to pass in to ``dict.update``.
+
+    A ``dict`` like container for storing HTTP Headers.
+
+    Field names are stored and compared case-insensitively in compliance with
+    RFC 7230. Iteration provides the first case-sensitive key seen for each
+    case-insensitive pair.
+
+    Using ``__setitem__`` syntax overwrites fields that compare equal
+    case-insensitively in order to maintain ``dict``'s api. For fields that
+    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
+    in a loop.
+
+    If multiple fields that are equal case-insensitively are passed to the
+    constructor or ``.update``, the behavior is undefined and some will be
+    lost.
+
+    >>> headers = HTTPHeaderDict()
+    >>> headers.add('Set-Cookie', 'foo=bar')
+    >>> headers.add('set-cookie', 'baz=quxx')
+    >>> headers['content-length'] = '7'
+    >>> headers['SET-cookie']
+    'foo=bar, baz=quxx'
+    >>> headers['Content-Length']
+    '7'
+    """
+
+    def __init__(self, headers=None, **kwargs):
+        super(HTTPHeaderDict, self).__init__()
+        self._container = OrderedDict()
+        if headers is not None:
+            if isinstance(headers, HTTPHeaderDict):
+                self._copy_from(headers)
+            else:
+                self.extend(headers)
+        if kwargs:
+            self.extend(kwargs)
+
+    def __setitem__(self, key, val):
+        self._container[key.lower()] = [key, val]
+        return self._container[key.lower()]
+
+    def __getitem__(self, key):
+        val = self._container[key.lower()]
+        return ', '.join(val[1:])
+
+    def __delitem__(self, key):
+        del self._container[key.lower()]
+
+    def __contains__(self, key):
+        return key.lower() in self._container
+
+    def __eq__(self, other):
+        if not isinstance(other, Mapping) and not hasattr(other, 'keys'):
+            return False
+        if not isinstance(other, type(self)):
+            other = type(self)(other)
+        return (dict((k.lower(), v) for k, v in self.itermerged()) ==
+                dict((k.lower(), v) for k, v in other.itermerged()))
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    if not PY3:  # Python 2
+        iterkeys = MutableMapping.iterkeys
+        itervalues = MutableMapping.itervalues
+
+    __marker = object()
+
+    def __len__(self):
+        return len(self._container)
+
+    def __iter__(self):
+        # Only provide the originally cased names
+        for vals in self._container.values():
+            yield vals[0]
+
+    def pop(self, key, default=__marker):
+        '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+          If key is not found, d is returned if given, otherwise KeyError is raised.
+        '''
+        # Using the MutableMapping function directly fails due to the private marker.
+        # Using ordinary dict.pop would expose the internal structures.
+        # So let's reinvent the wheel.
+        try:
+            value = self[key]
+        except KeyError:
+            if default is self.__marker:
+                raise
+            return default
+        else:
+            del self[key]
+            return value
+
+    def discard(self, key):
+        try:
+            del self[key]
+        except KeyError:
+            pass
+
+    def add(self, key, val):
+        """Adds a (name, value) pair, doesn't overwrite the value if it already
+        exists.
+
+        >>> headers = HTTPHeaderDict(foo='bar')
+        >>> headers.add('Foo', 'baz')
+        >>> headers['foo']
+        'bar, baz'
+        """
+        key_lower = key.lower()
+        new_vals = [key, val]
+        # Keep the common case aka no item present as fast as possible
+        vals = self._container.setdefault(key_lower, new_vals)
+        if new_vals is not vals:
+            vals.append(val)
+
+    def extend(self, *args, **kwargs):
+        """Generic import function for any type of header-like object.
+        Adapted version of MutableMapping.update in order to insert items
+        with self.add instead of self.__setitem__
+        """
+        if len(args) > 1:
+            raise TypeError("extend() takes at most 1 positional "
+                            "arguments ({0} given)".format(len(args)))
+        other = args[0] if len(args) >= 1 else ()
+
+        if isinstance(other, HTTPHeaderDict):
+            for key, val in other.iteritems():
+                self.add(key, val)
+        elif isinstance(other, Mapping):
+            for key in other:
+                self.add(key, other[key])
+        elif hasattr(other, "keys"):
+            for key in other.keys():
+                self.add(key, other[key])
+        else:
+            for key, value in other:
+                self.add(key, value)
+
+        for key, value in kwargs.items():
+            self.add(key, value)
+
+    def getlist(self, key, default=__marker):
+        """Returns a list of all the values for the named field. Returns an
+        empty list if the key doesn't exist."""
+        try:
+            vals = self._container[key.lower()]
+        except KeyError:
+            if default is self.__marker:
+                return []
+            return default
+        else:
+            return vals[1:]
+
+    # Backwards compatibility for httplib
+    getheaders = getlist
+    getallmatchingheaders = getlist
+    iget = getlist
+
+    # Backwards compatibility for http.cookiejar
+    get_all = getlist
+
+    def __repr__(self):
+        return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
+
+    def _copy_from(self, other):
+        for key in other:
+            val = other.getlist(key)
+            if isinstance(val, list):
+                # Don't need to convert tuples
+                val = list(val)
+            self._container[key.lower()] = [key] + val
+
+    def copy(self):
+        clone = type(self)()
+        clone._copy_from(self)
+        return clone
+
+    def iteritems(self):
+        """Iterate over all header lines, including duplicate ones."""
+        for key in self:
+            vals = self._container[key.lower()]
+            for val in vals[1:]:
+                yield vals[0], val
+
+    def itermerged(self):
+        """Iterate over all headers, merging duplicate ones together."""
+        for key in self:
+            val = self._container[key.lower()]
+            yield val[0], ', '.join(val[1:])
+
+    def items(self):
+        return list(self.iteritems())
+
+    @classmethod
+    def from_httplib(cls, message):  # Python 2
+        """Read headers from a Python 2 httplib message object."""
+        # python2.7 does not expose a proper API for exporting multiheaders
+        # efficiently. This function re-reads raw lines from the message
+        # object and extracts the multiheaders properly.
+        obs_fold_continued_leaders = (' ', '\t')
+        headers = []
+
+        for line in message.headers:
+            if line.startswith(obs_fold_continued_leaders):
+                if not headers:
+                    # We received a header line that starts with OWS as described
+                    # in RFC-7230 S3.2.4. This indicates a multiline header, but
+                    # there exists no previous header to which we can attach it.
+                    raise InvalidHeader(
+                        'Header continuation with no previous header: %s' % line
+                    )
+                else:
+                    key, value = headers[-1]
+                    headers[-1] = (key, value + ' ' + line.strip())
+                    continue
+
+            key, value = line.split(':', 1)
+            headers.append((key, value.strip()))
+
+        return cls(headers)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f4be5b9702c283faed7d9a0492625cc41c5ac93
GIT binary patch
literal 15104
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py
new file mode 100644
index 00000000..02b36654
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py
@@ -0,0 +1,391 @@
+from __future__ import absolute_import
+import datetime
+import logging
+import os
+import socket
+from socket import error as SocketError, timeout as SocketTimeout
+import warnings
+from .packages import six
+from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection
+from .packages.six.moves.http_client import HTTPException  # noqa: F401
+
+try:  # Compiled with SSL?
+    import ssl
+    BaseSSLError = ssl.SSLError
+except (ImportError, AttributeError):  # Platform-specific: No SSL.
+    ssl = None
+
+    class BaseSSLError(BaseException):
+        pass
+
+
+try:  # Python 3:
+    # Not a no-op, we're adding this to the namespace so it can be imported.
+    ConnectionError = ConnectionError
+except NameError:  # Python 2:
+    class ConnectionError(Exception):
+        pass
+
+
+from .exceptions import (
+    NewConnectionError,
+    ConnectTimeoutError,
+    SubjectAltNameWarning,
+    SystemTimeWarning,
+)
+from .packages.ssl_match_hostname import match_hostname, CertificateError
+
+from .util.ssl_ import (
+    resolve_cert_reqs,
+    resolve_ssl_version,
+    assert_fingerprint,
+    create_urllib3_context,
+    ssl_wrap_socket
+)
+
+
+from .util import connection
+
+from ._collections import HTTPHeaderDict
+
+log = logging.getLogger(__name__)
+
+port_by_scheme = {
+    'http': 80,
+    'https': 443,
+}
+
+# When updating RECENT_DATE, move it to within two years of the current date,
+# and not less than 6 months ago.
+# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or
+# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months)
+RECENT_DATE = datetime.date(2017, 6, 30)
+
+
+class DummyConnection(object):
+    """Used to detect a failed ConnectionCls import."""
+    pass
+
+
+class HTTPConnection(_HTTPConnection, object):
+    """
+    Based on httplib.HTTPConnection but provides an extra constructor
+    backwards-compatibility layer between older and newer Pythons.
+
+    Additional keyword parameters are used to configure attributes of the connection.
+    Accepted parameters include:
+
+      - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
+      - ``source_address``: Set the source address for the current connection.
+      - ``socket_options``: Set specific options on the underlying socket. If not specified, then
+        defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
+        Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
+
+        For example, if you wish to enable TCP Keep Alive in addition to the defaults,
+        you might pass::
+
+            HTTPConnection.default_socket_options + [
+                (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
+            ]
+
+        Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
+    """
+
+    default_port = port_by_scheme['http']
+
+    #: Disable Nagle's algorithm by default.
+    #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]``
+    default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
+
+    #: Whether this connection verifies the host's certificate.
+    is_verified = False
+
+    def __init__(self, *args, **kw):
+        if six.PY3:  # Python 3
+            kw.pop('strict', None)
+
+        # Pre-set source_address.
+        self.source_address = kw.get('source_address')
+
+        #: The socket options provided by the user. If no options are
+        #: provided, we use the default options.
+        self.socket_options = kw.pop('socket_options', self.default_socket_options)
+
+        _HTTPConnection.__init__(self, *args, **kw)
+
+    @property
+    def host(self):
+        """
+        Getter method to remove any trailing dots that indicate the hostname is an FQDN.
+
+        In general, SSL certificates don't include the trailing dot indicating a
+        fully-qualified domain name, and thus, they don't validate properly when
+        checked against a domain name that includes the dot. In addition, some
+        servers may not expect to receive the trailing dot when provided.
+
+        However, the hostname with trailing dot is critical to DNS resolution; doing a
+        lookup with the trailing dot will properly only resolve the appropriate FQDN,
+        whereas a lookup without a trailing dot will search the system's search domain
+        list. Thus, it's important to keep the original host around for use only in
+        those cases where it's appropriate (i.e., when doing DNS lookup to establish the
+        actual TCP connection across which we're going to send HTTP requests).
+        """
+        return self._dns_host.rstrip('.')
+
+    @host.setter
+    def host(self, value):
+        """
+        Setter for the `host` property.
+
+        We assume that only urllib3 uses the _dns_host attribute; httplib itself
+        only uses `host`, and it seems reasonable that other libraries follow suit.
+        """
+        self._dns_host = value
+
+    def _new_conn(self):
+        """ Establish a socket connection and set nodelay settings on it.
+
+        :return: New socket connection.
+        """
+        extra_kw = {}
+        if self.source_address:
+            extra_kw['source_address'] = self.source_address
+
+        if self.socket_options:
+            extra_kw['socket_options'] = self.socket_options
+
+        try:
+            conn = connection.create_connection(
+                (self._dns_host, self.port), self.timeout, **extra_kw)
+
+        except SocketTimeout as e:
+            raise ConnectTimeoutError(
+                self, "Connection to %s timed out. (connect timeout=%s)" %
+                (self.host, self.timeout))
+
+        except SocketError as e:
+            raise NewConnectionError(
+                self, "Failed to establish a new connection: %s" % e)
+
+        return conn
+
+    def _prepare_conn(self, conn):
+        self.sock = conn
+        if self._tunnel_host:
+            # TODO: Fix tunnel so it doesn't depend on self.sock state.
+            self._tunnel()
+            # Mark this connection as not reusable
+            self.auto_open = 0
+
+    def connect(self):
+        conn = self._new_conn()
+        self._prepare_conn(conn)
+
+    def request_chunked(self, method, url, body=None, headers=None):
+        """
+        Alternative to the common request method, which sends the
+        body with chunked encoding and not as one block
+        """
+        headers = HTTPHeaderDict(headers if headers is not None else {})
+        skip_accept_encoding = 'accept-encoding' in headers
+        skip_host = 'host' in headers
+        self.putrequest(
+            method,
+            url,
+            skip_accept_encoding=skip_accept_encoding,
+            skip_host=skip_host
+        )
+        for header, value in headers.items():
+            self.putheader(header, value)
+        if 'transfer-encoding' not in headers:
+            self.putheader('Transfer-Encoding', 'chunked')
+        self.endheaders()
+
+        if body is not None:
+            stringish_types = six.string_types + (bytes,)
+            if isinstance(body, stringish_types):
+                body = (body,)
+            for chunk in body:
+                if not chunk:
+                    continue
+                if not isinstance(chunk, bytes):
+                    chunk = chunk.encode('utf8')
+                len_str = hex(len(chunk))[2:]
+                self.send(len_str.encode('utf-8'))
+                self.send(b'\r\n')
+                self.send(chunk)
+                self.send(b'\r\n')
+
+        # After the if clause, to always have a closed body
+        self.send(b'0\r\n\r\n')
+
+
+class HTTPSConnection(HTTPConnection):
+    default_port = port_by_scheme['https']
+
+    ssl_version = None
+
+    def __init__(self, host, port=None, key_file=None, cert_file=None,
+                 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+                 ssl_context=None, server_hostname=None, **kw):
+
+        HTTPConnection.__init__(self, host, port, strict=strict,
+                                timeout=timeout, **kw)
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.ssl_context = ssl_context
+        self.server_hostname = server_hostname
+
+        # Required property for Google AppEngine 1.9.0 which otherwise causes
+        # HTTPS requests to go out as HTTP. (See Issue #356)
+        self._protocol = 'https'
+
+    def connect(self):
+        conn = self._new_conn()
+        self._prepare_conn(conn)
+
+        if self.ssl_context is None:
+            self.ssl_context = create_urllib3_context(
+                ssl_version=resolve_ssl_version(None),
+                cert_reqs=resolve_cert_reqs(None),
+            )
+
+        self.sock = ssl_wrap_socket(
+            sock=conn,
+            keyfile=self.key_file,
+            certfile=self.cert_file,
+            ssl_context=self.ssl_context,
+            server_hostname=self.server_hostname
+        )
+
+
+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, cert_file=None,
+                 cert_reqs=None, ca_certs=None,
+                 assert_hostname=None, assert_fingerprint=None,
+                 ca_cert_dir=None):
+        """
+        This method should only be called once, before the connection is used.
+        """
+        # If cert_reqs is not provided, we can try to guess. If the user gave
+        # us a cert database, we assume they want to use it: otherwise, if
+        # they gave us an SSL Context object we should use whatever is set for
+        # it.
+        if cert_reqs is None:
+            if ca_certs or ca_cert_dir:
+                cert_reqs = 'CERT_REQUIRED'
+            elif self.ssl_context is not None:
+                cert_reqs = self.ssl_context.verify_mode
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.assert_hostname = assert_hostname
+        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)
+
+    def connect(self):
+        # Add certificate verification
+        conn = self._new_conn()
+        hostname = self.host
+
+        if self._tunnel_host:
+            self.sock = conn
+            # Calls self._set_hostport(), so self.host is
+            # self._tunnel_host below.
+            self._tunnel()
+            # Mark this connection as not reusable
+            self.auto_open = 0
+
+            # Override the host with the one we're requesting data from.
+            hostname = self._tunnel_host
+
+        server_hostname = hostname
+        if self.server_hostname is not None:
+            server_hostname = self.server_hostname
+
+        is_time_off = datetime.date.today() < RECENT_DATE
+        if is_time_off:
+            warnings.warn((
+                'System time is way off (before {0}). This will probably '
+                'lead to SSL verification errors').format(RECENT_DATE),
+                SystemTimeWarning
+            )
+
+        # Wrap socket using verification with the root certs in
+        # trusted_root_certs
+        if self.ssl_context is None:
+            self.ssl_context = create_urllib3_context(
+                ssl_version=resolve_ssl_version(self.ssl_version),
+                cert_reqs=resolve_cert_reqs(self.cert_reqs),
+            )
+
+        context = self.ssl_context
+        context.verify_mode = resolve_cert_reqs(self.cert_reqs)
+        self.sock = ssl_wrap_socket(
+            sock=conn,
+            keyfile=self.key_file,
+            certfile=self.cert_file,
+            ca_certs=self.ca_certs,
+            ca_cert_dir=self.ca_cert_dir,
+            server_hostname=server_hostname,
+            ssl_context=context)
+
+        if self.assert_fingerprint:
+            assert_fingerprint(self.sock.getpeercert(binary_form=True),
+                               self.assert_fingerprint)
+        elif context.verify_mode != ssl.CERT_NONE \
+                and not getattr(context, 'check_hostname', False) \
+                and self.assert_hostname is not False:
+            # While urllib3 attempts to always turn off hostname matching from
+            # the TLS library, this cannot always be done. So we check whether
+            # the TLS Library still thinks it's matching hostnames.
+            cert = self.sock.getpeercert()
+            if not cert.get('subjectAltName', ()):
+                warnings.warn((
+                    'Certificate for {0} has no `subjectAltName`, falling back to check for a '
+                    '`commonName` for now. This feature is being removed by major browsers and '
+                    'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 '
+                    'for details.)'.format(hostname)),
+                    SubjectAltNameWarning
+                )
+            _match_hostname(cert, self.assert_hostname or server_hostname)
+
+        self.is_verified = (
+            context.verify_mode == ssl.CERT_REQUIRED or
+            self.assert_fingerprint is not None
+        )
+
+
+def _match_hostname(cert, asserted_hostname):
+    try:
+        match_hostname(cert, asserted_hostname)
+    except CertificateError as e:
+        log.error(
+            'Certificate did not match expected hostname: %s. '
+            'Certificate: %s', asserted_hostname, cert
+        )
+        # Add cert to exception and reraise so client code can inspect
+        # the cert when catching the exception, if they want to
+        e._peer_cert = cert
+        raise
+
+
+if ssl:
+    # Make a copy for testing.
+    UnverifiedHTTPSConnection = HTTPSConnection
+    HTTPSConnection = VerifiedHTTPSConnection
+else:
+    HTTPSConnection = DummyConnection
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e63fec2cb5d5c4f0ef40b61b519936eee5121d0c
GIT binary patch
literal 13186
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py
new file mode 100644
index 00000000..f7a8f193
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py
@@ -0,0 +1,896 @@
+from __future__ import absolute_import
+import errno
+import logging
+import sys
+import warnings
+
+from socket import error as SocketError, timeout as SocketTimeout
+import socket
+
+
+from .exceptions import (
+    ClosedPoolError,
+    ProtocolError,
+    EmptyPoolError,
+    HeaderParsingError,
+    HostChangedError,
+    LocationValueError,
+    MaxRetryError,
+    ProxyError,
+    ReadTimeoutError,
+    SSLError,
+    TimeoutError,
+    InsecureRequestWarning,
+    NewConnectionError,
+)
+from .packages.ssl_match_hostname import CertificateError
+from .packages import six
+from .packages.six.moves import queue
+from .connection import (
+    port_by_scheme,
+    DummyConnection,
+    HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection,
+    HTTPException, BaseSSLError,
+)
+from .request import RequestMethods
+from .response import HTTPResponse
+
+from .util.connection import is_connection_dropped
+from .util.request import set_file_position
+from .util.response import assert_header_parsing
+from .util.retry import Retry
+from .util.timeout import Timeout
+from .util.url import get_host, Url, NORMALIZABLE_SCHEMES
+from .util.queue import LifoQueue
+
+
+xrange = six.moves.xrange
+
+log = logging.getLogger(__name__)
+
+_Default = object()
+
+
+# Pool objects
+class ConnectionPool(object):
+    """
+    Base class for all connection pools, such as
+    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
+    """
+
+    scheme = None
+    QueueCls = LifoQueue
+
+    def __init__(self, host, port=None):
+        if not host:
+            raise LocationValueError("No host specified.")
+
+        self.host = _ipv6_host(host, self.scheme)
+        self._proxy_host = host.lower()
+        self.port = port
+
+    def __str__(self):
+        return '%s(host=%r, port=%r)' % (type(self).__name__,
+                                         self.host, self.port)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.close()
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def close(self):
+        """
+        Close all pooled connections and disable the pool.
+        """
+        pass
+
+
+# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
+_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK}
+
+
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
+    """
+    Thread-safe connection pool for one host.
+
+    :param host:
+        Host used for this HTTP Connection (e.g. "localhost"), passed into
+        :class:`httplib.HTTPConnection`.
+
+    :param port:
+        Port used for this HTTP Connection (None is equivalent to 80), passed
+        into :class:`httplib.HTTPConnection`.
+
+    :param strict:
+        Causes BadStatusLine to be raised if the status line can't be parsed
+        as a valid HTTP/1.0 or 1.1 status line, passed into
+        :class:`httplib.HTTPConnection`.
+
+        .. note::
+           Only works in Python 2. This parameter is ignored in Python 3.
+
+    :param timeout:
+        Socket timeout in seconds for each individual connection. This can
+        be a float or integer, which sets the timeout for the HTTP request,
+        or an instance of :class:`urllib3.util.Timeout` which gives you more
+        fine-grained control over request timeouts. After the constructor has
+        been parsed, this is always a `urllib3.util.Timeout` object.
+
+    :param maxsize:
+        Number of connections to save that can be reused. More than 1 is useful
+        in multithreaded situations. If ``block`` is set to False, more
+        connections will be created but they will not be saved once they've
+        been used.
+
+    :param block:
+        If set to True, no more than ``maxsize`` connections will be used at
+        a time. When no free connections are available, the call will block
+        until a connection has been released. This is a useful side effect for
+        particular multithreaded situations where one does not want to use more
+        than maxsize connections per host to prevent flooding.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+
+    :param retries:
+        Retry configuration to use by default with requests in this pool.
+
+    :param _proxy:
+        Parsed proxy URL, should not be used directly, instead, see
+        :class:`urllib3.connectionpool.ProxyManager`"
+
+    :param _proxy_headers:
+        A dictionary with proxy headers, should not be used directly,
+        instead, see :class:`urllib3.connectionpool.ProxyManager`"
+
+    :param \\**conn_kw:
+        Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`,
+        :class:`urllib3.connection.HTTPSConnection` instances.
+    """
+
+    scheme = 'http'
+    ConnectionCls = HTTPConnection
+    ResponseCls = HTTPResponse
+
+    def __init__(self, host, port=None, strict=False,
+                 timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False,
+                 headers=None, retries=None,
+                 _proxy=None, _proxy_headers=None,
+                 **conn_kw):
+        ConnectionPool.__init__(self, host, port)
+        RequestMethods.__init__(self, headers)
+
+        self.strict = strict
+
+        if not isinstance(timeout, Timeout):
+            timeout = Timeout.from_float(timeout)
+
+        if retries is None:
+            retries = Retry.DEFAULT
+
+        self.timeout = timeout
+        self.retries = retries
+
+        self.pool = self.QueueCls(maxsize)
+        self.block = block
+
+        self.proxy = _proxy
+        self.proxy_headers = _proxy_headers or {}
+
+        # Fill the queue up so that doing get() on it will block properly
+        for _ in xrange(maxsize):
+            self.pool.put(None)
+
+        # These are mostly for testing and debugging purposes.
+        self.num_connections = 0
+        self.num_requests = 0
+        self.conn_kw = conn_kw
+
+        if self.proxy:
+            # Enable Nagle's algorithm for proxies, to avoid packet fragmentation.
+            # We cannot know if the user has added default socket options, so we cannot replace the
+            # list.
+            self.conn_kw.setdefault('socket_options', [])
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`HTTPConnection`.
+        """
+        self.num_connections += 1
+        log.debug("Starting new HTTP connection (%d): %s:%s",
+                  self.num_connections, self.host, self.port or "80")
+
+        conn = self.ConnectionCls(host=self.host, port=self.port,
+                                  timeout=self.timeout.connect_timeout,
+                                  strict=self.strict, **self.conn_kw)
+        return conn
+
+    def _get_conn(self, timeout=None):
+        """
+        Get a connection. Will return a pooled connection if one is available.
+
+        If no connections are available and :prop:`.block` is ``False``, then a
+        fresh connection is returned.
+
+        :param timeout:
+            Seconds to wait before giving up and raising
+            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
+            :prop:`.block` is ``True``.
+        """
+        conn = None
+        try:
+            conn = self.pool.get(block=self.block, timeout=timeout)
+
+        except AttributeError:  # self.pool is None
+            raise ClosedPoolError(self, "Pool is closed.")
+
+        except queue.Empty:
+            if self.block:
+                raise EmptyPoolError(self,
+                                     "Pool reached maximum size and no more "
+                                     "connections are allowed.")
+            pass  # Oh well, we'll create a new connection then
+
+        # If this is a persistent connection, check if it got disconnected
+        if conn and is_connection_dropped(conn):
+            log.debug("Resetting dropped connection: %s", self.host)
+            conn.close()
+            if getattr(conn, 'auto_open', 1) == 0:
+                # This is a proxied connection that has been mutated by
+                # httplib._tunnel() and cannot be reused (since it would
+                # attempt to bypass the proxy)
+                conn = None
+
+        return conn or self._new_conn()
+
+    def _put_conn(self, conn):
+        """
+        Put a connection back into the pool.
+
+        :param conn:
+            Connection object for the current host and port as returned by
+            :meth:`._new_conn` or :meth:`._get_conn`.
+
+        If the pool is already full, the connection is closed and discarded
+        because we exceeded maxsize. If connections are discarded frequently,
+        then maxsize should be increased.
+
+        If the pool is closed, then the connection will be closed and discarded.
+        """
+        try:
+            self.pool.put(conn, block=False)
+            return  # Everything is dandy, done.
+        except AttributeError:
+            # self.pool is None.
+            pass
+        except queue.Full:
+            # This should never happen if self.block == True
+            log.warning(
+                "Connection pool is full, discarding connection: %s",
+                self.host)
+
+        # Connection never got put back into the pool, close it.
+        if conn:
+            conn.close()
+
+    def _validate_conn(self, conn):
+        """
+        Called right before a request is made, after the socket is created.
+        """
+        pass
+
+    def _prepare_proxy(self, conn):
+        # Nothing to do for HTTP connections.
+        pass
+
+    def _get_timeout(self, timeout):
+        """ Helper that always returns a :class:`urllib3.util.Timeout` """
+        if timeout is _Default:
+            return self.timeout.clone()
+
+        if isinstance(timeout, Timeout):
+            return timeout.clone()
+        else:
+            # User passed us an int/float. This is for backwards compatibility,
+            # can be removed later
+            return Timeout.from_float(timeout)
+
+    def _raise_timeout(self, err, url, timeout_value):
+        """Is the error actually a timeout? Will raise a ReadTimeout or pass"""
+
+        if isinstance(err, SocketTimeout):
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+        # See the above comment about EAGAIN in Python 3. In Python 2 we have
+        # to specifically catch it and throw the timeout error
+        if hasattr(err, 'errno') and err.errno in _blocking_errnos:
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+        # Catch possible read timeouts thrown as SSL errors. If not the
+        # case, rethrow the original. We need to do this because of:
+        # http://bugs.python.org/issue10272
+        if 'timed out' in str(err) or 'did not complete (read)' in str(err):  # Python < 2.7.4
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
+
+    def _make_request(self, conn, method, url, timeout=_Default, chunked=False,
+                      **httplib_request_kw):
+        """
+        Perform a request on a given urllib connection object taken from our
+        pool.
+
+        :param conn:
+            a connection from one of our connection pools
+
+        :param timeout:
+            Socket timeout in seconds for the request. This can be a
+            float or integer, which will set the same timeout value for
+            the socket connect and the socket read, or an instance of
+            :class:`urllib3.util.Timeout`, which gives you more fine-grained
+            control over your timeouts.
+        """
+        self.num_requests += 1
+
+        timeout_obj = self._get_timeout(timeout)
+        timeout_obj.start_connect()
+        conn.timeout = timeout_obj.connect_timeout
+
+        # Trigger any extra validation we need to do.
+        try:
+            self._validate_conn(conn)
+        except (SocketTimeout, BaseSSLError) as e:
+            # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.
+            self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
+            raise
+
+        # conn.request() calls httplib.*.request, not the method in
+        # urllib3.request. It also calls makefile (recv) on the socket.
+        if chunked:
+            conn.request_chunked(method, url, **httplib_request_kw)
+        else:
+            conn.request(method, url, **httplib_request_kw)
+
+        # Reset the timeout for the recv() on the socket
+        read_timeout = timeout_obj.read_timeout
+
+        # App Engine doesn't have a sock attr
+        if getattr(conn, 'sock', None):
+            # In Python 3 socket.py will catch EAGAIN and return None when you
+            # try and read into the file pointer created by http.client, which
+            # instead raises a BadStatusLine exception. Instead of catching
+            # the exception and assuming all BadStatusLine exceptions are read
+            # timeouts, check for a zero timeout before making the request.
+            if read_timeout == 0:
+                raise ReadTimeoutError(
+                    self, url, "Read timed out. (read timeout=%s)" % read_timeout)
+            if read_timeout is Timeout.DEFAULT_TIMEOUT:
+                conn.sock.settimeout(socket.getdefaulttimeout())
+            else:  # None or a value
+                conn.sock.settimeout(read_timeout)
+
+        # Receive the response from the server
+        try:
+            try:  # Python 2.7, use buffering of HTTP responses
+                httplib_response = conn.getresponse(buffering=True)
+            except TypeError:  # Python 3
+                try:
+                    httplib_response = conn.getresponse()
+                except Exception as e:
+                    # Remove the TypeError from the exception chain in Python 3;
+                    # otherwise it looks like a programming error was the cause.
+                    six.raise_from(e, None)
+        except (SocketTimeout, BaseSSLError, SocketError) as e:
+            self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
+            raise
+
+        # AppEngine doesn't have a version attr.
+        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
+        log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port,
+                  method, url, http_version, httplib_response.status,
+                  httplib_response.length)
+
+        try:
+            assert_header_parsing(httplib_response.msg)
+        except (HeaderParsingError, TypeError) as hpe:  # Platform-specific: Python 3
+            log.warning(
+                'Failed to parse headers (url=%s): %s',
+                self._absolute_url(url), hpe, exc_info=True)
+
+        return httplib_response
+
+    def _absolute_url(self, path):
+        return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url
+
+    def close(self):
+        """
+        Close all pooled connections and disable the pool.
+        """
+        if self.pool is None:
+            return
+        # Disable access to the pool
+        old_pool, self.pool = self.pool, None
+
+        try:
+            while True:
+                conn = old_pool.get(block=False)
+                if conn:
+                    conn.close()
+
+        except queue.Empty:
+            pass  # Done.
+
+    def is_same_host(self, url):
+        """
+        Check if the given ``url`` is a member of the same host as this
+        connection pool.
+        """
+        if url.startswith('/'):
+            return True
+
+        # TODO: Add optional support for socket.gethostbyname checking.
+        scheme, host, port = get_host(url)
+
+        host = _ipv6_host(host, self.scheme)
+
+        # Use explicit default port for comparison when none is given
+        if self.port and not port:
+            port = port_by_scheme.get(scheme)
+        elif not self.port and port == port_by_scheme.get(scheme):
+            port = None
+
+        return (scheme, host, port) == (self.scheme, self.host, self.port)
+
+    def urlopen(self, method, url, body=None, headers=None, retries=None,
+                redirect=True, assert_same_host=True, timeout=_Default,
+                pool_timeout=None, release_conn=None, chunked=False,
+                body_pos=None, **response_kw):
+        """
+        Get a connection from the pool and perform an HTTP request. This is the
+        lowest level call for making a request, so you'll need to specify all
+        the raw details.
+
+        .. note::
+
+           More commonly, it's appropriate to use a convenience method provided
+           by :class:`.RequestMethods`, such as :meth:`request`.
+
+        .. note::
+
+           `release_conn` will only behave as expected if
+           `preload_content=False` because we want to make
+           `preload_content=False` the default behaviour someday soon without
+           breaking backwards compatibility.
+
+        :param method:
+            HTTP request method (such as GET, POST, PUT, etc.)
+
+        :param body:
+            Data to send in the request body (useful for creating
+            POST requests, see HTTPConnectionPool.post_url for
+            more convenience).
+
+        :param headers:
+            Dictionary of custom headers to send, such as User-Agent,
+            If-None-Match, etc. If None, pool headers are used. If provided,
+            these headers completely replace any pool-specific headers.
+
+        :param retries:
+            Configure the number of retries to allow before raising a
+            :class:`~urllib3.exceptions.MaxRetryError` exception.
+
+            Pass ``None`` to retry until you receive a response. Pass a
+            :class:`~urllib3.util.retry.Retry` object for fine-grained control
+            over different types of retries.
+            Pass an integer number to retry connection errors that many times,
+            but no other types of errors. Pass zero to never retry.
+
+            If ``False``, then retries are disabled and any exception is raised
+            immediately. Also, instead of raising a MaxRetryError on redirects,
+            the redirect response will be returned.
+
+        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
+
+        :param redirect:
+            If True, automatically handle redirects (status codes 301, 302,
+            303, 307, 308). Each redirect counts as a retry. Disabling retries
+            will disable redirect, too.
+
+        :param assert_same_host:
+            If ``True``, will make sure that the host of the pool requests is
+            consistent else will raise HostChangedError. When False, you can
+            use the pool on an HTTP proxy and request foreign hosts.
+
+        :param timeout:
+            If specified, overrides the default timeout for this one
+            request. It may be a float (in seconds) or an instance of
+            :class:`urllib3.util.Timeout`.
+
+        :param pool_timeout:
+            If set and the pool is set to block=True, then this method will
+            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
+            connection is available within the time period.
+
+        :param release_conn:
+            If False, then the urlopen call will not release the connection
+            back into the pool once a response is received (but will release if
+            you read the entire contents of the response such as when
+            `preload_content=True`). This is useful if you're not preloading
+            the response's content immediately. You will need to call
+            ``r.release_conn()`` on the response ``r`` to return the connection
+            back into the pool. If None, it takes the value of
+            ``response_kw.get('preload_content', True)``.
+
+        :param chunked:
+            If True, urllib3 will send the body using chunked transfer
+            encoding. Otherwise, urllib3 will send the body using the standard
+            content-length form. Defaults to False.
+
+        :param int body_pos:
+            Position to seek to in file-like body in the event of a retry or
+            redirect. Typically this won't need to be set because urllib3 will
+            auto-populate the value when needed.
+
+        :param \\**response_kw:
+            Additional parameters are passed to
+            :meth:`urllib3.response.HTTPResponse.from_httplib`
+        """
+        if headers is None:
+            headers = self.headers
+
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
+
+        if release_conn is None:
+            release_conn = response_kw.get('preload_content', True)
+
+        # Check host
+        if assert_same_host and not self.is_same_host(url):
+            raise HostChangedError(self, url, retries)
+
+        conn = None
+
+        # Track whether `conn` needs to be released before
+        # returning/raising/recursing. Update this variable if necessary, and
+        # leave `release_conn` constant throughout the function. That way, if
+        # the function recurses, the original value of `release_conn` will be
+        # passed down into the recursive call, and its value will be respected.
+        #
+        # See issue #651 [1] for details.
+        #
+        # [1] <https://github.com/shazow/urllib3/issues/651>
+        release_this_conn = release_conn
+
+        # Merge the proxy headers. Only do this in HTTP. We have to copy the
+        # headers dict so we can safely change it without those changes being
+        # reflected in anyone else's copy.
+        if self.scheme == 'http':
+            headers = headers.copy()
+            headers.update(self.proxy_headers)
+
+        # Must keep the exception bound to a separate variable or else Python 3
+        # complains about UnboundLocalError.
+        err = None
+
+        # Keep track of whether we cleanly exited the except block. This
+        # ensures we do proper cleanup in finally.
+        clean_exit = False
+
+        # Rewind body position, if needed. Record current position
+        # for future rewinds in the event of a redirect/retry.
+        body_pos = set_file_position(body, body_pos)
+
+        try:
+            # Request a connection from the queue.
+            timeout_obj = self._get_timeout(timeout)
+            conn = self._get_conn(timeout=pool_timeout)
+
+            conn.timeout = timeout_obj.connect_timeout
+
+            is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)
+            if is_new_proxy_conn:
+                self._prepare_proxy(conn)
+
+            # Make the request on the httplib connection object.
+            httplib_response = self._make_request(conn, method, url,
+                                                  timeout=timeout_obj,
+                                                  body=body, headers=headers,
+                                                  chunked=chunked)
+
+            # If we're going to release the connection in ``finally:``, then
+            # the response doesn't need to know about the connection. Otherwise
+            # it will also try to release it and we'll have a double-release
+            # mess.
+            response_conn = conn if not release_conn else None
+
+            # Pass method to Response for length checking
+            response_kw['request_method'] = method
+
+            # Import httplib's response into our own wrapper object
+            response = self.ResponseCls.from_httplib(httplib_response,
+                                                     pool=self,
+                                                     connection=response_conn,
+                                                     retries=retries,
+                                                     **response_kw)
+
+            # Everything went great!
+            clean_exit = True
+
+        except queue.Empty:
+            # Timed out by queue.
+            raise EmptyPoolError(self, "No pool connections are available.")
+
+        except (TimeoutError, HTTPException, SocketError, ProtocolError,
+                BaseSSLError, SSLError, CertificateError) as e:
+            # Discard the connection for these exceptions. It will be
+            # replaced during the next _get_conn() call.
+            clean_exit = False
+            if isinstance(e, (BaseSSLError, CertificateError)):
+                e = SSLError(e)
+            elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy:
+                e = ProxyError('Cannot connect to proxy.', e)
+            elif isinstance(e, (SocketError, HTTPException)):
+                e = ProtocolError('Connection aborted.', e)
+
+            retries = retries.increment(method, url, error=e, _pool=self,
+                                        _stacktrace=sys.exc_info()[2])
+            retries.sleep()
+
+            # Keep track of the error for the retry warning.
+            err = e
+
+        finally:
+            if not clean_exit:
+                # We hit some kind of exception, handled or otherwise. We need
+                # to throw the connection away unless explicitly told not to.
+                # Close the connection, set the variable to None, and make sure
+                # we put the None back in the pool to avoid leaking it.
+                conn = conn and conn.close()
+                release_this_conn = True
+
+            if release_this_conn:
+                # Put the connection back to be reused. If the connection is
+                # expired then it will be None, which will get replaced with a
+                # fresh connection during _get_conn.
+                self._put_conn(conn)
+
+        if not conn:
+            # Try again
+            log.warning("Retrying (%r) after connection "
+                        "broken by '%r': %s", retries, err, url)
+            return self.urlopen(method, url, body, headers, retries,
+                                redirect, assert_same_host,
+                                timeout=timeout, pool_timeout=pool_timeout,
+                                release_conn=release_conn, body_pos=body_pos,
+                                **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) as e:
+                pass
+
+        # Handle redirect?
+        redirect_location = redirect and response.get_redirect_location()
+        if redirect_location:
+            if response.status == 303:
+                method = 'GET'
+
+            try:
+                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)
+                    raise
+                return response
+
+            # drain and return the connection to the pool before recursing
+            drain_and_release_conn(response)
+
+            retries.sleep_for_retry(response)
+            log.debug("Redirecting %s -> %s", url, redirect_location)
+            return self.urlopen(
+                method, redirect_location, body, headers,
+                retries=retries, redirect=redirect,
+                assert_same_host=assert_same_host,
+                timeout=timeout, pool_timeout=pool_timeout,
+                release_conn=release_conn, body_pos=body_pos,
+                **response_kw)
+
+        # Check if we should retry the HTTP response.
+        has_retry_after = bool(response.getheader('Retry-After'))
+        if retries.is_retry(method, response.status, has_retry_after):
+            try:
+                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)
+                    raise
+                return response
+
+            # drain and return the connection to the pool before recursing
+            drain_and_release_conn(response)
+
+            retries.sleep(response)
+            log.debug("Retry: %s", url)
+            return self.urlopen(
+                method, url, body, headers,
+                retries=retries, redirect=redirect,
+                assert_same_host=assert_same_host,
+                timeout=timeout, pool_timeout=pool_timeout,
+                release_conn=release_conn,
+                body_pos=body_pos, **response_kw)
+
+        return response
+
+
+class HTTPSConnectionPool(HTTPConnectionPool):
+    """
+    Same as :class:`.HTTPConnectionPool`, but HTTPS.
+
+    When Python is compiled with the :mod:`ssl` module, then
+    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
+    instead of :class:`.HTTPSConnection`.
+
+    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
+    ``assert_hostname`` and ``host`` in this order to verify connections.
+    If ``assert_hostname`` is False, no verification is done.
+
+    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``,
+    ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is
+    available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade
+    the connection socket into an SSL socket.
+    """
+
+    scheme = 'https'
+    ConnectionCls = HTTPSConnection
+
+    def __init__(self, host, port=None,
+                 strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1,
+                 block=False, headers=None, retries=None,
+                 _proxy=None, _proxy_headers=None,
+                 key_file=None, cert_file=None, cert_reqs=None,
+                 ca_certs=None, ssl_version=None,
+                 assert_hostname=None, assert_fingerprint=None,
+                 ca_cert_dir=None, **conn_kw):
+
+        HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize,
+                                    block, headers, retries, _proxy, _proxy_headers,
+                                    **conn_kw)
+
+        if ca_certs and cert_reqs is None:
+            cert_reqs = 'CERT_REQUIRED'
+
+        self.key_file = key_file
+        self.cert_file = cert_file
+        self.cert_reqs = cert_reqs
+        self.ca_certs = ca_certs
+        self.ca_cert_dir = ca_cert_dir
+        self.ssl_version = ssl_version
+        self.assert_hostname = assert_hostname
+        self.assert_fingerprint = assert_fingerprint
+
+    def _prepare_conn(self, conn):
+        """
+        Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket`
+        and establish the tunnel if proxy is used.
+        """
+
+        if isinstance(conn, VerifiedHTTPSConnection):
+            conn.set_cert(key_file=self.key_file,
+                          cert_file=self.cert_file,
+                          cert_reqs=self.cert_reqs,
+                          ca_certs=self.ca_certs,
+                          ca_cert_dir=self.ca_cert_dir,
+                          assert_hostname=self.assert_hostname,
+                          assert_fingerprint=self.assert_fingerprint)
+            conn.ssl_version = self.ssl_version
+        return conn
+
+    def _prepare_proxy(self, conn):
+        """
+        Establish tunnel connection early, because otherwise httplib
+        would improperly set Host: header to proxy's IP:port.
+        """
+        conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers)
+        conn.connect()
+
+    def _new_conn(self):
+        """
+        Return a fresh :class:`httplib.HTTPSConnection`.
+        """
+        self.num_connections += 1
+        log.debug("Starting new HTTPS connection (%d): %s:%s",
+                  self.num_connections, self.host, self.port or "443")
+
+        if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
+            raise SSLError("Can't connect to HTTPS URL because the SSL "
+                           "module is not available.")
+
+        actual_host = self.host
+        actual_port = self.port
+        if self.proxy is not None:
+            actual_host = self.proxy.host
+            actual_port = self.proxy.port
+
+        conn = self.ConnectionCls(host=actual_host, port=actual_port,
+                                  timeout=self.timeout.connect_timeout,
+                                  strict=self.strict, **self.conn_kw)
+
+        return self._prepare_conn(conn)
+
+    def _validate_conn(self, conn):
+        """
+        Called right before a request is made, after the socket is created.
+        """
+        super(HTTPSConnectionPool, self)._validate_conn(conn)
+
+        # Force connect early to allow us to validate the connection.
+        if not getattr(conn, 'sock', None):  # AppEngine might not have  `.sock`
+            conn.connect()
+
+        if not conn.is_verified:
+            warnings.warn((
+                'Unverified HTTPS request is being made. '
+                'Adding certificate verification is strongly advised. See: '
+                'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
+                '#ssl-warnings'),
+                InsecureRequestWarning)
+
+
+def connection_from_url(url, **kw):
+    """
+    Given a url, return an :class:`.ConnectionPool` instance of its host.
+
+    This is a shortcut for not having to parse out the scheme, host, and port
+    of the url before creating an :class:`.ConnectionPool` instance.
+
+    :param url:
+        Absolute URL string that must include the scheme. Port is optional.
+
+    :param \\**kw:
+        Passes additional parameters to the constructor of the appropriate
+        :class:`.ConnectionPool`. Useful for specifying things like
+        timeout, maxsize, headers, etc.
+
+    Example::
+
+        >>> conn = connection_from_url('http://google.com/')
+        >>> r = conn.request('GET', '/')
+    """
+    scheme, host, port = get_host(url)
+    port = port or port_by_scheme.get(scheme, 80)
+    if scheme == 'https':
+        return HTTPSConnectionPool(host, port=port, **kw)
+    else:
+        return HTTPConnectionPool(host, port=port, **kw)
+
+
+def _ipv6_host(host, scheme):
+    """
+    Process IPv6 address literals
+    """
+
+    # httplib doesn't like it when we include brackets in IPv6 addresses
+    # Specifically, if we include brackets but also pass the port then
+    # httplib crazily doubles up the square brackets on the Host header.
+    # Instead, we need to make sure we never pass ``None`` as the port.
+    # However, for backward compatibility reasons we can't actually
+    # *assert* that.  See http://bugs.python.org/issue28539
+    #
+    # Also if an IPv6 address literal has a zone identifier, the
+    # percent sign might be URIencoded, convert it back into ASCII
+    if host.startswith('[') and host.endswith(']'):
+        host = host.replace('%25', '%').strip('[]')
+    if scheme in NORMALIZABLE_SCHEMES:
+        host = host.lower()
+    return host
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5fa8ffc9b65f7955039673b666aa14ba28b5cf91
GIT binary patch
literal 28575
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
YF!3{SvWTe)F-!hu_|MQRR>Ua-0IEq`0ssI2

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..44971beb8fe4f29106cc1b09a8ad98dd32f64183
GIT binary patch
literal 206
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaXAA6gML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GM%Tn`F@{9CKi*j-@lZ^F~^YcoIGL!V<<1_OzOXB18
Z3MxxD7#J9Aa`RJ4b5iX<E-VH)5CEDNH97zQ

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py
new file mode 100644
index 00000000..f3e00942
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py
@@ -0,0 +1,30 @@
+"""
+This module provides means to detect the App Engine environment.
+"""
+
+import os
+
+
+def is_appengine():
+    return (is_local_appengine() or
+            is_prod_appengine() or
+            is_prod_appengine_mvms())
+
+
+def is_appengine_sandbox():
+    return is_appengine() and not is_prod_appengine_mvms()
+
+
+def is_local_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Development/' in os.environ['SERVER_SOFTWARE'])
+
+
+def is_prod_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
+            not is_prod_appengine_mvms())
+
+
+def is_prod_appengine_mvms():
+    return os.environ.get('GAE_VM', False) == 'true'
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bd3ee7389c7edcbf520d0dc5f09e2758e2128db8
GIT binary patch
literal 1838
zcmZSn%*&NH<x)&C0~9bZFfceUFfbH5GcYiuFfc?hFr+Xtq%bk$Ffv3jGNdpwv@kG4
zF)^gDfEmmTDXd@y3quMUn8C`B!VYGzfpi6HaDWVRVqjq43dzVUR>;jyDa}b$C@9J=
z%S=fvR>)0F%qvzX$yZ28ElEu-Q7FksRd6gQP;kvl&&*3zNX;wDEXvQzP0cIO<I4R1
z|NnnKxKkM!7#KjVES6+oU?^c=Xl7t2kYFfbgfW;vj9?9rGCvJwkQyNd28PVy_?-OY
z#GLrVf`U}AB_)Co;ew+46eLkGY@+eGWx2%~ps+#^#f=OM4EhB{nPrJ3srqG!Mfz#^
zIVq_{#roNW`q{-s=H`ZlSw`k%h8E_<IhE<<@g^xICI$uu2I+bFA^HWG1-hAe#U+V3
zIlASEmZgCiAR#c0FH6l!$uH6`Ey~HsOfuF_&d)0;%1qKnI5Hj@K6(X}B|H%K!o39!
zcs7tz895m_88L$m<ZVc><qJTAjRzK7pkxpP3bP;(O9NyIf*2$o7D4lHd~sr4N>Y9W
zA1K9voXvpnG{`I9w4wk?){LO!lEui7&Bl-~4@#yb3=CP|#4VZ4#t^K*!oa}b2Tm4_
z0RgUl?w)?G@j;<}A)daj#h_qzNi9pw$u9t<O8pXk1_p*;*Pt-hp!i^aw~%nhAXg2L
z?Ij>0zqo{*fq?-UO^6@_vj#^v27w|MlrxG!-ezFr#}aB<=%J>G5o-CG3?<+k#{&(&
zAXZR3fDCre&ri=m&er-tpmYh&lR=>12?C|n!JE>8Kt+f+$TuKogF;9cOBg{*p)5v*
zEGAHyS;EZF%mfOiY$k?auwVU3K>FPsUE{-iOF)5LQdF7>PHc!!C;_F^^wg3PQ0TcO
z<`k!blL~?uB#8!;xMe{>0%9;QYJj2<oYdpvQ}UDJ;~_o*c_s+tQ*a^!hvVRl<`PgU
bw8;fmP<9}fgY!BY6Av>d8z&1VD<>NOqM^p`

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9f2974dd7939b7a713b69317823ebff5ed1fcbad
GIT binary patch
literal 223
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaR&nfgML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GM%Tn`F@{9CKi*j-@lZ^F~^YcoIGL!V<i&K+Ji&9I9
q67z}+@{3CJ<Kr{)GE3s)^$IFWI2afhY;yBcN^?@}Ku#_OxflS+ojgqd

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
new file mode 100644
index 00000000..bcf41c02
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
@@ -0,0 +1,593 @@
+"""
+This module uses ctypes to bind a whole bunch of functions and constants from
+SecureTransport. The goal here is to provide the low-level API to
+SecureTransport. These are essentially the C-level functions and constants, and
+they're pretty gross to work with.
+
+This code is a bastardised version of the code found in Will Bond's oscrypto
+library. An enormous debt is owed to him for blazing this trail for us. For
+that reason, this code should be considered to be covered both by urllib3's
+license and by oscrypto's:
+
+    Copyright (c) 2015-2016 Will Bond <will@wbond.net>
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+    copy of this software and associated documentation files (the "Software"),
+    to deal in the Software without restriction, including without limitation
+    the rights to use, copy, modify, merge, publish, distribute, sublicense,
+    and/or sell copies of the Software, and to permit persons to whom the
+    Software is furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+"""
+from __future__ import absolute_import
+
+import platform
+from ctypes.util import find_library
+from ctypes import (
+    c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long,
+    c_bool
+)
+from ctypes import CDLL, POINTER, CFUNCTYPE
+
+
+security_path = find_library('Security')
+if not security_path:
+    raise ImportError('The library Security could not be found')
+
+
+core_foundation_path = find_library('CoreFoundation')
+if not core_foundation_path:
+    raise ImportError('The library CoreFoundation could not be found')
+
+
+version = platform.mac_ver()[0]
+version_info = tuple(map(int, version.split('.')))
+if version_info < (10, 8):
+    raise OSError(
+        'Only OS X 10.8 and newer are supported, not %s.%s' % (
+            version_info[0], version_info[1]
+        )
+    )
+
+Security = CDLL(security_path, use_errno=True)
+CoreFoundation = CDLL(core_foundation_path, use_errno=True)
+
+Boolean = c_bool
+CFIndex = c_long
+CFStringEncoding = c_uint32
+CFData = c_void_p
+CFString = c_void_p
+CFArray = c_void_p
+CFMutableArray = c_void_p
+CFDictionary = c_void_p
+CFError = c_void_p
+CFType = c_void_p
+CFTypeID = c_ulong
+
+CFTypeRef = POINTER(CFType)
+CFAllocatorRef = c_void_p
+
+OSStatus = c_int32
+
+CFDataRef = POINTER(CFData)
+CFStringRef = POINTER(CFString)
+CFArrayRef = POINTER(CFArray)
+CFMutableArrayRef = POINTER(CFMutableArray)
+CFDictionaryRef = POINTER(CFDictionary)
+CFArrayCallBacks = c_void_p
+CFDictionaryKeyCallBacks = c_void_p
+CFDictionaryValueCallBacks = c_void_p
+
+SecCertificateRef = POINTER(c_void_p)
+SecExternalFormat = c_uint32
+SecExternalItemType = c_uint32
+SecIdentityRef = POINTER(c_void_p)
+SecItemImportExportFlags = c_uint32
+SecItemImportExportKeyParameters = c_void_p
+SecKeychainRef = POINTER(c_void_p)
+SSLProtocol = c_uint32
+SSLCipherSuite = c_uint32
+SSLContextRef = POINTER(c_void_p)
+SecTrustRef = POINTER(c_void_p)
+SSLConnectionRef = c_uint32
+SecTrustResultType = c_uint32
+SecTrustOptionFlags = c_uint32
+SSLProtocolSide = c_uint32
+SSLConnectionType = c_uint32
+SSLSessionOption = c_uint32
+
+
+try:
+    Security.SecItemImport.argtypes = [
+        CFDataRef,
+        CFStringRef,
+        POINTER(SecExternalFormat),
+        POINTER(SecExternalItemType),
+        SecItemImportExportFlags,
+        POINTER(SecItemImportExportKeyParameters),
+        SecKeychainRef,
+        POINTER(CFArrayRef),
+    ]
+    Security.SecItemImport.restype = OSStatus
+
+    Security.SecCertificateGetTypeID.argtypes = []
+    Security.SecCertificateGetTypeID.restype = CFTypeID
+
+    Security.SecIdentityGetTypeID.argtypes = []
+    Security.SecIdentityGetTypeID.restype = CFTypeID
+
+    Security.SecKeyGetTypeID.argtypes = []
+    Security.SecKeyGetTypeID.restype = CFTypeID
+
+    Security.SecCertificateCreateWithData.argtypes = [
+        CFAllocatorRef,
+        CFDataRef
+    ]
+    Security.SecCertificateCreateWithData.restype = SecCertificateRef
+
+    Security.SecCertificateCopyData.argtypes = [
+        SecCertificateRef
+    ]
+    Security.SecCertificateCopyData.restype = CFDataRef
+
+    Security.SecCopyErrorMessageString.argtypes = [
+        OSStatus,
+        c_void_p
+    ]
+    Security.SecCopyErrorMessageString.restype = CFStringRef
+
+    Security.SecIdentityCreateWithCertificate.argtypes = [
+        CFTypeRef,
+        SecCertificateRef,
+        POINTER(SecIdentityRef)
+    ]
+    Security.SecIdentityCreateWithCertificate.restype = OSStatus
+
+    Security.SecKeychainCreate.argtypes = [
+        c_char_p,
+        c_uint32,
+        c_void_p,
+        Boolean,
+        c_void_p,
+        POINTER(SecKeychainRef)
+    ]
+    Security.SecKeychainCreate.restype = OSStatus
+
+    Security.SecKeychainDelete.argtypes = [
+        SecKeychainRef
+    ]
+    Security.SecKeychainDelete.restype = OSStatus
+
+    Security.SecPKCS12Import.argtypes = [
+        CFDataRef,
+        CFDictionaryRef,
+        POINTER(CFArrayRef)
+    ]
+    Security.SecPKCS12Import.restype = OSStatus
+
+    SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t))
+    SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t))
+
+    Security.SSLSetIOFuncs.argtypes = [
+        SSLContextRef,
+        SSLReadFunc,
+        SSLWriteFunc
+    ]
+    Security.SSLSetIOFuncs.restype = OSStatus
+
+    Security.SSLSetPeerID.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t
+    ]
+    Security.SSLSetPeerID.restype = OSStatus
+
+    Security.SSLSetCertificate.argtypes = [
+        SSLContextRef,
+        CFArrayRef
+    ]
+    Security.SSLSetCertificate.restype = OSStatus
+
+    Security.SSLSetCertificateAuthorities.argtypes = [
+        SSLContextRef,
+        CFTypeRef,
+        Boolean
+    ]
+    Security.SSLSetCertificateAuthorities.restype = OSStatus
+
+    Security.SSLSetConnection.argtypes = [
+        SSLContextRef,
+        SSLConnectionRef
+    ]
+    Security.SSLSetConnection.restype = OSStatus
+
+    Security.SSLSetPeerDomainName.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t
+    ]
+    Security.SSLSetPeerDomainName.restype = OSStatus
+
+    Security.SSLHandshake.argtypes = [
+        SSLContextRef
+    ]
+    Security.SSLHandshake.restype = OSStatus
+
+    Security.SSLRead.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t,
+        POINTER(c_size_t)
+    ]
+    Security.SSLRead.restype = OSStatus
+
+    Security.SSLWrite.argtypes = [
+        SSLContextRef,
+        c_char_p,
+        c_size_t,
+        POINTER(c_size_t)
+    ]
+    Security.SSLWrite.restype = OSStatus
+
+    Security.SSLClose.argtypes = [
+        SSLContextRef
+    ]
+    Security.SSLClose.restype = OSStatus
+
+    Security.SSLGetNumberSupportedCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetNumberSupportedCiphers.restype = OSStatus
+
+    Security.SSLGetSupportedCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite),
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetSupportedCiphers.restype = OSStatus
+
+    Security.SSLSetEnabledCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite),
+        c_size_t
+    ]
+    Security.SSLSetEnabledCiphers.restype = OSStatus
+
+    Security.SSLGetNumberEnabledCiphers.argtype = [
+        SSLContextRef,
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetNumberEnabledCiphers.restype = OSStatus
+
+    Security.SSLGetEnabledCiphers.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite),
+        POINTER(c_size_t)
+    ]
+    Security.SSLGetEnabledCiphers.restype = OSStatus
+
+    Security.SSLGetNegotiatedCipher.argtypes = [
+        SSLContextRef,
+        POINTER(SSLCipherSuite)
+    ]
+    Security.SSLGetNegotiatedCipher.restype = OSStatus
+
+    Security.SSLGetNegotiatedProtocolVersion.argtypes = [
+        SSLContextRef,
+        POINTER(SSLProtocol)
+    ]
+    Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus
+
+    Security.SSLCopyPeerTrust.argtypes = [
+        SSLContextRef,
+        POINTER(SecTrustRef)
+    ]
+    Security.SSLCopyPeerTrust.restype = OSStatus
+
+    Security.SecTrustSetAnchorCertificates.argtypes = [
+        SecTrustRef,
+        CFArrayRef
+    ]
+    Security.SecTrustSetAnchorCertificates.restype = OSStatus
+
+    Security.SecTrustSetAnchorCertificatesOnly.argstypes = [
+        SecTrustRef,
+        Boolean
+    ]
+    Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus
+
+    Security.SecTrustEvaluate.argtypes = [
+        SecTrustRef,
+        POINTER(SecTrustResultType)
+    ]
+    Security.SecTrustEvaluate.restype = OSStatus
+
+    Security.SecTrustGetCertificateCount.argtypes = [
+        SecTrustRef
+    ]
+    Security.SecTrustGetCertificateCount.restype = CFIndex
+
+    Security.SecTrustGetCertificateAtIndex.argtypes = [
+        SecTrustRef,
+        CFIndex
+    ]
+    Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef
+
+    Security.SSLCreateContext.argtypes = [
+        CFAllocatorRef,
+        SSLProtocolSide,
+        SSLConnectionType
+    ]
+    Security.SSLCreateContext.restype = SSLContextRef
+
+    Security.SSLSetSessionOption.argtypes = [
+        SSLContextRef,
+        SSLSessionOption,
+        Boolean
+    ]
+    Security.SSLSetSessionOption.restype = OSStatus
+
+    Security.SSLSetProtocolVersionMin.argtypes = [
+        SSLContextRef,
+        SSLProtocol
+    ]
+    Security.SSLSetProtocolVersionMin.restype = OSStatus
+
+    Security.SSLSetProtocolVersionMax.argtypes = [
+        SSLContextRef,
+        SSLProtocol
+    ]
+    Security.SSLSetProtocolVersionMax.restype = OSStatus
+
+    Security.SecCopyErrorMessageString.argtypes = [
+        OSStatus,
+        c_void_p
+    ]
+    Security.SecCopyErrorMessageString.restype = CFStringRef
+
+    Security.SSLReadFunc = SSLReadFunc
+    Security.SSLWriteFunc = SSLWriteFunc
+    Security.SSLContextRef = SSLContextRef
+    Security.SSLProtocol = SSLProtocol
+    Security.SSLCipherSuite = SSLCipherSuite
+    Security.SecIdentityRef = SecIdentityRef
+    Security.SecKeychainRef = SecKeychainRef
+    Security.SecTrustRef = SecTrustRef
+    Security.SecTrustResultType = SecTrustResultType
+    Security.SecExternalFormat = SecExternalFormat
+    Security.OSStatus = OSStatus
+
+    Security.kSecImportExportPassphrase = CFStringRef.in_dll(
+        Security, 'kSecImportExportPassphrase'
+    )
+    Security.kSecImportItemIdentity = CFStringRef.in_dll(
+        Security, 'kSecImportItemIdentity'
+    )
+
+    # CoreFoundation time!
+    CoreFoundation.CFRetain.argtypes = [
+        CFTypeRef
+    ]
+    CoreFoundation.CFRetain.restype = CFTypeRef
+
+    CoreFoundation.CFRelease.argtypes = [
+        CFTypeRef
+    ]
+    CoreFoundation.CFRelease.restype = None
+
+    CoreFoundation.CFGetTypeID.argtypes = [
+        CFTypeRef
+    ]
+    CoreFoundation.CFGetTypeID.restype = CFTypeID
+
+    CoreFoundation.CFStringCreateWithCString.argtypes = [
+        CFAllocatorRef,
+        c_char_p,
+        CFStringEncoding
+    ]
+    CoreFoundation.CFStringCreateWithCString.restype = CFStringRef
+
+    CoreFoundation.CFStringGetCStringPtr.argtypes = [
+        CFStringRef,
+        CFStringEncoding
+    ]
+    CoreFoundation.CFStringGetCStringPtr.restype = c_char_p
+
+    CoreFoundation.CFStringGetCString.argtypes = [
+        CFStringRef,
+        c_char_p,
+        CFIndex,
+        CFStringEncoding
+    ]
+    CoreFoundation.CFStringGetCString.restype = c_bool
+
+    CoreFoundation.CFDataCreate.argtypes = [
+        CFAllocatorRef,
+        c_char_p,
+        CFIndex
+    ]
+    CoreFoundation.CFDataCreate.restype = CFDataRef
+
+    CoreFoundation.CFDataGetLength.argtypes = [
+        CFDataRef
+    ]
+    CoreFoundation.CFDataGetLength.restype = CFIndex
+
+    CoreFoundation.CFDataGetBytePtr.argtypes = [
+        CFDataRef
+    ]
+    CoreFoundation.CFDataGetBytePtr.restype = c_void_p
+
+    CoreFoundation.CFDictionaryCreate.argtypes = [
+        CFAllocatorRef,
+        POINTER(CFTypeRef),
+        POINTER(CFTypeRef),
+        CFIndex,
+        CFDictionaryKeyCallBacks,
+        CFDictionaryValueCallBacks
+    ]
+    CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef
+
+    CoreFoundation.CFDictionaryGetValue.argtypes = [
+        CFDictionaryRef,
+        CFTypeRef
+    ]
+    CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef
+
+    CoreFoundation.CFArrayCreate.argtypes = [
+        CFAllocatorRef,
+        POINTER(CFTypeRef),
+        CFIndex,
+        CFArrayCallBacks,
+    ]
+    CoreFoundation.CFArrayCreate.restype = CFArrayRef
+
+    CoreFoundation.CFArrayCreateMutable.argtypes = [
+        CFAllocatorRef,
+        CFIndex,
+        CFArrayCallBacks
+    ]
+    CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef
+
+    CoreFoundation.CFArrayAppendValue.argtypes = [
+        CFMutableArrayRef,
+        c_void_p
+    ]
+    CoreFoundation.CFArrayAppendValue.restype = None
+
+    CoreFoundation.CFArrayGetCount.argtypes = [
+        CFArrayRef
+    ]
+    CoreFoundation.CFArrayGetCount.restype = CFIndex
+
+    CoreFoundation.CFArrayGetValueAtIndex.argtypes = [
+        CFArrayRef,
+        CFIndex
+    ]
+    CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p
+
+    CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll(
+        CoreFoundation, 'kCFAllocatorDefault'
+    )
+    CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks')
+    CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll(
+        CoreFoundation, 'kCFTypeDictionaryKeyCallBacks'
+    )
+    CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll(
+        CoreFoundation, 'kCFTypeDictionaryValueCallBacks'
+    )
+
+    CoreFoundation.CFTypeRef = CFTypeRef
+    CoreFoundation.CFArrayRef = CFArrayRef
+    CoreFoundation.CFStringRef = CFStringRef
+    CoreFoundation.CFDictionaryRef = CFDictionaryRef
+
+except (AttributeError):
+    raise ImportError('Error initializing ctypes')
+
+
+class CFConst(object):
+    """
+    A class object that acts as essentially a namespace for CoreFoundation
+    constants.
+    """
+    kCFStringEncodingUTF8 = CFStringEncoding(0x08000100)
+
+
+class SecurityConst(object):
+    """
+    A class object that acts as essentially a namespace for Security constants.
+    """
+    kSSLSessionOptionBreakOnServerAuth = 0
+
+    kSSLProtocol2 = 1
+    kSSLProtocol3 = 2
+    kTLSProtocol1 = 4
+    kTLSProtocol11 = 7
+    kTLSProtocol12 = 8
+
+    kSSLClientSide = 1
+    kSSLStreamType = 0
+
+    kSecFormatPEMSequence = 10
+
+    kSecTrustResultInvalid = 0
+    kSecTrustResultProceed = 1
+    # This gap is present on purpose: this was kSecTrustResultConfirm, which
+    # is deprecated.
+    kSecTrustResultDeny = 3
+    kSecTrustResultUnspecified = 4
+    kSecTrustResultRecoverableTrustFailure = 5
+    kSecTrustResultFatalTrustFailure = 6
+    kSecTrustResultOtherError = 7
+
+    errSSLProtocol = -9800
+    errSSLWouldBlock = -9803
+    errSSLClosedGraceful = -9805
+    errSSLClosedNoNotify = -9816
+    errSSLClosedAbort = -9806
+
+    errSSLXCertChainInvalid = -9807
+    errSSLCrypto = -9809
+    errSSLInternal = -9810
+    errSSLCertExpired = -9814
+    errSSLCertNotYetValid = -9815
+    errSSLUnknownRootCert = -9812
+    errSSLNoRootCert = -9813
+    errSSLHostNameMismatch = -9843
+    errSSLPeerHandshakeFail = -9824
+    errSSLPeerUserCancelled = -9839
+    errSSLWeakPeerEphemeralDHKey = -9850
+    errSSLServerAuthCompleted = -9841
+    errSSLRecordOverflow = -9847
+
+    errSecVerifyFailed = -67808
+    errSecNoTrustSettings = -25263
+    errSecItemNotFound = -25300
+    errSecInvalidTrustSettings = -25262
+
+    # Cipher suites. We only pick the ones our default cipher string allows.
+    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C
+    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030
+    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B
+    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F
+    TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3
+    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F
+    TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2
+    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E
+    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024
+    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028
+    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A
+    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014
+    TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B
+    TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A
+    TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039
+    TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038
+    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023
+    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027
+    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009
+    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013
+    TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067
+    TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040
+    TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033
+    TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032
+    TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D
+    TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C
+    TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D
+    TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C
+    TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035
+    TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F
+    TLS_AES_128_GCM_SHA256 = 0x1301
+    TLS_AES_256_GCM_SHA384 = 0x1302
+    TLS_CHACHA20_POLY1305_SHA256 = 0x1303
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..baea639adc7ee709b761f5ae25dacce7e6a5dc98
GIT binary patch
literal 12359
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
new file mode 100644
index 00000000..b13cd9e7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
@@ -0,0 +1,346 @@
+"""
+Low-level helpers for the SecureTransport bindings.
+
+These are Python functions that are not directly related to the high-level APIs
+but are necessary to get them to work. They include a whole bunch of low-level
+CoreFoundation messing about and memory management. The concerns in this module
+are almost entirely about trying to avoid memory leaks and providing
+appropriate and useful assistance to the higher-level code.
+"""
+import base64
+import ctypes
+import itertools
+import re
+import os
+import ssl
+import tempfile
+
+from .bindings import Security, CoreFoundation, CFConst
+
+
+# This regular expression is used to grab PEM data out of a PEM bundle.
+_PEM_CERTS_RE = re.compile(
+    b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL
+)
+
+
+def _cf_data_from_bytes(bytestring):
+    """
+    Given a bytestring, create a CFData object from it. This CFData object must
+    be CFReleased by the caller.
+    """
+    return CoreFoundation.CFDataCreate(
+        CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring)
+    )
+
+
+def _cf_dictionary_from_tuples(tuples):
+    """
+    Given a list of Python tuples, create an associated CFDictionary.
+    """
+    dictionary_size = len(tuples)
+
+    # We need to get the dictionary keys and values out in the same order.
+    keys = (t[0] for t in tuples)
+    values = (t[1] for t in tuples)
+    cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys)
+    cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values)
+
+    return CoreFoundation.CFDictionaryCreate(
+        CoreFoundation.kCFAllocatorDefault,
+        cf_keys,
+        cf_values,
+        dictionary_size,
+        CoreFoundation.kCFTypeDictionaryKeyCallBacks,
+        CoreFoundation.kCFTypeDictionaryValueCallBacks,
+    )
+
+
+def _cf_string_to_unicode(value):
+    """
+    Creates a Unicode string from a CFString object. Used entirely for error
+    reporting.
+
+    Yes, it annoys me quite a lot that this function is this complex.
+    """
+    value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p))
+
+    string = CoreFoundation.CFStringGetCStringPtr(
+        value_as_void_p,
+        CFConst.kCFStringEncodingUTF8
+    )
+    if string is None:
+        buffer = ctypes.create_string_buffer(1024)
+        result = CoreFoundation.CFStringGetCString(
+            value_as_void_p,
+            buffer,
+            1024,
+            CFConst.kCFStringEncodingUTF8
+        )
+        if not result:
+            raise OSError('Error copying C string from CFStringRef')
+        string = buffer.value
+    if string is not None:
+        string = string.decode('utf-8')
+    return string
+
+
+def _assert_no_error(error, exception_class=None):
+    """
+    Checks the return code and throws an exception if there is an error to
+    report
+    """
+    if error == 0:
+        return
+
+    cf_error_string = Security.SecCopyErrorMessageString(error, None)
+    output = _cf_string_to_unicode(cf_error_string)
+    CoreFoundation.CFRelease(cf_error_string)
+
+    if output is None or output == u'':
+        output = u'OSStatus %s' % error
+
+    if exception_class is None:
+        exception_class = ssl.SSLError
+
+    raise exception_class(output)
+
+
+def _cert_array_from_pem(pem_bundle):
+    """
+    Given a bundle of certs in PEM format, turns them into a CFArray of certs
+    that can be used to validate a cert chain.
+    """
+    # Normalize the PEM bundle's line endings.
+    pem_bundle = pem_bundle.replace(b"\r\n", b"\n")
+
+    der_certs = [
+        base64.b64decode(match.group(1))
+        for match in _PEM_CERTS_RE.finditer(pem_bundle)
+    ]
+    if not der_certs:
+        raise ssl.SSLError("No root certificates specified")
+
+    cert_array = CoreFoundation.CFArrayCreateMutable(
+        CoreFoundation.kCFAllocatorDefault,
+        0,
+        ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks)
+    )
+    if not cert_array:
+        raise ssl.SSLError("Unable to allocate memory!")
+
+    try:
+        for der_bytes in der_certs:
+            certdata = _cf_data_from_bytes(der_bytes)
+            if not certdata:
+                raise ssl.SSLError("Unable to allocate memory!")
+            cert = Security.SecCertificateCreateWithData(
+                CoreFoundation.kCFAllocatorDefault, certdata
+            )
+            CoreFoundation.CFRelease(certdata)
+            if not cert:
+                raise ssl.SSLError("Unable to build cert object!")
+
+            CoreFoundation.CFArrayAppendValue(cert_array, cert)
+            CoreFoundation.CFRelease(cert)
+    except Exception:
+        # We need to free the array before the exception bubbles further.
+        # We only want to do that if an error occurs: otherwise, the caller
+        # should free.
+        CoreFoundation.CFRelease(cert_array)
+
+    return cert_array
+
+
+def _is_cert(item):
+    """
+    Returns True if a given CFTypeRef is a certificate.
+    """
+    expected = Security.SecCertificateGetTypeID()
+    return CoreFoundation.CFGetTypeID(item) == expected
+
+
+def _is_identity(item):
+    """
+    Returns True if a given CFTypeRef is an identity.
+    """
+    expected = Security.SecIdentityGetTypeID()
+    return CoreFoundation.CFGetTypeID(item) == expected
+
+
+def _temporary_keychain():
+    """
+    This function creates a temporary Mac keychain that we can use to work with
+    credentials. This keychain uses a one-time password and a temporary file to
+    store the data. We expect to have one keychain per socket. The returned
+    SecKeychainRef must be freed by the caller, including calling
+    SecKeychainDelete.
+
+    Returns a tuple of the SecKeychainRef and the path to the temporary
+    directory that contains it.
+    """
+    # Unfortunately, SecKeychainCreate requires a path to a keychain. This
+    # means we cannot use mkstemp to use a generic temporary file. Instead,
+    # we're going to create a temporary directory and a filename to use there.
+    # This filename will be 8 random bytes expanded into base64. We also need
+    # some random bytes to password-protect the keychain we're creating, so we
+    # ask for 40 random bytes.
+    random_bytes = os.urandom(40)
+    filename = base64.b16encode(random_bytes[:8]).decode('utf-8')
+    password = base64.b16encode(random_bytes[8:])  # Must be valid UTF-8
+    tempdirectory = tempfile.mkdtemp()
+
+    keychain_path = os.path.join(tempdirectory, filename).encode('utf-8')
+
+    # We now want to create the keychain itself.
+    keychain = Security.SecKeychainRef()
+    status = Security.SecKeychainCreate(
+        keychain_path,
+        len(password),
+        password,
+        False,
+        None,
+        ctypes.byref(keychain)
+    )
+    _assert_no_error(status)
+
+    # Having created the keychain, we want to pass it off to the caller.
+    return keychain, tempdirectory
+
+
+def _load_items_from_file(keychain, path):
+    """
+    Given a single file, loads all the trust objects from it into arrays and
+    the keychain.
+    Returns a tuple of lists: the first list is a list of identities, the
+    second a list of certs.
+    """
+    certificates = []
+    identities = []
+    result_array = None
+
+    with open(path, 'rb') as f:
+        raw_filedata = f.read()
+
+    try:
+        filedata = CoreFoundation.CFDataCreate(
+            CoreFoundation.kCFAllocatorDefault,
+            raw_filedata,
+            len(raw_filedata)
+        )
+        result_array = CoreFoundation.CFArrayRef()
+        result = Security.SecItemImport(
+            filedata,  # cert data
+            None,  # Filename, leaving it out for now
+            None,  # What the type of the file is, we don't care
+            None,  # what's in the file, we don't care
+            0,  # import flags
+            None,  # key params, can include passphrase in the future
+            keychain,  # The keychain to insert into
+            ctypes.byref(result_array)  # Results
+        )
+        _assert_no_error(result)
+
+        # A CFArray is not very useful to us as an intermediary
+        # representation, so we are going to extract the objects we want
+        # and then free the array. We don't need to keep hold of keys: the
+        # keychain already has them!
+        result_count = CoreFoundation.CFArrayGetCount(result_array)
+        for index in range(result_count):
+            item = CoreFoundation.CFArrayGetValueAtIndex(
+                result_array, index
+            )
+            item = ctypes.cast(item, CoreFoundation.CFTypeRef)
+
+            if _is_cert(item):
+                CoreFoundation.CFRetain(item)
+                certificates.append(item)
+            elif _is_identity(item):
+                CoreFoundation.CFRetain(item)
+                identities.append(item)
+    finally:
+        if result_array:
+            CoreFoundation.CFRelease(result_array)
+
+        CoreFoundation.CFRelease(filedata)
+
+    return (identities, certificates)
+
+
+def _load_client_cert_chain(keychain, *paths):
+    """
+    Load certificates and maybe keys from a number of files. Has the end goal
+    of returning a CFArray containing one SecIdentityRef, and then zero or more
+    SecCertificateRef objects, suitable for use as a client certificate trust
+    chain.
+    """
+    # Ok, the strategy.
+    #
+    # This relies on knowing that macOS will not give you a SecIdentityRef
+    # unless you have imported a key into a keychain. This is a somewhat
+    # artificial limitation of macOS (for example, it doesn't necessarily
+    # affect iOS), but there is nothing inside Security.framework that lets you
+    # get a SecIdentityRef without having a key in a keychain.
+    #
+    # So the policy here is we take all the files and iterate them in order.
+    # Each one will use SecItemImport to have one or more objects loaded from
+    # it. We will also point at a keychain that macOS can use to work with the
+    # private key.
+    #
+    # Once we have all the objects, we'll check what we actually have. If we
+    # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise,
+    # we'll take the first certificate (which we assume to be our leaf) and
+    # ask the keychain to give us a SecIdentityRef with that cert's associated
+    # key.
+    #
+    # We'll then return a CFArray containing the trust chain: one
+    # SecIdentityRef and then zero-or-more SecCertificateRef objects. The
+    # responsibility for freeing this CFArray will be with the caller. This
+    # CFArray must remain alive for the entire connection, so in practice it
+    # will be stored with a single SSLSocket, along with the reference to the
+    # keychain.
+    certificates = []
+    identities = []
+
+    # Filter out bad paths.
+    paths = (path for path in paths if path)
+
+    try:
+        for file_path in paths:
+            new_identities, new_certs = _load_items_from_file(
+                keychain, file_path
+            )
+            identities.extend(new_identities)
+            certificates.extend(new_certs)
+
+        # Ok, we have everything. The question is: do we have an identity? If
+        # not, we want to grab one from the first cert we have.
+        if not identities:
+            new_identity = Security.SecIdentityRef()
+            status = Security.SecIdentityCreateWithCertificate(
+                keychain,
+                certificates[0],
+                ctypes.byref(new_identity)
+            )
+            _assert_no_error(status)
+            identities.append(new_identity)
+
+            # We now want to release the original certificate, as we no longer
+            # need it.
+            CoreFoundation.CFRelease(certificates.pop(0))
+
+        # We now need to build a new CFArray that holds the trust chain.
+        trust_chain = CoreFoundation.CFArrayCreateMutable(
+            CoreFoundation.kCFAllocatorDefault,
+            0,
+            ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
+        )
+        for item in itertools.chain(identities, certificates):
+            # ArrayAppendValue does a CFRetain on the item. That's fine,
+            # because the finally block will release our other refs to them.
+            CoreFoundation.CFArrayAppendValue(trust_chain, item)
+
+        return trust_chain
+    finally:
+        for obj in itertools.chain(identities, certificates):
+            CoreFoundation.CFRelease(obj)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c3f64af4801a18a7e90ca89398f8abc3a949e852
GIT binary patch
literal 10132
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py
new file mode 100644
index 00000000..9b42952d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py
@@ -0,0 +1,289 @@
+"""
+This module provides a pool manager that uses Google App Engine's
+`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
+
+Example usage::
+
+    from pip._vendor.urllib3 import PoolManager
+    from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox
+
+    if is_appengine_sandbox():
+        # AppEngineManager uses AppEngine's URLFetch API behind the scenes
+        http = AppEngineManager()
+    else:
+        # PoolManager uses a socket-level API behind the scenes
+        http = PoolManager()
+
+    r = http.request('GET', 'https://google.com/')
+
+There are `limitations <https://cloud.google.com/appengine/docs/python/\
+urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be
+the best choice for your application. There are three options for using
+urllib3 on Google App Engine:
+
+1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is
+   cost-effective in many circumstances as long as your usage is within the
+   limitations.
+2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets.
+   Sockets also have `limitations and restrictions
+   <https://cloud.google.com/appengine/docs/python/sockets/\
+   #limitations-and-restrictions>`_ and have a lower free quota than URLFetch.
+   To use sockets, be sure to specify the following in your ``app.yaml``::
+
+        env_variables:
+            GAE_USE_SOCKETS_HTTPLIB : 'true'
+
+3. If you are using `App Engine Flexible
+<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard
+:class:`PoolManager` without any configuration or special environment variables.
+"""
+
+from __future__ import absolute_import
+import io
+import logging
+import warnings
+from ..packages.six.moves.urllib.parse import urljoin
+
+from ..exceptions import (
+    HTTPError,
+    HTTPWarning,
+    MaxRetryError,
+    ProtocolError,
+    TimeoutError,
+    SSLError
+)
+
+from ..request import RequestMethods
+from ..response import HTTPResponse
+from ..util.timeout import Timeout
+from ..util.retry import Retry
+from . import _appengine_environ
+
+try:
+    from google.appengine.api import urlfetch
+except ImportError:
+    urlfetch = None
+
+
+log = logging.getLogger(__name__)
+
+
+class AppEnginePlatformWarning(HTTPWarning):
+    pass
+
+
+class AppEnginePlatformError(HTTPError):
+    pass
+
+
+class AppEngineManager(RequestMethods):
+    """
+    Connection manager for Google App Engine sandbox applications.
+
+    This manager uses the URLFetch service directly instead of using the
+    emulated httplib, and is subject to URLFetch limitations as described in
+    the App Engine documentation `here
+    <https://cloud.google.com/appengine/docs/python/urlfetch>`_.
+
+    Notably it will raise an :class:`AppEnginePlatformError` if:
+        * URLFetch is not available.
+        * If you attempt to use this on App Engine Flexible, as full socket
+          support is available.
+        * If a request size is more than 10 megabytes.
+        * If a response size is more than 32 megabtyes.
+        * If you use an unsupported request method such as OPTIONS.
+
+    Beyond those cases, it will raise normal urllib3 errors.
+    """
+
+    def __init__(self, headers=None, retries=None, validate_certificate=True,
+                 urlfetch_retries=True):
+        if not urlfetch:
+            raise AppEnginePlatformError(
+                "URLFetch is not available in this environment.")
+
+        if is_prod_appengine_mvms():
+            raise AppEnginePlatformError(
+                "Use normal urllib3.PoolManager instead of AppEngineManager"
+                "on Managed VMs, as using URLFetch is not necessary in "
+                "this environment.")
+
+        warnings.warn(
+            "urllib3 is using URLFetch on Google App Engine sandbox instead "
+            "of sockets. To use sockets directly instead of URLFetch see "
+            "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.",
+            AppEnginePlatformWarning)
+
+        RequestMethods.__init__(self, headers)
+        self.validate_certificate = validate_certificate
+        self.urlfetch_retries = urlfetch_retries
+
+        self.retries = retries or Retry.DEFAULT
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def urlopen(self, method, url, body=None, headers=None,
+                retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT,
+                **response_kw):
+
+        retries = self._get_retries(retries, redirect)
+
+        try:
+            follow_redirects = (
+                    redirect and
+                    retries.redirect != 0 and
+                    retries.total)
+            response = urlfetch.fetch(
+                url,
+                payload=body,
+                method=method,
+                headers=headers or {},
+                allow_truncated=False,
+                follow_redirects=self.urlfetch_retries and follow_redirects,
+                deadline=self._get_absolute_timeout(timeout),
+                validate_certificate=self.validate_certificate,
+            )
+        except urlfetch.DeadlineExceededError as e:
+            raise TimeoutError(self, e)
+
+        except urlfetch.InvalidURLError as e:
+            if 'too large' in str(e):
+                raise AppEnginePlatformError(
+                    "URLFetch request too large, URLFetch only "
+                    "supports requests up to 10mb in size.", e)
+            raise ProtocolError(e)
+
+        except urlfetch.DownloadError as e:
+            if 'Too many redirects' in str(e):
+                raise MaxRetryError(self, url, reason=e)
+            raise ProtocolError(e)
+
+        except urlfetch.ResponseTooLargeError as e:
+            raise AppEnginePlatformError(
+                "URLFetch response too large, URLFetch only supports"
+                "responses up to 32mb in size.", e)
+
+        except urlfetch.SSLCertificateError as e:
+            raise SSLError(e)
+
+        except urlfetch.InvalidMethodError as e:
+            raise AppEnginePlatformError(
+                "URLFetch does not support method: %s" % method, e)
+
+        http_response = self._urlfetch_response_to_http_response(
+            response, retries=retries, **response_kw)
+
+        # Handle redirect?
+        redirect_location = redirect and http_response.get_redirect_location()
+        if redirect_location:
+            # Check for redirect response
+            if (self.urlfetch_retries and retries.raise_on_redirect):
+                raise MaxRetryError(self, url, "too many redirects")
+            else:
+                if http_response.status == 303:
+                    method = 'GET'
+
+                try:
+                    retries = retries.increment(method, url, response=http_response, _pool=self)
+                except MaxRetryError:
+                    if retries.raise_on_redirect:
+                        raise MaxRetryError(self, url, "too many redirects")
+                    return http_response
+
+                retries.sleep_for_retry(http_response)
+                log.debug("Redirecting %s -> %s", url, redirect_location)
+                redirect_url = urljoin(url, redirect_location)
+                return self.urlopen(
+                    method, redirect_url, body, headers,
+                    retries=retries, redirect=redirect,
+                    timeout=timeout, **response_kw)
+
+        # Check if we should retry the HTTP response.
+        has_retry_after = bool(http_response.getheader('Retry-After'))
+        if retries.is_retry(method, http_response.status, has_retry_after):
+            retries = retries.increment(
+                method, url, response=http_response, _pool=self)
+            log.debug("Retry: %s", url)
+            retries.sleep(http_response)
+            return self.urlopen(
+                method, url,
+                body=body, headers=headers,
+                retries=retries, redirect=redirect,
+                timeout=timeout, **response_kw)
+
+        return http_response
+
+    def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
+
+        if is_prod_appengine():
+            # Production GAE handles deflate encoding automatically, but does
+            # not remove the encoding header.
+            content_encoding = urlfetch_resp.headers.get('content-encoding')
+
+            if content_encoding == 'deflate':
+                del urlfetch_resp.headers['content-encoding']
+
+        transfer_encoding = urlfetch_resp.headers.get('transfer-encoding')
+        # We have a full response's content,
+        # so let's make sure we don't report ourselves as chunked data.
+        if transfer_encoding == 'chunked':
+            encodings = transfer_encoding.split(",")
+            encodings.remove('chunked')
+            urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings)
+
+        original_response = HTTPResponse(
+            # In order for decoding to work, we must present the content as
+            # a file-like object.
+            body=io.BytesIO(urlfetch_resp.content),
+            msg=urlfetch_resp.header_msg,
+            headers=urlfetch_resp.headers,
+            status=urlfetch_resp.status_code,
+            **response_kw
+        )
+
+        return HTTPResponse(
+            body=io.BytesIO(urlfetch_resp.content),
+            headers=urlfetch_resp.headers,
+            status=urlfetch_resp.status_code,
+            original_response=original_response,
+            **response_kw
+        )
+
+    def _get_absolute_timeout(self, timeout):
+        if timeout is Timeout.DEFAULT_TIMEOUT:
+            return None  # Defer to URLFetch's default.
+        if isinstance(timeout, Timeout):
+            if timeout._read is not None or timeout._connect is not None:
+                warnings.warn(
+                    "URLFetch does not support granular timeout settings, "
+                    "reverting to total or default URLFetch timeout.",
+                    AppEnginePlatformWarning)
+            return timeout.total
+        return timeout
+
+    def _get_retries(self, retries, redirect):
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(
+                retries, redirect=redirect, default=self.retries)
+
+        if retries.connect or retries.read or retries.redirect:
+            warnings.warn(
+                "URLFetch only supports total retries and does not "
+                "recognize connect, read, or redirect retry parameters.",
+                AppEnginePlatformWarning)
+
+        return retries
+
+
+# Alias methods from _appengine_environ to maintain public API interface.
+
+is_appengine = _appengine_environ.is_appengine
+is_appengine_sandbox = _appengine_environ.is_appengine_sandbox
+is_local_appengine = _appengine_environ.is_local_appengine
+is_prod_appengine = _appengine_environ.is_prod_appengine
+is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e9d6727ebf60d9669dd989e4c49b9d746dfa4f73
GIT binary patch
literal 10129
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
CVM~Vq

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py
new file mode 100644
index 00000000..8ea127c5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py
@@ -0,0 +1,111 @@
+"""
+NTLM authenticating pool, contributed by erikcederstran
+
+Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
+"""
+from __future__ import absolute_import
+
+from logging import getLogger
+from ntlm import ntlm
+
+from .. import HTTPSConnectionPool
+from ..packages.six.moves.http_client import HTTPSConnection
+
+
+log = getLogger(__name__)
+
+
+class NTLMConnectionPool(HTTPSConnectionPool):
+    """
+    Implements an NTLM authentication version of an urllib3 connection pool
+    """
+
+    scheme = 'https'
+
+    def __init__(self, user, pw, authurl, *args, **kwargs):
+        """
+        authurl is a random URL on the server that is protected by NTLM.
+        user is the Windows user, probably in the DOMAIN\\username format.
+        pw is the password for the user.
+        """
+        super(NTLMConnectionPool, self).__init__(*args, **kwargs)
+        self.authurl = authurl
+        self.rawuser = user
+        user_parts = user.split('\\', 1)
+        self.domain = user_parts[0].upper()
+        self.user = user_parts[1]
+        self.pw = pw
+
+    def _new_conn(self):
+        # Performs the NTLM handshake that secures the connection. The socket
+        # must be kept open while requests are performed.
+        self.num_connections += 1
+        log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s',
+                  self.num_connections, self.host, self.authurl)
+
+        headers = {'Connection': 'Keep-Alive'}
+        req_header = 'Authorization'
+        resp_header = 'www-authenticate'
+
+        conn = HTTPSConnection(host=self.host, port=self.port)
+
+        # Send negotiation message
+        headers[req_header] = (
+            'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser))
+        log.debug('Request headers: %s', headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        reshdr = dict(res.getheaders())
+        log.debug('Response status: %s %s', res.status, res.reason)
+        log.debug('Response headers: %s', reshdr)
+        log.debug('Response data: %s [...]', res.read(100))
+
+        # Remove the reference to the socket, so that it can not be closed by
+        # the response object (we want to keep the socket open)
+        res.fp = None
+
+        # Server should respond with a challenge message
+        auth_header_values = reshdr[resp_header].split(', ')
+        auth_header_value = None
+        for s in auth_header_values:
+            if s[:5] == 'NTLM ':
+                auth_header_value = s[5:]
+        if auth_header_value is None:
+            raise Exception('Unexpected %s response header: %s' %
+                            (resp_header, reshdr[resp_header]))
+
+        # Send authentication message
+        ServerChallenge, NegotiateFlags = \
+            ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value)
+        auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,
+                                                         self.user,
+                                                         self.domain,
+                                                         self.pw,
+                                                         NegotiateFlags)
+        headers[req_header] = 'NTLM %s' % auth_msg
+        log.debug('Request headers: %s', headers)
+        conn.request('GET', self.authurl, None, headers)
+        res = conn.getresponse()
+        log.debug('Response status: %s %s', res.status, res.reason)
+        log.debug('Response headers: %s', dict(res.getheaders()))
+        log.debug('Response data: %s [...]', res.read()[:100])
+        if res.status != 200:
+            if res.status == 401:
+                raise Exception('Server rejected request: wrong '
+                                'username or password')
+            raise Exception('Wrong server response: %s %s' %
+                            (res.status, res.reason))
+
+        res.fp = None
+        log.debug('Connection established')
+        return conn
+
+    def urlopen(self, method, url, body=None, headers=None, retries=3,
+                redirect=True, assert_same_host=True):
+        if headers is None:
+            headers = {}
+        headers['Connection'] = 'Keep-Alive'
+        return super(NTLMConnectionPool, self).urlopen(method, url, body,
+                                                       headers, retries,
+                                                       redirect,
+                                                       assert_same_host)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a6902314a090a1e574644dc14734c115ecce1ad4
GIT binary patch
literal 4173
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
new file mode 100644
index 00000000..363667cb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
@@ -0,0 +1,466 @@
+"""
+SSL with SNI_-support for Python 2. Follow these instructions if you would
+like to verify SSL certificates in Python 2. Note, the default libraries do
+*not* do certificate checking; you need to do additional work to validate
+certificates yourself.
+
+This needs the following packages installed:
+
+* pyOpenSSL (tested with 16.0.0)
+* cryptography (minimum 1.3.4, from pyopenssl)
+* idna (minimum 2.0, from cryptography)
+
+However, pyopenssl depends on cryptography, which depends on idna, so while we
+use all three directly here we end up having relatively few packages required.
+
+You can install them with the following command:
+
+    pip install pyopenssl cryptography idna
+
+To activate certificate checking, call
+:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
+before you begin making HTTP requests. This can be done in a ``sitecustomize``
+module, or at any other time before your application begins using ``urllib3``,
+like this::
+
+    try:
+        import urllib3.contrib.pyopenssl
+        urllib3.contrib.pyopenssl.inject_into_urllib3()
+    except ImportError:
+        pass
+
+Now you can use :mod:`urllib3` as you normally would, and it will support SNI
+when the required modules are installed.
+
+Activating this module also has the positive side effect of disabling SSL/TLS
+compression in Python 2 (see `CRIME attack`_).
+
+If you want to configure the default list of supported cipher suites, you can
+set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.
+
+.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
+.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)
+"""
+from __future__ import absolute_import
+
+import OpenSSL.SSL
+from cryptography import x509
+from cryptography.hazmat.backends.openssl import backend as openssl_backend
+from cryptography.hazmat.backends.openssl.x509 import _Certificate
+try:
+    from cryptography.x509 import UnsupportedExtension
+except ImportError:
+    # UnsupportedExtension is gone in cryptography >= 2.1.0
+    class UnsupportedExtension(Exception):
+        pass
+
+from socket import timeout, error as SocketError
+from io import BytesIO
+
+try:  # Platform-specific: Python 2
+    from socket import _fileobject
+except ImportError:  # Platform-specific: Python 3
+    _fileobject = None
+    from ..packages.backports.makefile import backport_makefile
+
+import logging
+import ssl
+from ..packages import six
+import sys
+
+from .. import util
+
+__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
+
+# SNI always works.
+HAS_SNI = True
+
+# Map from urllib3 to PyOpenSSL compatible parameter-values.
+_openssl_versions = {
+    ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
+    ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
+}
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'):
+    _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'):
+    _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD
+
+try:
+    _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD})
+except AttributeError:
+    pass
+
+_stdlib_to_openssl_verify = {
+    ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
+    ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
+    ssl.CERT_REQUIRED:
+        OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
+}
+_openssl_to_stdlib_verify = dict(
+    (v, k) for k, v in _stdlib_to_openssl_verify.items()
+)
+
+# OpenSSL will only write 16K at a time
+SSL_WRITE_BLOCKSIZE = 16384
+
+orig_util_HAS_SNI = util.HAS_SNI
+orig_util_SSLContext = util.ssl_.SSLContext
+
+
+log = logging.getLogger(__name__)
+
+
+def inject_into_urllib3():
+    'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.'
+
+    _validate_dependencies_met()
+
+    util.ssl_.SSLContext = PyOpenSSLContext
+    util.HAS_SNI = HAS_SNI
+    util.ssl_.HAS_SNI = HAS_SNI
+    util.IS_PYOPENSSL = True
+    util.ssl_.IS_PYOPENSSL = True
+
+
+def extract_from_urllib3():
+    'Undo monkey-patching by :func:`inject_into_urllib3`.'
+
+    util.ssl_.SSLContext = orig_util_SSLContext
+    util.HAS_SNI = orig_util_HAS_SNI
+    util.ssl_.HAS_SNI = orig_util_HAS_SNI
+    util.IS_PYOPENSSL = False
+    util.ssl_.IS_PYOPENSSL = False
+
+
+def _validate_dependencies_met():
+    """
+    Verifies that PyOpenSSL's package-level dependencies have been met.
+    Throws `ImportError` if they are not met.
+    """
+    # Method added in `cryptography==1.1`; not available in older versions
+    from cryptography.x509.extensions import Extensions
+    if getattr(Extensions, "get_extension_for_class", None) is None:
+        raise ImportError("'cryptography' module missing required functionality.  "
+                          "Try upgrading to v1.3.4 or newer.")
+
+    # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509
+    # attribute is only present on those versions.
+    from OpenSSL.crypto import X509
+    x509 = X509()
+    if getattr(x509, "_x509", None) is None:
+        raise ImportError("'pyOpenSSL' module missing required functionality. "
+                          "Try upgrading to v0.14 or newer.")
+
+
+def _dnsname_to_stdlib(name):
+    """
+    Converts a dNSName SubjectAlternativeName field to the form used by the
+    standard library on the given Python version.
+
+    Cryptography produces a dNSName as a unicode string that was idna-decoded
+    from ASCII bytes. We need to idna-encode that string to get it back, and
+    then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib
+    uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8).
+
+    If the name cannot be idna-encoded then we return None signalling that
+    the name given should be skipped.
+    """
+    def idna_encode(name):
+        """
+        Borrowed wholesale from the Python Cryptography Project. It turns out
+        that we can't just safely call `idna.encode`: it can explode for
+        wildcard names. This avoids that problem.
+        """
+        from pip._vendor import idna
+
+        try:
+            for prefix in [u'*.', u'.']:
+                if name.startswith(prefix):
+                    name = name[len(prefix):]
+                    return prefix.encode('ascii') + idna.encode(name)
+            return idna.encode(name)
+        except idna.core.IDNAError:
+            return None
+
+    name = idna_encode(name)
+    if name is None:
+        return None
+    elif sys.version_info >= (3, 0):
+        name = name.decode('utf-8')
+    return name
+
+
+def get_subj_alt_name(peer_cert):
+    """
+    Given an PyOpenSSL certificate, provides all the subject alternative names.
+    """
+    # Pass the cert to cryptography, which has much better APIs for this.
+    if hasattr(peer_cert, "to_cryptography"):
+        cert = peer_cert.to_cryptography()
+    else:
+        # This is technically using private APIs, but should work across all
+        # relevant versions before PyOpenSSL got a proper API for this.
+        cert = _Certificate(openssl_backend, peer_cert._x509)
+
+    # We want to find the SAN extension. Ask Cryptography to locate it (it's
+    # faster than looping in Python)
+    try:
+        ext = cert.extensions.get_extension_for_class(
+            x509.SubjectAlternativeName
+        ).value
+    except x509.ExtensionNotFound:
+        # No such extension, return the empty list.
+        return []
+    except (x509.DuplicateExtension, UnsupportedExtension,
+            x509.UnsupportedGeneralNameType, UnicodeError) as e:
+        # A problem has been found with the quality of the certificate. Assume
+        # no SAN field is present.
+        log.warning(
+            "A problem was encountered with the certificate that prevented "
+            "urllib3 from finding the SubjectAlternativeName field. This can "
+            "affect certificate validation. The error was %s",
+            e,
+        )
+        return []
+
+    # We want to return dNSName and iPAddress fields. We need to cast the IPs
+    # back to strings because the match_hostname function wants them as
+    # strings.
+    # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8
+    # decoded. This is pretty frustrating, but that's what the standard library
+    # does with certificates, and so we need to attempt to do the same.
+    # We also want to skip over names which cannot be idna encoded.
+    names = [
+        ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName))
+        if name is not None
+    ]
+    names.extend(
+        ('IP Address', str(name))
+        for name in ext.get_values_for_type(x509.IPAddress)
+    )
+
+    return names
+
+
+class WrappedSocket(object):
+    '''API-compatibility wrapper for Python OpenSSL's Connection-class.
+
+    Note: _makefile_refs, _drop() and _reuse() are needed for the garbage
+    collector of pypy.
+    '''
+
+    def __init__(self, connection, socket, suppress_ragged_eofs=True):
+        self.connection = connection
+        self.socket = socket
+        self.suppress_ragged_eofs = suppress_ragged_eofs
+        self._makefile_refs = 0
+        self._closed = False
+
+    def fileno(self):
+        return self.socket.fileno()
+
+    # Copy-pasted from Python 3.5 source code
+    def _decref_socketios(self):
+        if self._makefile_refs > 0:
+            self._makefile_refs -= 1
+        if self._closed:
+            self.close()
+
+    def recv(self, *args, **kwargs):
+        try:
+            data = self.connection.recv(*args, **kwargs)
+        except OpenSSL.SSL.SysCallError as e:
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
+                return b''
+            else:
+                raise SocketError(str(e))
+        except OpenSSL.SSL.ZeroReturnError as e:
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
+                return b''
+            else:
+                raise
+        except OpenSSL.SSL.WantReadError:
+            if not util.wait_for_read(self.socket, self.socket.gettimeout()):
+                raise timeout('The read operation timed out')
+            else:
+                return self.recv(*args, **kwargs)
+        else:
+            return data
+
+    def recv_into(self, *args, **kwargs):
+        try:
+            return self.connection.recv_into(*args, **kwargs)
+        except OpenSSL.SSL.SysCallError as e:
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
+                return 0
+            else:
+                raise SocketError(str(e))
+        except OpenSSL.SSL.ZeroReturnError as e:
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
+                return 0
+            else:
+                raise
+        except OpenSSL.SSL.WantReadError:
+            if not util.wait_for_read(self.socket, self.socket.gettimeout()):
+                raise timeout('The read operation timed out')
+            else:
+                return self.recv_into(*args, **kwargs)
+
+    def settimeout(self, timeout):
+        return self.socket.settimeout(timeout)
+
+    def _send_until_done(self, data):
+        while True:
+            try:
+                return self.connection.send(data)
+            except OpenSSL.SSL.WantWriteError:
+                if not util.wait_for_write(self.socket, self.socket.gettimeout()):
+                    raise timeout()
+                continue
+            except OpenSSL.SSL.SysCallError as e:
+                raise SocketError(str(e))
+
+    def sendall(self, data):
+        total_sent = 0
+        while total_sent < len(data):
+            sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
+            total_sent += sent
+
+    def shutdown(self):
+        # FIXME rethrow compatible exceptions should we ever use this
+        self.connection.shutdown()
+
+    def close(self):
+        if self._makefile_refs < 1:
+            try:
+                self._closed = True
+                return self.connection.close()
+            except OpenSSL.SSL.Error:
+                return
+        else:
+            self._makefile_refs -= 1
+
+    def getpeercert(self, binary_form=False):
+        x509 = self.connection.get_peer_certificate()
+
+        if not x509:
+            return x509
+
+        if binary_form:
+            return OpenSSL.crypto.dump_certificate(
+                OpenSSL.crypto.FILETYPE_ASN1,
+                x509)
+
+        return {
+            'subject': (
+                (('commonName', x509.get_subject().CN),),
+            ),
+            'subjectAltName': get_subj_alt_name(x509)
+        }
+
+    def _reuse(self):
+        self._makefile_refs += 1
+
+    def _drop(self):
+        if self._makefile_refs < 1:
+            self.close()
+        else:
+            self._makefile_refs -= 1
+
+
+if _fileobject:  # Platform-specific: Python 2
+    def makefile(self, mode, bufsize=-1):
+        self._makefile_refs += 1
+        return _fileobject(self, mode, bufsize, close=True)
+else:  # Platform-specific: Python 3
+    makefile = backport_makefile
+
+WrappedSocket.makefile = makefile
+
+
+class PyOpenSSLContext(object):
+    """
+    I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible
+    for translating the interface of the standard library ``SSLContext`` object
+    to calls into PyOpenSSL.
+    """
+    def __init__(self, protocol):
+        self.protocol = _openssl_versions[protocol]
+        self._ctx = OpenSSL.SSL.Context(self.protocol)
+        self._options = 0
+        self.check_hostname = False
+
+    @property
+    def options(self):
+        return self._options
+
+    @options.setter
+    def options(self, value):
+        self._options = value
+        self._ctx.set_options(value)
+
+    @property
+    def verify_mode(self):
+        return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()]
+
+    @verify_mode.setter
+    def verify_mode(self, value):
+        self._ctx.set_verify(
+            _stdlib_to_openssl_verify[value],
+            _verify_callback
+        )
+
+    def set_default_verify_paths(self):
+        self._ctx.set_default_verify_paths()
+
+    def set_ciphers(self, ciphers):
+        if isinstance(ciphers, six.text_type):
+            ciphers = ciphers.encode('utf-8')
+        self._ctx.set_cipher_list(ciphers)
+
+    def load_verify_locations(self, cafile=None, capath=None, cadata=None):
+        if cafile is not None:
+            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))
+
+    def load_cert_chain(self, certfile, keyfile=None, password=None):
+        self._ctx.use_certificate_chain_file(certfile)
+        if password is not None:
+            self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password)
+        self._ctx.use_privatekey_file(keyfile or certfile)
+
+    def wrap_socket(self, sock, server_side=False,
+                    do_handshake_on_connect=True, suppress_ragged_eofs=True,
+                    server_hostname=None):
+        cnx = OpenSSL.SSL.Connection(self._ctx, sock)
+
+        if isinstance(server_hostname, six.text_type):  # Platform-specific: Python 3
+            server_hostname = server_hostname.encode('utf-8')
+
+        if server_hostname is not None:
+            cnx.set_tlsext_host_name(server_hostname)
+
+        cnx.set_connect_state()
+
+        while True:
+            try:
+                cnx.do_handshake()
+            except OpenSSL.SSL.WantReadError:
+                if not util.wait_for_read(sock, sock.gettimeout()):
+                    raise timeout('select timed out')
+                continue
+            except OpenSSL.SSL.Error as e:
+                raise ssl.SSLError('bad handshake: %r' % e)
+            break
+
+        return WrappedSocket(cnx, sock)
+
+
+def _verify_callback(cnx, x509, err_no, err_depth, return_code):
+    return err_no == 0
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ed80b1dde1e78e00404a190ca10655093ce2ee38
GIT binary patch
literal 19914
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
new file mode 100644
index 00000000..77cb59ed
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
@@ -0,0 +1,804 @@
+"""
+SecureTranport support for urllib3 via ctypes.
+
+This makes platform-native TLS available to urllib3 users on macOS without the
+use of a compiler. This is an important feature because the Python Package
+Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL
+that ships with macOS is not capable of doing TLSv1.2. The only way to resolve
+this is to give macOS users an alternative solution to the problem, and that
+solution is to use SecureTransport.
+
+We use ctypes here because this solution must not require a compiler. That's
+because pip is not allowed to require a compiler either.
+
+This is not intended to be a seriously long-term solution to this problem.
+The hope is that PEP 543 will eventually solve this issue for us, at which
+point we can retire this contrib module. But in the short term, we need to
+solve the impending tire fire that is Python on Mac without this kind of
+contrib module. So...here we are.
+
+To use this module, simply import and inject it::
+
+    import urllib3.contrib.securetransport
+    urllib3.contrib.securetransport.inject_into_urllib3()
+
+Happy TLSing!
+"""
+from __future__ import absolute_import
+
+import contextlib
+import ctypes
+import errno
+import os.path
+import shutil
+import socket
+import ssl
+import threading
+import weakref
+
+from .. import util
+from ._securetransport.bindings import (
+    Security, SecurityConst, CoreFoundation
+)
+from ._securetransport.low_level import (
+    _assert_no_error, _cert_array_from_pem, _temporary_keychain,
+    _load_client_cert_chain
+)
+
+try:  # Platform-specific: Python 2
+    from socket import _fileobject
+except ImportError:  # Platform-specific: Python 3
+    _fileobject = None
+    from ..packages.backports.makefile import backport_makefile
+
+__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
+
+# SNI always works
+HAS_SNI = True
+
+orig_util_HAS_SNI = util.HAS_SNI
+orig_util_SSLContext = util.ssl_.SSLContext
+
+# This dictionary is used by the read callback to obtain a handle to the
+# calling wrapped socket. This is a pretty silly approach, but for now it'll
+# do. I feel like I should be able to smuggle a handle to the wrapped socket
+# directly in the SSLConnectionRef, but for now this approach will work I
+# guess.
+#
+# We need to lock around this structure for inserts, but we don't do it for
+# reads/writes in the callbacks. The reasoning here goes as follows:
+#
+#    1. It is not possible to call into the callbacks before the dictionary is
+#       populated, so once in the callback the id must be in the dictionary.
+#    2. The callbacks don't mutate the dictionary, they only read from it, and
+#       so cannot conflict with any of the insertions.
+#
+# This is good: if we had to lock in the callbacks we'd drastically slow down
+# the performance of this code.
+_connection_refs = weakref.WeakValueDictionary()
+_connection_ref_lock = threading.Lock()
+
+# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over
+# for no better reason than we need *a* limit, and this one is right there.
+SSL_WRITE_BLOCKSIZE = 16384
+
+# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to
+# individual cipher suites. We need to do this because this is how
+# SecureTransport wants them.
+CIPHER_SUITES = [
+    SecurityConst.TLS_AES_256_GCM_SHA384,
+    SecurityConst.TLS_CHACHA20_POLY1305_SHA256,
+    SecurityConst.TLS_AES_128_GCM_SHA256,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
+    SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384,
+    SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256,
+    SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256,
+    SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256,
+    SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA,
+    SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA,
+]
+
+# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of
+# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version.
+_protocol_to_min_max = {
+    ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12),
+}
+
+if hasattr(ssl, "PROTOCOL_SSLv2"):
+    _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = (
+        SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2
+    )
+if hasattr(ssl, "PROTOCOL_SSLv3"):
+    _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = (
+        SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3
+    )
+if hasattr(ssl, "PROTOCOL_TLSv1"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = (
+        SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1
+    )
+if hasattr(ssl, "PROTOCOL_TLSv1_1"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = (
+        SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11
+    )
+if hasattr(ssl, "PROTOCOL_TLSv1_2"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = (
+        SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12
+    )
+if hasattr(ssl, "PROTOCOL_TLS"):
+    _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23]
+
+
+def inject_into_urllib3():
+    """
+    Monkey-patch urllib3 with SecureTransport-backed SSL-support.
+    """
+    util.ssl_.SSLContext = SecureTransportContext
+    util.HAS_SNI = HAS_SNI
+    util.ssl_.HAS_SNI = HAS_SNI
+    util.IS_SECURETRANSPORT = True
+    util.ssl_.IS_SECURETRANSPORT = True
+
+
+def extract_from_urllib3():
+    """
+    Undo monkey-patching by :func:`inject_into_urllib3`.
+    """
+    util.ssl_.SSLContext = orig_util_SSLContext
+    util.HAS_SNI = orig_util_HAS_SNI
+    util.ssl_.HAS_SNI = orig_util_HAS_SNI
+    util.IS_SECURETRANSPORT = False
+    util.ssl_.IS_SECURETRANSPORT = False
+
+
+def _read_callback(connection_id, data_buffer, data_length_pointer):
+    """
+    SecureTransport read callback. This is called by ST to request that data
+    be returned from the socket.
+    """
+    wrapped_socket = None
+    try:
+        wrapped_socket = _connection_refs.get(connection_id)
+        if wrapped_socket is None:
+            return SecurityConst.errSSLInternal
+        base_socket = wrapped_socket.socket
+
+        requested_length = data_length_pointer[0]
+
+        timeout = wrapped_socket.gettimeout()
+        error = None
+        read_count = 0
+
+        try:
+            while read_count < requested_length:
+                if timeout is None or timeout >= 0:
+                    if not util.wait_for_read(base_socket, timeout):
+                        raise socket.error(errno.EAGAIN, 'timed out')
+
+                remaining = requested_length - read_count
+                buffer = (ctypes.c_char * remaining).from_address(
+                    data_buffer + read_count
+                )
+                chunk_size = base_socket.recv_into(buffer, remaining)
+                read_count += chunk_size
+                if not chunk_size:
+                    if not read_count:
+                        return SecurityConst.errSSLClosedGraceful
+                    break
+        except (socket.error) as e:
+            error = e.errno
+
+            if error is not None and error != errno.EAGAIN:
+                data_length_pointer[0] = read_count
+                if error == errno.ECONNRESET or error == errno.EPIPE:
+                    return SecurityConst.errSSLClosedAbort
+                raise
+
+        data_length_pointer[0] = read_count
+
+        if read_count != requested_length:
+            return SecurityConst.errSSLWouldBlock
+
+        return 0
+    except Exception as e:
+        if wrapped_socket is not None:
+            wrapped_socket._exception = e
+        return SecurityConst.errSSLInternal
+
+
+def _write_callback(connection_id, data_buffer, data_length_pointer):
+    """
+    SecureTransport write callback. This is called by ST to request that data
+    actually be sent on the network.
+    """
+    wrapped_socket = None
+    try:
+        wrapped_socket = _connection_refs.get(connection_id)
+        if wrapped_socket is None:
+            return SecurityConst.errSSLInternal
+        base_socket = wrapped_socket.socket
+
+        bytes_to_write = data_length_pointer[0]
+        data = ctypes.string_at(data_buffer, bytes_to_write)
+
+        timeout = wrapped_socket.gettimeout()
+        error = None
+        sent = 0
+
+        try:
+            while sent < bytes_to_write:
+                if timeout is None or timeout >= 0:
+                    if not util.wait_for_write(base_socket, timeout):
+                        raise socket.error(errno.EAGAIN, 'timed out')
+                chunk_sent = base_socket.send(data)
+                sent += chunk_sent
+
+                # This has some needless copying here, but I'm not sure there's
+                # much value in optimising this data path.
+                data = data[chunk_sent:]
+        except (socket.error) as e:
+            error = e.errno
+
+            if error is not None and error != errno.EAGAIN:
+                data_length_pointer[0] = sent
+                if error == errno.ECONNRESET or error == errno.EPIPE:
+                    return SecurityConst.errSSLClosedAbort
+                raise
+
+        data_length_pointer[0] = sent
+
+        if sent != bytes_to_write:
+            return SecurityConst.errSSLWouldBlock
+
+        return 0
+    except Exception as e:
+        if wrapped_socket is not None:
+            wrapped_socket._exception = e
+        return SecurityConst.errSSLInternal
+
+
+# We need to keep these two objects references alive: if they get GC'd while
+# in use then SecureTransport could attempt to call a function that is in freed
+# memory. That would be...uh...bad. Yeah, that's the word. Bad.
+_read_callback_pointer = Security.SSLReadFunc(_read_callback)
+_write_callback_pointer = Security.SSLWriteFunc(_write_callback)
+
+
+class WrappedSocket(object):
+    """
+    API-compatibility wrapper for Python's OpenSSL wrapped socket object.
+
+    Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage
+    collector of PyPy.
+    """
+    def __init__(self, socket):
+        self.socket = socket
+        self.context = None
+        self._makefile_refs = 0
+        self._closed = False
+        self._exception = None
+        self._keychain = None
+        self._keychain_dir = None
+        self._client_cert_chain = None
+
+        # We save off the previously-configured timeout and then set it to
+        # zero. This is done because we use select and friends to handle the
+        # timeouts, but if we leave the timeout set on the lower socket then
+        # Python will "kindly" call select on that socket again for us. Avoid
+        # that by forcing the timeout to zero.
+        self._timeout = self.socket.gettimeout()
+        self.socket.settimeout(0)
+
+    @contextlib.contextmanager
+    def _raise_on_error(self):
+        """
+        A context manager that can be used to wrap calls that do I/O from
+        SecureTransport. If any of the I/O callbacks hit an exception, this
+        context manager will correctly propagate the exception after the fact.
+        This avoids silently swallowing those exceptions.
+
+        It also correctly forces the socket closed.
+        """
+        self._exception = None
+
+        # We explicitly don't catch around this yield because in the unlikely
+        # event that an exception was hit in the block we don't want to swallow
+        # it.
+        yield
+        if self._exception is not None:
+            exception, self._exception = self._exception, None
+            self.close()
+            raise exception
+
+    def _set_ciphers(self):
+        """
+        Sets up the allowed ciphers. By default this matches the set in
+        util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done
+        custom and doesn't allow changing at this time, mostly because parsing
+        OpenSSL cipher strings is going to be a freaking nightmare.
+        """
+        ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES)
+        result = Security.SSLSetEnabledCiphers(
+            self.context, ciphers, len(CIPHER_SUITES)
+        )
+        _assert_no_error(result)
+
+    def _custom_validate(self, verify, trust_bundle):
+        """
+        Called when we have set custom validation. We do this in two cases:
+        first, when cert validation is entirely disabled; and second, when
+        using a custom trust DB.
+        """
+        # If we disabled cert validation, just say: cool.
+        if not verify:
+            return
+
+        # We want data in memory, so load it up.
+        if os.path.isfile(trust_bundle):
+            with open(trust_bundle, 'rb') as f:
+                trust_bundle = f.read()
+
+        cert_array = None
+        trust = Security.SecTrustRef()
+
+        try:
+            # Get a CFArray that contains the certs we want.
+            cert_array = _cert_array_from_pem(trust_bundle)
+
+            # Ok, now the hard part. We want to get the SecTrustRef that ST has
+            # created for this connection, shove our CAs into it, tell ST to
+            # ignore everything else it knows, and then ask if it can build a
+            # chain. This is a buuuunch of code.
+            result = Security.SSLCopyPeerTrust(
+                self.context, ctypes.byref(trust)
+            )
+            _assert_no_error(result)
+            if not trust:
+                raise ssl.SSLError("Failed to copy trust reference")
+
+            result = Security.SecTrustSetAnchorCertificates(trust, cert_array)
+            _assert_no_error(result)
+
+            result = Security.SecTrustSetAnchorCertificatesOnly(trust, True)
+            _assert_no_error(result)
+
+            trust_result = Security.SecTrustResultType()
+            result = Security.SecTrustEvaluate(
+                trust, ctypes.byref(trust_result)
+            )
+            _assert_no_error(result)
+        finally:
+            if trust:
+                CoreFoundation.CFRelease(trust)
+
+            if cert_array is not None:
+                CoreFoundation.CFRelease(cert_array)
+
+        # Ok, now we can look at what the result was.
+        successes = (
+            SecurityConst.kSecTrustResultUnspecified,
+            SecurityConst.kSecTrustResultProceed
+        )
+        if trust_result.value not in successes:
+            raise ssl.SSLError(
+                "certificate verify failed, error code: %d" %
+                trust_result.value
+            )
+
+    def handshake(self,
+                  server_hostname,
+                  verify,
+                  trust_bundle,
+                  min_version,
+                  max_version,
+                  client_cert,
+                  client_key,
+                  client_key_passphrase):
+        """
+        Actually performs the TLS handshake. This is run automatically by
+        wrapped socket, and shouldn't be needed in user code.
+        """
+        # First, we do the initial bits of connection setup. We need to create
+        # a context, set its I/O funcs, and set the connection reference.
+        self.context = Security.SSLCreateContext(
+            None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType
+        )
+        result = Security.SSLSetIOFuncs(
+            self.context, _read_callback_pointer, _write_callback_pointer
+        )
+        _assert_no_error(result)
+
+        # Here we need to compute the handle to use. We do this by taking the
+        # id of self modulo 2**31 - 1. If this is already in the dictionary, we
+        # just keep incrementing by one until we find a free space.
+        with _connection_ref_lock:
+            handle = id(self) % 2147483647
+            while handle in _connection_refs:
+                handle = (handle + 1) % 2147483647
+            _connection_refs[handle] = self
+
+        result = Security.SSLSetConnection(self.context, handle)
+        _assert_no_error(result)
+
+        # If we have a server hostname, we should set that too.
+        if server_hostname:
+            if not isinstance(server_hostname, bytes):
+                server_hostname = server_hostname.encode('utf-8')
+
+            result = Security.SSLSetPeerDomainName(
+                self.context, server_hostname, len(server_hostname)
+            )
+            _assert_no_error(result)
+
+        # Setup the ciphers.
+        self._set_ciphers()
+
+        # Set the minimum and maximum TLS versions.
+        result = Security.SSLSetProtocolVersionMin(self.context, min_version)
+        _assert_no_error(result)
+        result = Security.SSLSetProtocolVersionMax(self.context, max_version)
+        _assert_no_error(result)
+
+        # If there's a trust DB, we need to use it. We do that by telling
+        # SecureTransport to break on server auth. We also do that if we don't
+        # want to validate the certs at all: we just won't actually do any
+        # authing in that case.
+        if not verify or trust_bundle is not None:
+            result = Security.SSLSetSessionOption(
+                self.context,
+                SecurityConst.kSSLSessionOptionBreakOnServerAuth,
+                True
+            )
+            _assert_no_error(result)
+
+        # If there's a client cert, we need to use it.
+        if client_cert:
+            self._keychain, self._keychain_dir = _temporary_keychain()
+            self._client_cert_chain = _load_client_cert_chain(
+                self._keychain, client_cert, client_key
+            )
+            result = Security.SSLSetCertificate(
+                self.context, self._client_cert_chain
+            )
+            _assert_no_error(result)
+
+        while True:
+            with self._raise_on_error():
+                result = Security.SSLHandshake(self.context)
+
+                if result == SecurityConst.errSSLWouldBlock:
+                    raise socket.timeout("handshake timed out")
+                elif result == SecurityConst.errSSLServerAuthCompleted:
+                    self._custom_validate(verify, trust_bundle)
+                    continue
+                else:
+                    _assert_no_error(result)
+                    break
+
+    def fileno(self):
+        return self.socket.fileno()
+
+    # Copy-pasted from Python 3.5 source code
+    def _decref_socketios(self):
+        if self._makefile_refs > 0:
+            self._makefile_refs -= 1
+        if self._closed:
+            self.close()
+
+    def recv(self, bufsiz):
+        buffer = ctypes.create_string_buffer(bufsiz)
+        bytes_read = self.recv_into(buffer, bufsiz)
+        data = buffer[:bytes_read]
+        return data
+
+    def recv_into(self, buffer, nbytes=None):
+        # Read short on EOF.
+        if self._closed:
+            return 0
+
+        if nbytes is None:
+            nbytes = len(buffer)
+
+        buffer = (ctypes.c_char * nbytes).from_buffer(buffer)
+        processed_bytes = ctypes.c_size_t(0)
+
+        with self._raise_on_error():
+            result = Security.SSLRead(
+                self.context, buffer, nbytes, ctypes.byref(processed_bytes)
+            )
+
+        # There are some result codes that we want to treat as "not always
+        # errors". Specifically, those are errSSLWouldBlock,
+        # errSSLClosedGraceful, and errSSLClosedNoNotify.
+        if (result == SecurityConst.errSSLWouldBlock):
+            # If we didn't process any bytes, then this was just a time out.
+            # However, we can get errSSLWouldBlock in situations when we *did*
+            # read some data, and in those cases we should just read "short"
+            # and return.
+            if processed_bytes.value == 0:
+                # Timed out, no data read.
+                raise socket.timeout("recv timed out")
+        elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify):
+            # The remote peer has closed this connection. We should do so as
+            # well. Note that we don't actually return here because in
+            # principle this could actually be fired along with return data.
+            # It's unlikely though.
+            self.close()
+        else:
+            _assert_no_error(result)
+
+        # Ok, we read and probably succeeded. We should return whatever data
+        # was actually read.
+        return processed_bytes.value
+
+    def settimeout(self, timeout):
+        self._timeout = timeout
+
+    def gettimeout(self):
+        return self._timeout
+
+    def send(self, data):
+        processed_bytes = ctypes.c_size_t(0)
+
+        with self._raise_on_error():
+            result = Security.SSLWrite(
+                self.context, data, len(data), ctypes.byref(processed_bytes)
+            )
+
+        if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0:
+            # Timed out
+            raise socket.timeout("send timed out")
+        else:
+            _assert_no_error(result)
+
+        # We sent, and probably succeeded. Tell them how much we sent.
+        return processed_bytes.value
+
+    def sendall(self, data):
+        total_sent = 0
+        while total_sent < len(data):
+            sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
+            total_sent += sent
+
+    def shutdown(self):
+        with self._raise_on_error():
+            Security.SSLClose(self.context)
+
+    def close(self):
+        # TODO: should I do clean shutdown here? Do I have to?
+        if self._makefile_refs < 1:
+            self._closed = True
+            if self.context:
+                CoreFoundation.CFRelease(self.context)
+                self.context = None
+            if self._client_cert_chain:
+                CoreFoundation.CFRelease(self._client_cert_chain)
+                self._client_cert_chain = None
+            if self._keychain:
+                Security.SecKeychainDelete(self._keychain)
+                CoreFoundation.CFRelease(self._keychain)
+                shutil.rmtree(self._keychain_dir)
+                self._keychain = self._keychain_dir = None
+            return self.socket.close()
+        else:
+            self._makefile_refs -= 1
+
+    def getpeercert(self, binary_form=False):
+        # Urgh, annoying.
+        #
+        # Here's how we do this:
+        #
+        # 1. Call SSLCopyPeerTrust to get hold of the trust object for this
+        #    connection.
+        # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf.
+        # 3. To get the CN, call SecCertificateCopyCommonName and process that
+        #    string so that it's of the appropriate type.
+        # 4. To get the SAN, we need to do something a bit more complex:
+        #    a. Call SecCertificateCopyValues to get the data, requesting
+        #       kSecOIDSubjectAltName.
+        #    b. Mess about with this dictionary to try to get the SANs out.
+        #
+        # This is gross. Really gross. It's going to be a few hundred LoC extra
+        # just to repeat something that SecureTransport can *already do*. So my
+        # operating assumption at this time is that what we want to do is
+        # instead to just flag to urllib3 that it shouldn't do its own hostname
+        # validation when using SecureTransport.
+        if not binary_form:
+            raise ValueError(
+                "SecureTransport only supports dumping binary certs"
+            )
+        trust = Security.SecTrustRef()
+        certdata = None
+        der_bytes = None
+
+        try:
+            # Grab the trust store.
+            result = Security.SSLCopyPeerTrust(
+                self.context, ctypes.byref(trust)
+            )
+            _assert_no_error(result)
+            if not trust:
+                # Probably we haven't done the handshake yet. No biggie.
+                return None
+
+            cert_count = Security.SecTrustGetCertificateCount(trust)
+            if not cert_count:
+                # Also a case that might happen if we haven't handshaked.
+                # Handshook? Handshaken?
+                return None
+
+            leaf = Security.SecTrustGetCertificateAtIndex(trust, 0)
+            assert leaf
+
+            # Ok, now we want the DER bytes.
+            certdata = Security.SecCertificateCopyData(leaf)
+            assert certdata
+
+            data_length = CoreFoundation.CFDataGetLength(certdata)
+            data_buffer = CoreFoundation.CFDataGetBytePtr(certdata)
+            der_bytes = ctypes.string_at(data_buffer, data_length)
+        finally:
+            if certdata:
+                CoreFoundation.CFRelease(certdata)
+            if trust:
+                CoreFoundation.CFRelease(trust)
+
+        return der_bytes
+
+    def _reuse(self):
+        self._makefile_refs += 1
+
+    def _drop(self):
+        if self._makefile_refs < 1:
+            self.close()
+        else:
+            self._makefile_refs -= 1
+
+
+if _fileobject:  # Platform-specific: Python 2
+    def makefile(self, mode, bufsize=-1):
+        self._makefile_refs += 1
+        return _fileobject(self, mode, bufsize, close=True)
+else:  # Platform-specific: Python 3
+    def makefile(self, mode="r", buffering=None, *args, **kwargs):
+        # We disable buffering with SecureTransport because it conflicts with
+        # the buffering that ST does internally (see issue #1153 for more).
+        buffering = 0
+        return backport_makefile(self, mode, buffering, *args, **kwargs)
+
+WrappedSocket.makefile = makefile
+
+
+class SecureTransportContext(object):
+    """
+    I am a wrapper class for the SecureTransport library, to translate the
+    interface of the standard library ``SSLContext`` object to calls into
+    SecureTransport.
+    """
+    def __init__(self, protocol):
+        self._min_version, self._max_version = _protocol_to_min_max[protocol]
+        self._options = 0
+        self._verify = False
+        self._trust_bundle = None
+        self._client_cert = None
+        self._client_key = None
+        self._client_key_passphrase = None
+
+    @property
+    def check_hostname(self):
+        """
+        SecureTransport cannot have its hostname checking disabled. For more,
+        see the comment on getpeercert() in this file.
+        """
+        return True
+
+    @check_hostname.setter
+    def check_hostname(self, value):
+        """
+        SecureTransport cannot have its hostname checking disabled. For more,
+        see the comment on getpeercert() in this file.
+        """
+        pass
+
+    @property
+    def options(self):
+        # TODO: Well, crap.
+        #
+        # So this is the bit of the code that is the most likely to cause us
+        # trouble. Essentially we need to enumerate all of the SSL options that
+        # users might want to use and try to see if we can sensibly translate
+        # them, or whether we should just ignore them.
+        return self._options
+
+    @options.setter
+    def options(self, value):
+        # TODO: Update in line with above.
+        self._options = value
+
+    @property
+    def verify_mode(self):
+        return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE
+
+    @verify_mode.setter
+    def verify_mode(self, value):
+        self._verify = True if value == ssl.CERT_REQUIRED else False
+
+    def set_default_verify_paths(self):
+        # So, this has to do something a bit weird. Specifically, what it does
+        # is nothing.
+        #
+        # This means that, if we had previously had load_verify_locations
+        # called, this does not undo that. We need to do that because it turns
+        # out that the rest of the urllib3 code will attempt to load the
+        # default verify paths if it hasn't been told about any paths, even if
+        # the context itself was sometime earlier. We resolve that by just
+        # ignoring it.
+        pass
+
+    def load_default_certs(self):
+        return self.set_default_verify_paths()
+
+    def set_ciphers(self, ciphers):
+        # For now, we just require the default cipher string.
+        if ciphers != util.ssl_.DEFAULT_CIPHERS:
+            raise ValueError(
+                "SecureTransport doesn't support custom cipher strings"
+            )
+
+    def load_verify_locations(self, cafile=None, capath=None, cadata=None):
+        # OK, we only really support cadata and cafile.
+        if capath is not None:
+            raise ValueError(
+                "SecureTransport does not support cert directories"
+            )
+
+        self._trust_bundle = cafile or cadata
+
+    def load_cert_chain(self, certfile, keyfile=None, password=None):
+        self._client_cert = certfile
+        self._client_key = keyfile
+        self._client_cert_passphrase = password
+
+    def wrap_socket(self, sock, server_side=False,
+                    do_handshake_on_connect=True, suppress_ragged_eofs=True,
+                    server_hostname=None):
+        # So, what do we do here? Firstly, we assert some properties. This is a
+        # stripped down shim, so there is some functionality we don't support.
+        # See PEP 543 for the real deal.
+        assert not server_side
+        assert do_handshake_on_connect
+        assert suppress_ragged_eofs
+
+        # Ok, we're good to go. Now we want to create the wrapped socket object
+        # and store it in the appropriate place.
+        wrapped_socket = WrappedSocket(sock)
+
+        # Now we can handshake
+        wrapped_socket.handshake(
+            server_hostname, self._verify, self._trust_bundle,
+            self._min_version, self._max_version, self._client_cert,
+            self._client_key, self._client_key_passphrase
+        )
+        return wrapped_socket
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2ee5d694a1c481380e40111fc840b434ac8b3d0e
GIT binary patch
literal 24494
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
Z<}~Lt<7eb&7W>c8!N$nX!q3LZ3;@5MWheju

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py
new file mode 100644
index 00000000..811e312e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py
@@ -0,0 +1,192 @@
+# -*- coding: utf-8 -*-
+"""
+This module contains provisional support for SOCKS proxies from within
+urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and
+SOCKS5. To enable its functionality, either install PySocks or install this
+module with the ``socks`` extra.
+
+The SOCKS implementation supports the full range of urllib3 features. It also
+supports the following SOCKS features:
+
+- SOCKS4
+- SOCKS4a
+- SOCKS5
+- Usernames and passwords for the SOCKS proxy
+
+Known Limitations:
+
+- Currently PySocks does not support contacting remote websites via literal
+  IPv6 addresses. Any such connection attempt will fail. You must use a domain
+  name.
+- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any
+  such connection attempt will fail.
+"""
+from __future__ import absolute_import
+
+try:
+    import socks
+except ImportError:
+    import warnings
+    from ..exceptions import DependencyWarning
+
+    warnings.warn((
+        'SOCKS support in urllib3 requires the installation of optional '
+        'dependencies: specifically, PySocks.  For more information, see '
+        'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies'
+        ),
+        DependencyWarning
+    )
+    raise
+
+from socket import error as SocketError, timeout as SocketTimeout
+
+from ..connection import (
+    HTTPConnection, HTTPSConnection
+)
+from ..connectionpool import (
+    HTTPConnectionPool, HTTPSConnectionPool
+)
+from ..exceptions import ConnectTimeoutError, NewConnectionError
+from ..poolmanager import PoolManager
+from ..util.url import parse_url
+
+try:
+    import ssl
+except ImportError:
+    ssl = None
+
+
+class SOCKSConnection(HTTPConnection):
+    """
+    A plain-text HTTP connection that connects via a SOCKS proxy.
+    """
+    def __init__(self, *args, **kwargs):
+        self._socks_options = kwargs.pop('_socks_options')
+        super(SOCKSConnection, self).__init__(*args, **kwargs)
+
+    def _new_conn(self):
+        """
+        Establish a new connection via the SOCKS proxy.
+        """
+        extra_kw = {}
+        if self.source_address:
+            extra_kw['source_address'] = self.source_address
+
+        if self.socket_options:
+            extra_kw['socket_options'] = self.socket_options
+
+        try:
+            conn = socks.create_connection(
+                (self.host, self.port),
+                proxy_type=self._socks_options['socks_version'],
+                proxy_addr=self._socks_options['proxy_host'],
+                proxy_port=self._socks_options['proxy_port'],
+                proxy_username=self._socks_options['username'],
+                proxy_password=self._socks_options['password'],
+                proxy_rdns=self._socks_options['rdns'],
+                timeout=self.timeout,
+                **extra_kw
+            )
+
+        except SocketTimeout as e:
+            raise ConnectTimeoutError(
+                self, "Connection to %s timed out. (connect timeout=%s)" %
+                (self.host, self.timeout))
+
+        except socks.ProxyError as e:
+            # This is fragile as hell, but it seems to be the only way to raise
+            # useful errors here.
+            if e.socket_err:
+                error = e.socket_err
+                if isinstance(error, SocketTimeout):
+                    raise ConnectTimeoutError(
+                        self,
+                        "Connection to %s timed out. (connect timeout=%s)" %
+                        (self.host, self.timeout)
+                    )
+                else:
+                    raise NewConnectionError(
+                        self,
+                        "Failed to establish a new connection: %s" % error
+                    )
+            else:
+                raise NewConnectionError(
+                    self,
+                    "Failed to establish a new connection: %s" % e
+                )
+
+        except SocketError as e:  # Defensive: PySocks should catch all these.
+            raise NewConnectionError(
+                self, "Failed to establish a new connection: %s" % e)
+
+        return conn
+
+
+# We don't need to duplicate the Verified/Unverified distinction from
+# urllib3/connection.py here because the HTTPSConnection will already have been
+# correctly set to either the Verified or Unverified form by that module. This
+# means the SOCKSHTTPSConnection will automatically be the correct type.
+class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection):
+    pass
+
+
+class SOCKSHTTPConnectionPool(HTTPConnectionPool):
+    ConnectionCls = SOCKSConnection
+
+
+class SOCKSHTTPSConnectionPool(HTTPSConnectionPool):
+    ConnectionCls = SOCKSHTTPSConnection
+
+
+class SOCKSProxyManager(PoolManager):
+    """
+    A version of the urllib3 ProxyManager that routes connections via the
+    defined SOCKS proxy.
+    """
+    pool_classes_by_scheme = {
+        'http': SOCKSHTTPConnectionPool,
+        'https': SOCKSHTTPSConnectionPool,
+    }
+
+    def __init__(self, proxy_url, username=None, password=None,
+                 num_pools=10, headers=None, **connection_pool_kw):
+        parsed = parse_url(proxy_url)
+
+        if username is None and password is None and parsed.auth is not None:
+            split = parsed.auth.split(':')
+            if len(split) == 2:
+                username, password = split
+        if parsed.scheme == 'socks5':
+            socks_version = socks.PROXY_TYPE_SOCKS5
+            rdns = False
+        elif parsed.scheme == 'socks5h':
+            socks_version = socks.PROXY_TYPE_SOCKS5
+            rdns = True
+        elif parsed.scheme == 'socks4':
+            socks_version = socks.PROXY_TYPE_SOCKS4
+            rdns = False
+        elif parsed.scheme == 'socks4a':
+            socks_version = socks.PROXY_TYPE_SOCKS4
+            rdns = True
+        else:
+            raise ValueError(
+                "Unable to determine SOCKS version from %s" % proxy_url
+            )
+
+        self.proxy_url = proxy_url
+
+        socks_options = {
+            'socks_version': socks_version,
+            'proxy_host': parsed.host,
+            'proxy_port': parsed.port,
+            'username': username,
+            'password': password,
+            'rdns': rdns
+        }
+        connection_pool_kw['_socks_options'] = socks_options
+
+        super(SOCKSProxyManager, self).__init__(
+            num_pools, headers, **connection_pool_kw
+        )
+
+        self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8345ad95d0f878a12ce4c4af434e96b0c0a1d516
GIT binary patch
literal 6298
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
R09=-fS<Fq6MT|v^1px4w1BCzp

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py
new file mode 100644
index 00000000..7bbaa987
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py
@@ -0,0 +1,246 @@
+from __future__ import absolute_import
+from .packages.six.moves.http_client import (
+    IncompleteRead as httplib_IncompleteRead
+)
+# Base Exceptions
+
+
+class HTTPError(Exception):
+    "Base exception used by this module."
+    pass
+
+
+class HTTPWarning(Warning):
+    "Base warning used by this module."
+    pass
+
+
+class PoolError(HTTPError):
+    "Base exception for errors caused within a pool."
+    def __init__(self, pool, message):
+        self.pool = pool
+        HTTPError.__init__(self, "%s: %s" % (pool, message))
+
+    def __reduce__(self):
+        # For pickling purposes.
+        return self.__class__, (None, None)
+
+
+class RequestError(PoolError):
+    "Base exception for PoolErrors that have associated URLs."
+    def __init__(self, pool, url, message):
+        self.url = url
+        PoolError.__init__(self, pool, message)
+
+    def __reduce__(self):
+        # For pickling purposes.
+        return self.__class__, (None, self.url, None)
+
+
+class SSLError(HTTPError):
+    "Raised when SSL certificate fails in an HTTPS connection."
+    pass
+
+
+class ProxyError(HTTPError):
+    "Raised when the connection to a proxy fails."
+    pass
+
+
+class DecodeError(HTTPError):
+    "Raised when automatic decoding based on Content-Type fails."
+    pass
+
+
+class ProtocolError(HTTPError):
+    "Raised when something unexpected happens mid-request/response."
+    pass
+
+
+#: Renamed to ProtocolError but aliased for backwards compatibility.
+ConnectionError = ProtocolError
+
+
+# Leaf Exceptions
+
+class MaxRetryError(RequestError):
+    """Raised when the maximum number of retries is exceeded.
+
+    :param pool: The connection pool
+    :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
+    :param string url: The requested Url
+    :param exceptions.Exception reason: The underlying error
+
+    """
+
+    def __init__(self, pool, url, reason=None):
+        self.reason = reason
+
+        message = "Max retries exceeded with url: %s (Caused by %r)" % (
+            url, reason)
+
+        RequestError.__init__(self, pool, url, message)
+
+
+class HostChangedError(RequestError):
+    "Raised when an existing pool gets a request for a foreign host."
+
+    def __init__(self, pool, url, retries=3):
+        message = "Tried to open a foreign host with url: %s" % url
+        RequestError.__init__(self, pool, url, message)
+        self.retries = retries
+
+
+class TimeoutStateError(HTTPError):
+    """ Raised when passing an invalid state to a timeout """
+    pass
+
+
+class TimeoutError(HTTPError):
+    """ Raised when a socket timeout error occurs.
+
+    Catching this error will catch both :exc:`ReadTimeoutErrors
+    <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
+    """
+    pass
+
+
+class ReadTimeoutError(TimeoutError, RequestError):
+    "Raised when a socket timeout occurs while receiving data from a server"
+    pass
+
+
+# This timeout error does not have a URL attached and needs to inherit from the
+# base HTTPError
+class ConnectTimeoutError(TimeoutError):
+    "Raised when a socket timeout occurs while connecting to a server"
+    pass
+
+
+class NewConnectionError(ConnectTimeoutError, PoolError):
+    "Raised when we fail to establish a new connection. Usually ECONNREFUSED."
+    pass
+
+
+class EmptyPoolError(PoolError):
+    "Raised when a pool runs out of connections and no more are allowed."
+    pass
+
+
+class ClosedPoolError(PoolError):
+    "Raised when a request enters a pool after the pool has been closed."
+    pass
+
+
+class LocationValueError(ValueError, HTTPError):
+    "Raised when there is something wrong with a given URL input."
+    pass
+
+
+class LocationParseError(LocationValueError):
+    "Raised when get_host or similar fails to parse the URL input."
+
+    def __init__(self, location):
+        message = "Failed to parse: %s" % location
+        HTTPError.__init__(self, message)
+
+        self.location = location
+
+
+class ResponseError(HTTPError):
+    "Used as a container for an error reason supplied in a MaxRetryError."
+    GENERIC_ERROR = 'too many error responses'
+    SPECIFIC_ERROR = 'too many {status_code} error responses'
+
+
+class SecurityWarning(HTTPWarning):
+    "Warned when performing security reducing actions"
+    pass
+
+
+class SubjectAltNameWarning(SecurityWarning):
+    "Warned when connecting to a host with a certificate missing a SAN."
+    pass
+
+
+class InsecureRequestWarning(SecurityWarning):
+    "Warned when making an unverified HTTPS request."
+    pass
+
+
+class SystemTimeWarning(SecurityWarning):
+    "Warned when system time is suspected to be wrong"
+    pass
+
+
+class InsecurePlatformWarning(SecurityWarning):
+    "Warned when certain SSL configuration is not available on a platform."
+    pass
+
+
+class SNIMissingWarning(HTTPWarning):
+    "Warned when making a HTTPS request without SNI available."
+    pass
+
+
+class DependencyWarning(HTTPWarning):
+    """
+    Warned when an attempt is made to import a module with missing optional
+    dependencies.
+    """
+    pass
+
+
+class ResponseNotChunked(ProtocolError, ValueError):
+    "Response needs to be chunked in order to read it as chunks."
+    pass
+
+
+class BodyNotHttplibCompatible(HTTPError):
+    """
+    Body should be httplib.HTTPResponse like (have an fp attribute which
+    returns raw chunks) for read_chunked().
+    """
+    pass
+
+
+class IncompleteRead(HTTPError, httplib_IncompleteRead):
+    """
+    Response length doesn't match expected Content-Length
+
+    Subclass of http_client.IncompleteRead to allow int value
+    for `partial` to avoid creating large objects on streamed
+    reads.
+    """
+    def __init__(self, partial, expected):
+        super(IncompleteRead, self).__init__(partial, expected)
+
+    def __repr__(self):
+        return ('IncompleteRead(%i bytes read, '
+                '%i more expected)' % (self.partial, self.expected))
+
+
+class InvalidHeader(HTTPError):
+    "The header provided was somehow invalid."
+    pass
+
+
+class ProxySchemeUnknown(AssertionError, ValueError):
+    "ProxyManager does not support the supplied scheme"
+    # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
+
+    def __init__(self, scheme):
+        message = "Not supported proxy scheme %s" % scheme
+        super(ProxySchemeUnknown, self).__init__(message)
+
+
+class HeaderParsingError(HTTPError):
+    "Raised by assert_header_parsing, but we convert it to a log.warning statement."
+    def __init__(self, defects, unparsed_data):
+        message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data)
+        super(HeaderParsingError, self).__init__(message)
+
+
+class UnrewindableBodyError(HTTPError):
+    "urllib3 encountered an error when trying to rewind a body"
+    pass
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aa6313b45f83642fe22480ea4f8c6f4f79a9a749
GIT binary patch
literal 15502
zcmZSn%*&NH<x)&C0~9bbFfcecFfbHrFf%ZuFfgPrGUPBY<T5fuF)}cwFfpVsGvqKa
z<T5ivu`n>EurQ>uGNdswq_8ryFfcSTFhoYNF{H3Dq_TrW+2Nub3@IE8scc|TPPiy1
zLkbr|DkoT!8!pPlkir8~%L^CfW=P?KiSolmc^FazV4{L>QC@}=A(*HzT$GO?m5(8c
zpCLtrA(abkrzl)bfFVT;CMpgW6=X<}fSDr+7ZqYik%Eaz!$pM|Qe+rXg~5g}F{H@C
zB}5of<UkUjV3LQ6iZY}qFr<oteb2;@q6n7|V@Oc~i!w5#D8og?8B$bWqN;FF35FCk
zhEz$gW0)9H)Zr3R3@I86sZwB1YQjaO8B(;sY8e?)wBe#M3@JJcsT^Rnx^Pihh7>)9
zR9Ud7K3r6eA;kbDY6usVXGk%Ei5kO26&O-XV4|jQQALInGnj4Wa8V_O6bqQBC0taQ
zA;k(5XQ`45X-o_$)^G_Gh7=o^M{MDusthT1AkkD7uyT921T#a514sfC1CDS}HHH)?
zhE#P>_<>A!hD&HLq`1J8yTU~^8B*L}qV8}}Ert{ihF}d(1_p*qP!7^yWME(@;b&lA
zNK7iu&nYcQjnB+2$S*3%1W7<-`4|`&JoA$Ca|?1(OHzYU6H`h!85kHmLP7#ui;D7#
z;CT_G#R-%bK{`?yKv^(_fgy^CAt)GZQn4}v1A|jyajHUUMRICENoIbYLTPboib7JQ
zLP<tuu|jTsN@-529w;j_lyERGFvQ2_CFZ8a$Cq${IS~2y_!4$7HzhwgK3)Ut4LDI;
z$iTp$Ur>};mRORiUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQWL{=yVP2e5nO+`ml44?F
zU|?X7o~Iw8Uyxa#o0(T!l9-dDTb^iH8khkR0^|6y)V!4ZBK^{$oSe)gV|}<6iuDRA
zgP0f?7(fm#W?^7pU}I!sEa8R*QFvleUS?i8@qwfW3#4+0PTWBh1S<T3KsE-kGB7X<
zj*wtuU|`^7U|>Lm1Sqit<mcz$NGu8r3=GJLC4~``TBDd5QkcLD7Etm5`LtLc7BcX#
zS4hh*Qb+|Q!eWKwL~vRv&n(Hv%u`5ID9F#x(Mtwt1YuABIfK%sIs*ek4I@Jh14BFm
zLkS~8788h_!Uz^*0_8-pW+n#46b6Q14N$E56@z@FT5P4D3a(=qN<aY)G8`P~&}5pK
zmst`Y4@tNn`Qp@^v>;G|04LSl)Z*gA^i)Iy4NxlOWME(rfyE62BPU}rD9eH{D2Twp
z1B$vD28JwfO`6683j|0|_<<>K?vIa8&PgmTj*kZihhKhPDmaS=aiJu{f$=A_v?xkV
zDNRm|kCy=X7!;KZOd6nMfR=57K%o)@DzXsq17;13<AXqDn-Iv!pmYZ+N;p|cco-NM
zf>H}hQ;SO|&P5j3a}hj;7AurwB$g;-B$lNrBo-IvCub&>q^2l@2Kf~0C4<s741?1P
zDEHPdfwB;Cb^>KEW`<^FXg&g^Fh5A<04222q8zX<!6B~!G7g+<!1*Oe0OVCr;R%id
zFfl+80ZJG0pojpu5GA*O1i-$R1QjNb+`<3~gDfUc8#Ij>RE$9CJczf0z!3<_TVVeU
zo~!~+_n>OIc<5vhP-{gN6fZ~_1XR=p2m9d29H7jNT*biJBbK1FmY4}@f|O^Z<|zaR
z`zR!*7L{bCWhN(<q$;E(X66(tfNGOG1yFM*SRpw-FE2G2)N+BeQqam0aB@Wu1C($D
zp=B_l3g%*9U<fG6uc#z3fOOCTs3ap5DF_rw@<H`1$XrNJ4dO5Xm8iO)L<7pZpi&jw
zKyyh=&QD1tF;J}00wuAuBtJK?Br{nd1!P=iUb;e3A}CGe=P5Yn=ar=9mFR|47C@8J
zAPys81_lNrlrRF7SOG=(CHcuXn{T-CmK|Cs73b%sf?8(j3Z;3e6$Pouph_hpv7jI|
zuUH{BGex%uQordJr4|?D=M_V{0fRDwf!a{!7y;#*SP_(3QiPVrK;<g9QzV7n&Se4(
zR<tmJMka!S!L?&C4<iFZ5K@5z%5S-e6`8rExe9ruxk;%-3i)XYMX4o4nW@DJnZ@9a
zRBB3UiXIo2f`WpARY77=VlKGpYo!o^npr_jR*0e!P+|metrV=ltvIWMI%u~>4^hB@
z6zG9UJ!g2C2WlfEK+J$xR9sR7O75jaIS}ihaR_QI6y+c*gtyp>^<3e7zoOK{;`}^_
z&eFV;)S{e9kZIudJj6fX_6DfU2EyPP*BDgeGK1>ccyJT7hKZpDT-}P*vLKrCp!Nq7
zLk$Z<GicNY(Udn}U|{e~tbm6g$XTG^QvmfE6u{n4EmqKQhIA#8Diu_VG{G@b0;+2u
z?hOLfKai#i$W`b~7co$}=Z2QRkUrS}RRf^*iw`K3f+|M_MouPXMqVaAtW980K8JV-
z-jN2^VguxIQBV^V<Z^If&B4Z00%{d{<QJDXXC&sOr>3Bm*toM8Be)aE$PmR0??l>z
z;s+^<CFUulR%8~JfKnbP$t$F%mJ}-_DnOGmxQCetB2zQd^As}ji%aw}L5*0<qzS5C
zK>bK225?$rV8~(wrBjr&Si=kwiU&6nVf{-@1_p+ZqRiA3g_3-Q{DM?a=QS<A2yP!r
z;smEgL=psdFQMfDBxXTXJyJ^=)cFbG9xTZ*0u-sBti-^`#VE!IY5Rjh6ETW0h?1c=
z0|P@S$i?7f$jHW20%}=>Wag&kmzD&VB$klcasU-x3drSqL1J++DB&gMDP-oACFW$N
zC=`Rt1*L>Ug%XHO3XnKQ4JL5*L=Xd%Q9=EmIHV9_1ou>-A%vPqL481QJ&3EpaDah<
z0VQw}6^iqdvr|jp;Q+1}6!MdkON)x36`pfqNpc1#1i|Bn5C!F#IXMc+API$}{E`d>
ztJI2Qs|3)vC9=bc!PS!uy0Be>LSkMDR1dV~L(!&SgGJOXK@V));EgFz>jN|f3F#BC
zvN3{-RCM2iRDfy#27<BWhF*-KM;0WS6v{I)b5a$GQj=3N%Rupzl30?ckXDqRtB|Nr
zoLW?tS~PgWOqziKG?|1nlnH7fV~Kv^gUx}YV1qTr^3ov%!e9?D8BkFG!q5Vfu>{oZ
z@=Gm;hFNBQ9*Kp52U>WQLwZr5;7BblNlePgEY46!RLDy$N9vdADTEf6Cg$W+D!4lP
z`}qaAx`hV2x(wou7icu20wvr)g`{h4K}lr*?tycV8f>E)&S+r<846b@D$Ofa$S*Ac
z^&nsgD?hIoT-@d5E9B-Er79$Xa86Esd1}fa4lX$c28LRc-~u(topbVwQ&XrCUa+=b
zYF<fd5vVZ;ZWtz}m82FafVyO0Zbo9ULQ-mKo<cI%;z1l<ph3(gl<)#&OP~DYM9@H1
zSYl2osSOz$v?NxNky?}r>W?CN`Q=6VdFha*YobDWW?5<;Xb4#$Gq0euWDtiHXgs?e
zXIKR!78T<PD^P0@IXlAVv4S8C{bF0RKub?8i3jy36!MD{iZgRFa}tXn!)Tz=tpH>b
zII)EW`9MQ08Pw4MH3LBy+#3c>W`VjKj0|G6ObjLPE(a3>Xbub1^I%{=?QDQ*Ft^0a
z97t~iYzus53p}9(ZhwPkwQ`^d1X4kR`xQzcFASRAL_a8=V7&<era|7D0L|<6fLsi%
z9GObMy>94e7mj)n)NDgbRFIj`D8#g=3#gj{8gEPl6;;Xkc_oRNd8tL9KC1$#cMF;x
zRe+3LC={0#6y$)qnxH{#1(Xphy<$*bu_QlVAvZCv5;Ci*02_=eE>;6A6o5%qgL)~Y
z#qprg(^_<;kbWpAjUsw=V86P%`nd*qI>);P1^EY+fU2+H09R*EH<%EjI|F77P@e`g
z8!`<PPoR{=#t4Go1rouj$)!b^C6y#k=z|8GK$=oh6u`3#1*t`8`9-;))^IV@Oa<^<
zB}gO@Jh=dwX&#hgpP+Ow2NXQeWXxCs8m$Q~P0C75E^*8$@k`821^JewH4jb<3=AMm
zupol9PhbsSa4`uUqf11YpvldI_Ma7k9sLGztpX~i7or3jXqeD54;=rg(3xFO0FV@F
zp!E<SO|VeQP0R)-p*)4syt34y%rsC&2aVtc!$z|PaS(yB{4$gv0u8nVR~DC~=7Kul
zAdiw1I_TN17;F@HFag|BDJ_OhLX_kyB&8~V+bfW&4z=h4ISew63uX;asRSA%T#XVu
zp!NnV1qI|JmVn9>k^{*VJ>#Vofoc!POlW>yT4s7_5xA8I3bMTX5{1OF#LS$;q?}ZR
ze9$;$0o39_oUpVQ7#KF7gd8|w`FZ+63J;RQ3^Z#D(uAJvpi{)K&I72p0(G~7{X7w&
zHi*MXn}LC0D@HiEq!y&+rKIL1lV0zEMn%A*V#tA&n5U3fQj(fmPy$L(xrr&Mpw=#A
z&7ndfbOj)!+W;%v^T8_x6Cv|SDKPhBrWWggO&`2@7BqXl3m&2@Y>?rQAZUxvFTcb&
zqckr&H3bw<#ErUvr=Fqu74lM3Q;I>Mmz1iI3^56`Rw2JA1=LN=2Q~Rp6f#Q`5{n_y
z#e+EUf#yyQ!Gj94eiGCeb;?hv^vf^tC@Cq($xL$2&n-wS$xO;gB|gBa7#JA9sRU${
zLUBfZX-*2Lw9kMT37+4CMTkO9W_GHA24vw=o<dpyD5Vx<CY6??f`&1ZGr$HFrIwTy
z<rOOwC6+^jRTJFOE=o;IiHAmmhUQ>TntBWj49DT&&BDeQ1RC+h3|CNh7_I-&!T_31
z!&saNG7TI+h~P}kOE1Y#NXbtv&QmW@$OVtc!>9gXD<gcssvy(7!KF#y`DoA(6)1+{
zlXEgt^GftkS096td?IL&N+C0^M4=2cd;zu?v=%g>AhD<<GchLttf(wMGese}C^Zp0
zyO)z#l%A@P4{oRygQ~CMlA_ea+|(4XZczL|OBDE`QBXqw+|LFL(3OCfi`FoJy4IjY
zql^qSkZv}3sVFG;AZxu!K(oTdr3I-);4lUEry*q&s0$6Au!A}h+{=aq2)J<pCI+a5
z!O6hDa2=E+K%)!{SeAx@Ry}|Q8^G(`Kx;%9LCf64Afp?8;MKXP5v8G;sgP7zl3ENd
zigXlIGa;jlFfVI@my-s88frm?peagFAcE)9!QlWV1|~4TF%utOlv+>}AAbuJD4^aB
z10ypdw$3d$ii1EaXTVNI5Ch|QaI!lOax}OH%g)Bg$qep)dqSodJyH`>Qb|~~5AqLa
zElCDgpF%-VepzM;sPU6ntN<GC%g8T>&0Y@T8U{4?dLI-hpqK=A>Oq5`;6-u4$r-7+
zsiAq<dHLmem}MZSp^dc+gbnP0(k|E_-^9Gc^wc77k*5G^ErW(z@{3Bq<9Hx8c<7}V
zY#ruco(cnGMGJf|uY?h_SfH5+yhfdgp&7KJ39*(1R3`c5mw<<K@{2&LsS3a=@gT;-
zR;verI*CChpm94+P!<CfY2YjdUeN+kJ9yRyynsazXnnvSAI}4Y=@XcH*%;ZF!INE(
z%mo@J&df{4F{no{LHU8A3$jKfsS>mZJGH1J9+LgyK|{8gdFeU|Nu?zU<>2L*WvN9a
zpoSiJIc83Nx*lxj2xycpH5XKaf~z!8$_K?ixJm<+x}egWk)ePGv`VH1viG5u88nQH
zlJb}lDG#LEuNXAoqgt$^P?`sFOlpb(Xj0coLA3~6xk2+0q{;)QJ~NPaz^M=90!Zou
zt#VIEO-oHKDF&BKFtg%8W(}SM`5qR*41<5U3MiQ0!rTik;Xn};npc!so|%^d>a&9y
z!8p<+XfzhNkV9S~4P6_kkeZjAUkaKMOHDxxEQ5zMONziN_ewyW4v=LEi3&;iDV2~k
z07^87kzi15GVsGGRtyXbUy#GfPXpBdh3*_lD=jH4N{x>X0`<yDK+}x{iOJcC>8Ztf
z#hDd)x%p+O#d=5$RB(-30vgf-3Fc%b#iKTaz&mE(>mI?=Ea0pH>KJF{r3ZoPX~>QU
z&_resXnZ0FR67NMW@~~#?Jn>LG}<hB5GZ<sK!r&VXdO-vXs#d#v}Pd)G!GvHsvm+t
zZVv*@|ABpmnCc4xHSB{xQxZX-@$MkdsBREwlrjhuKS7|;rXbM3Nf0Phf<PVFAW#=A
z2-I%~0#&8p;d{s8V$f=N=&U}ZmI0;0AW-mv3>xr=1~=qva>4rw?Lf`TV$g~L0Y(8f
zF;+2FF>Wz#FwH8)#>OfpEXFCuD#j_vF2*Vek_C}mVi1*Jz8I?*ha?CKh_Om?im?L#
DWA^@v

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py
new file mode 100644
index 00000000..37fe64a3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py
@@ -0,0 +1,178 @@
+from __future__ import absolute_import
+import email.utils
+import mimetypes
+
+from .packages import six
+
+
+def guess_content_type(filename, default='application/octet-stream'):
+    """
+    Guess the "Content-Type" of a file.
+
+    :param filename:
+        The filename to guess the "Content-Type" of using :mod:`mimetypes`.
+    :param default:
+        If no "Content-Type" can be guessed, default to `default`.
+    """
+    if filename:
+        return mimetypes.guess_type(filename)[0] or default
+    return default
+
+
+def format_header_param(name, value):
+    """
+    Helper function to format and quote a single header parameter.
+
+    Particularly useful for header parameters which might contain
+    non-ASCII values, like file names. This follows RFC 2231, as
+    suggested by RFC 2388 Section 4.4.
+
+    :param name:
+        The name of the parameter, a string expected to be ASCII only.
+    :param value:
+        The value of the parameter, provided as a unicode string.
+    """
+    if not any(ch in value for ch in '"\\\r\n'):
+        result = '%s="%s"' % (name, value)
+        try:
+            result.encode('ascii')
+        except (UnicodeEncodeError, UnicodeDecodeError):
+            pass
+        else:
+            return result
+    if not six.PY3 and isinstance(value, six.text_type):  # Python 2:
+        value = value.encode('utf-8')
+    value = email.utils.encode_rfc2231(value, 'utf-8')
+    value = '%s*=%s' % (name, value)
+    return value
+
+
+class RequestField(object):
+    """
+    A data container for request body parameters.
+
+    :param name:
+        The name of this request field.
+    :param data:
+        The data/value body.
+    :param filename:
+        An optional filename of the request field.
+    :param headers:
+        An optional dict-like object of headers to initially use for the field.
+    """
+    def __init__(self, name, data, filename=None, headers=None):
+        self._name = name
+        self._filename = filename
+        self.data = data
+        self.headers = {}
+        if headers:
+            self.headers = dict(headers)
+
+    @classmethod
+    def from_tuples(cls, fieldname, value):
+        """
+        A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.
+
+        Supports constructing :class:`~urllib3.fields.RequestField` from
+        parameter of key/value strings AND key/filetuple. A filetuple is a
+        (filename, data, MIME type) tuple where the MIME type is optional.
+        For example::
+
+            'foo': 'bar',
+            'fakefile': ('foofile.txt', 'contents of foofile'),
+            'realfile': ('barfile.txt', open('realfile').read()),
+            'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
+            'nonamefile': 'contents of nonamefile field',
+
+        Field names and filenames must be unicode.
+        """
+        if isinstance(value, tuple):
+            if len(value) == 3:
+                filename, data, content_type = value
+            else:
+                filename, data = value
+                content_type = guess_content_type(filename)
+        else:
+            filename = None
+            content_type = None
+            data = value
+
+        request_param = cls(fieldname, data, filename=filename)
+        request_param.make_multipart(content_type=content_type)
+
+        return request_param
+
+    def _render_part(self, name, value):
+        """
+        Overridable helper function to format a single header parameter.
+
+        :param name:
+            The name of the parameter, a string expected to be ASCII only.
+        :param value:
+            The value of the parameter, provided as a unicode string.
+        """
+        return format_header_param(name, value)
+
+    def _render_parts(self, header_parts):
+        """
+        Helper function to format and quote a single header.
+
+        Useful for single headers that are composed of multiple items. E.g.,
+        'Content-Disposition' fields.
+
+        :param header_parts:
+            A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format
+            as `k1="v1"; k2="v2"; ...`.
+        """
+        parts = []
+        iterable = header_parts
+        if isinstance(header_parts, dict):
+            iterable = header_parts.items()
+
+        for name, value in iterable:
+            if value is not None:
+                parts.append(self._render_part(name, value))
+
+        return '; '.join(parts)
+
+    def render_headers(self):
+        """
+        Renders the headers for this request field.
+        """
+        lines = []
+
+        sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location']
+        for sort_key in sort_keys:
+            if self.headers.get(sort_key, False):
+                lines.append('%s: %s' % (sort_key, self.headers[sort_key]))
+
+        for header_name, header_value in self.headers.items():
+            if header_name not in sort_keys:
+                if header_value:
+                    lines.append('%s: %s' % (header_name, header_value))
+
+        lines.append('\r\n')
+        return '\r\n'.join(lines)
+
+    def make_multipart(self, content_disposition=None, content_type=None,
+                       content_location=None):
+        """
+        Makes this request field into a multipart request field.
+
+        This method overrides "Content-Disposition", "Content-Type" and
+        "Content-Location" headers to the request parameter.
+
+        :param content_type:
+            The 'Content-Type' of the request body.
+        :param content_location:
+            The 'Content-Location' of the request body.
+
+        """
+        self.headers['Content-Disposition'] = content_disposition or 'form-data'
+        self.headers['Content-Disposition'] += '; '.join([
+            '', self._render_parts(
+                (('name', self._name), ('filename', self._filename))
+            )
+        ])
+        self.headers['Content-Type'] = content_type
+        self.headers['Content-Location'] = content_location
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b3214b5d1622beaf9811d19bfd08937d1e66719e
GIT binary patch
literal 7346
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py
new file mode 100644
index 00000000..78f1e19b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py
@@ -0,0 +1,98 @@
+from __future__ import absolute_import
+import binascii
+import codecs
+import os
+
+from io import BytesIO
+
+from .packages import six
+from .packages.six import b
+from .fields import RequestField
+
+writer = codecs.lookup('utf-8')[3]
+
+
+def choose_boundary():
+    """
+    Our embarrassingly-simple replacement for mimetools.choose_boundary.
+    """
+    boundary = binascii.hexlify(os.urandom(16))
+    if six.PY3:
+        boundary = boundary.decode('ascii')
+    return boundary
+
+
+def iter_field_objects(fields):
+    """
+    Iterate over fields.
+
+    Supports list of (k, v) tuples and dicts, and lists of
+    :class:`~urllib3.fields.RequestField`.
+
+    """
+    if isinstance(fields, dict):
+        i = six.iteritems(fields)
+    else:
+        i = iter(fields)
+
+    for field in i:
+        if isinstance(field, RequestField):
+            yield field
+        else:
+            yield RequestField.from_tuples(*field)
+
+
+def iter_fields(fields):
+    """
+    .. deprecated:: 1.6
+
+    Iterate over fields.
+
+    The addition of :class:`~urllib3.fields.RequestField` makes this function
+    obsolete. Instead, use :func:`iter_field_objects`, which returns
+    :class:`~urllib3.fields.RequestField` objects.
+
+    Supports list of (k, v) tuples and dicts.
+    """
+    if isinstance(fields, dict):
+        return ((k, v) for k, v in six.iteritems(fields))
+
+    return ((k, v) for k, v in fields)
+
+
+def encode_multipart_formdata(fields, boundary=None):
+    """
+    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
+
+    :param fields:
+        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).
+
+    :param boundary:
+        If not specified, then a random boundary will be generated using
+        :func:`urllib3.filepost.choose_boundary`.
+    """
+    body = BytesIO()
+    if boundary is None:
+        boundary = choose_boundary()
+
+    for field in iter_field_objects(fields):
+        body.write(b('--%s\r\n' % (boundary)))
+
+        writer(body).write(field.render_headers())
+        data = field.data
+
+        if isinstance(data, int):
+            data = str(data)  # Backwards compatibility
+
+        if isinstance(data, six.text_type):
+            writer(body).write(data)
+        else:
+            body.write(data)
+
+        body.write(b'\r\n')
+
+    body.write(b('--%s--\r\n' % (boundary)))
+
+    content_type = str('multipart/form-data; boundary=%s' % boundary)
+
+    return body.getvalue(), content_type
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..decc757078cbc130be01290470271c2d90cbfbf5
GIT binary patch
literal 3780
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py
new file mode 100644
index 00000000..170e974c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py
@@ -0,0 +1,5 @@
+from __future__ import absolute_import
+
+from . import ssl_match_hostname
+
+__all__ = ('ssl_match_hostname', )
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5c3869f86c3b0f99ac84a6c2ddee72b99fdd285e
GIT binary patch
literal 369
zcmZSn%*&NH<x)&C0~9bZFfcecFfbHrF)%QsFfgPrGUPBY<T5fuF)}cwFfpVsGvqKa
z<T5ivF*7ixurWljFr=_D1Z%J}Ffe3-%+O$DU|=ZWXJBAROe)ULDJ@Bj&&(~zFDl6d
zNkC+U7#J9ei*w?06HAga;xqD#OY#zPQ-eSX{J<)}Obu3$Nn8vJ4Ds=4r6r|Bsqyha
zAS+5h1XxK4$lCb$#GIV?cny#!f+((FU|`TMD9S8LEJ@WbODxh)%g;$kEh^T}F4WI1
zHZnIiEX*=8FEg|-FV3k<FON4#F)=YPFfd5Z(+|-v$Sly!%quQQ%*oL$PqZuz%m4|2
zaeP^7UP^wEerZuoPG*v^enDb#c4B&Jv3`7fW?p7Ve7s&kWeEoZ1A|R&eoARhsvXE%
N#ViaA3<697OaQ6zRHy&|

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d1891365d7535fa183f2b86174bc7c47f867b131
GIT binary patch
literal 217
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaT5argML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWocjrNC=GM%Tn`F@{9CKi*j-@lZ^EX5|gtN(^HG}lM<7&3-XIf
kiuL2;GxIV_;^XxSDoZ#R7#M7F^HWN5Qtd#FEe5$205(=RivR!s

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
new file mode 100644
index 00000000..740db377
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+"""
+backports.makefile
+~~~~~~~~~~~~~~~~~~
+
+Backports the Python 3 ``socket.makefile`` method for use with anything that
+wants to create a "fake" socket object.
+"""
+import io
+
+from socket import SocketIO
+
+
+def backport_makefile(self, mode="r", buffering=None, encoding=None,
+                      errors=None, newline=None):
+    """
+    Backport of ``socket.makefile`` from Python 3.5.
+    """
+    if not set(mode) <= {"r", "w", "b"}:
+        raise ValueError(
+            "invalid mode %r (only r, w, b allowed)" % (mode,)
+        )
+    writing = "w" in mode
+    reading = "r" in mode or not writing
+    assert reading or writing
+    binary = "b" in mode
+    rawmode = ""
+    if reading:
+        rawmode += "r"
+    if writing:
+        rawmode += "w"
+    raw = SocketIO(self, rawmode)
+    self._makefile_refs += 1
+    if buffering is None:
+        buffering = -1
+    if buffering < 0:
+        buffering = io.DEFAULT_BUFFER_SIZE
+    if buffering == 0:
+        if not binary:
+            raise ValueError("unbuffered streams must be binary")
+        return raw
+    if reading and writing:
+        buffer = io.BufferedRWPair(raw, raw, buffering)
+    elif reading:
+        buffer = io.BufferedReader(raw, buffering)
+    else:
+        assert writing
+        buffer = io.BufferedWriter(raw, buffering)
+    if binary:
+        return buffer
+    text = io.TextIOWrapper(buffer, encoding, errors, newline)
+    text.mode = mode
+    return text
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e55119320ceb2e049f6505ced957cef97318c73b
GIT binary patch
literal 1713
zcmZSn%*&NH<x)&C0~D|^FfceUFfbI`F)%QsFfc?hFr+Xtq%bk$Ffv3jg4xUrIZO<>
z%nVV?42&r(Ah{GK7|F`e!pacE3gQN9fXphM%fP_Em6VvAU65Z?QmmJon4OxInUl&@
zhXJ^_oM6fnN-|Ov0xC-~^79mo6%rDP^OLhvOW>Ll5)^V%OEU6P6w>mG6iSOz70NS9
zG87W?DoZjl^U@VcG7?L;$`kWSiWN%o6_Sfm6H8JR5*3uv60=j46d;Bv<R@jNCYR`O
zW&Z#F|G%FGBLf3N2?qlMLonDbPyZ5-NKrD#6TA!z46F<c49=i{na0S#P{P1a!^qGK
z2@fWQ6lR7DW`=A=hGIj85=Mp;7LaTjBZF8oBSRA-LmmStJZcyjve_7F*+5|kVHfx^
z)UYw|)Uq?wurm}VfjGrU3?)n;Jt@o}Ge8<R7*bdnYB@n_irN`!I6?Z&YdJxt*03=Y
z%>oNCF+hb%m>FsqKtjz-47FS!HcJ)@Lkb&%Ia53fLk$x{3Kv5*2Sd?Wh7@*&S|+e5
zObjU;4A~3}MNb(@*ch_V#F-e1xEO0V7>d~#L4M-|c^l%X8ZL(58g_;vJw}j2^cX>!
zIT&iVz=(;VnVF%Mn<38<>~c@AEGJBg2`nWC_HrmA#LFP<aJ^s!H5?2@g^V@a48b5d
zZiX6eh8kvu8Wx5cR)%I4hFTs_7}fAF#PcxJ@Gt~xaD(E<3Y6d!6ciL-sYxL}4Qmog
zE6UG>Co(-#JuZ-@AW*D>qrMzWCKanOFfe51l_ln6rYPj*r=%*V7Aa`t=jBu?6zM3G
z>nJ2CB<AGgm#3y^mVok5CddGAn#u%mixn9d7)tY!O4HI(i&9e*ic5-86LX6da!ZR#
z6p~UEk}~rWiz@vzKuN5G8RY)dk`gWk28OW2oYGX+qN4nw5<Uh72FK#!)S{Bi{5-Hw
z5Xfk-cswja#TTWf6_>CuFfjP#=cSe~fn1$mBFw<R;Nt4$80r%e?-c6h<{A_q>>1?>
z*6IXxQ&4z7VkX2ExKL_hN-C;Qcu{6aYEcQuogt|eC7%A_MTrFksYPHbLE!@N0>}Zy
zsX1vu0-*fF$-uw>@p@)nIyiTw<|XH+fH<Ihl?w7+aS1yE14CYFc}`|tDwthflvx5&
z0unDuO@u3lgcVpxQDQmBPH>17C6<?fOoLbic27xaMTrI|jKD;369WT-enC-YSz<}5
zepzCXep-G`N@`KDes-aLcCnGUxnW_Jk$IV+g?VvKWqNtMNs5Vyfq{WRdY*oWenDn|
zZf0I_Nn%cpZh4|*X<!CO2#n*)Qu9*si}Xv2a&j`0jP(l=ld}`kQ;YTC<()n(dh`k^
zO9Vlo0WIR-@dk?AVkeMWS*0178HJg67=;;y7<m}k7}*$k!I+<spOJ@=laU7u*%<j5
zSr~a3B^cQlMVWXQg&5fwSr{c4IT^tPE;xAN<5TjJ<Ku%s2?-oFkTMUPY=S_M5+uvO
kzyJ;$1Tk2G2~-H%<mRW8=A_zz*u@}%jgf~*fSHpK0H`~l`2YX_

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py
new file mode 100644
index 00000000..190c0239
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py
@@ -0,0 +1,868 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """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):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a768efacd28dae403bdc5bef42c04287ce5fdc27
GIT binary patch
literal 36102
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
new file mode 100644
index 00000000..d6594eb2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
@@ -0,0 +1,19 @@
+import sys
+
+try:
+    # Our match_hostname function is the same as 3.5's, so we only want to
+    # import the match_hostname function if it's at least that good.
+    if sys.version_info < (3, 5):
+        raise ImportError("Fallback to vendored code")
+
+    from ssl import CertificateError, match_hostname
+except ImportError:
+    try:
+        # Backport of the function from a pypi module
+        from backports.ssl_match_hostname import CertificateError, match_hostname
+    except ImportError:
+        # Our vendored copy
+        from ._implementation import CertificateError, match_hostname
+
+# Not needed, but documenting what we provide.
+__all__ = ('CertificateError', 'match_hostname')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..74fa35c16d6275ba2f741ad771cc0511b9caea84
GIT binary patch
literal 667
zcmZSn%*&NH<x)&C0~D|_FfceUFfbG^V_;xNVPHsMWXNG)h+<%<v|vbOV8~)*Na1A2
zW?(4NWk_XWNMT`UW@Kn$WXOXkW@X4>X2@k>h+<*LWo3wBWnc`?3uRzQWn#$YVknx;
zz{tp0DFrr`l_7@>O=aO6xXS4ul__itDXa`R?5N5L=P*R%F)~D?a4|%2fSebs!Og(H
zkoo`r|NnlO%pfMn55<xU3=D3GIXOv*$=M1e`3hyJc`5ltsVNG{`6;OyObiSRB?1f#
z49=-VC7EfN$%!SYu0=)pMJ0R;3=Fx6CCM4_8TrK}d5O8HnT!k!3_+mq2?DXedJz_Z
zxk$2{Ad^APD6T9n;bCB4C`&CW&dkq?&&*59F9A8#Gq)hWs03mgSYdGvLVt-20|Nud
z%^)?!dd0;#@u;pT;b&lAh|kO|$Vtsj%_~VP$;{6yVF!uDC+6hD$7_HbiXe)+85kJ!
z3yLz!5=&C`%My$9)ADmtQj3c9vkUdJi;c|94GXi3%*zZd%!_j>)63&cQcO$?3=9m?
z^YlaX3o;9IGxLf|5_58N%M&e212aHEU>pw#Q2o-PoSe)gWBr1}<m|-s)M9;1C+o+@
zXXa&=#K-FuRF-fsFfiEU=BJeAq}qXkvsi?Ifq{pKnVFxFpGk_5mysDnGRZLm0GE%P
ANdN!<

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
new file mode 100644
index 00000000..970cf653
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
@@ -0,0 +1,156 @@
+"""The match_hostname() function from Python 3.3.3, essential when using SSL."""
+
+# Note: This file is under the PSF license as the code comes from the python
+# stdlib.   http://docs.python.org/3/license.html
+
+import re
+import sys
+
+# ipaddress has been backported to 2.6+ in pypi.  If it is installed on the
+# system, use it to handle IPAddress ServerAltnames (this was added in
+# python-3.5) otherwise only do DNS matching.  This allows
+# backports.ssl_match_hostname to continue to be used in Python 2.7.
+try:
+    from pip._vendor import ipaddress
+except ImportError:
+    ipaddress = None
+
+__version__ = '3.5.0.1'
+
+
+class CertificateError(ValueError):
+    pass
+
+
+def _dnsname_match(dn, hostname, max_wildcards=1):
+    """Matching according to RFC 6125, section 6.4.3
+
+    http://tools.ietf.org/html/rfc6125#section-6.4.3
+    """
+    pats = []
+    if not dn:
+        return False
+
+    # Ported from python3-syntax:
+    # leftmost, *remainder = dn.split(r'.')
+    parts = dn.split(r'.')
+    leftmost = parts[0]
+    remainder = parts[1:]
+
+    wildcards = leftmost.count('*')
+    if wildcards > max_wildcards:
+        # Issue #17980: avoid denials of service by refusing more
+        # than one wildcard per fragment.  A survey of established
+        # policy among SSL implementations showed it to be a
+        # reasonable choice.
+        raise CertificateError(
+            "too many wildcards in certificate DNS name: " + repr(dn))
+
+    # speed up common case w/o wildcards
+    if not wildcards:
+        return dn.lower() == hostname.lower()
+
+    # RFC 6125, section 6.4.3, subitem 1.
+    # The client SHOULD NOT attempt to match a presented identifier in which
+    # the wildcard character comprises a label other than the left-most label.
+    if leftmost == '*':
+        # When '*' is a fragment by itself, it matches a non-empty dotless
+        # fragment.
+        pats.append('[^.]+')
+    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
+        # RFC 6125, section 6.4.3, subitem 3.
+        # The client SHOULD NOT attempt to match a presented identifier
+        # where the wildcard character is embedded within an A-label or
+        # U-label of an internationalized domain name.
+        pats.append(re.escape(leftmost))
+    else:
+        # Otherwise, '*' matches any dotless string, e.g. www*
+        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
+
+    # add the remaining fragments, ignore any wildcards
+    for frag in remainder:
+        pats.append(re.escape(frag))
+
+    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+    return pat.match(hostname)
+
+
+def _to_unicode(obj):
+    if isinstance(obj, str) and sys.version_info < (3,):
+        obj = unicode(obj, encoding='ascii', errors='strict')
+    return obj
+
+def _ipaddress_match(ipname, host_ip):
+    """Exact matching of IP addresses.
+
+    RFC 6125 explicitly doesn't define an algorithm for this
+    (section 1.7.2 - "Out of Scope").
+    """
+    # OpenSSL may add a trailing newline to a subjectAltName's IP address
+    # Divergence from upstream: ipaddress can't handle byte str
+    ip = ipaddress.ip_address(_to_unicode(ipname).rstrip())
+    return ip == host_ip
+
+
+def match_hostname(cert, hostname):
+    """Verify that *cert* (in decoded format as returned by
+    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
+    rules are followed, but IP addresses are not accepted for *hostname*.
+
+    CertificateError is raised on failure. On success, the function
+    returns nothing.
+    """
+    if not cert:
+        raise ValueError("empty or no certificate, match_hostname needs a "
+                         "SSL socket or SSL context with either "
+                         "CERT_OPTIONAL or CERT_REQUIRED")
+    try:
+        # Divergence from upstream: ipaddress can't handle byte str
+        host_ip = ipaddress.ip_address(_to_unicode(hostname))
+    except ValueError:
+        # Not an IP address (common case)
+        host_ip = None
+    except UnicodeError:
+        # Divergence from upstream: Have to deal with ipaddress not taking
+        # byte strings.  addresses should be all ascii, so we consider it not
+        # an ipaddress in this case
+        host_ip = None
+    except AttributeError:
+        # Divergence from upstream: Make ipaddress library optional
+        if ipaddress is None:
+            host_ip = None
+        else:
+            raise
+    dnsnames = []
+    san = cert.get('subjectAltName', ())
+    for key, value in san:
+        if key == 'DNS':
+            if host_ip is None and _dnsname_match(value, hostname):
+                return
+            dnsnames.append(value)
+        elif key == 'IP Address':
+            if host_ip is not None and _ipaddress_match(value, host_ip):
+                return
+            dnsnames.append(value)
+    if not dnsnames:
+        # The subject is only checked when there is no dNSName entry
+        # in subjectAltName
+        for sub in cert.get('subject', ()):
+            for key, value in sub:
+                # XXX according to RFC 2818, the most specific Common Name
+                # must be used.
+                if key == 'commonName':
+                    if _dnsname_match(value, hostname):
+                        return
+                    dnsnames.append(value)
+    if len(dnsnames) > 1:
+        raise CertificateError("hostname %r "
+            "doesn't match either of %s"
+            % (hostname, ', '.join(map(repr, dnsnames))))
+    elif len(dnsnames) == 1:
+        raise CertificateError("hostname %r "
+            "doesn't match %r"
+            % (hostname, dnsnames[0]))
+    else:
+        raise CertificateError("no appropriate commonName or "
+            "subjectAltName fields were found")
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b76e37da5f6d22791b32e0ba5c51022ef988853c
GIT binary patch
literal 4598
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
AVgLXD

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py
new file mode 100644
index 00000000..fe5491cf
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py
@@ -0,0 +1,450 @@
+from __future__ import absolute_import
+import collections
+import functools
+import logging
+
+from ._collections import RecentlyUsedContainer
+from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
+from .connectionpool import port_by_scheme
+from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown
+from .packages.six.moves.urllib.parse import urljoin
+from .request import RequestMethods
+from .util.url import parse_url
+from .util.retry import Retry
+
+
+__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']
+
+
+log = logging.getLogger(__name__)
+
+SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',
+                'ssl_version', 'ca_cert_dir', 'ssl_context')
+
+# All known keyword arguments that could be provided to the pool manager, its
+# pools, or the underlying connections. This is used to construct a pool key.
+_key_fields = (
+    'key_scheme',  # str
+    'key_host',  # str
+    'key_port',  # int
+    'key_timeout',  # int or float or Timeout
+    'key_retries',  # int or Retry
+    'key_strict',  # bool
+    'key_block',  # bool
+    'key_source_address',  # str
+    'key_key_file',  # str
+    'key_cert_file',  # str
+    'key_cert_reqs',  # str
+    'key_ca_certs',  # str
+    'key_ssl_version',  # str
+    'key_ca_cert_dir',  # str
+    'key_ssl_context',  # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext
+    'key_maxsize',  # int
+    'key_headers',  # dict
+    'key__proxy',  # parsed proxy url
+    'key__proxy_headers',  # dict
+    'key_socket_options',  # list of (level (int), optname (int), value (int or str)) tuples
+    'key__socks_options',  # dict
+    'key_assert_hostname',  # bool or string
+    'key_assert_fingerprint',  # str
+    'key_server_hostname', #str
+)
+
+#: The namedtuple class used to construct keys for the connection pool.
+#: All custom key schemes should include the fields in this key at a minimum.
+PoolKey = collections.namedtuple('PoolKey', _key_fields)
+
+
+def _default_key_normalizer(key_class, request_context):
+    """
+    Create a pool key out of a request context dictionary.
+
+    According to RFC 3986, both the scheme and host are case-insensitive.
+    Therefore, this function normalizes both before constructing the pool
+    key for an HTTPS request. If you wish to change this behaviour, provide
+    alternate callables to ``key_fn_by_scheme``.
+
+    :param key_class:
+        The class to use when constructing the key. This should be a namedtuple
+        with the ``scheme`` and ``host`` keys at a minimum.
+    :type  key_class: namedtuple
+    :param request_context:
+        A dictionary-like object that contain the context for a request.
+    :type  request_context: dict
+
+    :return: A namedtuple that can be used as a connection pool key.
+    :rtype:  PoolKey
+    """
+    # Since we mutate the dictionary, make a copy first
+    context = request_context.copy()
+    context['scheme'] = context['scheme'].lower()
+    context['host'] = context['host'].lower()
+
+    # These are both dictionaries and need to be transformed into frozensets
+    for key in ('headers', '_proxy_headers', '_socks_options'):
+        if key in context and context[key] is not None:
+            context[key] = frozenset(context[key].items())
+
+    # The socket_options key may be a list and needs to be transformed into a
+    # tuple.
+    socket_opts = context.get('socket_options')
+    if socket_opts is not None:
+        context['socket_options'] = tuple(socket_opts)
+
+    # Map the kwargs to the names in the namedtuple - this is necessary since
+    # namedtuples can't have fields starting with '_'.
+    for key in list(context.keys()):
+        context['key_' + key] = context.pop(key)
+
+    # Default to ``None`` for keys missing from the context
+    for field in key_class._fields:
+        if field not in context:
+            context[field] = None
+
+    return key_class(**context)
+
+
+#: A dictionary that maps a scheme to a callable that creates a pool key.
+#: This can be used to alter the way pool keys are constructed, if desired.
+#: Each PoolManager makes a copy of this dictionary so they can be configured
+#: globally here, or individually on the instance.
+key_fn_by_scheme = {
+    'http': functools.partial(_default_key_normalizer, PoolKey),
+    'https': functools.partial(_default_key_normalizer, PoolKey),
+}
+
+pool_classes_by_scheme = {
+    'http': HTTPConnectionPool,
+    'https': HTTPSConnectionPool,
+}
+
+
+class PoolManager(RequestMethods):
+    """
+    Allows for arbitrary requests while transparently keeping track of
+    necessary connection pools for you.
+
+    :param num_pools:
+        Number of connection pools to cache before discarding the least
+        recently used pool.
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+
+    :param \\**connection_pool_kw:
+        Additional parameters are used to create fresh
+        :class:`urllib3.connectionpool.ConnectionPool` instances.
+
+    Example::
+
+        >>> manager = PoolManager(num_pools=2)
+        >>> r = manager.request('GET', 'http://google.com/')
+        >>> r = manager.request('GET', 'http://google.com/mail')
+        >>> r = manager.request('GET', 'http://yahoo.com/')
+        >>> len(manager.pools)
+        2
+
+    """
+
+    proxy = None
+
+    def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
+        RequestMethods.__init__(self, headers)
+        self.connection_pool_kw = connection_pool_kw
+        self.pools = RecentlyUsedContainer(num_pools,
+                                           dispose_func=lambda p: p.close())
+
+        # Locally set the pool classes and keys so other PoolManagers can
+        # override them.
+        self.pool_classes_by_scheme = pool_classes_by_scheme
+        self.key_fn_by_scheme = key_fn_by_scheme.copy()
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.clear()
+        # Return False to re-raise any potential exceptions
+        return False
+
+    def _new_pool(self, scheme, host, port, request_context=None):
+        """
+        Create a new :class:`ConnectionPool` based on host, port, scheme, and
+        any additional pool keyword arguments.
+
+        If ``request_context`` is provided, it is provided as keyword arguments
+        to the pool class used. This method is used to actually create the
+        connection pools handed out by :meth:`connection_from_url` and
+        companion methods. It is intended to be overridden for customization.
+        """
+        pool_cls = self.pool_classes_by_scheme[scheme]
+        if request_context is None:
+            request_context = self.connection_pool_kw.copy()
+
+        # Although the context has everything necessary to create the pool,
+        # this function has historically only used the scheme, host, and port
+        # in the positional args. When an API change is acceptable these can
+        # be removed.
+        for key in ('scheme', 'host', 'port'):
+            request_context.pop(key, None)
+
+        if scheme == 'http':
+            for kw in SSL_KEYWORDS:
+                request_context.pop(kw, None)
+
+        return pool_cls(host, port, **request_context)
+
+    def clear(self):
+        """
+        Empty our store of pools and direct them all to close.
+
+        This will not affect in-flight connections, but they will not be
+        re-used after completion.
+        """
+        self.pools.clear()
+
+    def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None):
+        """
+        Get a :class:`ConnectionPool` based on the host, port, and scheme.
+
+        If ``port`` isn't given, it will be derived from the ``scheme`` using
+        ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is
+        provided, it is merged with the instance's ``connection_pool_kw``
+        variable and used to create the new connection pool, if one is
+        needed.
+        """
+
+        if not host:
+            raise LocationValueError("No host specified.")
+
+        request_context = self._merge_pool_kwargs(pool_kwargs)
+        request_context['scheme'] = scheme or 'http'
+        if not port:
+            port = port_by_scheme.get(request_context['scheme'].lower(), 80)
+        request_context['port'] = port
+        request_context['host'] = host
+
+        return self.connection_from_context(request_context)
+
+    def connection_from_context(self, request_context):
+        """
+        Get a :class:`ConnectionPool` based on the request context.
+
+        ``request_context`` must at least contain the ``scheme`` key and its
+        value must be a key in ``key_fn_by_scheme`` instance variable.
+        """
+        scheme = request_context['scheme'].lower()
+        pool_key_constructor = self.key_fn_by_scheme[scheme]
+        pool_key = pool_key_constructor(request_context)
+
+        return self.connection_from_pool_key(pool_key, request_context=request_context)
+
+    def connection_from_pool_key(self, pool_key, request_context=None):
+        """
+        Get a :class:`ConnectionPool` based on the provided pool key.
+
+        ``pool_key`` should be a namedtuple that only contains immutable
+        objects. At a minimum it must have the ``scheme``, ``host``, and
+        ``port`` fields.
+        """
+        with self.pools.lock:
+            # If the scheme, host, or port doesn't match existing open
+            # connections, open a new ConnectionPool.
+            pool = self.pools.get(pool_key)
+            if pool:
+                return pool
+
+            # Make a fresh ConnectionPool of the desired type
+            scheme = request_context['scheme']
+            host = request_context['host']
+            port = request_context['port']
+            pool = self._new_pool(scheme, host, port, request_context=request_context)
+            self.pools[pool_key] = pool
+
+        return pool
+
+    def connection_from_url(self, url, pool_kwargs=None):
+        """
+        Similar to :func:`urllib3.connectionpool.connection_from_url`.
+
+        If ``pool_kwargs`` is not provided and a new pool needs to be
+        constructed, ``self.connection_pool_kw`` is used to initialize
+        the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs``
+        is provided, it is used instead. Note that if a new pool does not
+        need to be created for the request, the provided ``pool_kwargs`` are
+        not used.
+        """
+        u = parse_url(url)
+        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme,
+                                         pool_kwargs=pool_kwargs)
+
+    def _merge_pool_kwargs(self, override):
+        """
+        Merge a dictionary of override values for self.connection_pool_kw.
+
+        This does not modify self.connection_pool_kw and returns a new dict.
+        Any keys in the override dictionary with a value of ``None`` are
+        removed from the merged dictionary.
+        """
+        base_pool_kwargs = self.connection_pool_kw.copy()
+        if override:
+            for key, value in override.items():
+                if value is None:
+                    try:
+                        del base_pool_kwargs[key]
+                    except KeyError:
+                        pass
+                else:
+                    base_pool_kwargs[key] = value
+        return base_pool_kwargs
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        """
+        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
+        with custom cross-host redirect logic and only sends the request-uri
+        portion of the ``url``.
+
+        The given ``url`` parameter must be absolute, such that an appropriate
+        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
+        """
+        u = parse_url(url)
+        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
+
+        kw['assert_same_host'] = False
+        kw['redirect'] = False
+
+        if 'headers' not in kw:
+            kw['headers'] = self.headers.copy()
+
+        if self.proxy is not None and u.scheme == "http":
+            response = conn.urlopen(method, url, **kw)
+        else:
+            response = conn.urlopen(method, u.request_uri, **kw)
+
+        redirect_location = redirect and response.get_redirect_location()
+        if not redirect_location:
+            return response
+
+        # Support relative URLs for redirecting.
+        redirect_location = urljoin(url, redirect_location)
+
+        # RFC 7231, Section 6.4.4
+        if response.status == 303:
+            method = 'GET'
+
+        retries = kw.get('retries')
+        if not isinstance(retries, Retry):
+            retries = Retry.from_int(retries, redirect=redirect)
+
+        # Strip headers marked as unsafe to forward to the redirected location.
+        # Check remove_headers_on_redirect to avoid a potential network call within
+        # conn.is_same_host() which may use socket.gethostbyname() in the future.
+        if (retries.remove_headers_on_redirect
+                and not conn.is_same_host(redirect_location)):
+            for header in retries.remove_headers_on_redirect:
+                kw['headers'].pop(header, None)
+
+        try:
+            retries = retries.increment(method, url, response=response, _pool=conn)
+        except MaxRetryError:
+            if retries.raise_on_redirect:
+                raise
+            return response
+
+        kw['retries'] = retries
+        kw['redirect'] = redirect
+
+        log.info("Redirecting %s -> %s", url, redirect_location)
+        return self.urlopen(method, redirect_location, **kw)
+
+
+class ProxyManager(PoolManager):
+    """
+    Behaves just like :class:`PoolManager`, but sends all requests through
+    the defined proxy, using the CONNECT method for HTTPS URLs.
+
+    :param proxy_url:
+        The URL of the proxy to be used.
+
+    :param proxy_headers:
+        A dictionary containing headers that will be sent to the proxy. In case
+        of HTTP they are being sent with each request, while in the
+        HTTPS/CONNECT case they are sent only once. Could be used for proxy
+        authentication.
+
+    Example:
+        >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
+        >>> r1 = proxy.request('GET', 'http://google.com/')
+        >>> r2 = proxy.request('GET', 'http://httpbin.org/')
+        >>> len(proxy.pools)
+        1
+        >>> r3 = proxy.request('GET', 'https://httpbin.org/')
+        >>> r4 = proxy.request('GET', 'https://twitter.com/')
+        >>> len(proxy.pools)
+        3
+
+    """
+
+    def __init__(self, proxy_url, num_pools=10, headers=None,
+                 proxy_headers=None, **connection_pool_kw):
+
+        if isinstance(proxy_url, HTTPConnectionPool):
+            proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host,
+                                        proxy_url.port)
+        proxy = parse_url(proxy_url)
+        if not proxy.port:
+            port = port_by_scheme.get(proxy.scheme, 80)
+            proxy = proxy._replace(port=port)
+
+        if proxy.scheme not in ("http", "https"):
+            raise ProxySchemeUnknown(proxy.scheme)
+
+        self.proxy = proxy
+        self.proxy_headers = proxy_headers or {}
+
+        connection_pool_kw['_proxy'] = self.proxy
+        connection_pool_kw['_proxy_headers'] = self.proxy_headers
+
+        super(ProxyManager, self).__init__(
+            num_pools, headers, **connection_pool_kw)
+
+    def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None):
+        if scheme == "https":
+            return super(ProxyManager, self).connection_from_host(
+                host, port, scheme, pool_kwargs=pool_kwargs)
+
+        return super(ProxyManager, self).connection_from_host(
+            self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs)
+
+    def _set_proxy_headers(self, url, headers=None):
+        """
+        Sets headers needed by proxies: specifically, the Accept and Host
+        headers. Only sets headers not provided by the user.
+        """
+        headers_ = {'Accept': '*/*'}
+
+        netloc = parse_url(url).netloc
+        if netloc:
+            headers_['Host'] = netloc
+
+        if headers:
+            headers_.update(headers)
+        return headers_
+
+    def urlopen(self, method, url, redirect=True, **kw):
+        "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
+        u = parse_url(url)
+
+        if u.scheme == "http":
+            # For proxied HTTPS requests, httplib sets the necessary headers
+            # on the CONNECT to the proxy. For HTTP, we'll definitely
+            # need to set 'Host' at the very least.
+            headers = kw.get('headers', self.headers)
+            kw['headers'] = self._set_proxy_headers(url, headers)
+
+        return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw)
+
+
+def proxy_from_url(url, **kw):
+    return ProxyManager(proxy_url=url, **kw)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e76d05951d5f3396f657a2bfb1ac65ded1c787b8
GIT binary patch
literal 16072
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py
new file mode 100644
index 00000000..8f2f44bb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py
@@ -0,0 +1,150 @@
+from __future__ import absolute_import
+
+from .filepost import encode_multipart_formdata
+from .packages.six.moves.urllib.parse import urlencode
+
+
+__all__ = ['RequestMethods']
+
+
+class RequestMethods(object):
+    """
+    Convenience mixin for classes who implement a :meth:`urlopen` method, such
+    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
+    :class:`~urllib3.poolmanager.PoolManager`.
+
+    Provides behavior for making common types of HTTP request methods and
+    decides which type of request field encoding to use.
+
+    Specifically,
+
+    :meth:`.request_encode_url` is for sending requests whose fields are
+    encoded in the URL (such as GET, HEAD, DELETE).
+
+    :meth:`.request_encode_body` is for sending requests whose fields are
+    encoded in the *body* of the request using multipart or www-form-urlencoded
+    (such as for POST, PUT, PATCH).
+
+    :meth:`.request` is for making any kind of request, it will look up the
+    appropriate encoding format and use one of the above two methods to make
+    the request.
+
+    Initializer parameters:
+
+    :param headers:
+        Headers to include with all requests, unless other headers are given
+        explicitly.
+    """
+
+    _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'}
+
+    def __init__(self, headers=None):
+        self.headers = headers or {}
+
+    def urlopen(self, method, url, body=None, headers=None,
+                encode_multipart=True, multipart_boundary=None,
+                **kw):  # Abstract
+        raise NotImplementedError("Classes extending RequestMethods must implement "
+                                  "their own ``urlopen`` method.")
+
+    def request(self, method, url, fields=None, headers=None, **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the appropriate encoding of
+        ``fields`` based on the ``method`` used.
+
+        This is a convenience method that requires the least amount of manual
+        effort. It can be used in most situations, while still having the
+        option to drop down to more specific methods when necessary, such as
+        :meth:`request_encode_url`, :meth:`request_encode_body`,
+        or even the lowest level :meth:`urlopen`.
+        """
+        method = method.upper()
+
+        urlopen_kw['request_url'] = url
+
+        if method in self._encode_url_methods:
+            return self.request_encode_url(method, url, fields=fields,
+                                           headers=headers,
+                                           **urlopen_kw)
+        else:
+            return self.request_encode_body(method, url, fields=fields,
+                                            headers=headers,
+                                            **urlopen_kw)
+
+    def request_encode_url(self, method, url, fields=None, headers=None,
+                           **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
+        """
+        if headers is None:
+            headers = self.headers
+
+        extra_kw = {'headers': headers}
+        extra_kw.update(urlopen_kw)
+
+        if fields:
+            url += '?' + urlencode(fields)
+
+        return self.urlopen(method, url, **extra_kw)
+
+    def request_encode_body(self, method, url, fields=None, headers=None,
+                            encode_multipart=True, multipart_boundary=None,
+                            **urlopen_kw):
+        """
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
+        the body. This is useful for request methods like POST, PUT, PATCH, etc.
+
+        When ``encode_multipart=True`` (default), then
+        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode
+        the payload with the appropriate content type. Otherwise
+        :meth:`urllib.urlencode` is used with the
+        'application/x-www-form-urlencoded' content type.
+
+        Multipart encoding must be used when posting files, and it's reasonably
+        safe to use it in other times too. However, it may break request
+        signing, such as with OAuth.
+
+        Supports an optional ``fields`` parameter of key/value strings AND
+        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
+        the MIME type is optional. For example::
+
+            fields = {
+                'foo': 'bar',
+                'fakefile': ('foofile.txt', 'contents of foofile'),
+                'realfile': ('barfile.txt', open('realfile').read()),
+                'typedfile': ('bazfile.bin', open('bazfile').read(),
+                              'image/jpeg'),
+                'nonamefile': 'contents of nonamefile field',
+            }
+
+        When uploading a file, providing a filename (the first parameter of the
+        tuple) is optional but recommended to best mimic behavior of browsers.
+
+        Note that if ``headers`` are supplied, the 'Content-Type' header will
+        be overwritten because it depends on the dynamic random boundary string
+        which is used to compose the body of the request. The random boundary
+        string can be explicitly set with the ``multipart_boundary`` parameter.
+        """
+        if headers is None:
+            headers = self.headers
+
+        extra_kw = {'headers': {}}
+
+        if fields:
+            if 'body' in urlopen_kw:
+                raise TypeError(
+                    "request got values for both 'fields' and 'body', can only specify one.")
+
+            if encode_multipart:
+                body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary)
+            else:
+                body, content_type = urlencode(fields), 'application/x-www-form-urlencoded'
+
+            extra_kw['body'] = body
+            extra_kw['headers'] = {'Content-Type': content_type}
+
+        extra_kw['headers'].update(headers)
+        extra_kw.update(urlopen_kw)
+
+        return self.urlopen(method, url, **extra_kw)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..32712cc393226e3fa868b496bc23459342a89cbd
GIT binary patch
literal 6445
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
B`hoxe

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py
new file mode 100644
index 00000000..c112690b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py
@@ -0,0 +1,705 @@
+from __future__ import absolute_import
+from contextlib import contextmanager
+import zlib
+import io
+import logging
+from socket import timeout as SocketTimeout
+from socket import error as SocketError
+
+from ._collections import HTTPHeaderDict
+from .exceptions import (
+    BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError,
+    ResponseNotChunked, IncompleteRead, InvalidHeader
+)
+from .packages.six import string_types as basestring, PY3
+from .packages.six.moves import http_client as httplib
+from .connection import HTTPException, BaseSSLError
+from .util.response import is_fp_closed, is_response_to_head
+
+log = logging.getLogger(__name__)
+
+
+class DeflateDecoder(object):
+
+    def __init__(self):
+        self._first_try = True
+        self._data = b''
+        self._obj = zlib.decompressobj()
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def decompress(self, data):
+        if not data:
+            return data
+
+        if not self._first_try:
+            return self._obj.decompress(data)
+
+        self._data += data
+        try:
+            decompressed = self._obj.decompress(data)
+            if decompressed:
+                self._first_try = False
+                self._data = None
+            return decompressed
+        except zlib.error:
+            self._first_try = False
+            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
+            try:
+                return self.decompress(self._data)
+            finally:
+                self._data = None
+
+
+class GzipDecoderState(object):
+
+    FIRST_MEMBER = 0
+    OTHER_MEMBERS = 1
+    SWALLOW_DATA = 2
+
+
+class GzipDecoder(object):
+
+    def __init__(self):
+        self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
+        self._state = GzipDecoderState.FIRST_MEMBER
+
+    def __getattr__(self, name):
+        return getattr(self._obj, name)
+
+    def decompress(self, data):
+        ret = bytearray()
+        if self._state == GzipDecoderState.SWALLOW_DATA or not data:
+            return bytes(ret)
+        while True:
+            try:
+                ret += self._obj.decompress(data)
+            except zlib.error:
+                previous_state = self._state
+                # Ignore data after the first error
+                self._state = GzipDecoderState.SWALLOW_DATA
+                if previous_state == GzipDecoderState.OTHER_MEMBERS:
+                    # Allow trailing garbage acceptable in other gzip clients
+                    return bytes(ret)
+                raise
+            data = self._obj.unused_data
+            if not data:
+                return bytes(ret)
+            self._state = GzipDecoderState.OTHER_MEMBERS
+            self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
+
+
+class MultiDecoder(object):
+    """
+    From RFC7231:
+        If one or more encodings have been applied to a representation, the
+        sender that applied the encodings MUST generate a Content-Encoding
+        header field that lists the content codings in the order in which
+        they were applied.
+    """
+
+    def __init__(self, modes):
+        self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')]
+
+    def flush(self):
+        return self._decoders[0].flush()
+
+    def decompress(self, data):
+        for d in reversed(self._decoders):
+            data = d.decompress(data)
+        return data
+
+
+def _get_decoder(mode):
+    if ',' in mode:
+        return MultiDecoder(mode)
+
+    if mode == 'gzip':
+        return GzipDecoder()
+
+    return DeflateDecoder()
+
+
+class HTTPResponse(io.IOBase):
+    """
+    HTTP Response container.
+
+    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
+    loaded and decoded on-demand when the ``data`` property is accessed.  This
+    class is also compatible with the Python standard library's :mod:`io`
+    module, and can hence be treated as a readable object in the context of that
+    framework.
+
+    Extra parameters for behaviour not present in httplib.HTTPResponse:
+
+    :param preload_content:
+        If True, the response's body will be preloaded during construction.
+
+    :param decode_content:
+        If True, will attempt to decode the body based on the
+        'content-encoding' header.
+
+    :param original_response:
+        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
+        object, it's convenient to include the original for debug purposes. It's
+        otherwise unused.
+
+    :param retries:
+        The retries contains the last :class:`~urllib3.util.retry.Retry` that
+        was used during the request.
+
+    :param enforce_content_length:
+        Enforce content length checking. Body returned by server must match
+        value of Content-Length header, if present. Otherwise, raise error.
+    """
+
+    CONTENT_DECODERS = ['gzip', 'deflate']
+    REDIRECT_STATUSES = [301, 302, 303, 307, 308]
+
+    def __init__(self, body='', headers=None, status=0, version=0, reason=None,
+                 strict=0, preload_content=True, decode_content=True,
+                 original_response=None, pool=None, connection=None, msg=None,
+                 retries=None, enforce_content_length=False,
+                 request_method=None, request_url=None):
+
+        if isinstance(headers, HTTPHeaderDict):
+            self.headers = headers
+        else:
+            self.headers = HTTPHeaderDict(headers)
+        self.status = status
+        self.version = version
+        self.reason = reason
+        self.strict = strict
+        self.decode_content = decode_content
+        self.retries = retries
+        self.enforce_content_length = enforce_content_length
+
+        self._decoder = None
+        self._body = None
+        self._fp = None
+        self._original_response = original_response
+        self._fp_bytes_read = 0
+        self.msg = msg
+        self._request_url = request_url
+
+        if body and isinstance(body, (basestring, bytes)):
+            self._body = body
+
+        self._pool = pool
+        self._connection = connection
+
+        if hasattr(body, 'read'):
+            self._fp = body
+
+        # Are we using the chunked-style of transfer encoding?
+        self.chunked = False
+        self.chunk_left = None
+        tr_enc = self.headers.get('transfer-encoding', '').lower()
+        # Don't incur the penalty of creating a list and then discarding it
+        encodings = (enc.strip() for enc in tr_enc.split(","))
+        if "chunked" in encodings:
+            self.chunked = True
+
+        # Determine length of response
+        self.length_remaining = self._init_length(request_method)
+
+        # If requested, preload the body.
+        if preload_content and not self._body:
+            self._body = self.read(decode_content=decode_content)
+
+    def get_redirect_location(self):
+        """
+        Should we redirect and where to?
+
+        :returns: Truthy redirect location string if we got a redirect status
+            code and valid location. ``None`` if redirect status and no
+            location. ``False`` if not a redirect status code.
+        """
+        if self.status in self.REDIRECT_STATUSES:
+            return self.headers.get('location')
+
+        return False
+
+    def release_conn(self):
+        if not self._pool or not self._connection:
+            return
+
+        self._pool._put_conn(self._connection)
+        self._connection = None
+
+    @property
+    def data(self):
+        # For backwords-compat with earlier urllib3 0.4 and earlier.
+        if self._body:
+            return self._body
+
+        if self._fp:
+            return self.read(cache_content=True)
+
+    @property
+    def connection(self):
+        return self._connection
+
+    def isclosed(self):
+        return is_fp_closed(self._fp)
+
+    def tell(self):
+        """
+        Obtain the number of bytes pulled over the wire so far. May differ from
+        the amount of content returned by :meth:``HTTPResponse.read`` if bytes
+        are encoded on the wire (e.g, compressed).
+        """
+        return self._fp_bytes_read
+
+    def _init_length(self, request_method):
+        """
+        Set initial length value for Response content if available.
+        """
+        length = self.headers.get('content-length')
+
+        if length is not None:
+            if self.chunked:
+                # This Response will fail with an IncompleteRead if it can't be
+                # received as chunked. This method falls back to attempt reading
+                # the response before raising an exception.
+                log.warning("Received response with both Content-Length and "
+                            "Transfer-Encoding set. This is expressly forbidden "
+                            "by RFC 7230 sec 3.3.2. Ignoring Content-Length and "
+                            "attempting to process response as Transfer-Encoding: "
+                            "chunked.")
+                return None
+
+            try:
+                # RFC 7230 section 3.3.2 specifies multiple content lengths can
+                # be sent in a single Content-Length header
+                # (e.g. Content-Length: 42, 42). This line ensures the values
+                # are all valid ints and that as long as the `set` length is 1,
+                # all values are the same. Otherwise, the header is invalid.
+                lengths = set([int(val) for val in length.split(',')])
+                if len(lengths) > 1:
+                    raise InvalidHeader("Content-Length contained multiple "
+                                        "unmatching values (%s)" % length)
+                length = lengths.pop()
+            except ValueError:
+                length = None
+            else:
+                if length < 0:
+                    length = None
+
+        # Convert status to int for comparison
+        # In some cases, httplib returns a status of "_UNKNOWN"
+        try:
+            status = int(self.status)
+        except ValueError:
+            status = 0
+
+        # Check for responses that shouldn't include a body
+        if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD':
+            length = 0
+
+        return length
+
+    def _init_decoder(self):
+        """
+        Set-up the _decoder attribute if necessary.
+        """
+        # Note: content-encoding value should be case-insensitive, per RFC 7230
+        # Section 3.2
+        content_encoding = self.headers.get('content-encoding', '').lower()
+        if self._decoder is None:
+            if content_encoding in self.CONTENT_DECODERS:
+                self._decoder = _get_decoder(content_encoding)
+            elif ',' in content_encoding:
+                encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS]
+                if len(encodings):
+                    self._decoder = _get_decoder(content_encoding)
+
+    def _decode(self, data, decode_content, flush_decoder):
+        """
+        Decode the data passed in and potentially flush the decoder.
+        """
+        try:
+            if decode_content and self._decoder:
+                data = self._decoder.decompress(data)
+        except (IOError, zlib.error) as e:
+            content_encoding = self.headers.get('content-encoding', '').lower()
+            raise DecodeError(
+                "Received response with content-encoding: %s, but "
+                "failed to decode it." % content_encoding, e)
+
+        if flush_decoder and decode_content:
+            data += self._flush_decoder()
+
+        return data
+
+    def _flush_decoder(self):
+        """
+        Flushes the decoder. Should only be called if the decoder is actually
+        being used.
+        """
+        if self._decoder:
+            buf = self._decoder.decompress(b'')
+            return buf + self._decoder.flush()
+
+        return b''
+
+    @contextmanager
+    def _error_catcher(self):
+        """
+        Catch low-level python exceptions, instead re-raising urllib3
+        variants, so that low-level exceptions are not leaked in the
+        high-level api.
+
+        On exit, release the connection back to the pool.
+        """
+        clean_exit = False
+
+        try:
+            try:
+                yield
+
+            except SocketTimeout:
+                # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but
+                # there is yet no clean way to get at it from this context.
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
+
+            except BaseSSLError as e:
+                # FIXME: Is there a better way to differentiate between SSLErrors?
+                if 'read operation timed out' not in str(e):  # Defensive:
+                    # This shouldn't happen but just in case we're missing an edge
+                    # case, let's avoid swallowing SSL errors.
+                    raise
+
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
+
+            except (HTTPException, SocketError) as e:
+                # This includes IncompleteRead.
+                raise ProtocolError('Connection broken: %r' % e, e)
+
+            # If no exception is thrown, we should avoid cleaning up
+            # unnecessarily.
+            clean_exit = True
+        finally:
+            # If we didn't terminate cleanly, we need to throw away our
+            # connection.
+            if not clean_exit:
+                # The response may not be closed but we're not going to use it
+                # anymore so close it now to ensure that the connection is
+                # released back to the pool.
+                if self._original_response:
+                    self._original_response.close()
+
+                # Closing the response may not actually be sufficient to close
+                # everything, so if we have a hold of the connection close that
+                # too.
+                if self._connection:
+                    self._connection.close()
+
+            # If we hold the original response but it's closed now, we should
+            # return the connection back to the pool.
+            if self._original_response and self._original_response.isclosed():
+                self.release_conn()
+
+    def read(self, amt=None, decode_content=None, cache_content=False):
+        """
+        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
+        parameters: ``decode_content`` and ``cache_content``.
+
+        :param amt:
+            How much of the content to read. If specified, caching is skipped
+            because it doesn't make sense to cache partial content as the full
+            response.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+
+        :param cache_content:
+            If True, will save the returned data such that the same result is
+            returned despite of the state of the underlying file object. This
+            is useful if you want the ``.data`` property to continue working
+            after having ``.read()`` the file object. (Overridden if ``amt`` is
+            set.)
+        """
+        self._init_decoder()
+        if decode_content is None:
+            decode_content = self.decode_content
+
+        if self._fp is None:
+            return
+
+        flush_decoder = False
+        data = None
+
+        with self._error_catcher():
+            if amt is None:
+                # cStringIO doesn't like amt=None
+                data = self._fp.read()
+                flush_decoder = True
+            else:
+                cache_content = False
+                data = self._fp.read(amt)
+                if amt != 0 and not data:  # Platform-specific: Buggy versions of Python.
+                    # Close the connection when no data is returned
+                    #
+                    # This is redundant to what httplib/http.client _should_
+                    # already do.  However, versions of python released before
+                    # December 15, 2012 (http://bugs.python.org/issue16298) do
+                    # not properly close the connection in all cases. There is
+                    # no harm in redundantly calling close.
+                    self._fp.close()
+                    flush_decoder = True
+                    if self.enforce_content_length and self.length_remaining not in (0, None):
+                        # This is an edge case that httplib failed to cover due
+                        # to concerns of backward compatibility. We're
+                        # addressing it here to make sure IncompleteRead is
+                        # raised during streaming, so all calls with incorrect
+                        # Content-Length are caught.
+                        raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
+
+        if data:
+            self._fp_bytes_read += len(data)
+            if self.length_remaining is not None:
+                self.length_remaining -= len(data)
+
+            data = self._decode(data, decode_content, flush_decoder)
+
+            if cache_content:
+                self._body = data
+
+        return data
+
+    def stream(self, amt=2**16, decode_content=None):
+        """
+        A generator wrapper for the read() method. A call will block until
+        ``amt`` bytes have been read from the connection or until the
+        connection is closed.
+
+        :param amt:
+            How much of the content to read. The generator will return up to
+            much data per iteration, but may return less. This is particularly
+            likely when using compressed data. However, the empty string will
+            never be returned.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+        """
+        if self.chunked and self.supports_chunked_reads():
+            for line in self.read_chunked(amt, decode_content=decode_content):
+                yield line
+        else:
+            while not is_fp_closed(self._fp):
+                data = self.read(amt=amt, decode_content=decode_content)
+
+                if data:
+                    yield data
+
+    @classmethod
+    def from_httplib(ResponseCls, r, **response_kw):
+        """
+        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
+        corresponding :class:`urllib3.response.HTTPResponse` object.
+
+        Remaining parameters are passed to the HTTPResponse constructor, along
+        with ``original_response=r``.
+        """
+        headers = r.msg
+
+        if not isinstance(headers, HTTPHeaderDict):
+            if PY3:  # Python 3
+                headers = HTTPHeaderDict(headers.items())
+            else:  # Python 2
+                headers = HTTPHeaderDict.from_httplib(headers)
+
+        # HTTPResponse objects in Python 3 don't have a .strict attribute
+        strict = getattr(r, 'strict', 0)
+        resp = ResponseCls(body=r,
+                           headers=headers,
+                           status=r.status,
+                           version=r.version,
+                           reason=r.reason,
+                           strict=strict,
+                           original_response=r,
+                           **response_kw)
+        return resp
+
+    # Backwards-compatibility methods for httplib.HTTPResponse
+    def getheaders(self):
+        return self.headers
+
+    def getheader(self, name, default=None):
+        return self.headers.get(name, default)
+
+    # Backwards compatibility for http.cookiejar
+    def info(self):
+        return self.headers
+
+    # Overrides from io.IOBase
+    def close(self):
+        if not self.closed:
+            self._fp.close()
+
+        if self._connection:
+            self._connection.close()
+
+    @property
+    def closed(self):
+        if self._fp is None:
+            return True
+        elif hasattr(self._fp, 'isclosed'):
+            return self._fp.isclosed()
+        elif hasattr(self._fp, 'closed'):
+            return self._fp.closed
+        else:
+            return True
+
+    def fileno(self):
+        if self._fp is None:
+            raise IOError("HTTPResponse has no file to get a fileno from")
+        elif hasattr(self._fp, "fileno"):
+            return self._fp.fileno()
+        else:
+            raise IOError("The file-like object this HTTPResponse is wrapped "
+                          "around has no file descriptor")
+
+    def flush(self):
+        if self._fp is not None and hasattr(self._fp, 'flush'):
+            return self._fp.flush()
+
+    def readable(self):
+        # This method is required for `io` module compatibility.
+        return True
+
+    def readinto(self, b):
+        # This method is required for `io` module compatibility.
+        temp = self.read(len(b))
+        if len(temp) == 0:
+            return 0
+        else:
+            b[:len(temp)] = temp
+            return len(temp)
+
+    def supports_chunked_reads(self):
+        """
+        Checks if the underlying file-like object looks like a
+        httplib.HTTPResponse object. We do this by testing for the fp
+        attribute. If it is present we assume it returns raw chunks as
+        processed by read_chunked().
+        """
+        return hasattr(self._fp, 'fp')
+
+    def _update_chunk_length(self):
+        # First, we'll figure out length of a chunk and then
+        # we'll try to read it from socket.
+        if self.chunk_left is not None:
+            return
+        line = self._fp.fp.readline()
+        line = line.split(b';', 1)[0]
+        try:
+            self.chunk_left = int(line, 16)
+        except ValueError:
+            # Invalid chunked protocol response, abort.
+            self.close()
+            raise httplib.IncompleteRead(line)
+
+    def _handle_chunk(self, amt):
+        returned_chunk = None
+        if amt is None:
+            chunk = self._fp._safe_read(self.chunk_left)
+            returned_chunk = chunk
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+        elif amt < self.chunk_left:
+            value = self._fp._safe_read(amt)
+            self.chunk_left = self.chunk_left - amt
+            returned_chunk = value
+        elif amt == self.chunk_left:
+            value = self._fp._safe_read(amt)
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+            returned_chunk = value
+        else:  # amt > self.chunk_left
+            returned_chunk = self._fp._safe_read(self.chunk_left)
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
+            self.chunk_left = None
+        return returned_chunk
+
+    def read_chunked(self, amt=None, decode_content=None):
+        """
+        Similar to :meth:`HTTPResponse.read`, but with an additional
+        parameter: ``decode_content``.
+
+        :param amt:
+            How much of the content to read. If specified, caching is skipped
+            because it doesn't make sense to cache partial content as the full
+            response.
+
+        :param decode_content:
+            If True, will attempt to decode the body based on the
+            'content-encoding' header.
+        """
+        self._init_decoder()
+        # FIXME: Rewrite this method and make it a class with a better structured logic.
+        if not self.chunked:
+            raise ResponseNotChunked(
+                "Response is not chunked. "
+                "Header 'transfer-encoding: chunked' is missing.")
+        if not self.supports_chunked_reads():
+            raise BodyNotHttplibCompatible(
+                "Body should be httplib.HTTPResponse like. "
+                "It should have have an fp attribute which returns raw chunks.")
+
+        with self._error_catcher():
+            # Don't bother reading the body of a HEAD request.
+            if self._original_response and is_response_to_head(self._original_response):
+                self._original_response.close()
+                return
+
+            # If a response is already read and closed
+            # then return immediately.
+            if self._fp.fp is None:
+                return
+
+            while True:
+                self._update_chunk_length()
+                if self.chunk_left == 0:
+                    break
+                chunk = self._handle_chunk(amt)
+                decoded = self._decode(chunk, decode_content=decode_content,
+                                       flush_decoder=False)
+                if decoded:
+                    yield decoded
+
+            if decode_content:
+                # On CPython and PyPy, we should never need to flush the
+                # decoder. However, on Jython we *might* need to, so
+                # lets defensively do it anyway.
+                decoded = self._flush_decoder()
+                if decoded:  # Platform-specific: Jython.
+                    yield decoded
+
+            # Chunk content ends with \r\n: discard it.
+            while True:
+                line = self._fp.fp.readline()
+                if not line:
+                    # Some sites may not end with '\r\n'.
+                    break
+                if line == b'\r\n':
+                    break
+
+            # We read everything; close the "file".
+            if self._original_response:
+                self._original_response.close()
+
+    def geturl(self):
+        """
+        Returns the URL that was the source of this response.
+        If the request that generated this response redirected, this method
+        will return the final redirect location.
+        """
+        if self.retries is not None and len(self.retries.history):
+            return self.retries.history[-1].redirect_location
+        else:
+            return self._request_url
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..207f125783232c62d27eadad02006942aeb7be81
GIT binary patch
literal 24614
zcmZSn%*&NH<x)&C0~9bbFfcecFfbIiGcquwFfgPrGUPBY<T5fuF)}cM_)H8rObofq
z3{lJwJ~KlO3quqOSS>R{4l6?xD~!#?5XA;&voPeaGvsnGL~%m&u!8wq3{l(+j45mk
zDeMe6JPf(K3{kugJ_kb%A44ubLli$lt^h-n07I@ILzEyxt`I|%5JRpoLzFN>t_VYv
z2t%$YLzE~)4<|#87(=c&LzDzVt|UX0Bt(>pAxDZKSDGP82EylN$dP5pm1BsKW5|_f
zh?0kh@-XBmFytySL@6@lDltSUF)*gGF=Qz-q^dA9GcrV}GNkY_q^dEbF*2m^F|;r+
zG&3+nMyWHT@WVs};G!A~DS|LjA-Jd}Ly9m=R0J-n#gHNj;zVgPq=+%3vNB}pfb9?m
z34-m=Wk_LW2-c8bU|`4uMUVy~0|P?|KLZ0pVp4H_PH9PMd}eMzeo+ZTf{%fLAvr&<
zB(<U>H!&|UJ+;UWBEb&QmYJKHUkX*p%D}*oT2z!@lnF8sq6nnhBP1liBQ-H4wa6ti
zxkLl34`jPjeoCcZeu+m(NkL9#l5>7;L1IZ}Qch|KF9QQZKv8~4esX?}E6BhSZUzPh
zm(=9^lvD^`fPsM_C^a!91Y$o#PzWqoT#%nvoa&cf;+#>Mmz|nY0&;?9UUGhJK~8E(
zDo7XD0?)j%#GK3&h{H6PK%U`YU|=XNDay=Ck1we#NG&b_CES2WV~AHkZpbJpDTq(b
z$xO{FfoK6a734qHisaOSlFa<P5|ANIiN&eG!9HMTLDYdnGmGQXK)UmbQ&UQWLBU@f
zUz7@QZ+uC9d`4;_#I-J|X*r1{sSpnr!Lt!4RGmQCNEsB+44~YT!T^faC?-&rYGDB7
zpA;sr2n$0{um;Ha$sk=I4Dz8fNVh7;s|*Y^3=Hv%AblVP6GI6zLlz4t5rVkj+!hRW
zxnBu5jj(|<u`n<&gcOygmT)mJFvO>278RGomlRc&fFeFVC9x#21f-%WCo>5g!YQes
zKrc!yF3wNN0!zi`CuKnb6Qr;>H7892Y&wW2&Szj?&@U*;EK4j&)h|md(of6JNl7g#
z*3T}~&n`AHH#aQIGBPhSv@kEusZ1}AH%T!uF)%PNNYB#`(J#m>(9O&%E=kPE(JfE3
zEDg*634w8ZS!!NNevy7@QBF=~lCeH4$n^>;OE^FtiO<Z-EQyZ?CCOrtKN%P~895n~
zK>-HBpil${94OJ1fCDazk)ei>p_z#x80;HAa7dMa5_WoONn%M!QIHe^0|QtzNE#M$
zd5O8H1MFQ;5{{3Dx-mXp7L?vWUSxpy7UWY<T!MXjh=Bp*$zm=L8C=7_kj21ItPDyv
zS&R%>Od!!_Mh1`sOBOSTXU-JQ%us2HuA-KSp@xZ}D2btj1tb*@t^q)ajF};i0VEY1
zo)^NvQo_cN#m<n;#Za`Dfsv6Bt{5cF!2lvT8MvDn!A3ALREdBXAXhLjWHEyZ)ZlPX
zMFNhUcxHx(JVu6y6b5+wfD&ww7^r*zMGQFoB2s6NI4Fuh9(PO3DNY5aRKNVZ)F4ob
z2m%F4kR(V2Cj$e6uVX}fxRYlHBy%Am7o7Te7#J83#-^qWY-|T9FfcHHaIq37e=)K#
zvM_Nn3NZ0AGBXM>vN3Wp@-T8R3NUgqiZL=XiZE$_LI9d0Kxs8T9vn{b@wxdar8%kb
z@j)`60F(z2AY&1}1G5Gq{|13dQBbsk^DP?_Co3m&2`HPoS7jDJi_hSa#FA9ZG8B{!
zQekB%qyUX#W=LTIH9Me1C%AS5*JYWYOacy{AT^Np)j`Pt6x(i|LBS#MzOKGbu0h~3
z&p*V&H3%vY46X};!ySEm{KMm2977zz0fit2B*;M4n}aewsHkIOVq;`u1Xr&}L53Mx
zWYsvJoC7XOG(o||z>o#5Zb}$HrH42)D>H+Ng)CN3ZjJ}H>!7txCMXucO$A6U1ZBV=
zkSo9?YY@m2L11G+zKAad#WA=j2IokSECZMrkPrrC69-TTgDN=&MoCEF3Q9uo5CQoP
zPgN2GDw)APMbsfda-b>&l#>U}XP~_A0`eKiGtf!{<VjG;0gmYhkeF^}U;q{S;3zL)
z0+rC&Obo?Jpjv{bNCy<<HB8__yJ9Uv2`fX<ZH7uIP*nh`Wx(|SsCH#!Ft24|2+wn6
zU@75X$l?T74%0xD14tPoLoG7{#B5My!pKkq;c_u#GcgoRK(eEWfdNz-fHbi&WN|ap
zf-CRh%}7c>=5T@2AR`0FE*?<32*luJfF)EmhC+P?P#uGkKtXNG5>UO6R9TXmSX7i)
z8Kes;AV5(RqzwuTP|$!Ri-SZ#5};xSTrfkDH7G#@X@S&%s^-$X(&E$<a7zkY<A4*q
z1}K2R$vQ{{q!6T~D76IKtSu-?Ez8U=Erw=*flVBsI>8;3I3U#xC!-`I7b7PlGouu!
zl40Uu<Y(eyWM|}IWMkxF<Y7cBP6uJ-qQk(zU<dLLsElD_;$-1u2AAl*r8y;;(AovF
zs05WtXcbEfYRf!@8Qer?1vSw@ky|Xx$iTp*prD}OR+OKs5ai};Ze(m|1r`B`dZsDl
z=cOv-7b)cC7o{qs<|XH+Wagz8D`X^=r79$)rsgRm78K-Urlu&A<SQg96r~mvr52~=
zl_Y{XBsvNu8L4oyic|AaQi~KyG7?J=nlg|L^$iUUQAkhCOD#$)NmWQxa0d1L@=A1F
zq1M8U0(DnXixko_Q*%-v2IgcImlT7nQvi1u^GXz8F3rpX3+ESsEYHkSD9^}D&VZX#
zl95`eP@Y<p3UiVkSPI+%2PJn<Ac2b)Qw9cxba1mY3p|R@%*fypD*-BNN*F=qM-~&P
z2h+^R5XZz&C;-mT%%H&nXr3(r^@DW484BEIDK5y#ECEL;s7)LXYPzMQ7D1#+iZTnp
zIU6Qi4DL>WGa^_;ZhlH?G1$ahP;MXK`X&vOPNAhT$d@1t;(~)s5Y&_hH{eqk86>k9
zL4gDf5^x&_Qps3=N*7RZm6lUloH1x>Q)^I18Oe7bUx5+@2!nkGDsU^*7~s_@I8lg#
z5=9LYsHp*|OKKTGDI&av5#A>N831nX7NwS@78R$a1c5>TTsR}58dBzhLUS;*=5s*d
z04j|b7{wTc88tvmq!uZt0~#NnlAjD~tAoN0;vsm|08Xm|(kwD&U|@&^c>vVuW@Be#
z;$-Gz#vGn70Cl1mL3uZujiE>k8n4i<W(pIyde>wqfh6J*aE6C;#{7azKq(khSfp2F
z7C_<<WN8qnAP099z=;~%zXRo7a8Q7W0SON?1_p*AP<Vhkrwoidj9g4SjO<L{@(47f
z6a*a_f>$x1Yz!X%nZ?M!fL6t%FfpVvfyaNC8B$mnQdk)vW1#7*pbkw62SbV`LkcGt
zff=c645@5jK}`gi$_`_5F|-IUL~$^raD%HVPKFd7FoTOBm75`j7sLh)V)B5wkl{;4
z&`4_vKS(Nyk0Av-dKtwJ8o2~je*z3CLSQLD(5NLyM2H~;JZc#w%#bPq9kc|QDGGH1
z$T4CJEzAs2Vhkx-U_nWS7AA%$afVb0h7>7~X(08I3@Oqec9axYjSNEzBSVxlLy9a|
zP=+Bz4$P1RJ5?UU2I-PxNKpW>qvRP<6u}Gyh7=_*Ly;jx8O%^(NKpYZlo?V~!3-6K
z6g4nI6>OI#Ly9`sNoou!8enmCP@N8H_Z9DAf!67us8oQ(CAeZt%*;zI(&GZxaZZWJ
z+2x5vDaE>=u`<Z`C#V(&4K(ItCaD)Ifb_$)CzY0fE7Brp+E7SHNXk#COh{13EC!pG
zlb@K9nxc@Hm!bfv&QcWe^K?^Eb3r2I8L5zZI3WQvUXhTXP*9X#kXlqysgPN$keHmD
zT3no(qNkt`k^wa?IVZ8W7%Z7noUef7#PZCN46sWADoZl*^Aw6p67y0Li&7MFGLwoD
ziz?NN6|8deQ>+p)^Ao@h%LNZ2=zv|8oS3JOk(!qbYP=|v6s0DXfSg<mZn`9<Bqrsg
zD&!|+r6!jsK-&%A=0rt_LVg;!p#e59ttc@!wLHHl8yb?X6(vQ93I&NE;gZy%VuiH)
zB88;Xj6_fixkw=|zeEArECQJd4PQOv(6xd@i51ukkYZ3^#)Iw7D?w?Ffd)ar?J5OW
zM5q@lfFeSnJToUpAt@E6J2gcir4%%v42t;TlA_XNP?HSmVyH!sc*0{3*v!O|lGNOS
z5>VQJXaI*k*v_QH;#5#HgG9hV18Ov?L*1<lYc8rQKpJeQmgg5`rf23Q=D-J{5&jH^
zq?SyyBv@XQSWu8!1WFXJR$_`m8mQq4iq#VESUyUy!kq+(QyqoO67^zGc$B5)fd<k+
zUdqf%&M8ev1^GY$<|J?grlcm7rYjVb78T?drxxoec$TO`5<19_`6U^tMdg{rsS1#u
z6ROvWQcH?5Q;QKE3du-SfC_@FFG<YIgS1w25{pX|tiWmADxnTKPOMj2l9{6iQeUYT
zlv+|$nSe-pAj``WixoiKHCP0ffK4wfO)V}#bw_GmT7FS-DlCHIb5irtOEM77a)ro)
zos^naq5zRsNX|%2&d$tB*HZw^lYksvT9lWXqL5UnP@Gy+mRh8cTUuPAkegV7)RHbs
z%qdL;WfNGd-3M$LH0pH}GSfgQ6Vx}*Q}Bm{o{mCMA}A2Sb2pHtcaS}(Dh0JCQXq2?
znYxS&44HZ$LLWpJg9sBw28JLJX#0#I8B{-k2IN3BFt}wlgOLGTeKUcpYbJ&wX;32_
z)Lmy{$m0hILWTh#A~npQN<W^Np@s#_U}30%j0>?c)Ubg?*cfU!zzlYV8eTAigQ12G
z%-{qy^Fiit!x%g;1}{SmCs++1s8<hC!_QE|0~QfrsDbnn1VKX+Md!h;Wn?H3Vki-2
zNMizx@E4s2Nr80nfXAyL!vrD>HQZnmL>WrNKnhYIivNJvAjP~O#U<ikH4-qFNP@Uo
zObl64peeW%7LfT_(xBFOtstn%Zed`k5oE}c0oC20R%|mPL#+^KCbLF}0n`|ZVl0sb
z84)i5G95IaA;(a|4;n}TSt-v@!_H7Ng%Kpq!@vV&DKMmPfP$@=0VEL*_CyM3V4RbI
zfx!>l{0BFPic%9(iUmQjUX++uoR(SyFF3$43~r}^n%*E>44Os)&1=*!FvJQ%2UN1a
zQ<!0lh0q=ssLc$SDGUM)H-h^ZB_Q2;2H<(M)VySH+Y3w#L<6iC6aqG&GOVJY$nFHF
zB?fXH8v~>r2}=CQNK=TAQWutsH55TX1!}ov7K7)V@{&`7KnWi_3j`@?i%UT5bI{mi
zX)#zB)Xe}*5rTw^QWJ~w^Pnn<GLuV!Kw~FhWuP)AGqt!x3^dILDI8$dLJN-|&=3o_
z?*i+cg1e;gpy~h|xbbNPB|@ONEm&a+FW<rAMxc2}@Ss#YDB8g~a*NZ!EzkI(RB#y<
zUs{v{9{&f`E|5vlAbpUZK|RFyg8cj(@Tf7!VR@<GS`F;>jKpH_{1+&Ag4{srL16?A
z$M~Gov=Xpg>8T}P_vYl6rxpc)I`!beF^K)($v8+E2p-CZFyo6-a}zW3GV{`doI&HD
z!l1!4P!a?uUXZ_oJV8QUAi^6&_<#sskPARl+XY3b$hA2nutCWkGk`#`2=*V?<@tF~
z?*)Z|4D<sL{vcENK+Sh(SmmacWaOuS0|YtvK=E8s6rY-x3?4~<)x^c%Bo8JABHe>W
z+7^J4J7|!afsLP$hlw9N<q4Yh1Y;&J2@_+IX5;~hF!3|;FoR^InIsu`7<rh5m<1TY
z1p_FrgYpiz)CbLwfXX27TwE3-xa3j-6<eT^j~P@3gF161EDVq#h++=d=ohF~4bI3f
z%}G%x2i4RmnMI&BAhhLLl&VmYZx3mrfmB)*rIwTy<rP~ggcOyQWK=2?r9w62<R^ni
zz7!zI7F6k#rz)i9mw+3XP(_ez$ptbAhC#~<!0l7;!T<%BF?tFK383jfP$N4HVGG0n
zu=>1w6myU@f@c&VIzcT^(BK@313)8WsgODs<P310hUtflkb+Wl2`Hroxw?1;xjKi$
z2ZuO@ga*3?LsEPUC`E#@8@O`|9-jgyEif?<>8k`Z(4C%I5?=(3ka(DfE`t&sC{r+S
z2r&vUVJ02W01PDQ@Dz)HlMEvRPZ7BO1Whz&fv1i@3K&6^9%BkPiGfxzfGRXlBJ=|f
z?gd4F!Xy%uOF?CPd_idmxSRqPn}a5pc)$fnPHJK?xNVpRnmZ{5jg2rciZHS;2_v!=
zXrv09wLn8%An!9U6oK0<Sq$I__$)?-B292`ffs_5Ff%kWFb0Ebc~GwO1J6t*Cnjfr
zEh+&mUI7(yL4lxP3IY+JG8J3~50=mYkGnkwr5A9BFmp1pGjSq91Qgfc5CPTFkPv|_
z#Q;eKf#QD9cqN5_f#CzlE1<|=z>@5FK`9lSmO*2)h!IMV`XF%D2Sw6g@ejC+$}CRK
z$uCY#`2zPB5s_1Tn*ll~0xIkLlR!N%aF;KyG&d==2-I%@w@MTWN^^2RU0P5t2h^`B
z&n!w+D9%?%ODxh;@J*~#NXbk~1I;}Y<>$hSUXa4X-2Bo!@Hhdq`-{?VvI5o9RtX8n
zoqjz~3kXs`gYAYJmk66`0XYORYyx(MMyg)A4tOX8w6ZBRMH5kaLt-cd)II^HLQwkz
zTnvMW0V#_?`Me}GC+9mnp4h<CDxgvr)RF^dB5OuS;sejurhv;<(DW@6LkbT=HYY>T
zS#a6H%ur+jnlsH}1uc_k1})v>VF<2F1})A3P0BEV7VxBi7vs3Z3W29*IY6_r(CHXI
zP?25B!cf8q>fkjqf`%!xSs04?7)rQ6ou3*e2C-&Fh9*XE--ZP=Qwy0!4$l*3U@74N
zPycQKP5-9wfCl#q&oV^RFoC*C*$f~j!bS5K7%GK9)3~5=ffsBmD+972Kf#8uG1Rg`
zCWcuVQg}hFlwv)`6i!g5lZ82(ks)7}F@=jEn}H#ZiGhi+SdX!W5i}eMnq4*rEikQR
z0y`A61`N~`ECw|-;fW_W6*P90S(2HU1MAO2y5^ukDfnm}ERANSDI}I9X6ArKz7VOY
z7-TF|i7uoSTzm;sSf?hZW|pO<z{j2xz=Lr~`6U_f$vSAaAJlXTf%WHL6L<>6sU>>g
zAwJL;PHF{cRIE6s5;WYBl$nx}ng<$U2y$~)FgG$bP$*7KRxs8x)-%#m@J!Fk2ajc;
z4K9Fefeue)=B0y%a|(*`L1T#s7bX@fV7S9d0o*M}P0<5)xWEf-ia{*^G~+=*02(q)
zQOE^NycXnuhI_!n9w6Jm!CI`Kp<1j7?#yPM0gXo(fQBbP<!&aZUkC0Zc(^*cKo;sD
zlxTp07^xWr>Q+H|EubnlCqEtBrzuY?0(CsVU6<n25^#qF%*o7y^k;HX^MbfRWjIJz
zL4E<a-xLNKiUF?x4FWacAagaK5+NuRq!g3^A(09;sw^=FY!^hR7@`F}X)_Q-M^GFC
z1H*q%u>qPsVPFwr;$h@u;bmoEVrJ6=FCgP(6ky~9&sy-XFf$5+*vux3oRA6*RPcZ>
zxPaLMpMZp{0fLN{KxS(}%Q3)<_)=IHvN;%vc0h+vvRFZRvd9}$yg;V#K!Y62423&D
zgC{kRe#H*hbTB(e5Hw~Is}3q0Kr??Fpn(-o82~XT9W?fo1r`L&4yS_)C{AbrRkRhu
znynz4@)$tHR4}+DUTlk8dj+SK=$00MYcE(ITmjVc%}gpSNd<K|@=`%rAhD<tDMt&y
z)>7w{pboEqbAX=)sK<$v96_^XK>?sF4@#Ke-mtU3Ux=$;NW6=yv%iaLP;d}v773gp
z!J{leWuVFj6z<@T09Xqs|D@)XfV!dJbpzlz>(rnOkjeo~Vc=$IJh;CP8C)p>4J{Uf
z0*Qf5nvtK8pHYaBhtZaihcOxCB~X?DVQ`X~!N9;!sR4@9B6V=}#J~V&K$qt-f<~tD
z7#PCyyck$YU`w3Sn7}nj2?Jv-3j=6OEQ^&Piw)E*g{De&22j1j3aUX;m_gNnSPgij
z4pcKSGDOrcGZak$+dBo8QaM37%xfVv7pVCLa&0kar~qCeK$eSulM86-MWG-OG}Qu{
zi2#+J1^J*xd1hh`s2B##zC#p(7rYk{lYWX_L8%0L#Q=?ec!IN1P%YL`0L>(&C1!$}
zSta?<xgv$k5<N&71SdMsf*x?8<mnG7$0R_OfXX=ZGzw~kLkE^Xu7_m^q%se*bO|!(
z0&47nR~W!l1=WF!tsVH}2=WEgQFe?B48@@FHwG4FMt(*~MhQk~MrKB4MnNVXMqx+^
z2Wp*zFgQ7aX01VG4Ff}w4m3GJiaO93E_lHiL>5x!i3g{Ek_kw6aW-<P;sy%7RLHCZ
zG*9R$K*vP#^KvRdQ%lK-;Kp%g8ge25Rpp7vC8eMw1W$BHsh}DXG)aL-L*UU|$lN$Q
zl7m3&1i%BdkWvE_#Yv?Dyf#0m5wr^g6c6AYAS)-M5ThU@<U#HO6$HtkacB|9BttDD
zL)9{dN={Hl4r2_@o4~+Q!U)dkR-ooy2@^P0z{5|Ve9jDRXl668l(2#oRWdNvGBGfw
zFoWv>@Z!X5c7~!v2GHt32GBx7Q2e23*I{5OVF#5H&@yES#E=qBP^AHC&w{2mn7}qM
zGDMVcfy$%s6mV)Neg$?9H$%}mC?kspREjWy*2FU~WbrZ-K~(TEKqU%af!mu5poVb~
zKe*uHX2{|LX@YY3L2Qr#5#ZDXYTg%vy3p|S;0&58Qpm|K*Ud>SOU+RzfXv;d!uGBd
z>nMQ6vQra5ZA)Fyq!2j$K=w_*O({z(%1q2FDb@k?$iNH95GEpwQULXzKto<RsfpRC
zDWH-Lc^z6tW_kwH6^R9z&<QheuP{#`wIZ`bN1-ScJTwAM<jL?+ScRm-<ZMtA6V%%S
zjnX1gwqG%5pck~iN1-G$7u0JjEzv6mm06%Jo&sp18!{{imn{a3R5>G=U6h}lnrEe;
zTBHH0gn~e$YT!yLI6pZ%wFJ7^C<v4uAwx`{YB>m`6x@a@E-4BEIRQKl4ABB9H$iC?
zJh~DT3~Ks;A_m-h1`ksNf%d%w<${VoP`ZZXKrT>2AtyC4FCG*a;1UwthXfM?(Hex5
z?%)~1_+(HrN-c^8<xQ}IIN6v$Wg{mOFS7&_Ka&tM8<PZ+D3dq~7YiE;C!+u>C!;Wn
z1fmiL6|~?|GZNnMY-V6!1oh?^!EHd;a51!x1!*2aq)b5>Jh+5~p_T>2s$~UdA68J(
z@1Mm0?xaB!7J((0L3KN{K4%B%$twi)VQZNYvXI6l$RI{g$2Oapq3AKF+UEgLV5=dm
zM#d7b0ibe#6Rd=RA&U#t>;x4Qj~Pn1!A6277PGiOQ+rK}426$DnHH4i10!l!8Hz$d
z`IaS%hoOWQWJNP0gE><?OiKzQxVNnhQNx8$W5E>91u_R@H6KV{4HLKz%?#?og4!dY
zjL@l4eulzOPzg}O$`A}53M~#`MjCPn&dklsNi0$*$yb1mg<x9;0T~j3G!ejE%aZbZ
zg~XJUOwihe#2k1*0A44N3R-JnrI3&Ssjfidtf00`LIQYXJRt#P*fAjiDW^l1KP2WN
zt*ro+03P|}3c01p8KB`HP%ekIUqFrqWn?`C&oqVNg4E>9w9M2L9R-jDpkgYsSfMyO
zv!Ea~1@1tQX-TQciKWG<3YjGeDfy|zdFr4k^XycG;?%ri(2N3De=2C*2)MHjvn&x(
z2d9<hAp8q54z}I{(;uk*M@;X7ba|$MCMi;NAj?CbePxh`Aez8s9B2+p0W{f$v6KU3
z0-@y`AT`hc1qBFvpckJzib2bVK_Lv8Ndc`@Ni0cJC<cW+xLgOx6({DVg8K2LIVG?)
zMj*RDxClG}1JagST##7;UUvZ20@{rMi@nmkl+>b}N>B`?Wx^NsK*k?XA}SNSoFc6>
z2h@40%r8|aPs}R;hfG3(9;nTXyj-aSv=}L`Br~rxRROdHC^Ih|#jwP*lGGy5`e=~7
z2?^j7t)ZEa05%WB9UA^+sYOMQagWS2g@lB}+!D}mAYzpX$g7|s6HT}ckZE&pg9$w5
z;0LKL>Ot*TaFqa>$_)aI*@CN(pe~REe26`$1H=W*AqK^RSfH{#2sCI2?z{yxgTz21
z^N7|nxOPd*g-j6#<$)A5fe28e8e9N_iGipVz>~34Kox-rs4FQ7TG$VoO=JP>D`Mh>
z%q%joF$ysXbMP{<F-ov0GO;m=GV(KmDhM`4ekSnND)4TfWKi`7svAKV+_VGr2|#5Y
z14EH5xNrq8`Yf_#s7M5JnLr&dP<sm0USo8L<p%ZXYnU0r7z?!-!t-nxDl9?!T0usz
zfW`rfE5O>o<Cmb(Jn)+FW(KBO7Ep0o<NzYW7z-U33LO~2!JDMP9l3ZWq$1Q2wl+S$
zNCCDK3N)w(O8B7SNkdZsG|HTxqNm`f0BWj3@_bTGesZ=#X<kVtqCA16HSoAID6xXp
z!=>gafQ*5xr~(;^)b`0Qf|vkG#qh+4B%fKV0B%>LV3tm#m$IPMQlP~VMTsRKuY%UK
zK{C7oXxIaF#uHpzgYu{Xcx6}#XzxH~ex44vmzkRgnwtg9)hgtq78gUZKB&J^kXTfb
znOvHaSd>!<_YNqx<z!~3=2R+xmn)VQgR(Ga<soFaT>)f`o`OeyIcU{3WDy={VO%9_
zwimQo4#l)QkU~($3F7=zETID_hU1}yKfW@P%4Ijmw;&Ae8V7ZQmgGRPJ$UH^r~_JD
zS^(OMUmOn|ECsLFC<ZT;0HqU{Fk+f02vpF32duzNNwA?{<H4h#IhlE>;JGz$kpU(K
zqTGP3dr3{qy$LEkK;y6s0-}sEj66(2j1o+2kUevthBK&n?G5Va%>oS~GJ>`tgLZzw
zHheWRF%-Lka(R(4xR(ao#t!OtGcy#rf&@YP3&HaewctI+C2Y`g1JV%$<$eZGI}TJN
zuz&^xQ&>R?ve-eB3pI=kSsdUsSd5@OXrR)D1-zsRTzK>{u!9<opw<>>rn#60c`bu`
zW*KN}P9A(|A-2X=0=UbS2wDuAkWiG60P6UF^GYH-5hv#tL7E+)T|aQcV9OLCQpKq#
zYc3O@3uuuFf*{xe8c<s&F&Er!19#G(Ls2F9pkf7exp8uS9%RvKevytsVop9%EemcK
zCL~}ipRp|hHS$1d8ia#Dvm)R+GAIF5V_{pPlLYGefGa`p3L6iQI#9VA#0%>zWtODo
zLXtdaooPHY7$KV^L1XJd@C85M%meO!!6sRpb0C{^iol|<z>3c<hm2u?+y~AWAQ^CW
z022d|CxRw2Ffe=u<p$7BPX<m-CVoaXMo}gqX3!`oXumdS?F}0vGw5&v(EK6{gS%3o
zJ{72<L#%`VNrOEJnU(}iJ%IfNCI-TT;AxTc)Dr0GI6)=`hGHgAvw;y@^@FN^5C(fk
z7?jz;Tb3Y$xsZ_**c?Ad7uah-pw%ys(JYYvz<XrDLzXG2X^EvdC1AgTi2?C2s7!!+
zSOm$xptylyuz!a_^no&EW?ovp1U`>|<|82Kuvik@+5#UI0qWjEN4A(5ij2S#%%II#
zPzmr_6;Oac7Vv<p2S`%}(u@W-nFrOP4v>pvKmh?74Fa7QBEW>SJ_VkR!{F&Sg#kRY
zAq=XJf=eLd50FiaOt27PfF8kuBn??s><11o28JwFhTsw=2FTJLkR5)I(IZgR2rl{{
zp#|=PfX23hqCkZycz_A41Qf#HRslFmfQf;~7eOG$D1!nIT<<gSGqNxWG4e7BF>*l$
zctP$2c@La5Kt(hpML~m54itotWeT7<8EsJQ4^;pOE=Xqq5t>Y(+8wgC0G!Z33E8h0
zw3rHcC5S>sVzEMAz5=*=Sdy=ho(ftp2;zYRi}G{9sS?6326f*+Eo2Z^7t~&bR=5f!
z8R#1(GK--dg%pLvqWsdl6cme6Qj3#|G7C!biy&<_aIX;@feoOz14rO&Pz?zRlfe*o
zAjjx|;to`0GeBqQc(KHr5lYhMWGK=D#TzuDz^CUF>A})9XvG>dS%b=UKgf&(D4vi~
zG&n54Qx$_HEI^Ji2ZaU5r3{RUSk^#+WJ=H~Wl+`}G?g-_`~vkPK#NbTL4E;600R?v
zl@KTof;<4uhoH6_B=$g?t--5=K#gqh<_=Kx3_jfhv^+)|G%y=n1MZ!Jl!AKa3|ep&
zr1S#Wf;5f-?zMmiKoGS#c%nK9+&Tm8eF7I(U}7N3Ebyu~P&j4gmE_xl!U>%InM4_d
z7+IJE5HSx5GjMo;Ixg@{$)Ms2v{VS>?c!g^Q-02%eLlsYK`&5mA8oh{rD(~?&(AJa
z02elh&H=PBtcOyPL3Uc{DTJpgq=1_BnZ=+rJte8dC7{kUY`7w=0N%xbuUr6+u4aOU
z`d}M{Kx?rRi;GKh!DFb9K6J4{QDQk{`A)GyB4Vfvy6y+EO9>QMu<oe_(keOdCXloO
z@bDR=f&!I!gC#!%^)N6nc!1&;6jcoD;6=(HCTLU&9Iv3EH%LAJ)kmBRMZ%!{J>d1p
zOrWDqAjhbImbEZ~D(n>StU@!m4w9^8WT+GaPceemzcn*~3cz^K5(O>rTq5ZFt6I=}
zCCCEsS{23;PS7+1WRe0@-N6pF0=dTzoJFj`OQ*oSEbu^@1~;hYhz1ehiUbtAL7)Zy
z@H7k_1px26C<Upi01==D4Y=tHO;JHypjrpyb8xK_)Cb~%TI&Os1w|Mb7~)F{QW8s2
zAqfk*9VQSIU7+nQ49t+G1n593F-Be{F32zfD5yXl0Y~2t(Ef7B`8156hy$%T@&rW#
z^jI_Sj1Q<_V+IWcfYw2RmqliQmsW#UJ%SfY#xpbItp*JffMSXnv`(<78OaoI@dz1N
z$O4~^CIMN!RKo&Vo|IRJq?3uE=ok*2;I=cU=m0IYgjowU0#bK^RY05oax)XcAPjA=
z;>Qm><O-f00xyUM*RbHeS$uI~S}J&eDF~E$APo|5zp5M56$dreAo)Kv1rq+?T|D4{
zDKHDX77v^}z{G$Q)1X0v_>9E7lpI(Z0VNL5o)iW~Hbx#sQARdK0Y)D1+9J@|XP`Ak
zAexg&6m(1tq$>&<cj5v~!Ggw}vQQ@}!KtBG3DlN>1TiR6g5w5s5FG<Uu`OtV5j3;}
zU(5<_xHmH}^h+~>=JvAK7>bG+O4z}1#ReLfE-Hqyp)-x3v1d@Eg0p@KGq~f>32MX!
zSHv@v@F3O(fVxj0g?ykD2cWulJwpJrpT!SKVxTm^3^rQ;l$t>UTi_+LC4vmijIeR<
z9_YAt4?|%OLpbQLK0dHBg+P<4pft?FP{hYr!vY#t=L5|yR+xbu;RaR(c4L+>SS>4P
za<bT%5$pz5(5M;6O@fR8g@TNQf{fuHr?N2=C4e=ufd<w<9sn)TN?~RQi~xCC1JoWV
zK88GwhB<4AT-kx=b`l^%&EP?)#5}x{mDuJgk%q~jlW3%mmyga$X6B_MHkpG)|3J7H
zJe~(Tt{@ZC!zzKa96%=xKu%v(P%nWkQiko3gD(zN2h9}ZW)_2{0rZN~85kJA+o6jg
z`^1t`6`<7>Y6A$=NCIsZSAePmpOge967v+&3XoQ6f=?oX?h-(5*62YRr{IzEAW)SL
z9;)Ky(g0OLLEx!A&=`FXXov^gW(We+GLWf0&?=80P<;fM>Vwz6km459`VU$Hs&YYv
zY|u&&3q0wk2x5U&Jq0ZS)wQ5P2vYTeN?(XWmNPJb3J%CIlPRewgP>Lp>SbVHC<PU=
zpp)Sk__&xj8JQV*n0P=WGcS__BQGNh3#gII$;ibBs-HncE+?okW@2Ljod(9u3|ia8
z#>4_Tkdhf`6a`*qgI3;x$_@tb0u4^kcnNet7p%61jwyk;;6sjBAUmU28G=(l6(6Wo
zUVH?(-5ms;y@pKlhX(n8H}@-mHuZy=;l=r-Maj?!?aX4({5SYiVLf<**%Pw*4!YYD
zq8U0{20DfdGzb71Q3f4F4Bs*cTCD&c9)L^`!p#EBSV2=DcnCfXbRYv<7h)eGTtnvn
z|NsB{K?Zz4t4ty33bgbW(tyh>F3B&d1aBI|*n<}Y8j%_-jcxFVN;)Vaa&~}H5Gctr
zuqiSMGJ$d*BZCI09f3IDC<t^KTTl%sn`D6qaO)PFoxoW~1|$YrP6=L31#axZ&Nl&1
zc?E$s1V9GN3P4Ih3)~?&8JzvVIS)LtfS9lE2jw?zP)h)G5DFyTz~l5m(?BMG79j`C
z1hGJ^XYjCA5NLb^JbV!}2P82cM1cAfkSq_*?VubJv=)@d;q7UVM;Qj9!4%{O8Kz+X
z7u0O>Y)m|iqTv0&psdNS&&kWl&d<ru!pY3Z!D+zB&nd*o&2K5>$}hz)$H~mY!pXwP
z&d<%s$q8a{a&mI=af<OfYv_Rj4%CE-k54NtDJ=pW9}Ds<xSa`}XRRp7$xI3Yhc{@A
z9=KPSnGa6DIr-`7nR)5p)KLsxdKUyL3W8ceVF}8~LG2*pK^rLJlk;<OQo;Mriy`~(
zL6#zxAwo)JP`U~N4Y3D-S{INq8>9}hYXf9XL1J=tVtQ(^UU6nc5J(^>9Ap`&H3{BG
zk1Vg3n_re%90Y0(2Q3Dv0;el}5DVPr2Wf&H9s)Vs8!|Zyst~~Yz|&JpeDc%NQ;Q%e
z8*~N~*sG9UJNTd~$N{IIjTb@S6RgZY{ssBM(;sxUI5^V4Nd`d-MB)MGF`HcQ(LSIh
u(+tI+hPD8>fz89n!zjQgz$CzE!Xm~fz$nHj#>CGorYOcPCNCz+$prvV>eW~P

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py
new file mode 100644
index 00000000..2f2770b6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py
@@ -0,0 +1,54 @@
+from __future__ import absolute_import
+# For backwards compatibility, provide imports that used to be here.
+from .connection import is_connection_dropped
+from .request import make_headers
+from .response import is_fp_closed
+from .ssl_ import (
+    SSLContext,
+    HAS_SNI,
+    IS_PYOPENSSL,
+    IS_SECURETRANSPORT,
+    assert_fingerprint,
+    resolve_cert_reqs,
+    resolve_ssl_version,
+    ssl_wrap_socket,
+)
+from .timeout import (
+    current_time,
+    Timeout,
+)
+
+from .retry import Retry
+from .url import (
+    get_host,
+    parse_url,
+    split_first,
+    Url,
+)
+from .wait import (
+    wait_for_read,
+    wait_for_write
+)
+
+__all__ = (
+    'HAS_SNI',
+    'IS_PYOPENSSL',
+    'IS_SECURETRANSPORT',
+    'SSLContext',
+    'Retry',
+    'Timeout',
+    'Url',
+    'assert_fingerprint',
+    'current_time',
+    'is_connection_dropped',
+    'is_fp_closed',
+    'get_host',
+    'parse_url',
+    'make_headers',
+    'resolve_cert_reqs',
+    'resolve_ssl_version',
+    'split_first',
+    'ssl_wrap_socket',
+    'wait_for_read',
+    'wait_for_write'
+)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..90f147e1835b10193713e067ef01018e71b28fd2
GIT binary patch
literal 1324
zcmZSn%*&NH<x)&C0~ClbFfcecFfbH9VqjoMVPHsMWXNG)$Yo@RVq{=UVPZ&OX2@Y;
z$Yo}TVutWp7;;z`a#<OoSRs5?h8#AATy};ib_k!1A%}w@my;oilOdOjA&QG3mzyDq
zn<1BnA&Q3~mzN=mmm!yrA&QS7m!BbupCMO(AxZ$Elbs<)kRexyAxelLSC}D67$VBS
zkR!s7E6NZh3gL4y<cKlkiZeusGvrDzL`g8@N-{)AGUQ4zL`gwZa53aaGvvxJM9DDZ
z$}&XBGBBnnFht2Qq{uS_YbY`>Fl2)KuEEH_z)-@^z`&50RGgnvT9O){nOl%wRFVmj
zfXIr16c@)Q=jY|6CYNO9=f$TK<rfsBra+{57#J9G6SGs}Gg1>%Qj3ZaqM60<X$A4g
zIr+t@DH<Fgi?|pV7=nX+ob&TaQY%VI*cliYJRF1LgZ(^9K*o3m#|K3E2e|qL2m6!=
zF)%QA2FC}xI)?_ih6FkK1qb*Cg@A<<i;Gi>O5)Qp^U_m`3W_rGN=gJ77#NCDi}Q2J
zQsa|Bl0~V7#U;W>qQ%8I@nxw+#hLkeU=M@%<wc1F@x}Sc*{LNOOdtn>T#;N_RFs-m
z5?_*;n+kSfNM>$oerXBBW2_7e3_+<SMU@&XAPpdIrKgs}XXF=`lyEXIFcc&f6{p6R
z7Uh(1GcYg|7vyAu99mRdQo_u@zz|xL1F?vgfq|hs5hRyi6kn8@m{P)rEK**SS&|wA
zwu=p9Av=fwSr`OT76j5A1PY)ako`d*R|kP2EC^&r5GXo>1VB1KehLD)DhL$vL7+ei
z0y!%P6fi-cRPUz&BI#k1hCC>|K<<c-Pb)1cElQ1#4+5pZ5|9`ob%8ws4)>ze!qU{@
zk|2;TN<bbhN-ZwP&nr#^d$R--9H2-H0x{5i08)<RbC9ROW`ZI$zqAArWT0Ry0R?gq
zC_=$O3y!7Iq8y|^1cw?Zu)#KhA`KCIU^C<66LWIn<268@K@i0y3=9nV1x1-<i6yD}
zWr;=lY56&z45FW1sGnVIWNvO)m}O*MW@uqvoKu-z9&eIjVq#!mV33}tAEIB7S)iMl
zS6q^qlcQUnXjvMV0TKe^__EZzl>8$7(xRN4%p_y|(vr*^{rLFIyv&mLc)fy3a8TLg
l=BJeAq}qW}MX?0~1A_pQ03!%mafz`CFe<T$u`w_b0|A=g0YLx&

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py
new file mode 100644
index 00000000..5ad70b2f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py
@@ -0,0 +1,134 @@
+from __future__ import absolute_import
+import socket
+from .wait import NoWayToWaitForSocketError, wait_for_read
+from ..contrib import _appengine_environ
+
+
+def is_connection_dropped(conn):  # Platform-specific
+    """
+    Returns True if the connection is dropped and should be closed.
+
+    :param conn:
+        :class:`httplib.HTTPConnection` object.
+
+    Note: For platforms like AppEngine, this will always return ``False`` to
+    let the platform handle connection recycling transparently for us.
+    """
+    sock = getattr(conn, 'sock', False)
+    if sock is False:  # Platform-specific: AppEngine
+        return False
+    if sock is None:  # Connection already closed (such as by httplib).
+        return True
+    try:
+        # Returns True if readable, which here means it's been dropped
+        return wait_for_read(sock, timeout=0.0)
+    except NoWayToWaitForSocketError:  # Platform-specific: AppEngine
+        return False
+
+
+# This function is copied from socket.py in the Python 2.7 standard
+# library test suite. Added to its signature is only `socket_options`.
+# One additional modification is that we avoid binding to IPv6 servers
+# discovered in DNS if the system doesn't have IPv6 functionality.
+def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+                      source_address=None, socket_options=None):
+    """Connect to *address* and return the socket object.
+
+    Convenience function.  Connect to *address* (a 2-tuple ``(host,
+    port)``) and return the socket object.  Passing the optional
+    *timeout* parameter will set the timeout on the socket instance
+    before attempting to connect.  If no *timeout* is supplied, the
+    global default timeout setting returned by :func:`getdefaulttimeout`
+    is used.  If *source_address* is set it must be a tuple of (host, port)
+    for the socket to bind as a source address before making the connection.
+    An host of '' or port 0 tells the OS to use the default.
+    """
+
+    host, port = address
+    if host.startswith('['):
+        host = host.strip('[]')
+    err = None
+
+    # Using the value from allowed_gai_family() in the context of getaddrinfo lets
+    # us select whether to work with IPv4 DNS records, IPv6 records, or both.
+    # The original create_connection function always returns all records.
+    family = allowed_gai_family()
+
+    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
+        af, socktype, proto, canonname, sa = res
+        sock = None
+        try:
+            sock = socket.socket(af, socktype, proto)
+
+            # If provided, set socket level options before connecting.
+            _set_socket_options(sock, socket_options)
+
+            if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
+                sock.settimeout(timeout)
+            if source_address:
+                sock.bind(source_address)
+            sock.connect(sa)
+            return sock
+
+        except socket.error as e:
+            err = e
+            if sock is not None:
+                sock.close()
+                sock = None
+
+    if err is not None:
+        raise err
+
+    raise socket.error("getaddrinfo returns an empty list")
+
+
+def _set_socket_options(sock, options):
+    if options is None:
+        return
+
+    for opt in options:
+        sock.setsockopt(*opt)
+
+
+def allowed_gai_family():
+    """This function is designed to work in the context of
+    getaddrinfo, where family=socket.AF_UNSPEC is the default and
+    will perform a DNS search for both IPv6 and IPv4 records."""
+
+    family = socket.AF_INET
+    if HAS_IPV6:
+        family = socket.AF_UNSPEC
+    return family
+
+
+def _has_ipv6(host):
+    """ Returns True if the system can bind an IPv6 address. """
+    sock = None
+    has_ipv6 = False
+
+    # App Engine doesn't support IPV6 sockets and actually has a quota on the
+    # number of sockets that can be used, so just early out here instead of
+    # creating a socket needlessly.
+    # See https://github.com/urllib3/urllib3/issues/1446
+    if _appengine_environ.is_appengine_sandbox():
+        return False
+
+    if socket.has_ipv6:
+        # has_ipv6 returns true if cPython was compiled with IPv6 support.
+        # It does not tell us if the system has IPv6 support enabled. To
+        # determine that we must bind to an IPv6 address.
+        # https://github.com/shazow/urllib3/pull/611
+        # https://bugs.python.org/issue658327
+        try:
+            sock = socket.socket(socket.AF_INET6)
+            sock.bind((host, 0))
+            has_ipv6 = True
+        except Exception:
+            pass
+
+    if sock:
+        sock.close()
+    return has_ipv6
+
+
+HAS_IPV6 = _has_ipv6('::1')
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2060a3135f5e532f2f4007937cd4c4afe0546192
GIT binary patch
literal 4192
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
D3KJr6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py
new file mode 100644
index 00000000..d3d379a1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py
@@ -0,0 +1,21 @@
+import collections
+from ..packages import six
+from ..packages.six.moves import queue
+
+if six.PY2:
+    # Queue is imported for side effects on MS Windows. See issue #229.
+    import Queue as _unused_module_Queue  # noqa: F401
+
+
+class LifoQueue(queue.Queue):
+    def _init(self, _):
+        self.queue = collections.deque()
+
+    def _qsize(self, len=len):
+        return len(self.queue)
+
+    def _put(self, item):
+        self.queue.append(item)
+
+    def _get(self):
+        return self.queue.pop()
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b9223131d3356812016a623720ea899b8d5a3648
GIT binary patch
literal 1665
zcmZSn%*&NH<x)&C0~9bbFfceUFfbG+GB7ZtFfgPrGUPBYL@_X=FfpVsGvqKb<T5ct
zF)=WL_$&-L%nZ3K3{fl$jHyfvS*#32E-+1O3{mV1c?=9GtPH6v3|VXpX^adhYz!?7
z49yG-kx?8VlY=$b85kHc|NsC0-!GGifq_ATk%57s1muR|%nAsHm4Shwur#$awS<#_
zfx#y;Ek6*%gF6_c%?adSeFg@GR0f79Mvx0y7(k9pWd_;O!U%F;3KPigC{~a!K(cHM
zLBSd<3=9m(AQNEN8Dx?$$Po+-S&Sg3)-W){Gl7f@2D`^k1LV3AZji?OoSf9;lFa<P
z;u4T6Q&I~{Q-eT0&;S`%0y4ZfH7BhEBowa!3Scl%T*$z{pkGjwS(aFms$Z5^q@R|b
zlag9gte;(|pIvNZZf;nZWn^AvXklKQQ<+{KZ<1nSVqjokke;U>qF<0%pqrUjT#}fR
zqg$S6SsIuD5(4A+vedkk{389*qMV$}BxC*3lFS@^aM<Y;RDzutpP82lc6%|%g$#_C
ze&=OiV5nhas9|8pVqj=yWPte^<OhV`f<XQS$5T#f9@tZ0Vt{<c#=yW3Us#-3mC6T-
zK3rZC0eKDVuPjE8ADbB&7*iPFJ_Kn4`>+ILUSdH(YF-LBA|ajy#b#znYA)ELU}AuL
z3vx(&L1~E~l3ziw1H<4X430*aUz@Rc5|oS!@(aL;8tg-`pTNXGdMrJ)1Qbuu^a(B>
zN;p9A8=se$n;IWq!Ug8!=BJeAq{hbwfeMfykb)pi1_p*89uNUa1z?XLh=K7^5GYN7
z99#@?AsZtnGY>N-vj*6upzsI#tROKtJ25@AI0#fgln5~}Fu+9giZd(pa`Veliy`R}
zq$MEI2%M9_g&;Vn;!E>Ni&InLp+N$c09%akJ(x8xK>+rm4a9ABpd?xh3J)Ge0Y(8P
IP9}b40OH|&Hvj+t

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py
new file mode 100644
index 00000000..3ddfcd55
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py
@@ -0,0 +1,118 @@
+from __future__ import absolute_import
+from base64 import b64encode
+
+from ..packages.six import b, integer_types
+from ..exceptions import UnrewindableBodyError
+
+ACCEPT_ENCODING = 'gzip,deflate'
+_FAILEDTELL = object()
+
+
+def make_headers(keep_alive=None, accept_encoding=None, user_agent=None,
+                 basic_auth=None, proxy_basic_auth=None, disable_cache=None):
+    """
+    Shortcuts for generating request headers.
+
+    :param keep_alive:
+        If ``True``, adds 'connection: keep-alive' header.
+
+    :param accept_encoding:
+        Can be a boolean, list, or string.
+        ``True`` translates to 'gzip,deflate'.
+        List will get joined by comma.
+        String will be used as provided.
+
+    :param user_agent:
+        String representing the user-agent you want, such as
+        "python-urllib3/0.6"
+
+    :param basic_auth:
+        Colon-separated username:password string for 'authorization: basic ...'
+        auth header.
+
+    :param proxy_basic_auth:
+        Colon-separated username:password string for 'proxy-authorization: basic ...'
+        auth header.
+
+    :param disable_cache:
+        If ``True``, adds 'cache-control: no-cache' header.
+
+    Example::
+
+        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
+        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
+        >>> make_headers(accept_encoding=True)
+        {'accept-encoding': 'gzip,deflate'}
+    """
+    headers = {}
+    if accept_encoding:
+        if isinstance(accept_encoding, str):
+            pass
+        elif isinstance(accept_encoding, list):
+            accept_encoding = ','.join(accept_encoding)
+        else:
+            accept_encoding = ACCEPT_ENCODING
+        headers['accept-encoding'] = accept_encoding
+
+    if user_agent:
+        headers['user-agent'] = user_agent
+
+    if keep_alive:
+        headers['connection'] = 'keep-alive'
+
+    if basic_auth:
+        headers['authorization'] = 'Basic ' + \
+            b64encode(b(basic_auth)).decode('utf-8')
+
+    if proxy_basic_auth:
+        headers['proxy-authorization'] = 'Basic ' + \
+            b64encode(b(proxy_basic_auth)).decode('utf-8')
+
+    if disable_cache:
+        headers['cache-control'] = 'no-cache'
+
+    return headers
+
+
+def set_file_position(body, pos):
+    """
+    If a position is provided, move file to that point.
+    Otherwise, we'll attempt to record a position for future use.
+    """
+    if pos is not None:
+        rewind_body(body, pos)
+    elif getattr(body, 'tell', None) is not None:
+        try:
+            pos = body.tell()
+        except (IOError, OSError):
+            # This differentiates from None, allowing us to catch
+            # a failed `tell()` later when trying to rewind the body.
+            pos = _FAILEDTELL
+
+    return pos
+
+
+def rewind_body(body, body_pos):
+    """
+    Attempt to rewind body to a certain position.
+    Primarily used for request redirects and retries.
+
+    :param body:
+        File-like object that supports seek.
+
+    :param int pos:
+        Position to seek to in file.
+    """
+    body_seek = getattr(body, 'seek', None)
+    if body_seek is not None and isinstance(body_pos, integer_types):
+        try:
+            body_seek(body_pos)
+        except (IOError, OSError):
+            raise UnrewindableBodyError("An error occurred when rewinding request "
+                                        "body for redirect/retry.")
+    elif body_pos is _FAILEDTELL:
+        raise UnrewindableBodyError("Unable to record file position for rewinding "
+                                    "request body during a redirect/retry.")
+    else:
+        raise ValueError("body_pos must be of type integer, "
+                         "instead it was %s." % type(body_pos))
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cd065bc667797fd8f57535bd316d879c6eaec675
GIT binary patch
literal 3945
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
Qz{JML$;`<p<j5%m091$#*8l(j

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py
new file mode 100644
index 00000000..3d548648
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py
@@ -0,0 +1,87 @@
+from __future__ import absolute_import
+from ..packages.six.moves import http_client as httplib
+
+from ..exceptions import HeaderParsingError
+
+
+def is_fp_closed(obj):
+    """
+    Checks whether a given file-like object is closed.
+
+    :param obj:
+        The file-like object to check.
+    """
+
+    try:
+        # Check `isclosed()` first, in case Python3 doesn't set `closed`.
+        # GH Issue #928
+        return obj.isclosed()
+    except AttributeError:
+        pass
+
+    try:
+        # Check via the official file-like-object way.
+        return obj.closed
+    except AttributeError:
+        pass
+
+    try:
+        # Check if the object is a container for another file-like object that
+        # gets released on exhaustion (e.g. HTTPResponse).
+        return obj.fp is None
+    except AttributeError:
+        pass
+
+    raise ValueError("Unable to determine whether fp is closed.")
+
+
+def assert_header_parsing(headers):
+    """
+    Asserts whether all headers have been successfully parsed.
+    Extracts encountered errors from the result of parsing headers.
+
+    Only works on Python 3.
+
+    :param headers: Headers to verify.
+    :type headers: `httplib.HTTPMessage`.
+
+    :raises urllib3.exceptions.HeaderParsingError:
+        If parsing errors are found.
+    """
+
+    # This will fail silently if we pass in the wrong kind of parameter.
+    # To make debugging easier add an explicit check.
+    if not isinstance(headers, httplib.HTTPMessage):
+        raise TypeError('expected httplib.Message, got {0}.'.format(
+            type(headers)))
+
+    defects = getattr(headers, 'defects', None)
+    get_payload = getattr(headers, 'get_payload', None)
+
+    unparsed_data = None
+    if get_payload:
+        # get_payload is actually email.message.Message.get_payload;
+        # we're only interested in the result if it's not a multipart message
+        if not headers.is_multipart():
+            payload = get_payload()
+
+            if isinstance(payload, (bytes, str)):
+                unparsed_data = payload
+
+    if defects or unparsed_data:
+        raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
+
+
+def is_response_to_head(response):
+    """
+    Checks whether the request of a response has been a HEAD-request.
+    Handles the quirks of AppEngine.
+
+    :param conn:
+    :type conn: :class:`httplib.HTTPResponse`
+    """
+    # FIXME: Can we do this somehow without accessing private httplib _method?
+    method = response._method
+    if isinstance(method, int):  # Platform-specific: Appengine
+        return method == 3
+    return method.upper() == 'HEAD'
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d9fce12058b2478b667e6946ef846b1ca71db47b
GIT binary patch
literal 2583
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py
new file mode 100644
index 00000000..e7d0abd6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py
@@ -0,0 +1,411 @@
+from __future__ import absolute_import
+import time
+import logging
+from collections import namedtuple
+from itertools import takewhile
+import email
+import re
+
+from ..exceptions import (
+    ConnectTimeoutError,
+    MaxRetryError,
+    ProtocolError,
+    ReadTimeoutError,
+    ResponseError,
+    InvalidHeader,
+)
+from ..packages import six
+
+
+log = logging.getLogger(__name__)
+
+
+# Data structure for representing the metadata of requests that result in a retry.
+RequestHistory = namedtuple('RequestHistory', ["method", "url", "error",
+                                               "status", "redirect_location"])
+
+
+class Retry(object):
+    """ Retry configuration.
+
+    Each retry attempt will create a new Retry object with updated values, so
+    they can be safely reused.
+
+    Retries can be defined as a default for a pool::
+
+        retries = Retry(connect=5, read=2, redirect=5)
+        http = PoolManager(retries=retries)
+        response = http.request('GET', 'http://example.com/')
+
+    Or per-request (which overrides the default for the pool)::
+
+        response = http.request('GET', 'http://example.com/', retries=Retry(10))
+
+    Retries can be disabled by passing ``False``::
+
+        response = http.request('GET', 'http://example.com/', retries=False)
+
+    Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless
+    retries are disabled, in which case the causing exception will be raised.
+
+    :param int total:
+        Total number of retries to allow. Takes precedence over other counts.
+
+        Set to ``None`` to remove this constraint and fall back on other
+        counts. It's a good idea to set this to some sensibly-high value to
+        account for unexpected edge cases and avoid infinite retry loops.
+
+        Set to ``0`` to fail on the first retry.
+
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
+
+    :param int connect:
+        How many connection-related errors to retry on.
+
+        These are errors raised before the request is sent to the remote server,
+        which we assume has not triggered the server to process the request.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param int read:
+        How many times to retry on read errors.
+
+        These errors are raised after the request was sent to the server, so the
+        request may have side-effects.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param int redirect:
+        How many redirects to perform. Limit this to avoid infinite redirect
+        loops.
+
+        A redirect is a HTTP response with a status code 301, 302, 303, 307 or
+        308.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
+
+    :param int status:
+        How many times to retry on bad status codes.
+
+        These are retries made on responses, where status code matches
+        ``status_forcelist``.
+
+        Set to ``0`` to fail on the first retry of this type.
+
+    :param iterable method_whitelist:
+        Set of uppercased HTTP method verbs that we should retry on.
+
+        By default, we only retry on methods which are considered to be
+        idempotent (multiple requests with the same parameters end with the
+        same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`.
+
+        Set to a ``False`` value to retry on any verb.
+
+    :param iterable status_forcelist:
+        A set of integer HTTP status codes that we should force a retry on.
+        A retry is initiated if the request method is in ``method_whitelist``
+        and the response status code is in ``status_forcelist``.
+
+        By default, this is disabled with ``None``.
+
+    :param float backoff_factor:
+        A backoff factor to apply between attempts after the second try
+        (most errors are resolved immediately by a second try without a
+        delay). urllib3 will sleep for::
+
+            {backoff factor} * (2 ** ({number of total retries} - 1))
+
+        seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
+        for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer
+        than :attr:`Retry.BACKOFF_MAX`.
+
+        By default, backoff is disabled (set to 0).
+
+    :param bool raise_on_redirect: Whether, if the number of redirects is
+        exhausted, to raise a MaxRetryError, or to return a response with a
+        response code in the 3xx range.
+
+    :param bool raise_on_status: Similar meaning to ``raise_on_redirect``:
+        whether we should raise an exception, or return a response,
+        if status falls in ``status_forcelist`` range and retries have
+        been exhausted.
+
+    :param tuple history: The history of the request encountered during
+        each call to :meth:`~Retry.increment`. The list is in the order
+        the requests occurred. Each list item is of class :class:`RequestHistory`.
+
+    :param bool respect_retry_after_header:
+        Whether to respect Retry-After header on status codes defined as
+        :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not.
+
+    :param iterable remove_headers_on_redirect:
+        Sequence of headers to remove from the request when a response
+        indicating a redirect is returned before firing off the redirected
+        request.
+    """
+
+    DEFAULT_METHOD_WHITELIST = frozenset([
+        'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE'])
+
+    RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503])
+
+    DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization'])
+
+    #: Maximum backoff time.
+    BACKOFF_MAX = 120
+
+    def __init__(self, total=10, connect=None, read=None, redirect=None, status=None,
+                 method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None,
+                 backoff_factor=0, raise_on_redirect=True, raise_on_status=True,
+                 history=None, respect_retry_after_header=True,
+                 remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST):
+
+        self.total = total
+        self.connect = connect
+        self.read = read
+        self.status = status
+
+        if redirect is False or total is False:
+            redirect = 0
+            raise_on_redirect = False
+
+        self.redirect = redirect
+        self.status_forcelist = status_forcelist or set()
+        self.method_whitelist = method_whitelist
+        self.backoff_factor = backoff_factor
+        self.raise_on_redirect = raise_on_redirect
+        self.raise_on_status = raise_on_status
+        self.history = history or tuple()
+        self.respect_retry_after_header = respect_retry_after_header
+        self.remove_headers_on_redirect = remove_headers_on_redirect
+
+    def new(self, **kw):
+        params = dict(
+            total=self.total,
+            connect=self.connect, read=self.read, redirect=self.redirect, status=self.status,
+            method_whitelist=self.method_whitelist,
+            status_forcelist=self.status_forcelist,
+            backoff_factor=self.backoff_factor,
+            raise_on_redirect=self.raise_on_redirect,
+            raise_on_status=self.raise_on_status,
+            history=self.history,
+            remove_headers_on_redirect=self.remove_headers_on_redirect
+        )
+        params.update(kw)
+        return type(self)(**params)
+
+    @classmethod
+    def from_int(cls, retries, redirect=True, default=None):
+        """ Backwards-compatibility for the old retries format."""
+        if retries is None:
+            retries = default if default is not None else cls.DEFAULT
+
+        if isinstance(retries, Retry):
+            return retries
+
+        redirect = bool(redirect) and None
+        new_retries = cls(retries, redirect=redirect)
+        log.debug("Converted retries value: %r -> %r", retries, new_retries)
+        return new_retries
+
+    def get_backoff_time(self):
+        """ Formula for computing the current backoff
+
+        :rtype: float
+        """
+        # We want to consider only the last consecutive errors sequence (Ignore redirects).
+        consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None,
+                                                    reversed(self.history))))
+        if consecutive_errors_len <= 1:
+            return 0
+
+        backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1))
+        return min(self.BACKOFF_MAX, backoff_value)
+
+    def parse_retry_after(self, retry_after):
+        # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4
+        if re.match(r"^\s*[0-9]+\s*$", retry_after):
+            seconds = int(retry_after)
+        else:
+            retry_date_tuple = email.utils.parsedate(retry_after)
+            if retry_date_tuple is None:
+                raise InvalidHeader("Invalid Retry-After header: %s" % retry_after)
+            retry_date = time.mktime(retry_date_tuple)
+            seconds = retry_date - time.time()
+
+        if seconds < 0:
+            seconds = 0
+
+        return seconds
+
+    def get_retry_after(self, response):
+        """ Get the value of Retry-After in seconds. """
+
+        retry_after = response.getheader("Retry-After")
+
+        if retry_after is None:
+            return None
+
+        return self.parse_retry_after(retry_after)
+
+    def sleep_for_retry(self, response=None):
+        retry_after = self.get_retry_after(response)
+        if retry_after:
+            time.sleep(retry_after)
+            return True
+
+        return False
+
+    def _sleep_backoff(self):
+        backoff = self.get_backoff_time()
+        if backoff <= 0:
+            return
+        time.sleep(backoff)
+
+    def sleep(self, response=None):
+        """ Sleep between retry attempts.
+
+        This method will respect a server's ``Retry-After`` response header
+        and sleep the duration of the time requested. If that is not present, it
+        will use an exponential backoff. By default, the backoff factor is 0 and
+        this method will return immediately.
+        """
+
+        if response:
+            slept = self.sleep_for_retry(response)
+            if slept:
+                return
+
+        self._sleep_backoff()
+
+    def _is_connection_error(self, err):
+        """ Errors when we're fairly sure that the server did not receive the
+        request, so it should be safe to retry.
+        """
+        return isinstance(err, ConnectTimeoutError)
+
+    def _is_read_error(self, err):
+        """ Errors that occur after the request has been started, so we should
+        assume that the server began processing it.
+        """
+        return isinstance(err, (ReadTimeoutError, ProtocolError))
+
+    def _is_method_retryable(self, method):
+        """ Checks if a given HTTP method should be retried upon, depending if
+        it is included on the method whitelist.
+        """
+        if self.method_whitelist and method.upper() not in self.method_whitelist:
+            return False
+
+        return True
+
+    def is_retry(self, method, status_code, has_retry_after=False):
+        """ Is this method/status code retryable? (Based on whitelists and control
+        variables such as the number of total retries to allow, whether to
+        respect the Retry-After header, whether this header is present, and
+        whether the returned status code is on the list of status codes to
+        be retried upon on the presence of the aforementioned header)
+        """
+        if not self._is_method_retryable(method):
+            return False
+
+        if self.status_forcelist and status_code in self.status_forcelist:
+            return True
+
+        return (self.total and self.respect_retry_after_header and
+                has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES))
+
+    def is_exhausted(self):
+        """ Are we out of retries? """
+        retry_counts = (self.total, self.connect, self.read, self.redirect, self.status)
+        retry_counts = list(filter(None, retry_counts))
+        if not retry_counts:
+            return False
+
+        return min(retry_counts) < 0
+
+    def increment(self, method=None, url=None, response=None, error=None,
+                  _pool=None, _stacktrace=None):
+        """ Return a new Retry object with incremented retry counters.
+
+        :param response: A response object, or None, if the server did not
+            return a response.
+        :type response: :class:`~urllib3.response.HTTPResponse`
+        :param Exception error: An error encountered during the request, or
+            None if the response was received successfully.
+
+        :return: A new ``Retry`` object.
+        """
+        if self.total is False and error:
+            # Disabled, indicate to re-raise the error.
+            raise six.reraise(type(error), error, _stacktrace)
+
+        total = self.total
+        if total is not None:
+            total -= 1
+
+        connect = self.connect
+        read = self.read
+        redirect = self.redirect
+        status_count = self.status
+        cause = 'unknown'
+        status = None
+        redirect_location = None
+
+        if error and self._is_connection_error(error):
+            # Connect retry?
+            if connect is False:
+                raise six.reraise(type(error), error, _stacktrace)
+            elif connect is not None:
+                connect -= 1
+
+        elif error and self._is_read_error(error):
+            # Read retry?
+            if read is False or not self._is_method_retryable(method):
+                raise six.reraise(type(error), error, _stacktrace)
+            elif read is not None:
+                read -= 1
+
+        elif response and response.get_redirect_location():
+            # Redirect retry?
+            if redirect is not None:
+                redirect -= 1
+            cause = 'too many redirects'
+            redirect_location = response.get_redirect_location()
+            status = response.status
+
+        else:
+            # Incrementing because of a server error like a 500 in
+            # status_forcelist and a the given method is in the whitelist
+            cause = ResponseError.GENERIC_ERROR
+            if response and response.status:
+                if status_count is not None:
+                    status_count -= 1
+                cause = ResponseError.SPECIFIC_ERROR.format(
+                    status_code=response.status)
+                status = response.status
+
+        history = self.history + (RequestHistory(method, url, error, status, redirect_location),)
+
+        new_retry = self.new(
+            total=total,
+            connect=connect, read=read, redirect=redirect, status=status_count,
+            history=history)
+
+        if new_retry.is_exhausted():
+            raise MaxRetryError(_pool, url, error or ResponseError(cause))
+
+        log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)
+
+        return new_retry
+
+    def __repr__(self):
+        return ('{cls.__name__}(total={self.total}, connect={self.connect}, '
+                'read={self.read}, redirect={self.redirect}, status={self.status})').format(
+                    cls=type(self), self=self)
+
+
+# For backwards compatibility (equivalent to pre-v1.9):
+Retry.DEFAULT = Retry(3)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d161a538649cdc31358de6548e95bfe9dc21a79e
GIT binary patch
literal 15622
zcmZSn%*&NH<x)&C0~D|`FfcecFfbH<VPIfLVPHsMWXNG)$Yo@RVq{<h@tGKMm>8m%
zz;a9sIm`@E%wRS%Lk<f=E-OP6D?}X&Lk=55E;~aMJA}`~ki)?c#Q|2!#E`?u5XH%m
z!pe}s#*o9skju>w#m$h*!w|*8kju*u#mkV(#}LKGkju{y#m|r{zz`+Czz9;!&X6O>
zkSoLxCB(p(%FK`@%#bR=(9FmXCCZS>%8<grkiyB3!o`rn&5**wkiyH5&dSit#1JLM
zkiy51D$bC`$dJO%(89pb%)k&CCBcv?!H^;V(w{295HHD)!o(1)A;`eMkO>M64MqkA
zh7x`T28P6>;{2S_lGOOj+=Bd~5<iFx7Xt%BUSe))N=a!!PAWu<6Qm_EJGDF`Gbc5Z
ziGhJZgAF7k%)r3loS&DMnp_f+nVXtlTH;z%lwVZB%fP_kn^+N)T2fSr5D6&CFUe2N
z&w+>tFfcF#r6#6eXbeg%F38U-PK77~8ReN*mY9>7;*pw|l3E0D5i<h=LvdzB2_M*$
z!qU{@5|7N{lKi5|5|GPsQ%f@PQ%XRpN{ezzSQ!`?Qo$|*NfwtRmXsEkfI_4wH6^ns
zHMt}{CqFr{Br`t`tQ72Sc-jG3;RH%MCX5UWsSKbblfnQ>E2+$&bd<uxkiyK6!UB!<
zbT&}HN3k$~WZ9u{m(C0pWCaUyF{Cqsxon^ajbaDKsT@NJ45hMw*}M#?oFJ4U2O?A1
zKylr|%Mir{jq50GhEyJq6iA~0LkknwOkRc*K~PGF;$uh=0yFp-QiQ<_0kE+m3@wZd
zQGyI9qF_NGu%H-NP?#Y_94sipkRkzQh%%%|f*E3<WR@ZYRwluaA`KRl1nY%48{`Z*
zh7=iw7B+?`DTWkTuo`KGpkNJoP-GbkF)%2ALslU<KQApay|f4%;(A<M3JMAeu8GMR
z3Pqp<qmWoqlA2pkqEMchlcSJal$uzQs*tFVms$?ho}ZMJnhcUI$xtXQNJ%V7O;IRI
z%qdMR)=?<V2b)%sky@#coS3JOl&Vmin3kGTsZf+!TAZ2!wGHHs%+z9-l9bf6%)HbT
zg~VcoM1_>pw8YY!5{0z<B85bSg8cj(D=UZ_LGA=O5v0==;uwu&Nb<Ke)ln!)O-!*h
z0@08}WoxPlb__^cMoCG5f~`V8etwQ`VqRi;YLN!iBwHwrP+J7e01CDWAZ>a@so?aj
zq3-S)qOPN$4idD|*H5iT%q_@C)l1IL)mPVqxX`~yp&+$L7pg-+qdX%sIYS}8EVZa8
zGbOcHp(G;}#eX0^$cLJ!UW8;oQtSu$x}+#Gwb&LEw3Ql$2AWVOf%u>RgT_WmW^rOt
zPHKumQl&ycVsUY1Ub;d;f?HxvacV*W^;`iq5b6SOK~fA!PD!Z><wc1F1*s_tnRyCU
z$vKI|#a0P*rA0Y8nMuZasTIko1)y@ESP!NAN>C`x%SkOR2FE8f!W0sVQWap{(E%9;
z3GL*>;#6=zCnuJIy$3fG?u4SmOhj6=Do89!%vH$DD^V!PFG<X?0$Tz~G$A0aLSAWZ
zQfiSxei}G?fP%6lUm-CkC%;@zAtW(7wOFB`C^b1XB{eTO6&%$H`6U^tMGDFJrFkXA
z&;$=ME;torgF-@rUw&R{LV`j`zCuxIZhjfawVB1BTv=RFln8Q1VqS_uT4GL)LQ-OK
zwnBa$#6-Bepe8GLmZ*a=OnQEPib7^eY9h$QVvr>nnZ;mser~ElacW+1W>QY2ZboK$
z1|**<lt6MR$We*OVAH_4tu!ySq98RHl%G>m(o+>cAz7>da!g`bekLf!(lYZhOH#oB
zQK^uVpI?C0e+CfGr6p$OfE*7><Y}2j#U&7Z*g^!HTp+rjF$%UeGq)h8QXwG$9AEMI
zdGWCN!WOClY8FxyLdye0BzokRE955TRf577R8eN;=jj%u=738raGeAWDo~oLRLIYR
z8VCxRkc`ygRB$4LDg(PBMIk9QEx!m9XP|HZmkbJ-#h_pY$1cdTpja&dg?v$2YLN~+
z+91iZJXImFxVSVoRUsp>SRpUJM4_Z8Gd(@EC^ZF~YKv1rx<JuaP?VpXS_~;Ppd|{D
z^Wdooe`tf!Z3#F%R2HN{wIc-=sLaF?RwbFapwbGIKud~1;Q}sP6(9itH3bny5Mgjo
zLBl99tt7Pw>>a4X70MG)!wBL{P=x_f1`i{c^4!Eqg^a|qRE6TqlvLf+w6xS@?0Jbo
z-$QB&EFl0(Y2egRkXn?MUzDq-;FFn~S)u?5&wK@pTmdl+?iut9;-~;K6_jEU6+A*h
z0u<o2O?hTXhC-qOq;;f_oS%}aU~FKhqhM@c1R{(<gt<a~5!`rV0}G_6pddYfViK+$
znzKL&kix78@d=i&#Y|mEi7Ch)M=n(m*$|XRLB(%wVoEBgT!DpLv5rD{Mru(ivIz>g
zi6zMysgMc-<iCUjh;!o8@{5vFb25ud5)!Brda&G7l3E0+Srs5{-}v&3%o4CYhyVbE
zaekUYX+c415vXiUfusP428FWJq9jmePb^U=PgN++$S=)Ffs~l2<&sk+tO=n5Qkb6y
zZd^gLDa5Q|1xQ%~sv(o}^FVnBT)gBfB&EWWPi9JLZb5!YYF>$gMs8_NNoGL~yhH=l
z)+HIBoT*Tpn478qt|C)QQj3ZeQu9(2z)7_v17Q|e5h#FDHT4vNQ&SbJ5=%;otP((t
zk4ilkS2xE{pOAQ8*ANeXm-uiG&k$E1&)^U&5s-*zjKJ$EcpxZ%ig8ddK_d=5<UtN7
zEk?vJBIF$vK=opN8mN{}O;0U?1Uy7NIICd<JUE#sB*N|1gNGX^7lT4OvseLC8)kxQ
zlFT%4V8M$oaQ_FC%QN#75)vS>f=Chx32@UuwJW5~fHwM&90k`85kq(kCFvrk2XM)h
zSqyI$L1GHl;y?|yw4D6J5^xJ6KP@djEit(yzX&<RKy8owv@`{X45&OvEC5x<NvS2}
zsi}FeZbGpFqOdPcP0r6tQ79>@g!@k;H@~<9T5&*Xh}7czoH9`RFE=+e1r&NYm7vCG
zq5?uU*xC7|B?^gfb5c@s5-T<J6re3dNK>vjCpEPI)O0~^xPo$fHLBxl6|@vIj1;uA
z6f~+4%{g#u4;;ansl~Mlx(bG{HZ#Zwh--@V6g(kO3pEiMP@t$W&@<El#d@BCRa$9Y
zvQ>f}*gXkIZi71?)R~Dk&@(93Q83Um0+S}iItqGvda(+y0EL!sdJ3MP&Q(s1LSAZF
zY7wXlm6M;Bo{A{=OEMDkP;;1*qqDcan_IlEV+3-hLQWb`_k$b`E!R^NG(fqcBwxWm
z6E$fh<>%)pfU9!kMwgXBct$FyX{)0EP40-WgjH<C3Ymy9H?<-ov9!1(HAM%Mdcfu>
zBr2dZ>~$3Ki@=hpC8b4q;QR*72jDUW5&y8l9-Lc2jeSt2F|MdkC`!yrM{C%iIv<jG
ztQ3MXb2D=iixhHG6Z1g5o|1fQEz5)iL>?%Ico$U4!ir;1$3Y=6PXXSi0DGVa-Svn@
zUuGJtS^_obK}CiFwyFr?4RE6unhe0rA9(sn0_8Y(c%sG@c%Voj12X(#r4W*l3gbW;
zf2j(vVktEb+}H=VHB(B9GV{{m7Nmmu|H+^}M@hbd6{x_nN~nVr-<f&IMX9-|c_j&Y
zV8cO`Cny<Z=7CbbLVi&SO4@{5SFDhqoLpK|l$xRk8D4;BEJ@7;>CR760QdgjoxmVS
zHyb*P1WU%yG9D78sl}k~NjxZoD&xV$PJ9M<Pzn)e&?E{;Q()zgfdXAeaFZ0G9MpP%
zBnxnIDh5@k&;bZ|fS}Z1L9QV|k@1dhA+AC3!6A+zp~3Oa{w}V;383VgmtTS!A(^nI
z0H`BSmI`%aF-l&7+Y=1(Hn{7UrT}prxXB68s*qNcp9>CUSQM6LfQnvts}XKYW?o7r
zXb3GY9h`|EEm2T77lG3zsKXEGx1?o);#~n$vV*cv5p)DDH3e=I)GA1gSHi-;z~JHP
z=mH+hb9W5^(*dC&;Bh_|S0C39*Ame1u75y?r@vn?cmOXX$kEv~b1owTL*`l#@tu)@
z0X!(_SXz>iUzAw|9(l^F0F8-)#yi0Sqse>>3=AL)8sBsV4ft(hU|^_WWT;_ah-YA^
zVFEK48ETlp3?_yeRxpE^p@xN_goPoSgQ3_4q#nX9@&=6#)`F#KIT`X8K*~Tyu`<-K
zGZZ8+l(2!uYe6FH3^i<Eqc|99IKT`}h8j*VgNvbt3(VkVsNrTPn8r}T1JlLJP{RY3
z;$x`c1vB_T!_dJRAou%$y`&)k8l?q|euC>7a5zCbsNiq~^}d4mU~0fE?-C9M1_oH9
zfWx{twWI`O4kW=M8UbKIP)5y9L9{Hu1G3Pf9$HmF23kP{7jgmwk3fTqWRNJtY;fFx
zOB1k5p(RR*6xc=Jyo4p|L8U?C7}yfJ2H1O`L{yxblNKZa8ZVXv5g=28WI!yCiXhM!
zWsn?*s{kStL4*>BPyrFDAVLi^?hPJ72NA`E3=9nV1x1-<i6yD}Wr;=lY56%RsYS*5
z*@gPq#YX1lhJ{&1=4FN!=EXUc>E-bzDJCWc1_lP{dHNyx1(^l9nR&$}i8(pC<%yQ1
zff*nnFpe)v%}dEI(ucM*^h--JbM(PQj$T0}IC|paK@Gq7`1zo5RgiNT*f<%%kV%4(
zjggaylTir5XN0hlL1X@)!Elhzy+KKP5-8Ha^B^@03|WkzIRX#^JeCb&fJd}J4Dh%%
zhyk9|05RAYQrJPsEekxl4H5y*Pk<QUSqcyXJXZl?fM+Z~3{bM=sbvCXqby!fE@@_D
zU@YMS8Pv=O676MR2-e_bU|{egH<G~d!w>QpD7sTJlS?Qu30%HFhL^#4rKGYTRRa`;
zLFynYK$$GN9IOc3IVsivB?>SxKq&*{w!GBx9iT)3O6Clpq`;^GPY9p{!o$SNm<$RX
zP?-Rt!Q~vN9IRmkO=DzpFcfKlO1KnehHOrTA~_H{j|~({S&R&|jG$tygb5UVCCs2H
zs3KbsJGg`e6obu-4Ea7FQ$W!SE;&=cG26_@2r33y8M4^G>5LIn5;ik4FxIdz1Z#j?
zQEbA%z@Xrin4DdnSd>z%o1C9pkXVwLl$n!RQVD8bgR7u?Xnz#c2L}y@B$nubGjK5|
zvpVPJm8BMeh7Lhl1*8N#C19nXTBM+Br=VKorva)Zz)=Yr{{)vX(2ijV7pNjA2It4T
z<kTQgX$Mvas`bHTU`~EIxNu5IO)5>-00kacI60>nY!1{)uxr2q&^d$>ZqQ^}YB{*r
z%1j;jGy*EzK~;KuW?sp0P(lHDm4TUuQI3h9k%dW!QHW8P5nft=Cd<GHBnFh?85l|!
z8A_NywOR`ULkTlDQLun!otnXOPtD*20!l|r4B3nfMdqNS5Dd!utf1*Jh=hc&NG%hn
z>H~?hgHsJ?b`lh##a^I9;Fe#MTbh#yj&x8mC@lfEl`~Qmz)iV4c#jb>;Q{I?Srviu
zrj-J?LkVw1fPDcf_dq!{7*ytg3Kx*I;2Gd-4u)XxRH7faz6=7D8$tS@5+0<d1VmJT
zb2FG2pezlFE}NXh+@zF5yW61X0+lhDAh&_5cgRdEND(+S=A`C<Q!S{O8wBz-xUwh$
zb>fOsQ-Z)18K|}ZE6&Z#1E)?WM9&SWbQ5D>U;qu=q$Zb^WR|7ILq=HRK{kLw5mv#2
zvluvlz{CKB5-1I)r<TOSTm>55y9x>|9#C+x@iR&=@-VV6i83aG0tJ-RKt&}uVRu0i
zHmCw*1eIjXObkVephR8+o}#T~V#o^sCG{*8hAdXF0!D^fW>BG+!T@UU6$LSrutN(q
zv1UewCP)d%!H~rXQUuBpETGb^go7cA1JrPn0F{m4S~i=3p{Na%ML?E-o0pKX(65+}
zfq@||rdTW5K-V%>JEmAmr5MyOfzE<s=}uTFs1}10ga)V}D*^ekC>2~@fkz?1@tv7h
z0v1WlP0WN$h=bY{#U-2!3=9Q{Ma8M0c~o!)2m&W4P_YaONN^38n+;-u%RNZ##|>_h
zl@vjHLEthEI$!~A7J>@I%6O2G@sRc$$YBUUaB2Y)1C(S0VZH{J%uruE2BjGhP?}*9
zV&rEMV&q{IX5?oSVB%rqWCEuhP`UwyE;#MzKzavR;8qkUrooMy6ee)GkOw6SaN!3Q
zZDwQ$24}BgEl?rn4xS`Sg^n=hr=i4YW*&4Ts#s5<7!=UpUNEHp=m$0g9BJvGp%Bo5
z2uP#_fQl}V`ydenibL3tMUW3j4&<+a402Eb3(BRCQ~>Tge+C6O$fXR-{7j%MiW$hD
z;DVId@Elpg#89LLs*AE<LCaXe%m8YGzzTFw77q#rHQ7N`3OLz=N5;UVV@OeHYLGN2
zMBt$n6a-Q`XhI3>R!~0+k~sf@LJ5?A7#R5(*%)~lS(w0e8z>=yFgP*lf)XPGLl$@q
zP%XGDOJM|8!!qDbVF@DxD7e6-8fd{2N-q%{5YC`50EJgj2q<tsCPR`EsM!Q9TEXcD
zObk%I1r?3)knn*ziItIop%|Qo7<oX&Jfx5Z`3U3#aM&1t!iJHdND16x0XIzH*|kUs
z)Sd|j_0GZlpk@XJ#uQLy1?et!W@KPc2nG-GA`g;Q!pEMW<1V09NC;?>6Ve@q48Vf2
zA84HlXkZyMrK(=6kN}yGfaK+b1o$Wlbl?Tvb^#5_gMA5Z_ohHs%D_g`KxHv(NDVZ$
z1s)(yECCI+fTnW`ic*VH^Gb9SGE3kFf|t^if~J!}Lx%<Vd8v6NnTe43{rt2vJq6^E
zTF|fzG<0Eu@0rC42B5(~xPjn-epKIr2T(I};e+as@f%RkK$}=$pcEDXN?f4m0VghS
z&Vyypf)a4j0uuw1zQ9SJ8<e8J`Hhneoa5Lbg+C}ofE*4^Q=nE*2{<X0FoHTlkfNu!
z8dSQ&)|-Gv%F0vKi&7QR5;Kc(Diw-L!SnWspc!1)^t?h!W(s%~9<+ud6TB7!F|7q1
z2?NhkXO_U`<e+Ps6u|2@N{T8G0S#%&8iK+Z<WdM1++786Q;UkgVGAY(CV)#o)oXla
zaXfSsDl<P1(zcWa1v)5%8CbxT0Eh`{f;fX3?x1Cc@W3u%Vn|~`3i1Y|ATP;CEP)LA
zB25ZG0};I30X&RdT#^XtD1t*3KGO+L+0exiV52}e0kTj)At^OIF;4-yBm&eW$t*z%
zcTn&Kfx{itX9@yUK#0H(iUOtifv$hSMQ3JlJZQ`h66T6n!W<Ot;4lXbra&rQP`Swn
z8Y60EfEJ+H?4ZK5goz;-RPlm)QN=Z&XmHL*P0lU`&CVn$q-U0;=0WB;q2&a04kIZQ
zI_H(5P+E|mr=yUPT9BHT0uIwOcr;{!%d^b9<ebu!)D+NwIVduqCc)>nk)i;UTEL@t
z;NqkdG{+6D=7T~(p%3yGq{IQWsK7Y@Obl=~fcOVe&x0oK)j?4LN<s`Qa-e!1<S7sa
zIUgJ?pt>0nEs*w5u`sA51Z`**>4Q4dAZaFsY&M1>eNfj0EXTr-9}JE>RxpDZOfrE*
z*g#65#a9KWzViglMQ0X6*AeJLhGxO@6ySKP1i8~*LBlDr7!oh=$S4NY5TIpFB}Mr;
z@Q5r+EXo9FDOM;hP0j!<u>?gVV&)D!G7UBvG-v}`+6G=y0h;SWUMmKxQ9%YEHHx9N
zCz2LWRScQS09A_c3NbMcG06a%TLYO@1e>Bj_G@M_EYX4b)1bN+Nwyf-S!f9wrVU~(
zXiZ)kxEfCcE!zT3V`b)p)|x`xhgkIq9-az{1C`yN)+uBx8kBY+gP5QZ=n~Md9<He%
z@IV?OiGw@$5EsXT*7AVI+cOeD`5)eG1LpuRF+kY>)NTV8NhL*<2B4%5?y<9jhN2|E
z!%^^tE~rEWX8=&M9+bi%Wf3Dd2}2SxGnmc7kj4rcs4QUxjWVTx$0{M?Q;=41u`@#n
z2SacPC$u*YY9)h4o<SveF(`Z$9E(yxGp?ZNf5e(gdj)U@+Yj8shQtVHEIkNq7Qq%Y
zo&d_fX_+}CsYQ^k88|xaQA(i_kVhdsA@Gdoz>f@q9F$oc51-<707VBEsM2CmVH9O#
z1C>Ugo&c!l3~Ky<BcqiG5)I&?LD1N-F=()($QU$&lEn;~6srLb5Z17OX1JP}q2nWv
z_^V|HO@yWJfCrjG!E8nbi&}Qj7&Ax(8$&GzI7-<WYB|9S4u)FrWLOp_LoGL`gI&wR
zkix@I%L^v?z;-_atK<T)n;993o`Gi6N*KX?@>BSnRrsE<h67{{XxJOV2DyfVq3}Ip
z9w%t1x+stl<ScHO(SeLLoS?!NH18)4mg0e?DV`!z#u6q5Tp<9miWA8yPEZ%bqLveE
z)jZI+QPC{M8fJzpUeJgUh|L94UBg(z1yRif3Z@ihhFTtw28hyHJ}{dT6e4+{3?+OF
zS^Q81Meo5Tax#Dz;7J*fKTk8(a6^pa1{nv^Ai$6%2p+Cw2904gGcZCefEWsiZXt#e
zVUSmAm_T6xntbGAXl4a%LlLj#2Zz51Xg5R+J7^yaC{)=&)0rt8pt;NxPS8YV3Kv5S
zKSMJETde>?jQ~TIDA=cYOeJFASyiyP1*uG+`5_+g2s13{l!!BANr3iEfb14v0M8-_
zKqroh7lNv<AaG%hbHf09F+nP9aT_=TrWO?=_2r<G{-F8>v=hZj0kq}{x-JB=`vAP`
z0yK{RUyA~5CqkR^@ahlL|AEvm;CXR~A&6#+6=>)h-Vd~bFGhf`NQb#W542blwlxN^
zd<*JQSJ=9B$Vw+G1;;!HO96Aq1-LSTHi|*sKyfO_OQ7}}q*{cy7QA*A+C51D)#9L4
z!D*#AIhDvk2Js{)s6ab4pgrA$1O-TVA$$xTz6K8%mgZ&W<(KCb3xNvF{CvnNY1q_r
zaZm!NDg>3tLD))K&}eosi13814oOXc45NXk4m3)Oa%|OAi`6wjGeCYCU?aeWflFgf
zkd>g~tSA*c2OXphvJ5o*kJYkhkSu5t1YAFth%zuRK!&m)%N*dlhk`&xf)^UNyZX5X
zc{<0t1_k*CfhWa-16-Xw-QYstN+Q1~H?agVFb^tfgY-c5q=E=gqc6x9#4-U@9D*Pg
zs3RA|4Pt=`YjD>&2vih<8@%zLZ5-fAKfbsmF*&=WC^0z|TSWz~df*L%Qs}TSXs<#l
zcqss6CIl3+;9<r*=<HP`xSaqd2B@(BiZgib^#oN<ps@r79#JMaCQe2kMqVb+3?~S)
zF|skTF^MwqFv>CVFbXh<GRZ($LQFi2yo_w1p(0jJMt+bk5Sx*QNr{P*k&RJ;k&}ss
zQISa)GQ<X&X@R#qKx+k37(qj9DNLYpzlH%+GNmws3cO|pCfMjbs3TOJoKvh99}n6_
z7aw1%0dC^jR)ZEG=z-a_I-q7UXg2^<6xtoG1#P2AOo0l5dTL-1NGgMiLb$a$(1l%4
zaY&TbY6h8tQV1xmKzg9rATB6*gZpXV1|m2X!NdSXC8*sOA77MOP!u0O1r(E@<j%mz
z$>gU23T5!T6)gC`le6*hx%nxjIjQmS;F2RgJ|#anJ|3Jv(~9z|Qu9EIR6yAqI-`rR
z)Hf&|l;c4QI$$b-TwOeaT%AMWL5quAgM#Cod>oy<LCb=J96&(^E)2l!Z%{~qvnDuu
zfftQI`fWj$Acf$8Q_%1`WXKsl$^{-w3PLS9AU)C~kT!5OF9flQKsg-L(gIn;044?|
zUceLIpa>|oU|?WiD`#V3W|U?UW#VUMV*(95gK`LuC?`KNqYy7AAEy8(7Y_#~8;<}d
z8z&nlCyxLpCl4dPS0<<_tsw;pZ&0BYAD>oQQd*Q69}gO3X9xlfF@qy9CqF$sGcO$y
zsQEcLsmb7tS3#gm2aegylGLJ-{QR6^@MLC?J1DGNV8+51Ko$pq><a>=An>?L5U6AY
z7sQZ>EKpi2NKDR7OiwKi0+k_Pv(r;ceDXoNUV@52#)3;)kZZxyU63jZ92!BO!DDcg
sAc%p99B`(vfn)<aP#6`1VoCs9d<iguX(l}m0cL&{enx&~vHuJW0AA4iqW}N^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py
new file mode 100644
index 00000000..dfc553ff
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py
@@ -0,0 +1,381 @@
+from __future__ import absolute_import
+import errno
+import warnings
+import hmac
+import socket
+
+from binascii import hexlify, unhexlify
+from hashlib import md5, sha1, sha256
+
+from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning
+from ..packages import six
+
+
+SSLContext = None
+HAS_SNI = False
+IS_PYOPENSSL = False
+IS_SECURETRANSPORT = False
+
+# Maps the length of a digest to a possible hash function producing this digest
+HASHFUNC_MAP = {
+    32: md5,
+    40: sha1,
+    64: sha256,
+}
+
+
+def _const_compare_digest_backport(a, b):
+    """
+    Compare two digests of equal length in constant time.
+
+    The digests must be of type str/bytes.
+    Returns True if the digests match, and False otherwise.
+    """
+    result = abs(len(a) - len(b))
+    for l, r in zip(bytearray(a), bytearray(b)):
+        result |= l ^ r
+    return result == 0
+
+
+_const_compare_digest = getattr(hmac, 'compare_digest',
+                                _const_compare_digest_backport)
+
+
+try:  # Test for SSL features
+    import ssl
+    from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23
+    from ssl import HAS_SNI  # Has SNI?
+except ImportError:
+    pass
+
+
+try:
+    from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION
+except ImportError:
+    OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000
+    OP_NO_COMPRESSION = 0x20000
+
+
+# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in
+# those cases. This means that we can only detect IPv4 addresses in this case.
+if hasattr(socket, 'inet_pton'):
+    inet_pton = socket.inet_pton
+else:
+    # Maybe we can use ipaddress if the user has urllib3[secure]?
+    try:
+        from pip._vendor import ipaddress
+
+        def inet_pton(_, host):
+            if isinstance(host, bytes):
+                host = host.decode('ascii')
+            return ipaddress.ip_address(host)
+
+    except ImportError:  # Platform-specific: Non-Linux
+        def inet_pton(_, host):
+            return socket.inet_aton(host)
+
+
+# A secure default.
+# Sources for more information on TLS ciphers:
+#
+# - https://wiki.mozilla.org/Security/Server_Side_TLS
+# - https://www.ssllabs.com/projects/best-practices/index.html
+# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
+#
+# The general intent is:
+# - Prefer TLS 1.3 cipher suites
+# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE),
+# - prefer ECDHE over DHE for better performance,
+# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and
+#   security,
+# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common,
+# - disable NULL authentication, MD5 MACs and DSS for security reasons.
+DEFAULT_CIPHERS = ':'.join([
+    'TLS13-AES-256-GCM-SHA384',
+    'TLS13-CHACHA20-POLY1305-SHA256',
+    'TLS13-AES-128-GCM-SHA256',
+    'ECDH+AESGCM',
+    'ECDH+CHACHA20',
+    'DH+AESGCM',
+    'DH+CHACHA20',
+    'ECDH+AES256',
+    'DH+AES256',
+    'ECDH+AES128',
+    'DH+AES',
+    'RSA+AESGCM',
+    'RSA+AES',
+    '!aNULL',
+    '!eNULL',
+    '!MD5',
+])
+
+try:
+    from ssl import SSLContext  # Modern SSL?
+except ImportError:
+    import sys
+
+    class SSLContext(object):  # Platform-specific: Python 2
+        def __init__(self, protocol_version):
+            self.protocol = protocol_version
+            # Use default values from a real SSLContext
+            self.check_hostname = False
+            self.verify_mode = ssl.CERT_NONE
+            self.ca_certs = None
+            self.options = 0
+            self.certfile = None
+            self.keyfile = None
+            self.ciphers = None
+
+        def load_cert_chain(self, certfile, keyfile):
+            self.certfile = certfile
+            self.keyfile = keyfile
+
+        def load_verify_locations(self, cafile=None, capath=None):
+            self.ca_certs = cafile
+
+            if capath is not None:
+                raise SSLError("CA directories not supported in older Pythons")
+
+        def set_ciphers(self, cipher_suite):
+            self.ciphers = cipher_suite
+
+        def wrap_socket(self, socket, server_hostname=None, server_side=False):
+            warnings.warn(
+                'A true SSLContext object is not available. This prevents '
+                'urllib3 from configuring SSL appropriately and may cause '
+                'certain SSL connections to fail. You can upgrade to a newer '
+                'version of Python to solve this. For more information, see '
+                'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
+                '#ssl-warnings',
+                InsecurePlatformWarning
+            )
+            kwargs = {
+                'keyfile': self.keyfile,
+                'certfile': self.certfile,
+                'ca_certs': self.ca_certs,
+                'cert_reqs': self.verify_mode,
+                'ssl_version': self.protocol,
+                'server_side': server_side,
+            }
+            return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
+
+
+def assert_fingerprint(cert, fingerprint):
+    """
+    Checks if given fingerprint matches the supplied certificate.
+
+    :param cert:
+        Certificate as bytes object.
+    :param fingerprint:
+        Fingerprint as string of hexdigits, can be interspersed by colons.
+    """
+
+    fingerprint = fingerprint.replace(':', '').lower()
+    digest_length = len(fingerprint)
+    hashfunc = HASHFUNC_MAP.get(digest_length)
+    if not hashfunc:
+        raise SSLError(
+            'Fingerprint of invalid length: {0}'.format(fingerprint))
+
+    # We need encode() here for py32; works on py2 and p33.
+    fingerprint_bytes = unhexlify(fingerprint.encode())
+
+    cert_digest = hashfunc(cert).digest()
+
+    if not _const_compare_digest(cert_digest, fingerprint_bytes):
+        raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".'
+                       .format(fingerprint, hexlify(cert_digest)))
+
+
+def resolve_cert_reqs(candidate):
+    """
+    Resolves the argument to a numeric constant, which can be passed to
+    the wrap_socket function/method from the ssl module.
+    Defaults to :data:`ssl.CERT_NONE`.
+    If given a string it is assumed to be the name of the constant in the
+    :mod:`ssl` module or its abbreviation.
+    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
+    If it's neither `None` nor a string we assume it is already the numeric
+    constant which can directly be passed to wrap_socket.
+    """
+    if candidate is None:
+        return CERT_NONE
+
+    if isinstance(candidate, str):
+        res = getattr(ssl, candidate, None)
+        if res is None:
+            res = getattr(ssl, 'CERT_' + candidate)
+        return res
+
+    return candidate
+
+
+def resolve_ssl_version(candidate):
+    """
+    like resolve_cert_reqs
+    """
+    if candidate is None:
+        return PROTOCOL_SSLv23
+
+    if isinstance(candidate, str):
+        res = getattr(ssl, candidate, None)
+        if res is None:
+            res = getattr(ssl, 'PROTOCOL_' + candidate)
+        return res
+
+    return candidate
+
+
+def create_urllib3_context(ssl_version=None, cert_reqs=None,
+                           options=None, ciphers=None):
+    """All arguments have the same meaning as ``ssl_wrap_socket``.
+
+    By default, this function does a lot of the same work that
+    ``ssl.create_default_context`` does on Python 3.4+. It:
+
+    - Disables SSLv2, SSLv3, and compression
+    - Sets a restricted set of server ciphers
+
+    If you wish to enable SSLv3, you can do::
+
+        from pip._vendor.urllib3.util import ssl_
+        context = ssl_.create_urllib3_context()
+        context.options &= ~ssl_.OP_NO_SSLv3
+
+    You can do the same to enable compression (substituting ``COMPRESSION``
+    for ``SSLv3`` in the last line above).
+
+    :param ssl_version:
+        The desired protocol version to use. This will default to
+        PROTOCOL_SSLv23 which will negotiate the highest protocol that both
+        the server and your installation of OpenSSL support.
+    :param cert_reqs:
+        Whether to require the certificate verification. This defaults to
+        ``ssl.CERT_REQUIRED``.
+    :param options:
+        Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``,
+        ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``.
+    :param ciphers:
+        Which cipher suites to allow the server to select.
+    :returns:
+        Constructed SSLContext object with specified options
+    :rtype: SSLContext
+    """
+    context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23)
+
+    context.set_ciphers(ciphers or DEFAULT_CIPHERS)
+
+    # Setting the default here, as we may have no ssl module on import
+    cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs
+
+    if options is None:
+        options = 0
+        # SSLv2 is easily broken and is considered harmful and dangerous
+        options |= OP_NO_SSLv2
+        # SSLv3 has several problems and is now dangerous
+        options |= OP_NO_SSLv3
+        # Disable compression to prevent CRIME attacks for OpenSSL 1.0+
+        # (issue #309)
+        options |= OP_NO_COMPRESSION
+
+    context.options |= options
+
+    context.verify_mode = cert_reqs
+    if getattr(context, 'check_hostname', None) is not None:  # Platform-specific: Python 3.2
+        # We do our own verification, including fingerprints and alternative
+        # hostnames. So disable it here
+        context.check_hostname = False
+    return context
+
+
+def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
+                    ca_certs=None, server_hostname=None,
+                    ssl_version=None, ciphers=None, ssl_context=None,
+                    ca_cert_dir=None):
+    """
+    All arguments except for server_hostname, ssl_context, and ca_cert_dir have
+    the same meaning as they do when using :func:`ssl.wrap_socket`.
+
+    :param server_hostname:
+        When SNI is supported, the expected hostname of the certificate
+    :param ssl_context:
+        A pre-made :class:`SSLContext` object. If none is provided, one will
+        be created using :func:`create_urllib3_context`.
+    :param ciphers:
+        A string of ciphers we wish the client to support.
+    :param ca_cert_dir:
+        A directory containing CA certificates in multiple separate files, as
+        supported by OpenSSL's -CApath flag or the capath argument to
+        SSLContext.load_verify_locations().
+    """
+    context = ssl_context
+    if context is None:
+        # Note: This branch of code and all the variables in it are no longer
+        # used by urllib3 itself. We should consider deprecating and removing
+        # this code.
+        context = create_urllib3_context(ssl_version, cert_reqs,
+                                         ciphers=ciphers)
+
+    if ca_certs or ca_cert_dir:
+        try:
+            context.load_verify_locations(ca_certs, ca_cert_dir)
+        except IOError as e:  # Platform-specific: Python 2.7
+            raise SSLError(e)
+        # Py33 raises FileNotFoundError which subclasses OSError
+        # These are not equivalent unless we check the errno attribute
+        except OSError as e:  # Platform-specific: Python 3.3 and beyond
+            if e.errno == errno.ENOENT:
+                raise SSLError(e)
+            raise
+    elif getattr(context, 'load_default_certs', None) is not None:
+        # try to load OS default certs; works well on Windows (require Python3.4+)
+        context.load_default_certs()
+
+    if certfile:
+        context.load_cert_chain(certfile, keyfile)
+
+    # If we detect server_hostname is an IP address then the SNI
+    # extension should not be used according to RFC3546 Section 3.1
+    # We shouldn't warn the user if SNI isn't available but we would
+    # not be using SNI anyways due to IP address for server_hostname.
+    if ((server_hostname is not None and not is_ipaddress(server_hostname))
+            or IS_SECURETRANSPORT):
+        if HAS_SNI and server_hostname is not None:
+            return context.wrap_socket(sock, server_hostname=server_hostname)
+
+        warnings.warn(
+            'An HTTPS request has been made, but the SNI (Server Name '
+            'Indication) extension to TLS is not available on this platform. '
+            'This may cause the server to present an incorrect TLS '
+            'certificate, which can cause validation failures. You can upgrade to '
+            'a newer version of Python to solve this. For more information, see '
+            'https://urllib3.readthedocs.io/en/latest/advanced-usage.html'
+            '#ssl-warnings',
+            SNIMissingWarning
+        )
+
+    return context.wrap_socket(sock)
+
+
+def is_ipaddress(hostname):
+    """Detects whether the hostname given is an IP address.
+
+    :param str hostname: Hostname to examine.
+    :return: True if the hostname is an IP address, False otherwise.
+    """
+    if six.PY3 and isinstance(hostname, bytes):
+        # IDN A-label bytes are ASCII compatible.
+        hostname = hostname.decode('ascii')
+
+    families = [socket.AF_INET]
+    if hasattr(socket, 'AF_INET6'):
+        families.append(socket.AF_INET6)
+
+    for af in families:
+        try:
+            inet_pton(af, hostname)
+        except (socket.error, ValueError, OSError):
+            pass
+        else:
+            return True
+    return False
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1fee4fe5d29120b79d6f1fbbdd775c28da1a5548
GIT binary patch
literal 12270
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py
new file mode 100644
index 00000000..cec817e6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py
@@ -0,0 +1,242 @@
+from __future__ import absolute_import
+# The default socket timeout, used by httplib to indicate that no timeout was
+# specified by the user
+from socket import _GLOBAL_DEFAULT_TIMEOUT
+import time
+
+from ..exceptions import TimeoutStateError
+
+# A sentinel value to indicate that no timeout was specified by the user in
+# urllib3
+_Default = object()
+
+
+# Use time.monotonic if available.
+current_time = getattr(time, "monotonic", time.time)
+
+
+class Timeout(object):
+    """ Timeout configuration.
+
+    Timeouts can be defined as a default for a pool::
+
+        timeout = Timeout(connect=2.0, read=7.0)
+        http = PoolManager(timeout=timeout)
+        response = http.request('GET', 'http://example.com/')
+
+    Or per-request (which overrides the default for the pool)::
+
+        response = http.request('GET', 'http://example.com/', timeout=Timeout(10))
+
+    Timeouts can be disabled by setting all the parameters to ``None``::
+
+        no_timeout = Timeout(connect=None, read=None)
+        response = http.request('GET', 'http://example.com/, timeout=no_timeout)
+
+
+    :param total:
+        This combines the connect and read timeouts into one; the read timeout
+        will be set to the time leftover from the connect attempt. In the
+        event that both a connect timeout and a total are specified, or a read
+        timeout and a total are specified, the shorter timeout will be applied.
+
+        Defaults to None.
+
+    :type total: integer, float, or None
+
+    :param connect:
+        The maximum amount of time to wait for a connection attempt to a server
+        to succeed. Omitting the parameter will default the connect timeout to
+        the system default, probably `the global default timeout in socket.py
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
+        None will set an infinite timeout for connection attempts.
+
+    :type connect: integer, float, or None
+
+    :param read:
+        The maximum amount of time to wait between consecutive
+        read operations for a response from the server. Omitting
+        the parameter will default the read timeout to the system
+        default, probably `the global default timeout in socket.py
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
+        None will set an infinite timeout.
+
+    :type read: integer, float, or None
+
+    .. note::
+
+        Many factors can affect the total amount of time for urllib3 to return
+        an HTTP response.
+
+        For example, Python's DNS resolver does not obey the timeout specified
+        on the socket. Other factors that can affect total request time include
+        high CPU load, high swap, the program running at a low priority level,
+        or other behaviors.
+
+        In addition, the read and total timeouts only measure the time between
+        read operations on the socket connecting the client and the server,
+        not the total amount of time for the request to return a complete
+        response. For most requests, the timeout is raised because the server
+        has not sent the first byte in the specified time. This is not always
+        the case; if a server streams one byte every fifteen seconds, a timeout
+        of 20 seconds will not trigger, even though the request will take
+        several minutes to complete.
+
+        If your goal is to cut off any request after a set amount of wall clock
+        time, consider having a second "watcher" thread to cut off a slow
+        request.
+    """
+
+    #: A sentinel object representing the default timeout value
+    DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT
+
+    def __init__(self, total=None, connect=_Default, read=_Default):
+        self._connect = self._validate_timeout(connect, 'connect')
+        self._read = self._validate_timeout(read, 'read')
+        self.total = self._validate_timeout(total, 'total')
+        self._start_connect = None
+
+    def __str__(self):
+        return '%s(connect=%r, read=%r, total=%r)' % (
+            type(self).__name__, self._connect, self._read, self.total)
+
+    @classmethod
+    def _validate_timeout(cls, value, name):
+        """ Check that a timeout attribute is valid.
+
+        :param value: The timeout value to validate
+        :param name: The name of the timeout attribute to validate. This is
+            used to specify in error messages.
+        :return: The validated and casted version of the given value.
+        :raises ValueError: If it is a numeric value less than or equal to
+            zero, or the type is not an integer, float, or None.
+        """
+        if value is _Default:
+            return cls.DEFAULT_TIMEOUT
+
+        if value is None or value is cls.DEFAULT_TIMEOUT:
+            return value
+
+        if isinstance(value, bool):
+            raise ValueError("Timeout cannot be a boolean value. It must "
+                             "be an int, float or None.")
+        try:
+            float(value)
+        except (TypeError, ValueError):
+            raise ValueError("Timeout value %s was %s, but it must be an "
+                             "int, float or None." % (name, value))
+
+        try:
+            if value <= 0:
+                raise ValueError("Attempted to set %s timeout to %s, but the "
+                                 "timeout cannot be set to a value less "
+                                 "than or equal to 0." % (name, value))
+        except TypeError:  # Python 3
+            raise ValueError("Timeout value %s was %s, but it must be an "
+                             "int, float or None." % (name, value))
+
+        return value
+
+    @classmethod
+    def from_float(cls, timeout):
+        """ Create a new Timeout from a legacy timeout value.
+
+        The timeout value used by httplib.py sets the same timeout on the
+        connect(), and recv() socket requests. This creates a :class:`Timeout`
+        object that sets the individual timeouts to the ``timeout`` value
+        passed to this function.
+
+        :param timeout: The legacy timeout value.
+        :type timeout: integer, float, sentinel default object, or None
+        :return: Timeout object
+        :rtype: :class:`Timeout`
+        """
+        return Timeout(read=timeout, connect=timeout)
+
+    def clone(self):
+        """ Create a copy of the timeout object
+
+        Timeout properties are stored per-pool but each request needs a fresh
+        Timeout object to ensure each one has its own start/stop configured.
+
+        :return: a copy of the timeout object
+        :rtype: :class:`Timeout`
+        """
+        # We can't use copy.deepcopy because that will also create a new object
+        # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
+        # detect the user default.
+        return Timeout(connect=self._connect, read=self._read,
+                       total=self.total)
+
+    def start_connect(self):
+        """ Start the timeout clock, used during a connect() attempt
+
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
+            to start a timer that has been started already.
+        """
+        if self._start_connect is not None:
+            raise TimeoutStateError("Timeout timer has already been started.")
+        self._start_connect = current_time()
+        return self._start_connect
+
+    def get_connect_duration(self):
+        """ Gets the time elapsed since the call to :meth:`start_connect`.
+
+        :return: Elapsed time.
+        :rtype: float
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
+            to get duration for a timer that hasn't been started.
+        """
+        if self._start_connect is None:
+            raise TimeoutStateError("Can't get connect duration for timer "
+                                    "that has not started.")
+        return current_time() - self._start_connect
+
+    @property
+    def connect_timeout(self):
+        """ Get the value to use when setting a connection timeout.
+
+        This will be a positive float or integer, the value None
+        (never timeout), or the default system timeout.
+
+        :return: Connect timeout.
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
+        """
+        if self.total is None:
+            return self._connect
+
+        if self._connect is None or self._connect is self.DEFAULT_TIMEOUT:
+            return self.total
+
+        return min(self._connect, self.total)
+
+    @property
+    def read_timeout(self):
+        """ Get the value for the read timeout.
+
+        This assumes some time has elapsed in the connection timeout and
+        computes the read timeout appropriately.
+
+        If self.total is set, the read timeout is dependent on the amount of
+        time taken by the connect timeout. If the connection time has not been
+        established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
+        raised.
+
+        :return: Value to use for the read timeout.
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
+        :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
+            has not yet been called on this object.
+        """
+        if (self.total is not None and
+                self.total is not self.DEFAULT_TIMEOUT and
+                self._read is not None and
+                self._read is not self.DEFAULT_TIMEOUT):
+            # In case the connect timeout has not yet been established.
+            if self._start_connect is None:
+                return self._read
+            return max(0, min(self.total - self.get_connect_duration(),
+                              self._read))
+        elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT:
+            return max(0, self.total - self.get_connect_duration())
+        else:
+            return self._read
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8ed35bc3f09df5e0540d9be02d3e28ef64d73827
GIT binary patch
literal 10233
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
D1Gzks

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py
new file mode 100644
index 00000000..6b6f9968
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py
@@ -0,0 +1,230 @@
+from __future__ import absolute_import
+from collections import namedtuple
+
+from ..exceptions import LocationParseError
+
+
+url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment']
+
+# We only want to normalize urls with an HTTP(S) scheme.
+# urllib3 infers URLs without a scheme (None) to be http.
+NORMALIZABLE_SCHEMES = ('http', 'https', None)
+
+
+class Url(namedtuple('Url', url_attrs)):
+    """
+    Datastructure for representing an HTTP URL. Used as a return value for
+    :func:`parse_url`. Both the scheme and host are normalized as they are
+    both case-insensitive according to RFC 3986.
+    """
+    __slots__ = ()
+
+    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None,
+                query=None, fragment=None):
+        if path and not path.startswith('/'):
+            path = '/' + path
+        if scheme:
+            scheme = scheme.lower()
+        if host and scheme in NORMALIZABLE_SCHEMES:
+            host = host.lower()
+        return super(Url, cls).__new__(cls, scheme, auth, host, port, path,
+                                       query, fragment)
+
+    @property
+    def hostname(self):
+        """For backwards-compatibility with urlparse. We're nice like that."""
+        return self.host
+
+    @property
+    def request_uri(self):
+        """Absolute path including the query string."""
+        uri = self.path or '/'
+
+        if self.query is not None:
+            uri += '?' + self.query
+
+        return uri
+
+    @property
+    def netloc(self):
+        """Network location including host and port"""
+        if self.port:
+            return '%s:%d' % (self.host, self.port)
+        return self.host
+
+    @property
+    def url(self):
+        """
+        Convert self into a url
+
+        This function should more or less round-trip with :func:`.parse_url`. The
+        returned url may not be exactly the same as the url inputted to
+        :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls
+        with a blank port will have : removed).
+
+        Example: ::
+
+            >>> U = parse_url('http://google.com/mail/')
+            >>> U.url
+            'http://google.com/mail/'
+            >>> Url('http', 'username:password', 'host.com', 80,
+            ... '/path', 'query', 'fragment').url
+            'http://username:password@host.com:80/path?query#fragment'
+        """
+        scheme, auth, host, port, path, query, fragment = self
+        url = ''
+
+        # We use "is not None" we want things to happen with empty strings (or 0 port)
+        if scheme is not None:
+            url += scheme + '://'
+        if auth is not None:
+            url += auth + '@'
+        if host is not None:
+            url += host
+        if port is not None:
+            url += ':' + str(port)
+        if path is not None:
+            url += path
+        if query is not None:
+            url += '?' + query
+        if fragment is not None:
+            url += '#' + fragment
+
+        return url
+
+    def __str__(self):
+        return self.url
+
+
+def split_first(s, delims):
+    """
+    Given a string and an iterable of delimiters, split on the first found
+    delimiter. Return two split parts and the matched delimiter.
+
+    If not found, then the first part is the full input string.
+
+    Example::
+
+        >>> split_first('foo/bar?baz', '?/=')
+        ('foo', 'bar?baz', '/')
+        >>> split_first('foo/bar?baz', '123')
+        ('foo/bar?baz', '', None)
+
+    Scales linearly with number of delims. Not ideal for large number of delims.
+    """
+    min_idx = None
+    min_delim = None
+    for d in delims:
+        idx = s.find(d)
+        if idx < 0:
+            continue
+
+        if min_idx is None or idx < min_idx:
+            min_idx = idx
+            min_delim = d
+
+    if min_idx is None or min_idx < 0:
+        return s, '', None
+
+    return s[:min_idx], s[min_idx + 1:], min_delim
+
+
+def parse_url(url):
+    """
+    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
+    performed to parse incomplete urls. Fields not provided will be None.
+
+    Partly backwards-compatible with :mod:`urlparse`.
+
+    Example::
+
+        >>> parse_url('http://google.com/mail/')
+        Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
+        >>> parse_url('google.com:80')
+        Url(scheme=None, host='google.com', port=80, path=None, ...)
+        >>> parse_url('/foo?bar')
+        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
+    """
+
+    # While this code has overlap with stdlib's urlparse, it is much
+    # simplified for our needs and less annoying.
+    # Additionally, this implementations does silly things to be optimal
+    # on CPython.
+
+    if not url:
+        # Empty
+        return Url()
+
+    scheme = None
+    auth = None
+    host = None
+    port = None
+    path = None
+    fragment = None
+    query = None
+
+    # Scheme
+    if '://' in url:
+        scheme, url = url.split('://', 1)
+
+    # Find the earliest Authority Terminator
+    # (http://tools.ietf.org/html/rfc3986#section-3.2)
+    url, path_, delim = split_first(url, ['/', '?', '#'])
+
+    if delim:
+        # Reassemble the path
+        path = delim + path_
+
+    # Auth
+    if '@' in url:
+        # Last '@' denotes end of auth part
+        auth, url = url.rsplit('@', 1)
+
+    # IPv6
+    if url and url[0] == '[':
+        host, url = url.split(']', 1)
+        host += ']'
+
+    # Port
+    if ':' in url:
+        _host, port = url.split(':', 1)
+
+        if not host:
+            host = _host
+
+        if port:
+            # If given, ports must be integers. No whitespace, no plus or
+            # minus prefixes, no non-integer digits such as ^2 (superscript).
+            if not port.isdigit():
+                raise LocationParseError(url)
+            try:
+                port = int(port)
+            except ValueError:
+                raise LocationParseError(url)
+        else:
+            # Blank ports are cool, too. (rfc3986#section-3.2.3)
+            port = None
+
+    elif not host and url:
+        host = url
+
+    if not path:
+        return Url(scheme, auth, host, port, path, query, fragment)
+
+    # Fragment
+    if '#' in path:
+        path, fragment = path.split('#', 1)
+
+    # Query
+    if '?' in path:
+        path, query = path.split('?', 1)
+
+    return Url(scheme, auth, host, port, path, query, fragment)
+
+
+def get_host(url):
+    """
+    Deprecated. Use :func:`parse_url` instead.
+    """
+    p = parse_url(url)
+    return p.scheme or 'http', p.hostname, p.port
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..162aa262531570295a4fdf58d7967931e081a4c3
GIT binary patch
literal 6901
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py
new file mode 100644
index 00000000..4db71baf
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py
@@ -0,0 +1,150 @@
+import errno
+from functools import partial
+import select
+import sys
+try:
+    from time import monotonic
+except ImportError:
+    from time import time as monotonic
+
+__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"]
+
+
+class NoWayToWaitForSocketError(Exception):
+    pass
+
+
+# How should we wait on sockets?
+#
+# There are two types of APIs you can use for waiting on sockets: the fancy
+# modern stateful APIs like epoll/kqueue, and the older stateless APIs like
+# select/poll. The stateful APIs are more efficient when you have a lots of
+# sockets to keep track of, because you can set them up once and then use them
+# lots of times. But we only ever want to wait on a single socket at a time
+# and don't want to keep track of state, so the stateless APIs are actually
+# more efficient. So we want to use select() or poll().
+#
+# Now, how do we choose between select() and poll()? On traditional Unixes,
+# select() has a strange calling convention that makes it slow, or fail
+# altogether, for high-numbered file descriptors. The point of poll() is to fix
+# that, so on Unixes, we prefer poll().
+#
+# On Windows, there is no poll() (or at least Python doesn't provide a wrapper
+# for it), but that's OK, because on Windows, select() doesn't have this
+# strange calling convention; plain select() works fine.
+#
+# So: on Windows we use select(), and everywhere else we use poll(). We also
+# fall back to select() in case poll() is somehow broken or missing.
+
+if sys.version_info >= (3, 5):
+    # Modern Python, that retries syscalls by default
+    def _retry_on_intr(fn, timeout):
+        return fn(timeout)
+else:
+    # Old and broken Pythons.
+    def _retry_on_intr(fn, timeout):
+        if timeout is None:
+            deadline = float("inf")
+        else:
+            deadline = monotonic() + timeout
+
+        while True:
+            try:
+                return fn(timeout)
+            # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7
+            except (OSError, select.error) as e:
+                # 'e.args[0]' incantation works for both OSError and select.error
+                if e.args[0] != errno.EINTR:
+                    raise
+                else:
+                    timeout = deadline - monotonic()
+                    if timeout < 0:
+                        timeout = 0
+                    if timeout == float("inf"):
+                        timeout = None
+                    continue
+
+
+def select_wait_for_socket(sock, read=False, write=False, timeout=None):
+    if not read and not write:
+        raise RuntimeError("must specify at least one of read=True, write=True")
+    rcheck = []
+    wcheck = []
+    if read:
+        rcheck.append(sock)
+    if write:
+        wcheck.append(sock)
+    # When doing a non-blocking connect, most systems signal success by
+    # marking the socket writable. Windows, though, signals success by marked
+    # it as "exceptional". We paper over the difference by checking the write
+    # sockets for both conditions. (The stdlib selectors module does the same
+    # thing.)
+    fn = partial(select.select, rcheck, wcheck, wcheck)
+    rready, wready, xready = _retry_on_intr(fn, timeout)
+    return bool(rready or wready or xready)
+
+
+def poll_wait_for_socket(sock, read=False, write=False, timeout=None):
+    if not read and not write:
+        raise RuntimeError("must specify at least one of read=True, write=True")
+    mask = 0
+    if read:
+        mask |= select.POLLIN
+    if write:
+        mask |= select.POLLOUT
+    poll_obj = select.poll()
+    poll_obj.register(sock, mask)
+
+    # For some reason, poll() takes timeout in milliseconds
+    def do_poll(t):
+        if t is not None:
+            t *= 1000
+        return poll_obj.poll(t)
+
+    return bool(_retry_on_intr(do_poll, timeout))
+
+
+def null_wait_for_socket(*args, **kwargs):
+    raise NoWayToWaitForSocketError("no select-equivalent available")
+
+
+def _have_working_poll():
+    # Apparently some systems have a select.poll that fails as soon as you try
+    # to use it, either due to strange configuration or broken monkeypatching
+    # from libraries like eventlet/greenlet.
+    try:
+        poll_obj = select.poll()
+        _retry_on_intr(poll_obj.poll, 0)
+    except (AttributeError, OSError):
+        return False
+    else:
+        return True
+
+
+def wait_for_socket(*args, **kwargs):
+    # We delay choosing which implementation to use until the first time we're
+    # called. We could do it at import time, but then we might make the wrong
+    # decision if someone goes wild with monkeypatching select.poll after
+    # we're imported.
+    global wait_for_socket
+    if _have_working_poll():
+        wait_for_socket = poll_wait_for_socket
+    elif hasattr(select, "select"):
+        wait_for_socket = select_wait_for_socket
+    else:  # Platform-specific: Appengine.
+        wait_for_socket = null_wait_for_socket
+    return wait_for_socket(*args, **kwargs)
+
+
+def wait_for_read(sock, timeout=None):
+    """ Waits for reading to be available on a given socket.
+    Returns True if the socket is readable, or False if the timeout expired.
+    """
+    return wait_for_socket(sock, read=True, timeout=timeout)
+
+
+def wait_for_write(sock, timeout=None):
+    """ Waits for writing to be available on a given socket.
+    Returns True if the socket is readable, or False if the timeout expired.
+    """
+    return wait_for_socket(sock, write=True, timeout=timeout)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..823d31809a69ab98321c03115aa1337a4f94ddd8
GIT binary patch
literal 4842
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
X@iXzTaEc2F3yE;DaPo5U^RNQ|v{px$

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py
new file mode 100644
index 00000000..d21d697c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py
@@ -0,0 +1,342 @@
+# coding: utf-8
+"""
+
+    webencodings
+    ~~~~~~~~~~~~
+
+    This is a Python implementation of the `WHATWG Encoding standard
+    <http://encoding.spec.whatwg.org/>`. See README for details.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+import codecs
+
+from .labels import LABELS
+
+
+VERSION = '0.5.1'
+
+
+# Some names in Encoding are not valid Python aliases. Remap these.
+PYTHON_NAMES = {
+    'iso-8859-8-i': 'iso-8859-8',
+    'x-mac-cyrillic': 'mac-cyrillic',
+    'macintosh': 'mac-roman',
+    'windows-874': 'cp874'}
+
+CACHE = {}
+
+
+def ascii_lower(string):
+    r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z.
+
+    :param string: An Unicode string.
+    :returns: A new Unicode string.
+
+    This is used for `ASCII case-insensitive
+    <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_
+    matching of encoding labels.
+    The same matching is also used, among other things,
+    for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_.
+
+    This is different from the :meth:`~py:str.lower` method of Unicode strings
+    which also affect non-ASCII characters,
+    sometimes mapping them into the ASCII range:
+
+        >>> keyword = u'Bac\N{KELVIN SIGN}ground'
+        >>> assert keyword.lower() == u'background'
+        >>> assert ascii_lower(keyword) != keyword.lower()
+        >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground'
+
+    """
+    # This turns out to be faster than unicode.translate()
+    return string.encode('utf8').lower().decode('utf8')
+
+
+def lookup(label):
+    """
+    Look for an encoding by its label.
+    This is the spec’s `get an encoding
+    <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm.
+    Supported labels are listed there.
+
+    :param label: A string.
+    :returns:
+        An :class:`Encoding` object, or :obj:`None` for an unknown label.
+
+    """
+    # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020.
+    label = ascii_lower(label.strip('\t\n\f\r '))
+    name = LABELS.get(label)
+    if name is None:
+        return None
+    encoding = CACHE.get(name)
+    if encoding is None:
+        if name == 'x-user-defined':
+            from .x_user_defined import codec_info
+        else:
+            python_name = PYTHON_NAMES.get(name, name)
+            # Any python_name value that gets to here should be valid.
+            codec_info = codecs.lookup(python_name)
+        encoding = Encoding(name, codec_info)
+        CACHE[name] = encoding
+    return encoding
+
+
+def _get_encoding(encoding_or_label):
+    """
+    Accept either an encoding object or label.
+
+    :param encoding: An :class:`Encoding` object or a label string.
+    :returns: An :class:`Encoding` object.
+    :raises: :exc:`~exceptions.LookupError` for an unknown label.
+
+    """
+    if hasattr(encoding_or_label, 'codec_info'):
+        return encoding_or_label
+
+    encoding = lookup(encoding_or_label)
+    if encoding is None:
+        raise LookupError('Unknown encoding label: %r' % encoding_or_label)
+    return encoding
+
+
+class Encoding(object):
+    """Reresents a character encoding such as UTF-8,
+    that can be used for decoding or encoding.
+
+    .. attribute:: name
+
+        Canonical name of the encoding
+
+    .. attribute:: codec_info
+
+        The actual implementation of the encoding,
+        a stdlib :class:`~codecs.CodecInfo` object.
+        See :func:`codecs.register`.
+
+    """
+    def __init__(self, name, codec_info):
+        self.name = name
+        self.codec_info = codec_info
+
+    def __repr__(self):
+        return '<Encoding %s>' % self.name
+
+
+#: The UTF-8 encoding. Should be used for new content and formats.
+UTF8 = lookup('utf-8')
+
+_UTF16LE = lookup('utf-16le')
+_UTF16BE = lookup('utf-16be')
+
+
+def decode(input, fallback_encoding, errors='replace'):
+    """
+    Decode a single string.
+
+    :param input: A byte string
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :return:
+        A ``(output, encoding)`` tuple of an Unicode string
+        and an :obj:`Encoding`.
+
+    """
+    # Fail early if `encoding` is an invalid label.
+    fallback_encoding = _get_encoding(fallback_encoding)
+    bom_encoding, input = _detect_bom(input)
+    encoding = bom_encoding or fallback_encoding
+    return encoding.codec_info.decode(input, errors)[0], encoding
+
+
+def _detect_bom(input):
+    """Return (bom_encoding, input), with any BOM removed from the input."""
+    if input.startswith(b'\xFF\xFE'):
+        return _UTF16LE, input[2:]
+    if input.startswith(b'\xFE\xFF'):
+        return _UTF16BE, input[2:]
+    if input.startswith(b'\xEF\xBB\xBF'):
+        return UTF8, input[3:]
+    return None, input
+
+
+def encode(input, encoding=UTF8, errors='strict'):
+    """
+    Encode a single string.
+
+    :param input: An Unicode string.
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :return: A byte string.
+
+    """
+    return _get_encoding(encoding).codec_info.encode(input, errors)[0]
+
+
+def iter_decode(input, fallback_encoding, errors='replace'):
+    """
+    "Pull"-based decoder.
+
+    :param input:
+        An iterable of byte strings.
+
+        The input is first consumed just enough to determine the encoding
+        based on the precense of a BOM,
+        then consumed on demand when the return value is.
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :returns:
+        An ``(output, encoding)`` tuple.
+        :obj:`output` is an iterable of Unicode strings,
+        :obj:`encoding` is the :obj:`Encoding` that is being used.
+
+    """
+
+    decoder = IncrementalDecoder(fallback_encoding, errors)
+    generator = _iter_decode_generator(input, decoder)
+    encoding = next(generator)
+    return generator, encoding
+
+
+def _iter_decode_generator(input, decoder):
+    """Return a generator that first yields the :obj:`Encoding`,
+    then yields output chukns as Unicode strings.
+
+    """
+    decode = decoder.decode
+    input = iter(input)
+    for chunck in input:
+        output = decode(chunck)
+        if output:
+            assert decoder.encoding is not None
+            yield decoder.encoding
+            yield output
+            break
+    else:
+        # Input exhausted without determining the encoding
+        output = decode(b'', final=True)
+        assert decoder.encoding is not None
+        yield decoder.encoding
+        if output:
+            yield output
+        return
+
+    for chunck in input:
+        output = decode(chunck)
+        if output:
+            yield output
+    output = decode(b'', final=True)
+    if output:
+        yield output
+
+
+def iter_encode(input, encoding=UTF8, errors='strict'):
+    """
+    “Pull”-based encoder.
+
+    :param input: An iterable of Unicode strings.
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :returns: An iterable of byte strings.
+
+    """
+    # Fail early if `encoding` is an invalid label.
+    encode = IncrementalEncoder(encoding, errors).encode
+    return _iter_encode_generator(input, encode)
+
+
+def _iter_encode_generator(input, encode):
+    for chunck in input:
+        output = encode(chunck)
+        if output:
+            yield output
+    output = encode('', final=True)
+    if output:
+        yield output
+
+
+class IncrementalDecoder(object):
+    """
+    “Push”-based decoder.
+
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+
+    """
+    def __init__(self, fallback_encoding, errors='replace'):
+        # Fail early if `encoding` is an invalid label.
+        self._fallback_encoding = _get_encoding(fallback_encoding)
+        self._errors = errors
+        self._buffer = b''
+        self._decoder = None
+        #: The actual :class:`Encoding` that is being used,
+        #: or :obj:`None` if that is not determined yet.
+        #: (Ie. if there is not enough input yet to determine
+        #: if there is a BOM.)
+        self.encoding = None  # Not known yet.
+
+    def decode(self, input, final=False):
+        """Decode one chunk of the input.
+
+        :param input: A byte string.
+        :param final:
+            Indicate that no more input is available.
+            Must be :obj:`True` if this is the last call.
+        :returns: An Unicode string.
+
+        """
+        decoder = self._decoder
+        if decoder is not None:
+            return decoder(input, final)
+
+        input = self._buffer + input
+        encoding, input = _detect_bom(input)
+        if encoding is None:
+            if len(input) < 3 and not final:  # Not enough data yet.
+                self._buffer = input
+                return ''
+            else:  # No BOM
+                encoding = self._fallback_encoding
+        decoder = encoding.codec_info.incrementaldecoder(self._errors).decode
+        self._decoder = decoder
+        self.encoding = encoding
+        return decoder(input, final)
+
+
+class IncrementalEncoder(object):
+    """
+    “Push”-based encoder.
+
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+
+    .. method:: encode(input, final=False)
+
+        :param input: An Unicode string.
+        :param final:
+            Indicate that no more input is available.
+            Must be :obj:`True` if this is the last call.
+        :returns: A byte string.
+
+    """
+    def __init__(self, encoding=UTF8, errors='strict'):
+        encoding = _get_encoding(encoding)
+        self.encode = encoding.codec_info.incrementalencoder(errors).encode
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9daaa3f7f410db3680cc29e8d75039ea479576c3
GIT binary patch
literal 12364
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
GW()wy`KaOm

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py
new file mode 100644
index 00000000..29cbf91e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py
@@ -0,0 +1,231 @@
+"""
+
+    webencodings.labels
+    ~~~~~~~~~~~~~~~~~~~
+
+    Map encoding labels to their name.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+# XXX Do not edit!
+# This file is automatically generated by mklabels.py
+
+LABELS = {
+    'unicode-1-1-utf-8':   'utf-8',
+    'utf-8':               'utf-8',
+    'utf8':                'utf-8',
+    '866':                 'ibm866',
+    'cp866':               'ibm866',
+    'csibm866':            'ibm866',
+    'ibm866':              'ibm866',
+    'csisolatin2':         'iso-8859-2',
+    'iso-8859-2':          'iso-8859-2',
+    'iso-ir-101':          'iso-8859-2',
+    'iso8859-2':           'iso-8859-2',
+    'iso88592':            'iso-8859-2',
+    'iso_8859-2':          'iso-8859-2',
+    'iso_8859-2:1987':     'iso-8859-2',
+    'l2':                  'iso-8859-2',
+    'latin2':              'iso-8859-2',
+    'csisolatin3':         'iso-8859-3',
+    'iso-8859-3':          'iso-8859-3',
+    'iso-ir-109':          'iso-8859-3',
+    'iso8859-3':           'iso-8859-3',
+    'iso88593':            'iso-8859-3',
+    'iso_8859-3':          'iso-8859-3',
+    'iso_8859-3:1988':     'iso-8859-3',
+    'l3':                  'iso-8859-3',
+    'latin3':              'iso-8859-3',
+    'csisolatin4':         'iso-8859-4',
+    'iso-8859-4':          'iso-8859-4',
+    'iso-ir-110':          'iso-8859-4',
+    'iso8859-4':           'iso-8859-4',
+    'iso88594':            'iso-8859-4',
+    'iso_8859-4':          'iso-8859-4',
+    'iso_8859-4:1988':     'iso-8859-4',
+    'l4':                  'iso-8859-4',
+    'latin4':              'iso-8859-4',
+    'csisolatincyrillic':  'iso-8859-5',
+    'cyrillic':            'iso-8859-5',
+    'iso-8859-5':          'iso-8859-5',
+    'iso-ir-144':          'iso-8859-5',
+    'iso8859-5':           'iso-8859-5',
+    'iso88595':            'iso-8859-5',
+    'iso_8859-5':          'iso-8859-5',
+    'iso_8859-5:1988':     'iso-8859-5',
+    'arabic':              'iso-8859-6',
+    'asmo-708':            'iso-8859-6',
+    'csiso88596e':         'iso-8859-6',
+    'csiso88596i':         'iso-8859-6',
+    'csisolatinarabic':    'iso-8859-6',
+    'ecma-114':            'iso-8859-6',
+    'iso-8859-6':          'iso-8859-6',
+    'iso-8859-6-e':        'iso-8859-6',
+    'iso-8859-6-i':        'iso-8859-6',
+    'iso-ir-127':          'iso-8859-6',
+    'iso8859-6':           'iso-8859-6',
+    'iso88596':            'iso-8859-6',
+    'iso_8859-6':          'iso-8859-6',
+    'iso_8859-6:1987':     'iso-8859-6',
+    'csisolatingreek':     'iso-8859-7',
+    'ecma-118':            'iso-8859-7',
+    'elot_928':            'iso-8859-7',
+    'greek':               'iso-8859-7',
+    'greek8':              'iso-8859-7',
+    'iso-8859-7':          'iso-8859-7',
+    'iso-ir-126':          'iso-8859-7',
+    'iso8859-7':           'iso-8859-7',
+    'iso88597':            'iso-8859-7',
+    'iso_8859-7':          'iso-8859-7',
+    'iso_8859-7:1987':     'iso-8859-7',
+    'sun_eu_greek':        'iso-8859-7',
+    'csiso88598e':         'iso-8859-8',
+    'csisolatinhebrew':    'iso-8859-8',
+    'hebrew':              'iso-8859-8',
+    'iso-8859-8':          'iso-8859-8',
+    'iso-8859-8-e':        'iso-8859-8',
+    'iso-ir-138':          'iso-8859-8',
+    'iso8859-8':           'iso-8859-8',
+    'iso88598':            'iso-8859-8',
+    'iso_8859-8':          'iso-8859-8',
+    'iso_8859-8:1988':     'iso-8859-8',
+    'visual':              'iso-8859-8',
+    'csiso88598i':         'iso-8859-8-i',
+    'iso-8859-8-i':        'iso-8859-8-i',
+    'logical':             'iso-8859-8-i',
+    'csisolatin6':         'iso-8859-10',
+    'iso-8859-10':         'iso-8859-10',
+    'iso-ir-157':          'iso-8859-10',
+    'iso8859-10':          'iso-8859-10',
+    'iso885910':           'iso-8859-10',
+    'l6':                  'iso-8859-10',
+    'latin6':              'iso-8859-10',
+    'iso-8859-13':         'iso-8859-13',
+    'iso8859-13':          'iso-8859-13',
+    'iso885913':           'iso-8859-13',
+    'iso-8859-14':         'iso-8859-14',
+    'iso8859-14':          'iso-8859-14',
+    'iso885914':           'iso-8859-14',
+    'csisolatin9':         'iso-8859-15',
+    'iso-8859-15':         'iso-8859-15',
+    'iso8859-15':          'iso-8859-15',
+    'iso885915':           'iso-8859-15',
+    'iso_8859-15':         'iso-8859-15',
+    'l9':                  'iso-8859-15',
+    'iso-8859-16':         'iso-8859-16',
+    'cskoi8r':             'koi8-r',
+    'koi':                 'koi8-r',
+    'koi8':                'koi8-r',
+    'koi8-r':              'koi8-r',
+    'koi8_r':              'koi8-r',
+    'koi8-u':              'koi8-u',
+    'csmacintosh':         'macintosh',
+    'mac':                 'macintosh',
+    'macintosh':           'macintosh',
+    'x-mac-roman':         'macintosh',
+    'dos-874':             'windows-874',
+    'iso-8859-11':         'windows-874',
+    'iso8859-11':          'windows-874',
+    'iso885911':           'windows-874',
+    'tis-620':             'windows-874',
+    'windows-874':         'windows-874',
+    'cp1250':              'windows-1250',
+    'windows-1250':        'windows-1250',
+    'x-cp1250':            'windows-1250',
+    'cp1251':              'windows-1251',
+    'windows-1251':        'windows-1251',
+    'x-cp1251':            'windows-1251',
+    'ansi_x3.4-1968':      'windows-1252',
+    'ascii':               'windows-1252',
+    'cp1252':              'windows-1252',
+    'cp819':               'windows-1252',
+    'csisolatin1':         'windows-1252',
+    'ibm819':              'windows-1252',
+    'iso-8859-1':          'windows-1252',
+    'iso-ir-100':          'windows-1252',
+    'iso8859-1':           'windows-1252',
+    'iso88591':            'windows-1252',
+    'iso_8859-1':          'windows-1252',
+    'iso_8859-1:1987':     'windows-1252',
+    'l1':                  'windows-1252',
+    'latin1':              'windows-1252',
+    'us-ascii':            'windows-1252',
+    'windows-1252':        'windows-1252',
+    'x-cp1252':            'windows-1252',
+    'cp1253':              'windows-1253',
+    'windows-1253':        'windows-1253',
+    'x-cp1253':            'windows-1253',
+    'cp1254':              'windows-1254',
+    'csisolatin5':         'windows-1254',
+    'iso-8859-9':          'windows-1254',
+    'iso-ir-148':          'windows-1254',
+    'iso8859-9':           'windows-1254',
+    'iso88599':            'windows-1254',
+    'iso_8859-9':          'windows-1254',
+    'iso_8859-9:1989':     'windows-1254',
+    'l5':                  'windows-1254',
+    'latin5':              'windows-1254',
+    'windows-1254':        'windows-1254',
+    'x-cp1254':            'windows-1254',
+    'cp1255':              'windows-1255',
+    'windows-1255':        'windows-1255',
+    'x-cp1255':            'windows-1255',
+    'cp1256':              'windows-1256',
+    'windows-1256':        'windows-1256',
+    'x-cp1256':            'windows-1256',
+    'cp1257':              'windows-1257',
+    'windows-1257':        'windows-1257',
+    'x-cp1257':            'windows-1257',
+    'cp1258':              'windows-1258',
+    'windows-1258':        'windows-1258',
+    'x-cp1258':            'windows-1258',
+    'x-mac-cyrillic':      'x-mac-cyrillic',
+    'x-mac-ukrainian':     'x-mac-cyrillic',
+    'chinese':             'gbk',
+    'csgb2312':            'gbk',
+    'csiso58gb231280':     'gbk',
+    'gb2312':              'gbk',
+    'gb_2312':             'gbk',
+    'gb_2312-80':          'gbk',
+    'gbk':                 'gbk',
+    'iso-ir-58':           'gbk',
+    'x-gbk':               'gbk',
+    'gb18030':             'gb18030',
+    'hz-gb-2312':          'hz-gb-2312',
+    'big5':                'big5',
+    'big5-hkscs':          'big5',
+    'cn-big5':             'big5',
+    'csbig5':              'big5',
+    'x-x-big5':            'big5',
+    'cseucpkdfmtjapanese': 'euc-jp',
+    'euc-jp':              'euc-jp',
+    'x-euc-jp':            'euc-jp',
+    'csiso2022jp':         'iso-2022-jp',
+    'iso-2022-jp':         'iso-2022-jp',
+    'csshiftjis':          'shift_jis',
+    'ms_kanji':            'shift_jis',
+    'shift-jis':           'shift_jis',
+    'shift_jis':           'shift_jis',
+    'sjis':                'shift_jis',
+    'windows-31j':         'shift_jis',
+    'x-sjis':              'shift_jis',
+    'cseuckr':             'euc-kr',
+    'csksc56011987':       'euc-kr',
+    'euc-kr':              'euc-kr',
+    'iso-ir-149':          'euc-kr',
+    'korean':              'euc-kr',
+    'ks_c_5601-1987':      'euc-kr',
+    'ks_c_5601-1989':      'euc-kr',
+    'ksc5601':             'euc-kr',
+    'ksc_5601':            'euc-kr',
+    'windows-949':         'euc-kr',
+    'csiso2022kr':         'iso-2022-kr',
+    'iso-2022-kr':         'iso-2022-kr',
+    'utf-16be':            'utf-16be',
+    'utf-16':              'utf-16le',
+    'utf-16le':            'utf-16le',
+    'x-user-defined':      'x-user-defined',
+}
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c0c88f2830b07550cb56c4d5fd7ad47bdc390e66
GIT binary patch
literal 5361
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
T#p@Uu7}!{u8QDkS5D5VQY%bhY

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py
new file mode 100644
index 00000000..295dc928
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py
@@ -0,0 +1,59 @@
+"""
+
+    webencodings.mklabels
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Regenarate the webencodings.labels module.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+import json
+try:
+    from urllib import urlopen
+except ImportError:
+    from urllib.request import urlopen
+
+
+def assert_lower(string):
+    assert string == string.lower()
+    return string
+
+
+def generate(url):
+    parts = ['''\
+"""
+
+    webencodings.labels
+    ~~~~~~~~~~~~~~~~~~~
+
+    Map encoding labels to their name.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+# XXX Do not edit!
+# This file is automatically generated by mklabels.py
+
+LABELS = {
+''']
+    labels = [
+        (repr(assert_lower(label)).lstrip('u'),
+         repr(encoding['name']).lstrip('u'))
+        for category in json.loads(urlopen(url).read().decode('ascii'))
+        for encoding in category['encodings']
+        for label in encoding['labels']]
+    max_len = max(len(label) for label, name in labels)
+    parts.extend(
+        '    %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name)
+        for label, name in labels)
+    parts.append('}')
+    return ''.join(parts)
+
+
+if __name__ == '__main__':
+    print(generate('http://encoding.spec.whatwg.org/encodings.json'))
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4f79751d79079cd8ab4087a64ffb0b04dc2ac77b
GIT binary patch
literal 2486
zcmZSn%*&NH<x)&C0~D|_FfceUFfbHXF)%QsFfc?hFr+Xtq%bk$Ffv3jGE|Cyxy%eX
zObofq3{lJsjNy5T3@oWE4B1=^MV<_djEo@l%nUiKFa>#x3=t_T3@r={QEUt;tY8K^
zLn;SD3L8T<6GKrMLn=E%3OhqHBZIp~9s|g-U=0qC8xAorFmQ1xC@3hDrzWN5CFiGP
z=A{?w<!0w3CZ*;SgJtTl0f?rc)b!N6#G=HKRE3g^R8%t{CMe|Qr<CTT>Os_7CFd7Z
z7G<VqlvpV^!<Y(228KooNtFu0nYsCS3c-m5nR#G~t#UGxQ}c>btrVPsU33(RQ&Sau
zJe^(rf?XBT@{1HwQcDsubBgu2xHA9$|Nq}lgOP!Op@f}*fuXc0C%+&yFBv2N!b}Vd
z49+0$$}li6)PPYI14A<dC~%4;7)lr!nixUi!C)i&G(hT0K=G85U!Gc2!pFeC;8<Lo
zT2zvmpXXXslwSl^SHcD|vZN?8FI@u^w_u{Ugn@xUzo00yEU_e2zbvsxKP^8eCAFwn
zKf6#ryV%Iw+^{gq$h^$Z!n`=AGQB+BB*nzUz`(#DJx@PGzaX<fH#4ueBrzvPw>;6Z
zG%y1s1jg}Ysd*{+Mf%9`qz{WHy@JXT9tH-6M6fI4!Oj)|xsC<oFh&VRa8Q8U3yO7S
zkj!0B>SJU`XJn{lWJqUVC}Cj8Vq_>`0);~}BSRK5D15S5Kxw6!5tMRVVq+L;nHXxA
z7*d!SBwb>?8ETmsYM2>PSU@~0hFTVe5>|#1HijA&kaCb2?4ZQh%m@+(DP&`iL>5hB
zVu)j5DD+||v|%XJW2j|iDB%F5(iR4W8de4uh^?Ir3^j}lS)2^*3=C<E3@IE8ZOGD$
zAW1HU6i$$pj450US==D?&5R7e8r%#F41UGJj0_A)N=lIQha7l%kOT@&X;@M?M1yZ)
zfdVXBC_pqQl;ndFduEYBUSckd6E@i4$_fz?5ehE(3VHb@3aKfXC5l|i3LzPp#R_Se
zIjIVn#R`d~CHc9DC7H>IIXRUI>8W|Cpe&gJ%2P-wgp13^(aF^(Six4InhTt~6N{5G
zGfOxb7#LuFECwfPh(}96S*NrFl!QP&1t%d;(gEROP!dvv<fd40h8QMLDyn4yrJ@>e
zY6)X3WCoRPuq*{Ks|2JoCpAw4M3;avnVtdI9bo%{K<)tNAuusu8L1fL4jWJ)RumN3
z8G$?saw;1GJODsNj4?>u3>pABhyX|dr`Hrlh7NF+f&_+yNDUK18Z(0!BvhCfg26#h
z3@TVaWv^<nm1?nqYOxL%ILs9wMOhFR0|NtCVGt-O2Z1s;B#^*?335elVnsYCKtZ{D
zkOY_sC}6+=#t8OIEvP_b&;U6eoRqSP^Yb8)o}ZXf90YPXSiC4TF$J9XQc{!iQ&OQ~
z1w}!i^aqy6DK06>EC45>+{6m7P-;a<Y92&eVnG3j2~wSvpP8otD(t{&ON(;A_7x-+
zl@ynN%D?2qlGOD4qDn9amhvIN3kp<l@&lLfL7)g4uy6%C50nl;nOPDPtYV<h65?cH
zX3}8fWAtMbV`O9GVdQ4yWdy5@kIzla%!`jN)?;8`$S5f(u+rCuc~7snAT?R9JR`BB
zJY6rpC><_QtOtq_4N#&7*PZe4Df!9q@j-&1$`llcrA0Y8nMsg{0;NOG+=Bd~5^yyL
zt{EZndPS*)rK!aw;OGjH2WbWcb$mRi=!lPpgel1RVAjBfsSTt}Vh8d~u@D0T0~-?$
TBQv82BQK)}GbbyjA`c?~CR}3p

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py
new file mode 100644
index 00000000..e12c10d0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py
@@ -0,0 +1,153 @@
+# coding: utf-8
+"""
+
+    webencodings.tests
+    ~~~~~~~~~~~~~~~~~~
+
+    A basic test suite for Encoding.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode,
+               IncrementalDecoder, IncrementalEncoder, UTF8)
+
+
+def assert_raises(exception, function, *args, **kwargs):
+    try:
+        function(*args, **kwargs)
+    except exception:
+        return
+    else:  # pragma: no cover
+        raise AssertionError('Did not raise %s.' % exception)
+
+
+def test_labels():
+    assert lookup('utf-8').name == 'utf-8'
+    assert lookup('Utf-8').name == 'utf-8'
+    assert lookup('UTF-8').name == 'utf-8'
+    assert lookup('utf8').name == 'utf-8'
+    assert lookup('utf8').name == 'utf-8'
+    assert lookup('utf8 ').name == 'utf-8'
+    assert lookup(' \r\nutf8\t').name == 'utf-8'
+    assert lookup('u8') is None  # Python label.
+    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+
+    assert lookup('US-ASCII').name == 'windows-1252'
+    assert lookup('iso-8859-1').name == 'windows-1252'
+    assert lookup('latin1').name == 'windows-1252'
+    assert lookup('LATIN1').name == 'windows-1252'
+    assert lookup('latin-1') is None
+    assert lookup('LATİN1') is None  # ASCII-only case insensitivity.
+
+
+def test_all_labels():
+    for label in LABELS:
+        assert decode(b'', label) == ('', lookup(label))
+        assert encode('', label) == b''
+        for repeat in [0, 1, 12]:
+            output, _ = iter_decode([b''] * repeat, label)
+            assert list(output) == []
+            assert list(iter_encode([''] * repeat, label)) == []
+        decoder = IncrementalDecoder(label)
+        assert decoder.decode(b'') == ''
+        assert decoder.decode(b'', final=True) == ''
+        encoder = IncrementalEncoder(label)
+        assert encoder.encode('') == b''
+        assert encoder.encode('', final=True) == b''
+    # All encoding names are valid labels too:
+    for name in set(LABELS.values()):
+        assert lookup(name).name == name
+
+
+def test_invalid_label():
+    assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid')
+    assert_raises(LookupError, encode, 'é', 'invalid')
+    assert_raises(LookupError, iter_decode, [], 'invalid')
+    assert_raises(LookupError, iter_encode, [], 'invalid')
+    assert_raises(LookupError, IncrementalDecoder, 'invalid')
+    assert_raises(LookupError, IncrementalEncoder, 'invalid')
+
+
+def test_decode():
+    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8'))  # UTF-8 with BOM
+
+    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be'))  # UTF-16-BE with BOM
+    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+
+    assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be'))
+    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+    assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le'))
+
+    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+
+
+def test_encode():
+    assert encode('é', 'latin1') == b'\xe9'
+    assert encode('é', 'utf8') == b'\xc3\xa9'
+    assert encode('é', 'utf8') == b'\xc3\xa9'
+    assert encode('é', 'utf-16') == b'\xe9\x00'
+    assert encode('é', 'utf-16le') == b'\xe9\x00'
+    assert encode('é', 'utf-16be') == b'\x00\xe9'
+
+
+def test_iter_decode():
+    def iter_decode_to_string(input, fallback_encoding):
+        output, _encoding = iter_decode(input, fallback_encoding)
+        return ''.join(output)
+    assert iter_decode_to_string([], 'latin1') == ''
+    assert iter_decode_to_string([b''], 'latin1') == ''
+    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+    assert iter_decode_to_string([
+        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é'
+    assert iter_decode_to_string([
+        b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo'
+
+
+def test_iter_encode():
+    assert b''.join(iter_encode([], 'latin1')) == b''
+    assert b''.join(iter_encode([''], 'latin1')) == b''
+    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+    assert b''.join(iter_encode([
+        '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo'
+
+
+def test_x_user_defined():
+    encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca'
+    decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca'
+    encoded = b'aa'
+    decoded = 'aa'
+    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+    assert encode(decoded, 'x-user-defined') == encoded
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b16d0a4a410a03f01889c6ac3a619abd2f6df2e8
GIT binary patch
literal 7345
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
aF$pj^uyAs63Udl`a&n4sa&pRW@&EuT0uHbM

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py
new file mode 100644
index 00000000..d16e3260
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py
@@ -0,0 +1,325 @@
+# coding: utf-8
+"""
+
+    webencodings.x_user_defined
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    An implementation of the x-user-defined encoding.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+import codecs
+
+
+### Codec APIs
+
+class Codec(codecs.Codec):
+
+    def encode(self, input, errors='strict'):
+        return codecs.charmap_encode(input, errors, encoding_table)
+
+    def decode(self, input, errors='strict'):
+        return codecs.charmap_decode(input, errors, decoding_table)
+
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+    def encode(self, input, final=False):
+        return codecs.charmap_encode(input, self.errors, encoding_table)[0]
+
+
+class IncrementalDecoder(codecs.IncrementalDecoder):
+    def decode(self, input, final=False):
+        return codecs.charmap_decode(input, self.errors, decoding_table)[0]
+
+
+class StreamWriter(Codec, codecs.StreamWriter):
+    pass
+
+
+class StreamReader(Codec, codecs.StreamReader):
+    pass
+
+
+### encodings module API
+
+codec_info = codecs.CodecInfo(
+    name='x-user-defined',
+    encode=Codec().encode,
+    decode=Codec().decode,
+    incrementalencoder=IncrementalEncoder,
+    incrementaldecoder=IncrementalDecoder,
+    streamreader=StreamReader,
+    streamwriter=StreamWriter,
+)
+
+
+### Decoding Table
+
+# Python 3:
+# for c in range(256): print('    %r' % chr(c if c < 128 else c + 0xF700))
+decoding_table = (
+    '\x00'
+    '\x01'
+    '\x02'
+    '\x03'
+    '\x04'
+    '\x05'
+    '\x06'
+    '\x07'
+    '\x08'
+    '\t'
+    '\n'
+    '\x0b'
+    '\x0c'
+    '\r'
+    '\x0e'
+    '\x0f'
+    '\x10'
+    '\x11'
+    '\x12'
+    '\x13'
+    '\x14'
+    '\x15'
+    '\x16'
+    '\x17'
+    '\x18'
+    '\x19'
+    '\x1a'
+    '\x1b'
+    '\x1c'
+    '\x1d'
+    '\x1e'
+    '\x1f'
+    ' '
+    '!'
+    '"'
+    '#'
+    '$'
+    '%'
+    '&'
+    "'"
+    '('
+    ')'
+    '*'
+    '+'
+    ','
+    '-'
+    '.'
+    '/'
+    '0'
+    '1'
+    '2'
+    '3'
+    '4'
+    '5'
+    '6'
+    '7'
+    '8'
+    '9'
+    ':'
+    ';'
+    '<'
+    '='
+    '>'
+    '?'
+    '@'
+    'A'
+    'B'
+    'C'
+    'D'
+    'E'
+    'F'
+    'G'
+    'H'
+    'I'
+    'J'
+    'K'
+    'L'
+    'M'
+    'N'
+    'O'
+    'P'
+    'Q'
+    'R'
+    'S'
+    'T'
+    'U'
+    'V'
+    'W'
+    'X'
+    'Y'
+    'Z'
+    '['
+    '\\'
+    ']'
+    '^'
+    '_'
+    '`'
+    'a'
+    'b'
+    'c'
+    'd'
+    'e'
+    'f'
+    'g'
+    'h'
+    'i'
+    'j'
+    'k'
+    'l'
+    'm'
+    'n'
+    'o'
+    'p'
+    'q'
+    'r'
+    's'
+    't'
+    'u'
+    'v'
+    'w'
+    'x'
+    'y'
+    'z'
+    '{'
+    '|'
+    '}'
+    '~'
+    '\x7f'
+    '\uf780'
+    '\uf781'
+    '\uf782'
+    '\uf783'
+    '\uf784'
+    '\uf785'
+    '\uf786'
+    '\uf787'
+    '\uf788'
+    '\uf789'
+    '\uf78a'
+    '\uf78b'
+    '\uf78c'
+    '\uf78d'
+    '\uf78e'
+    '\uf78f'
+    '\uf790'
+    '\uf791'
+    '\uf792'
+    '\uf793'
+    '\uf794'
+    '\uf795'
+    '\uf796'
+    '\uf797'
+    '\uf798'
+    '\uf799'
+    '\uf79a'
+    '\uf79b'
+    '\uf79c'
+    '\uf79d'
+    '\uf79e'
+    '\uf79f'
+    '\uf7a0'
+    '\uf7a1'
+    '\uf7a2'
+    '\uf7a3'
+    '\uf7a4'
+    '\uf7a5'
+    '\uf7a6'
+    '\uf7a7'
+    '\uf7a8'
+    '\uf7a9'
+    '\uf7aa'
+    '\uf7ab'
+    '\uf7ac'
+    '\uf7ad'
+    '\uf7ae'
+    '\uf7af'
+    '\uf7b0'
+    '\uf7b1'
+    '\uf7b2'
+    '\uf7b3'
+    '\uf7b4'
+    '\uf7b5'
+    '\uf7b6'
+    '\uf7b7'
+    '\uf7b8'
+    '\uf7b9'
+    '\uf7ba'
+    '\uf7bb'
+    '\uf7bc'
+    '\uf7bd'
+    '\uf7be'
+    '\uf7bf'
+    '\uf7c0'
+    '\uf7c1'
+    '\uf7c2'
+    '\uf7c3'
+    '\uf7c4'
+    '\uf7c5'
+    '\uf7c6'
+    '\uf7c7'
+    '\uf7c8'
+    '\uf7c9'
+    '\uf7ca'
+    '\uf7cb'
+    '\uf7cc'
+    '\uf7cd'
+    '\uf7ce'
+    '\uf7cf'
+    '\uf7d0'
+    '\uf7d1'
+    '\uf7d2'
+    '\uf7d3'
+    '\uf7d4'
+    '\uf7d5'
+    '\uf7d6'
+    '\uf7d7'
+    '\uf7d8'
+    '\uf7d9'
+    '\uf7da'
+    '\uf7db'
+    '\uf7dc'
+    '\uf7dd'
+    '\uf7de'
+    '\uf7df'
+    '\uf7e0'
+    '\uf7e1'
+    '\uf7e2'
+    '\uf7e3'
+    '\uf7e4'
+    '\uf7e5'
+    '\uf7e6'
+    '\uf7e7'
+    '\uf7e8'
+    '\uf7e9'
+    '\uf7ea'
+    '\uf7eb'
+    '\uf7ec'
+    '\uf7ed'
+    '\uf7ee'
+    '\uf7ef'
+    '\uf7f0'
+    '\uf7f1'
+    '\uf7f2'
+    '\uf7f3'
+    '\uf7f4'
+    '\uf7f5'
+    '\uf7f6'
+    '\uf7f7'
+    '\uf7f8'
+    '\uf7f9'
+    '\uf7fa'
+    '\uf7fb'
+    '\uf7fc'
+    '\uf7fd'
+    '\uf7fe'
+    '\uf7ff'
+)
+
+### Encoding table
+encoding_table = codecs.charmap_build(decoding_table)
diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9d23c5e288a18681d5823fff5d3df7a9f34142b8
GIT binary patch
literal 3842
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/__init__.py
new file mode 100644
index 00000000..97e08d68
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/__init__.py
@@ -0,0 +1,3286 @@
+# coding: utf-8
+"""
+Package resource API
+--------------------
+
+A resource is a logical file contained within a package, or a logical
+subdirectory thereof.  The package resource API expects resource names
+to have their path parts separated with ``/``, *not* whatever the local
+path separator is.  Do not use os.path operations to manipulate resource
+names being passed into the API.
+
+The package resource API is designed to work with normal filesystem packages,
+.egg files, and unpacked .egg files.  It can also work in a limited way with
+.zip files and with custom PEP 302 loaders that support the ``get_data()``
+method.
+"""
+
+from __future__ import absolute_import
+
+import sys
+import os
+import io
+import time
+import re
+import types
+import zipfile
+import zipimport
+import warnings
+import stat
+import functools
+import pkgutil
+import operator
+import platform
+import collections
+import plistlib
+import email.parser
+import errno
+import tempfile
+import textwrap
+import itertools
+import inspect
+import ntpath
+import posixpath
+from pkgutil import get_importer
+
+try:
+    import _imp
+except ImportError:
+    # Python 3.2 compatibility
+    import imp as _imp
+
+try:
+    FileExistsError
+except NameError:
+    FileExistsError = OSError
+
+from pkg_resources.extern import six
+from pkg_resources.extern.six.moves import urllib, map, filter
+
+# capture these to bypass sandboxing
+from os import utime
+try:
+    from os import mkdir, rename, unlink
+    WRITE_SUPPORT = True
+except ImportError:
+    # no write support, probably under GAE
+    WRITE_SUPPORT = False
+
+from os import open as os_open
+from os.path import isdir, split
+
+try:
+    import importlib.machinery as importlib_machinery
+    # access attribute to force import under delayed import mechanisms.
+    importlib_machinery.__name__
+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')
+
+
+__metaclass__ = type
+
+
+if (3, 0) < sys.version_info < (3, 4):
+    raise RuntimeError("Python 3.4 or later is required")
+
+if six.PY2:
+    # Those builtin exceptions are only defined in Python 3
+    PermissionError = None
+    NotADirectoryError = None
+
+# declare some globals that will be defined later to
+# satisfy the linters.
+require = None
+working_set = None
+add_activation_listener = None
+resources_stream = None
+cleanup_resources = None
+resource_dir = None
+resource_stream = None
+set_extraction_path = None
+resource_isdir = None
+resource_string = None
+iter_entry_points = None
+resource_listdir = None
+resource_filename = None
+resource_exists = None
+_distribution_finders = None
+_namespace_handlers = None
+_namespace_packages = None
+
+
+class PEP440Warning(RuntimeWarning):
+    """
+    Used when there is an issue with a version or specifier not complying with
+    PEP 440.
+    """
+
+
+def parse_version(v):
+    try:
+        return packaging.version.Version(v)
+    except packaging.version.InvalidVersion:
+        return packaging.version.LegacyVersion(v)
+
+
+_state_vars = {}
+
+
+def _declare_state(vartype, **kw):
+    globals().update(kw)
+    _state_vars.update(dict.fromkeys(kw, vartype))
+
+
+def __getstate__():
+    state = {}
+    g = globals()
+    for k, v in _state_vars.items():
+        state[k] = g['_sget_' + v](g[k])
+    return state
+
+
+def __setstate__(state):
+    g = globals()
+    for k, v in state.items():
+        g['_sset_' + _state_vars[k]](k, g[k], v)
+    return state
+
+
+def _sget_dict(val):
+    return val.copy()
+
+
+def _sset_dict(key, ob, state):
+    ob.clear()
+    ob.update(state)
+
+
+def _sget_object(val):
+    return val.__getstate__()
+
+
+def _sset_object(key, ob, state):
+    ob.__setstate__(state)
+
+
+_sget_none = _sset_none = lambda *args: None
+
+
+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
+    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
+    current version of the OS.
+
+    If this condition occurs for any other platform with a version in its
+    platform strings, this function should be extended accordingly.
+    """
+    plat = get_build_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))
+        except ValueError:
+            # not Mac OS X
+            pass
+    return plat
+
+
+__all__ = [
+    # Basic resource access and distribution/entry point discovery
+    'require', 'run_script', 'get_provider', 'get_distribution',
+    'load_entry_point', 'get_entry_map', 'get_entry_info',
+    'iter_entry_points',
+    'resource_string', 'resource_stream', 'resource_filename',
+    'resource_listdir', 'resource_exists', 'resource_isdir',
+
+    # Environmental control
+    'declare_namespace', 'working_set', 'add_activation_listener',
+    'find_distributions', 'set_extraction_path', 'cleanup_resources',
+    'get_default_cache',
+
+    # Primary implementation classes
+    'Environment', 'WorkingSet', 'ResourceManager',
+    'Distribution', 'Requirement', 'EntryPoint',
+
+    # Exceptions
+    'ResolutionError', 'VersionConflict', 'DistributionNotFound',
+    'UnknownExtra', 'ExtractionError',
+
+    # Warnings
+    'PEP440Warning',
+
+    # Parsing functions and string utilities
+    'parse_requirements', 'parse_version', 'safe_name', 'safe_version',
+    'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections',
+    'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker',
+
+    # filesystem utilities
+    'ensure_directory', 'normalize_path',
+
+    # Distribution "precedence" constants
+    'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST',
+
+    # "Provider" interfaces, implementations, and registration/lookup APIs
+    'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
+    'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
+    'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
+    'register_finder', 'register_namespace_handler', 'register_loader_type',
+    'fixup_namespace_packages', 'get_importer',
+
+    # Warnings
+    'PkgResourcesDeprecationWarning',
+
+    # Deprecated/backward compatibility only
+    'run_main', 'AvailableDistributions',
+]
+
+
+class ResolutionError(Exception):
+    """Abstract base for dependency resolution errors"""
+
+    def __repr__(self):
+        return self.__class__.__name__ + repr(self.args)
+
+
+class VersionConflict(ResolutionError):
+    """
+    An already-installed version conflicts with the requested version.
+
+    Should be initialized with the installed Distribution and the requested
+    Requirement.
+    """
+
+    _template = "{self.dist} is installed but {self.req} is required"
+
+    @property
+    def dist(self):
+        return self.args[0]
+
+    @property
+    def req(self):
+        return self.args[1]
+
+    def report(self):
+        return self._template.format(**locals())
+
+    def with_context(self, required_by):
+        """
+        If required_by is non-empty, return a version of self that is a
+        ContextualVersionConflict.
+        """
+        if not required_by:
+            return self
+        args = self.args + (required_by,)
+        return ContextualVersionConflict(*args)
+
+
+class ContextualVersionConflict(VersionConflict):
+    """
+    A VersionConflict that accepts a third parameter, the set of the
+    requirements that required the installed Distribution.
+    """
+
+    _template = VersionConflict._template + ' by {self.required_by}'
+
+    @property
+    def required_by(self):
+        return self.args[2]
+
+
+class DistributionNotFound(ResolutionError):
+    """A requested distribution was not found"""
+
+    _template = ("The '{self.req}' distribution was not found "
+                 "and is required by {self.requirers_str}")
+
+    @property
+    def req(self):
+        return self.args[0]
+
+    @property
+    def requirers(self):
+        return self.args[1]
+
+    @property
+    def requirers_str(self):
+        if not self.requirers:
+            return 'the application'
+        return ', '.join(self.requirers)
+
+    def report(self):
+        return self._template.format(**locals())
+
+    def __str__(self):
+        return self.report()
+
+
+class UnknownExtra(ResolutionError):
+    """Distribution doesn't have an "extra feature" of the given name"""
+
+
+_provider_factories = {}
+
+PY_MAJOR = sys.version[:3]
+EGG_DIST = 3
+BINARY_DIST = 2
+SOURCE_DIST = 1
+CHECKOUT_DIST = 0
+DEVELOP_DIST = -1
+
+
+def register_loader_type(loader_type, provider_factory):
+    """Register `provider_factory` to make providers for `loader_type`
+
+    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
+    and `provider_factory` is a function that, passed a *module* object,
+    returns an ``IResourceProvider`` for that module.
+    """
+    _provider_factories[loader_type] = provider_factory
+
+
+def get_provider(moduleOrReq):
+    """Return an IResourceProvider for the named module or requirement"""
+    if isinstance(moduleOrReq, Requirement):
+        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
+    try:
+        module = sys.modules[moduleOrReq]
+    except KeyError:
+        __import__(moduleOrReq)
+        module = sys.modules[moduleOrReq]
+    loader = getattr(module, '__loader__', None)
+    return _find_adapter(_provider_factories, loader)(module)
+
+
+def _macosx_vers(_cache=[]):
+    if not _cache:
+        version = platform.mac_ver()[0]
+        # fallback for MacPorts
+        if version == '':
+            plist = '/System/Library/CoreServices/SystemVersion.plist'
+            if os.path.exists(plist):
+                if hasattr(plistlib, 'readPlist'):
+                    plist_content = plistlib.readPlist(plist)
+                    if 'ProductVersion' in plist_content:
+                        version = plist_content['ProductVersion']
+
+        _cache.append(version.split('.'))
+    return _cache[0]
+
+
+def _macosx_arch(machine):
+    return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
+
+
+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.
+    """
+    from sysconfig import get_platform
+
+    plat = get_platform()
+    if sys.platform == "darwin" and not plat.startswith('macosx-'):
+        try:
+            version = _macosx_vers()
+            machine = os.uname()[4].replace(" ", "_")
+            return "macosx-%d.%d-%s" % (
+                int(version[0]), int(version[1]),
+                _macosx_arch(machine),
+            )
+        except ValueError:
+            # if someone is running a non-Mac darwin system, this will fall
+            # through to the default implementation
+            pass
+    return plat
+
+
+macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
+darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
+# XXX backward compat
+get_platform = get_build_platform
+
+
+def compatible_platforms(provided, required):
+    """Can code for the `provided` platform run on the `required` platform?
+
+    Returns true if either platform is ``None``, or the platforms are equal.
+
+    XXX Needs compatibility checks for Linux and other unixy OSes.
+    """
+    if provided is None or required is None or provided == required:
+        # easy case
+        return True
+
+    # Mac OS X special cases
+    reqMac = macosVersionString.match(required)
+    if reqMac:
+        provMac = macosVersionString.match(provided)
+
+        # is this a Mac package?
+        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.
+            provDarwin = darwinVersionString.match(provided)
+            if provDarwin:
+                dversion = int(provDarwin.group(1))
+                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
+                if dversion == 7 and macosversion >= "10.3" or \
+                        dversion == 8 and macosversion >= "10.4":
+                    return True
+            # egg isn't macosx or legacy darwin
+            return False
+
+        # are they the same major version and machine type?
+        if provMac.group(1) != reqMac.group(1) or \
+                provMac.group(3) != reqMac.group(3):
+            return False
+
+        # is the required OS major update >= the provided one?
+        if int(provMac.group(2)) > int(reqMac.group(2)):
+            return False
+
+        return True
+
+    # XXX Linux and other platforms' special cases should go here
+    return False
+
+
+def run_script(dist_spec, script_name):
+    """Locate distribution `dist_spec` and run its `script_name` script"""
+    ns = sys._getframe(1).f_globals
+    name = ns['__name__']
+    ns.clear()
+    ns['__name__'] = name
+    require(dist_spec)[0].run_script(script_name, ns)
+
+
+# backward compatibility
+run_main = run_script
+
+
+def get_distribution(dist):
+    """Return a current distribution object for a Requirement or string"""
+    if isinstance(dist, six.string_types):
+        dist = Requirement.parse(dist)
+    if isinstance(dist, Requirement):
+        dist = get_provider(dist)
+    if not isinstance(dist, Distribution):
+        raise TypeError("Expected string, Requirement, or Distribution", dist)
+    return dist
+
+
+def load_entry_point(dist, group, name):
+    """Return `name` entry point of `group` for `dist` or raise ImportError"""
+    return get_distribution(dist).load_entry_point(group, name)
+
+
+def get_entry_map(dist, group=None):
+    """Return the entry point map for `group`, or the full entry map"""
+    return get_distribution(dist).get_entry_map(group)
+
+
+def get_entry_info(dist, group, name):
+    """Return the EntryPoint object for `group`+`name`, or ``None``"""
+    return get_distribution(dist).get_entry_info(group, name)
+
+
+class IMetadataProvider:
+    def has_metadata(name):
+        """Does the package's distribution contain the named metadata?"""
+
+    def get_metadata(name):
+        """The named metadata resource as a string"""
+
+    def get_metadata_lines(name):
+        """Yield named metadata resource as list of non-blank non-comment lines
+
+       Leading and trailing whitespace is stripped from each line, and lines
+       with ``#`` as the first non-blank character are omitted."""
+
+    def metadata_isdir(name):
+        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
+
+    def metadata_listdir(name):
+        """List of metadata names in the directory (like ``os.listdir()``)"""
+
+    def run_script(script_name, namespace):
+        """Execute the named script in the supplied namespace dictionary"""
+
+
+class IResourceProvider(IMetadataProvider):
+    """An object that provides access to package resources"""
+
+    def get_resource_filename(manager, resource_name):
+        """Return a true filesystem path for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_stream(manager, resource_name):
+        """Return a readable file-like object for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_string(manager, resource_name):
+        """Return a string containing the contents of `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def has_resource(resource_name):
+        """Does the package contain the named resource?"""
+
+    def resource_isdir(resource_name):
+        """Is the named resource a directory?  (like ``os.path.isdir()``)"""
+
+    def resource_listdir(resource_name):
+        """List of resource names in the directory (like ``os.listdir()``)"""
+
+
+class WorkingSet:
+    """A collection of active distributions on sys.path (or a similar list)"""
+
+    def __init__(self, entries=None):
+        """Create working set from list of path entries (default=sys.path)"""
+        self.entries = []
+        self.entry_keys = {}
+        self.by_key = {}
+        self.callbacks = []
+
+        if entries is None:
+            entries = sys.path
+
+        for entry in entries:
+            self.add_entry(entry)
+
+    @classmethod
+    def _build_master(cls):
+        """
+        Prepare the master working set.
+        """
+        ws = cls()
+        try:
+            from __main__ import __requires__
+        except ImportError:
+            # The main program does not list any requirements
+            return ws
+
+        # ensure the requirements are met
+        try:
+            ws.require(__requires__)
+        except VersionConflict:
+            return cls._build_from_requirements(__requires__)
+
+        return ws
+
+    @classmethod
+    def _build_from_requirements(cls, req_spec):
+        """
+        Build a working set from a requirement spec. Rewrites sys.path.
+        """
+        # try it without defaults already on sys.path
+        # by starting with an empty path
+        ws = cls([])
+        reqs = parse_requirements(req_spec)
+        dists = ws.resolve(reqs, Environment())
+        for dist in dists:
+            ws.add(dist)
+
+        # add any missing entries from sys.path
+        for entry in sys.path:
+            if entry not in ws.entries:
+                ws.add_entry(entry)
+
+        # then copy back to sys.path
+        sys.path[:] = ws.entries
+        return ws
+
+    def add_entry(self, entry):
+        """Add a path item to ``.entries``, finding any distributions on it
+
+        ``find_distributions(entry, True)`` is used to find distributions
+        corresponding to the path entry, and they are added.  `entry` is
+        always appended to ``.entries``, even if it is already present.
+        (This is because ``sys.path`` can contain the same value more than
+        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
+        equal ``sys.path``.)
+        """
+        self.entry_keys.setdefault(entry, [])
+        self.entries.append(entry)
+        for dist in find_distributions(entry, True):
+            self.add(dist, entry, False)
+
+    def __contains__(self, dist):
+        """True if `dist` is the active distribution for its project"""
+        return self.by_key.get(dist.key) == dist
+
+    def find(self, req):
+        """Find a distribution matching requirement `req`
+
+        If there is an active distribution for the requested project, this
+        returns it as long as it meets the version requirement specified by
+        `req`.  But, if there is an active distribution for the project and it
+        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
+        If there is no active distribution for the requested project, ``None``
+        is returned.
+        """
+        dist = self.by_key.get(req.key)
+        if dist is not None and dist not in req:
+            # XXX add more info
+            raise VersionConflict(dist, req)
+        return dist
+
+    def iter_entry_points(self, group, name=None):
+        """Yield entry point objects from `group` matching `name`
+
+        If `name` is None, yields all entry points in `group` from all
+        distributions in the working set, otherwise only ones matching
+        both `group` and `name` are yielded (in distribution order).
+        """
+        return (
+            entry
+            for dist in self
+            for entry in dist.get_entry_map(group).values()
+            if name is None or name == entry.name
+        )
+
+    def run_script(self, requires, script_name):
+        """Locate distribution for `requires` and run `script_name` script"""
+        ns = sys._getframe(1).f_globals
+        name = ns['__name__']
+        ns.clear()
+        ns['__name__'] = name
+        self.require(requires)[0].run_script(script_name, ns)
+
+    def __iter__(self):
+        """Yield distributions for non-duplicate projects in the working set
+
+        The yield order is the order in which the items' path entries were
+        added to the working set.
+        """
+        seen = {}
+        for item in self.entries:
+            if item not in self.entry_keys:
+                # workaround a cache issue
+                continue
+
+            for key in self.entry_keys[item]:
+                if key not in seen:
+                    seen[key] = 1
+                    yield self.by_key[key]
+
+    def add(self, dist, entry=None, insert=True, replace=False):
+        """Add `dist` to working set, associated with `entry`
+
+        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
+        On exit from this routine, `entry` is added to the end of the working
+        set's ``.entries`` (if it wasn't already present).
+
+        `dist` is only added to the working set if it's for a project that
+        doesn't already have a distribution in the set, unless `replace=True`.
+        If it's added, any callbacks registered with the ``subscribe()`` method
+        will be called.
+        """
+        if insert:
+            dist.insert_on(self.entries, entry, replace=replace)
+
+        if entry is None:
+            entry = dist.location
+        keys = self.entry_keys.setdefault(entry, [])
+        keys2 = self.entry_keys.setdefault(dist.location, [])
+        if not replace and dist.key in self.by_key:
+            # ignore hidden distros
+            return
+
+        self.by_key[dist.key] = dist
+        if dist.key not in keys:
+            keys.append(dist.key)
+        if dist.key not in keys2:
+            keys2.append(dist.key)
+        self._added_new(dist)
+
+    def resolve(self, requirements, env=None, installer=None,
+                replace_conflicting=False, extras=None):
+        """List all distributions needed to (recursively) meet `requirements`
+
+        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
+        if supplied, should be an ``Environment`` instance.  If
+        not supplied, it defaults to all distributions available within any
+        entry or distribution in the working set.  `installer`, if supplied,
+        will be invoked with each requirement that cannot be met by an
+        already-installed distribution; it should return a ``Distribution`` or
+        ``None``.
+
+        Unless `replace_conflicting=True`, raises a VersionConflict exception
+        if
+        any requirements are found on the path that have the correct name but
+        the wrong version.  Otherwise, if an `installer` is supplied it will be
+        invoked to obtain the correct version of the requirement and activate
+        it.
+
+        `extras` is a list of the extras to be used with these requirements.
+        This is important because extra requirements may look like `my_req;
+        extra = "my_extra"`, which would otherwise be interpreted as a purely
+        optional requirement.  Instead, we want to be able to assert that these
+        requirements are truly required.
+        """
+
+        # set up the stack
+        requirements = list(requirements)[::-1]
+        # set of processed requirements
+        processed = {}
+        # key -> dist
+        best = {}
+        to_activate = []
+
+        req_extras = _ReqExtras()
+
+        # Mapping of requirement to set of distributions that required it;
+        # useful for reporting info about conflicts.
+        required_by = collections.defaultdict(set)
+
+        while requirements:
+            # process dependencies breadth-first
+            req = requirements.pop(0)
+            if req in processed:
+                # Ignore cyclic or redundant dependencies
+                continue
+
+            if not req_extras.markers_pass(req, extras):
+                continue
+
+            dist = best.get(req.key)
+            if dist is None:
+                # Find the best distribution and add it to the map
+                dist = self.by_key.get(req.key)
+                if dist is None or (dist not in req and replace_conflicting):
+                    ws = self
+                    if env is None:
+                        if dist is None:
+                            env = Environment(self.entries)
+                        else:
+                            # Use an empty environment and workingset to avoid
+                            # any further conflicts with the conflicting
+                            # distribution
+                            env = Environment([])
+                            ws = WorkingSet([])
+                    dist = best[req.key] = env.best_match(
+                        req, ws, installer,
+                        replace_conflicting=replace_conflicting
+                    )
+                    if dist is None:
+                        requirers = required_by.get(req, None)
+                        raise DistributionNotFound(req, requirers)
+                to_activate.append(dist)
+            if dist not in req:
+                # Oops, the "best" so far conflicts with a dependency
+                dependent_req = required_by[req]
+                raise VersionConflict(dist, req).with_context(dependent_req)
+
+            # push the new requirements onto the stack
+            new_requirements = dist.requires(req.extras)[::-1]
+            requirements.extend(new_requirements)
+
+            # Register the new requirements needed by req
+            for new_requirement in new_requirements:
+                required_by[new_requirement].add(req.project_name)
+                req_extras[new_requirement] = req.extras
+
+            processed[req] = True
+
+        # return list of distros to activate
+        return to_activate
+
+    def find_plugins(
+            self, plugin_env, full_env=None, installer=None, fallback=True):
+        """Find all activatable distributions in `plugin_env`
+
+        Example usage::
+
+            distributions, errors = working_set.find_plugins(
+                Environment(plugin_dirlist)
+            )
+            # add plugins+libs to sys.path
+            map(working_set.add, distributions)
+            # display errors
+            print('Could not load', errors)
+
+        The `plugin_env` should be an ``Environment`` instance that contains
+        only distributions that are in the project's "plugin directory" or
+        directories. The `full_env`, if supplied, should be an ``Environment``
+        contains all currently-available distributions.  If `full_env` is not
+        supplied, one is created automatically from the ``WorkingSet`` this
+        method is called on, which will typically mean that every directory on
+        ``sys.path`` will be scanned for distributions.
+
+        `installer` is a standard installer callback as used by the
+        ``resolve()`` method. The `fallback` flag indicates whether we should
+        attempt to resolve older versions of a plugin if the newest version
+        cannot be resolved.
+
+        This method returns a 2-tuple: (`distributions`, `error_info`), where
+        `distributions` is a list of the distributions found in `plugin_env`
+        that were loadable, along with any other distributions that are needed
+        to resolve their dependencies.  `error_info` is a dictionary mapping
+        unloadable plugin distributions to an exception instance describing the
+        error that occurred. Usually this will be a ``DistributionNotFound`` or
+        ``VersionConflict`` instance.
+        """
+
+        plugin_projects = list(plugin_env)
+        # scan project names in alphabetic order
+        plugin_projects.sort()
+
+        error_info = {}
+        distributions = {}
+
+        if full_env is None:
+            env = Environment(self.entries)
+            env += plugin_env
+        else:
+            env = full_env + plugin_env
+
+        shadow_set = self.__class__([])
+        # put all our entries in shadow_set
+        list(map(shadow_set.add, self))
+
+        for project_name in plugin_projects:
+
+            for dist in plugin_env[project_name]:
+
+                req = [dist.as_requirement()]
+
+                try:
+                    resolvees = shadow_set.resolve(req, env, installer)
+
+                except ResolutionError as v:
+                    # save error info
+                    error_info[dist] = v
+                    if fallback:
+                        # try the next older version of project
+                        continue
+                    else:
+                        # give up on this project, keep going
+                        break
+
+                else:
+                    list(map(shadow_set.add, resolvees))
+                    distributions.update(dict.fromkeys(resolvees))
+
+                    # success, no need to try any more versions of this project
+                    break
+
+        distributions = list(distributions)
+        distributions.sort()
+
+        return distributions, error_info
+
+    def require(self, *requirements):
+        """Ensure that distributions matching `requirements` are activated
+
+        `requirements` must be a string or a (possibly-nested) sequence
+        thereof, specifying the distributions and versions required.  The
+        return value is a sequence of the distributions that needed to be
+        activated to fulfill the requirements; all relevant distributions are
+        included, even if they were already activated in this working set.
+        """
+        needed = self.resolve(parse_requirements(requirements))
+
+        for dist in needed:
+            self.add(dist)
+
+        return needed
+
+    def subscribe(self, callback, existing=True):
+        """Invoke `callback` for all distributions
+
+        If `existing=True` (default),
+        call on all existing ones, as well.
+        """
+        if callback in self.callbacks:
+            return
+        self.callbacks.append(callback)
+        if not existing:
+            return
+        for dist in self:
+            callback(dist)
+
+    def _added_new(self, dist):
+        for callback in self.callbacks:
+            callback(dist)
+
+    def __getstate__(self):
+        return (
+            self.entries[:], self.entry_keys.copy(), self.by_key.copy(),
+            self.callbacks[:]
+        )
+
+    def __setstate__(self, e_k_b_c):
+        entries, keys, by_key, callbacks = e_k_b_c
+        self.entries = entries[:]
+        self.entry_keys = keys.copy()
+        self.by_key = by_key.copy()
+        self.callbacks = callbacks[:]
+
+
+class _ReqExtras(dict):
+    """
+    Map each requirement to the extras that demanded it.
+    """
+
+    def markers_pass(self, req, extras=None):
+        """
+        Evaluate markers for req against each extra that
+        demanded it.
+
+        Return False if the req has a marker and fails
+        evaluation. Otherwise, return True.
+        """
+        extra_evals = (
+            req.marker.evaluate({'extra': extra})
+            for extra in self.get(req, ()) + (extras or (None,))
+        )
+        return not req.marker or any(extra_evals)
+
+
+class Environment:
+    """Searchable snapshot of distributions on a search path"""
+
+    def __init__(
+            self, search_path=None, platform=get_supported_platform(),
+            python=PY_MAJOR):
+        """Snapshot distributions available on a search path
+
+        Any distributions found on `search_path` are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.
+
+        `platform` is an optional string specifying the name of the platform
+        that platform-specific distributions must be compatible with.  If
+        unspecified, it defaults to the current platform.  `python` is an
+        optional string naming the desired version of Python (e.g. ``'3.6'``);
+        it defaults to the current version.
+
+        You may explicitly set `platform` (and/or `python`) to ``None`` if you
+        wish to map *all* distributions, not just those compatible with the
+        running platform or Python version.
+        """
+        self._distmap = {}
+        self.platform = platform
+        self.python = python
+        self.scan(search_path)
+
+    def can_add(self, dist):
+        """Is distribution `dist` acceptable for this environment?
+
+        The distribution must match the platform and python version
+        requirements specified when this environment was created, or False
+        is returned.
+        """
+        py_compat = (
+            self.python is None
+            or dist.py_version is None
+            or dist.py_version == self.python
+        )
+        return py_compat and compatible_platforms(dist.platform, self.platform)
+
+    def remove(self, dist):
+        """Remove `dist` from the environment"""
+        self._distmap[dist.key].remove(dist)
+
+    def scan(self, search_path=None):
+        """Scan `search_path` for distributions usable in this environment
+
+        Any distributions found are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.  Only distributions conforming to
+        the platform/python version defined at initialization are added.
+        """
+        if search_path is None:
+            search_path = sys.path
+
+        for item in search_path:
+            for dist in find_distributions(item):
+                self.add(dist)
+
+    def __getitem__(self, project_name):
+        """Return a newest-to-oldest list of distributions for `project_name`
+
+        Uses case-insensitive `project_name` comparison, assuming all the
+        project's distributions use their project's name converted to all
+        lowercase as their key.
+
+        """
+        distribution_key = project_name.lower()
+        return self._distmap.get(distribution_key, [])
+
+    def add(self, dist):
+        """Add `dist` if we ``can_add()`` it and it has not already been added
+        """
+        if self.can_add(dist) and dist.has_version():
+            dists = self._distmap.setdefault(dist.key, [])
+            if dist not in dists:
+                dists.append(dist)
+                dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
+
+    def best_match(
+            self, req, working_set, installer=None, replace_conflicting=False):
+        """Find distribution best matching `req` and usable on `working_set`
+
+        This calls the ``find(req)`` method of the `working_set` to see if a
+        suitable distribution is already active.  (This may raise
+        ``VersionConflict`` if an unsuitable version of the project is already
+        active in the specified `working_set`.)  If a suitable distribution
+        isn't active, this method returns the newest distribution in the
+        environment that meets the ``Requirement`` in `req`.  If no suitable
+        distribution is found, and `installer` is supplied, then the result of
+        calling the environment's ``obtain(req, installer)`` method will be
+        returned.
+        """
+        try:
+            dist = working_set.find(req)
+        except VersionConflict:
+            if not replace_conflicting:
+                raise
+            dist = None
+        if dist is not None:
+            return dist
+        for dist in self[req.key]:
+            if dist in req:
+                return dist
+        # try to download/install
+        return self.obtain(req, installer)
+
+    def obtain(self, requirement, installer=None):
+        """Obtain a distribution matching `requirement` (e.g. via download)
+
+        Obtain a distro that matches requirement (e.g. via download).  In the
+        base ``Environment`` class, this routine just returns
+        ``installer(requirement)``, unless `installer` is None, in which case
+        None is returned instead.  This method is a hook that allows subclasses
+        to attempt other ways of obtaining a distribution before falling back
+        to the `installer` argument."""
+        if installer is not None:
+            return installer(requirement)
+
+    def __iter__(self):
+        """Yield the unique project names of the available distributions"""
+        for key in self._distmap.keys():
+            if self[key]:
+                yield key
+
+    def __iadd__(self, other):
+        """In-place addition of a distribution or environment"""
+        if isinstance(other, Distribution):
+            self.add(other)
+        elif isinstance(other, Environment):
+            for project in other:
+                for dist in other[project]:
+                    self.add(dist)
+        else:
+            raise TypeError("Can't add %r to environment" % (other,))
+        return self
+
+    def __add__(self, other):
+        """Add an environment or distribution to an environment"""
+        new = self.__class__([], platform=None, python=None)
+        for env in self, other:
+            new += env
+        return new
+
+
+# XXX backward compatibility
+AvailableDistributions = Environment
+
+
+class ExtractionError(RuntimeError):
+    """An error occurred extracting a resource
+
+    The following attributes are available from instances of this exception:
+
+    manager
+        The resource manager that raised this exception
+
+    cache_path
+        The base directory for resource extraction
+
+    original_error
+        The exception instance that caused extraction to fail
+    """
+
+
+class ResourceManager:
+    """Manage resource extraction and packages"""
+    extraction_path = None
+
+    def __init__(self):
+        self.cached_files = {}
+
+    def resource_exists(self, package_or_requirement, resource_name):
+        """Does the named resource exist?"""
+        return get_provider(package_or_requirement).has_resource(resource_name)
+
+    def resource_isdir(self, package_or_requirement, resource_name):
+        """Is the named resource an existing directory?"""
+        return get_provider(package_or_requirement).resource_isdir(
+            resource_name
+        )
+
+    def resource_filename(self, package_or_requirement, resource_name):
+        """Return a true filesystem path for specified resource"""
+        return get_provider(package_or_requirement).get_resource_filename(
+            self, resource_name
+        )
+
+    def resource_stream(self, package_or_requirement, resource_name):
+        """Return a readable file-like object for specified resource"""
+        return get_provider(package_or_requirement).get_resource_stream(
+            self, resource_name
+        )
+
+    def resource_string(self, package_or_requirement, resource_name):
+        """Return specified resource as a string"""
+        return get_provider(package_or_requirement).get_resource_string(
+            self, resource_name
+        )
+
+    def resource_listdir(self, package_or_requirement, resource_name):
+        """List the contents of the named resource directory"""
+        return get_provider(package_or_requirement).resource_listdir(
+            resource_name
+        )
+
+    def extraction_error(self):
+        """Give an error message for problems extracting file(s)"""
+
+        old_exc = sys.exc_info()[1]
+        cache_path = self.extraction_path or get_default_cache()
+
+        tmpl = textwrap.dedent("""
+            Can't extract file(s) to egg cache
+
+            The following error occurred while trying to extract file(s)
+            to the Python egg cache:
+
+              {old_exc}
+
+            The Python egg cache directory is currently set to:
+
+              {cache_path}
+
+            Perhaps your account does not have write access to this directory?
+            You can change the cache directory by setting the PYTHON_EGG_CACHE
+            environment variable to point to an accessible directory.
+            """).lstrip()
+        err = ExtractionError(tmpl.format(**locals()))
+        err.manager = self
+        err.cache_path = cache_path
+        err.original_error = old_exc
+        raise err
+
+    def get_cache_path(self, archive_name, names=()):
+        """Return absolute location in cache for `archive_name` and `names`
+
+        The parent directory of the resulting path will be created if it does
+        not already exist.  `archive_name` should be the base filename of the
+        enclosing egg (which may not be the name of the enclosing zipfile!),
+        including its ".egg" extension.  `names`, if provided, should be a
+        sequence of path name parts "under" the egg's extraction location.
+
+        This method should only be called by resource providers that need to
+        obtain an extraction location, and only for names they intend to
+        extract, as it tracks the generated names for possible cleanup later.
+        """
+        extract_path = self.extraction_path or get_default_cache()
+        target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
+        try:
+            _bypass_ensure_directory(target_path)
+        except Exception:
+            self.extraction_error()
+
+        self._warn_unsafe_extraction_path(extract_path)
+
+        self.cached_files[target_path] = 1
+        return target_path
+
+    @staticmethod
+    def _warn_unsafe_extraction_path(path):
+        """
+        If the default extraction path is overridden and set to an insecure
+        location, such as /tmp, it opens up an opportunity for an attacker to
+        replace an extracted file with an unauthorized payload. Warn the user
+        if a known insecure location is used.
+
+        See Distribute #375 for more details.
+        """
+        if os.name == 'nt' and not path.startswith(os.environ['windir']):
+            # On Windows, permissions are generally restrictive by default
+            #  and temp directories are not writable by other users, so
+            #  bypass the warning.
+            return
+        mode = os.stat(path).st_mode
+        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
+            msg = (
+                "%s is writable by group/others and vulnerable to attack "
+                "when "
+                "used with get_resource_filename. Consider a more secure "
+                "location (set with .set_extraction_path or the "
+                "PYTHON_EGG_CACHE environment variable)." % path
+            )
+            warnings.warn(msg, UserWarning)
+
+    def postprocess(self, tempname, filename):
+        """Perform any platform-specific postprocessing of `tempname`
+
+        This is where Mac header rewrites should be done; other platforms don't
+        have anything special they should do.
+
+        Resource providers should call this method ONLY after successfully
+        extracting a compressed resource.  They must NOT call it on resources
+        that are already in the filesystem.
+
+        `tempname` is the current (temporary) name of the file, and `filename`
+        is the name it will be renamed to by the caller after this routine
+        returns.
+        """
+
+        if os.name == 'posix':
+            # Make the resource executable
+            mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
+            os.chmod(tempname, mode)
+
+    def set_extraction_path(self, path):
+        """Set the base path where resources will be extracted to, if needed.
+
+        If you do not call this routine before any extractions take place, the
+        path defaults to the return value of ``get_default_cache()``.  (Which
+        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
+        platform-specific fallbacks.  See that routine's documentation for more
+        details.)
+
+        Resources are extracted to subdirectories of this path based upon
+        information given by the ``IResourceProvider``.  You may set this to a
+        temporary directory, but then you must call ``cleanup_resources()`` to
+        delete the extracted files when done.  There is no guarantee that
+        ``cleanup_resources()`` will be able to remove all extracted files.
+
+        (Note: you may not change the extraction path for a given resource
+        manager once resources have been extracted, unless you first call
+        ``cleanup_resources()``.)
+        """
+        if self.cached_files:
+            raise ValueError(
+                "Can't change extraction path, files already extracted"
+            )
+
+        self.extraction_path = path
+
+    def cleanup_resources(self, force=False):
+        """
+        Delete all extracted resource files and directories, returning a list
+        of the file and directory names that could not be successfully removed.
+        This function does not have any concurrency protection, so it should
+        generally only be called when the extraction path is a temporary
+        directory exclusive to a single process.  This method is not
+        automatically called; you must call it explicitly or register it as an
+        ``atexit`` function if you wish to ensure cleanup of a temporary
+        directory used for extractions.
+        """
+        # XXX
+
+
+def get_default_cache():
+    """
+    Return the ``PYTHON_EGG_CACHE`` environment variable
+    or a platform-relevant user cache dir for an app
+    named "Python-Eggs".
+    """
+    return (
+        os.environ.get('PYTHON_EGG_CACHE')
+        or appdirs.user_cache_dir(appname='Python-Eggs')
+    )
+
+
+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
+    """
+    try:
+        # normalize the version
+        return str(packaging.version.Version(version))
+    except packaging.version.InvalidVersion:
+        version = version.replace(' ', '.')
+        return re.sub('[^A-Za-z0-9.]+', '-', version)
+
+
+def safe_extra(extra):
+    """Convert an arbitrary string to a standard 'extra' name
+
+    Any runs of non-alphanumeric characters are replaced with a single '_',
+    and the result is always lowercased.
+    """
+    return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
+
+
+def to_filename(name):
+    """Convert a project or version name to its filename-escaped form
+
+    Any '-' characters are currently replaced with '_'.
+    """
+    return name.replace('-', '_')
+
+
+def invalid_marker(text):
+    """
+    Validate text as a PEP 508 environment marker; return an exception
+    if invalid or False otherwise.
+    """
+    try:
+        evaluate_marker(text)
+    except SyntaxError as e:
+        e.filename = None
+        e.lineno = None
+        return e
+    return False
+
+
+def evaluate_marker(text, extra=None):
+    """
+    Evaluate a PEP 508 environment marker.
+    Return a boolean indicating the marker result in this environment.
+    Raise SyntaxError if marker is invalid.
+
+    This implementation uses the 'pyparsing' module.
+    """
+    try:
+        marker = packaging.markers.Marker(text)
+        return marker.evaluate()
+    except packaging.markers.InvalidMarker as e:
+        raise SyntaxError(e)
+
+
+class NullProvider:
+    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
+
+    egg_name = None
+    egg_info = None
+    loader = None
+
+    def __init__(self, module):
+        self.loader = getattr(module, '__loader__', None)
+        self.module_path = os.path.dirname(getattr(module, '__file__', ''))
+
+    def get_resource_filename(self, manager, resource_name):
+        return self._fn(self.module_path, resource_name)
+
+    def get_resource_stream(self, manager, resource_name):
+        return io.BytesIO(self.get_resource_string(manager, resource_name))
+
+    def get_resource_string(self, manager, resource_name):
+        return self._get(self._fn(self.module_path, resource_name))
+
+    def has_resource(self, resource_name):
+        return self._has(self._fn(self.module_path, resource_name))
+
+    def _get_metadata_path(self, name):
+        return self._fn(self.egg_info, name)
+
+    def has_metadata(self, name):
+        if not self.egg_info:
+            return self.egg_info
+
+        path = self._get_metadata_path(name)
+        return self._has(path)
+
+    def get_metadata(self, name):
+        if not self.egg_info:
+            return ""
+        value = self._get(self._fn(self.egg_info, name))
+        return value.decode('utf-8') if six.PY3 else value
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+    def resource_isdir(self, resource_name):
+        return self._isdir(self._fn(self.module_path, resource_name))
+
+    def metadata_isdir(self, name):
+        return self.egg_info and self._isdir(self._fn(self.egg_info, name))
+
+    def resource_listdir(self, resource_name):
+        return self._listdir(self._fn(self.module_path, resource_name))
+
+    def metadata_listdir(self, name):
+        if self.egg_info:
+            return self._listdir(self._fn(self.egg_info, name))
+        return []
+
+    def run_script(self, script_name, namespace):
+        script = 'scripts/' + script_name
+        if not self.has_metadata(script):
+            raise ResolutionError(
+                "Script {script!r} not found in metadata at {self.egg_info!r}"
+                .format(**locals()),
+            )
+        script_text = self.get_metadata(script).replace('\r\n', '\n')
+        script_text = script_text.replace('\r', '\n')
+        script_filename = self._fn(self.egg_info, script)
+        namespace['__file__'] = script_filename
+        if os.path.exists(script_filename):
+            source = open(script_filename).read()
+            code = compile(source, script_filename, 'exec')
+            exec(code, namespace, namespace)
+        else:
+            from linecache import cache
+            cache[script_filename] = (
+                len(script_text), 0, script_text.split('\n'), script_filename
+            )
+            script_code = compile(script_text, script_filename, 'exec')
+            exec(script_code, namespace, namespace)
+
+    def _has(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _isdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _listdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _fn(self, base, resource_name):
+        self._validate_resource_path(resource_name)
+        if resource_name:
+            return os.path.join(base, *resource_name.split('/'))
+        return base
+
+    @staticmethod
+    def _validate_resource_path(path):
+        """
+        Validate the resource paths according to the docs.
+        https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access
+
+        >>> warned = getfixture('recwarn')
+        >>> warnings.simplefilter('always')
+        >>> vrp = NullProvider._validate_resource_path
+        >>> vrp('foo/bar.txt')
+        >>> bool(warned)
+        False
+        >>> vrp('../foo/bar.txt')
+        >>> bool(warned)
+        True
+        >>> warned.clear()
+        >>> vrp('/foo/bar.txt')
+        >>> bool(warned)
+        True
+        >>> vrp('foo/../../bar.txt')
+        >>> bool(warned)
+        True
+        >>> warned.clear()
+        >>> vrp('foo/f../bar.txt')
+        >>> bool(warned)
+        False
+
+        Windows path separators are straight-up disallowed.
+        >>> vrp(r'\\foo/bar.txt')
+        Traceback (most recent call last):
+        ...
+        ValueError: Use of .. or absolute path in a resource path \
+is not allowed.
+
+        >>> vrp(r'C:\\foo/bar.txt')
+        Traceback (most recent call last):
+        ...
+        ValueError: Use of .. or absolute path in a resource path \
+is not allowed.
+
+        Blank values are allowed
+
+        >>> vrp('')
+        >>> bool(warned)
+        False
+
+        Non-string values are not.
+
+        >>> vrp(None)
+        Traceback (most recent call last):
+        ...
+        AttributeError: ...
+        """
+        invalid = (
+            os.path.pardir in path.split(posixpath.sep) or
+            posixpath.isabs(path) or
+            ntpath.isabs(path)
+        )
+        if not invalid:
+            return
+
+        msg = "Use of .. or absolute path in a resource path is not allowed."
+
+        # Aggressively disallow Windows absolute paths
+        if ntpath.isabs(path) and not posixpath.isabs(path):
+            raise ValueError(msg)
+
+        # for compatibility, warn; in future
+        # raise ValueError(msg)
+        warnings.warn(
+            msg[:-1] + " and will raise exceptions in a future release.",
+            DeprecationWarning,
+            stacklevel=4,
+        )
+
+    def _get(self, path):
+        if hasattr(self.loader, 'get_data'):
+            return self.loader.get_data(path)
+        raise NotImplementedError(
+            "Can't perform this operation for loaders without 'get_data()'"
+        )
+
+
+register_loader_type(object, NullProvider)
+
+
+class EggProvider(NullProvider):
+    """Provider based on a virtual filesystem"""
+
+    def __init__(self, module):
+        NullProvider.__init__(self, module)
+        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)
+
+
+class DefaultProvider(EggProvider):
+    """Provides access to package resources in the filesystem"""
+
+    def _has(self, path):
+        return os.path.exists(path)
+
+    def _isdir(self, path):
+        return os.path.isdir(path)
+
+    def _listdir(self, path):
+        return os.listdir(path)
+
+    def get_resource_stream(self, manager, resource_name):
+        return open(self._fn(self.module_path, resource_name), 'rb')
+
+    def _get(self, path):
+        with open(path, 'rb') as stream:
+            return stream.read()
+
+    @classmethod
+    def _register(cls):
+        loader_names = 'SourceFileLoader', 'SourcelessFileLoader',
+        for name in loader_names:
+            loader_cls = getattr(importlib_machinery, name, type(None))
+            register_loader_type(loader_cls, cls)
+
+
+DefaultProvider._register()
+
+
+class EmptyProvider(NullProvider):
+    """Provider that returns nothing for all requests"""
+
+    module_path = None
+
+    _isdir = _has = lambda self, path: False
+
+    def _get(self, path):
+        return ''
+
+    def _listdir(self, path):
+        return []
+
+    def __init__(self):
+        pass
+
+
+empty_provider = EmptyProvider()
+
+
+class ZipManifests(dict):
+    """
+    zip manifest builder
+    """
+
+    @classmethod
+    def build(cls, path):
+        """
+        Build a dictionary similar to the zipimport directory
+        caches, except instead of tuples, store ZipInfo objects.
+
+        Use a platform-specific path separator (os.sep) for the path keys
+        for compatibility with pypy on Windows.
+        """
+        with zipfile.ZipFile(path) as zfile:
+            items = (
+                (
+                    name.replace('/', os.sep),
+                    zfile.getinfo(name),
+                )
+                for name in zfile.namelist()
+            )
+            return dict(items)
+
+    load = build
+
+
+class MemoizedZipManifests(ZipManifests):
+    """
+    Memoized zipfile manifests.
+    """
+    manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
+
+    def load(self, path):
+        """
+        Load a manifest at path or return a suitable manifest already loaded.
+        """
+        path = os.path.normpath(path)
+        mtime = os.stat(path).st_mtime
+
+        if path not in self or self[path].mtime != mtime:
+            manifest = self.build(path)
+            self[path] = self.manifest_mod(manifest, mtime)
+
+        return self[path].manifest
+
+
+class ZipProvider(EggProvider):
+    """Resource support for zips and eggs"""
+
+    eagers = None
+    _zip_manifests = MemoizedZipManifests()
+
+    def __init__(self, module):
+        EggProvider.__init__(self, module)
+        self.zip_pre = self.loader.archive + os.sep
+
+    def _zipinfo_name(self, fspath):
+        # Convert a virtual filename (full path to file) into a zipfile subpath
+        # usable with the zipimport directory cache for our target archive
+        fspath = fspath.rstrip(os.sep)
+        if fspath == self.loader.archive:
+            return ''
+        if fspath.startswith(self.zip_pre):
+            return fspath[len(self.zip_pre):]
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.zip_pre)
+        )
+
+    def _parts(self, zip_path):
+        # Convert a zipfile subpath into an egg-relative path part list.
+        # pseudo-fs path
+        fspath = self.zip_pre + zip_path
+        if fspath.startswith(self.egg_root + os.sep):
+            return fspath[len(self.egg_root) + 1:].split(os.sep)
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.egg_root)
+        )
+
+    @property
+    def zipinfo(self):
+        return self._zip_manifests.load(self.loader.archive)
+
+    def get_resource_filename(self, manager, resource_name):
+        if not self.egg_name:
+            raise NotImplementedError(
+                "resource_filename() only supported for .egg, not .zip"
+            )
+        # no need to lock for extraction, since we use temp names
+        zip_path = self._resource_to_zip(resource_name)
+        eagers = self._get_eager_resources()
+        if '/'.join(self._parts(zip_path)) in eagers:
+            for name in eagers:
+                self._extract_resource(manager, self._eager_to_zip(name))
+        return self._extract_resource(manager, zip_path)
+
+    @staticmethod
+    def _get_date_and_size(zip_stat):
+        size = zip_stat.file_size
+        # ymdhms+wday, yday, dst
+        date_time = zip_stat.date_time + (0, 0, -1)
+        # 1980 offset already done
+        timestamp = time.mktime(date_time)
+        return timestamp, size
+
+    def _extract_resource(self, manager, zip_path):
+
+        if zip_path in self._index():
+            for name in self._index()[zip_path]:
+                last = self._extract_resource(
+                    manager, os.path.join(zip_path, name)
+                )
+            # return the extracted directory name
+            return os.path.dirname(last)
+
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+
+        if not WRITE_SUPPORT:
+            raise IOError('"os.rename" and "os.unlink" are not supported '
+                          'on this platform')
+        try:
+
+            real_path = manager.get_cache_path(
+                self.egg_name, self._parts(zip_path)
+            )
+
+            if self._is_current(real_path, zip_path):
+                return real_path
+
+            outf, tmpnam = _mkstemp(
+                ".$extract",
+                dir=os.path.dirname(real_path),
+            )
+            os.write(outf, self.loader.get_data(zip_path))
+            os.close(outf)
+            utime(tmpnam, (timestamp, timestamp))
+            manager.postprocess(tmpnam, real_path)
+
+            try:
+                rename(tmpnam, real_path)
+
+            except os.error:
+                if os.path.isfile(real_path):
+                    if self._is_current(real_path, zip_path):
+                        # the file became current since it was checked above,
+                        #  so proceed.
+                        return real_path
+                    # Windows, del old file and retry
+                    elif os.name == 'nt':
+                        unlink(real_path)
+                        rename(tmpnam, real_path)
+                        return real_path
+                raise
+
+        except os.error:
+            # report a user-friendly error
+            manager.extraction_error()
+
+        return real_path
+
+    def _is_current(self, file_path, zip_path):
+        """
+        Return True if the file_path is current for this zip_path
+        """
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+        if not os.path.isfile(file_path):
+            return False
+        stat = os.stat(file_path)
+        if stat.st_size != size or stat.st_mtime != timestamp:
+            return False
+        # check that the contents match
+        zip_contents = self.loader.get_data(zip_path)
+        with open(file_path, 'rb') as f:
+            file_contents = f.read()
+        return zip_contents == file_contents
+
+    def _get_eager_resources(self):
+        if self.eagers is None:
+            eagers = []
+            for name in ('native_libs.txt', 'eager_resources.txt'):
+                if self.has_metadata(name):
+                    eagers.extend(self.get_metadata_lines(name))
+            self.eagers = eagers
+        return self.eagers
+
+    def _index(self):
+        try:
+            return self._dirindex
+        except AttributeError:
+            ind = {}
+            for path in self.zipinfo:
+                parts = path.split(os.sep)
+                while parts:
+                    parent = os.sep.join(parts[:-1])
+                    if parent in ind:
+                        ind[parent].append(parts[-1])
+                        break
+                    else:
+                        ind[parent] = [parts.pop()]
+            self._dirindex = ind
+            return ind
+
+    def _has(self, fspath):
+        zip_path = self._zipinfo_name(fspath)
+        return zip_path in self.zipinfo or zip_path in self._index()
+
+    def _isdir(self, fspath):
+        return self._zipinfo_name(fspath) in self._index()
+
+    def _listdir(self, fspath):
+        return list(self._index().get(self._zipinfo_name(fspath), ()))
+
+    def _eager_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.egg_root, resource_name))
+
+    def _resource_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.module_path, resource_name))
+
+
+register_loader_type(zipimport.zipimporter, ZipProvider)
+
+
+class FileMetadata(EmptyProvider):
+    """Metadata handler for standalone PKG-INFO files
+
+    Usage::
+
+        metadata = FileMetadata("/path/to/PKG-INFO")
+
+    This provider rejects all data and metadata requests except for PKG-INFO,
+    which is treated as existing, and will be the contents of the file at
+    the provided location.
+    """
+
+    def __init__(self, path):
+        self.path = path
+
+    def _get_metadata_path(self, name):
+        return self.path
+
+    def has_metadata(self, name):
+        return name == 'PKG-INFO' and os.path.isfile(self.path)
+
+    def get_metadata(self, name):
+        if name != 'PKG-INFO':
+            raise KeyError("No metadata except PKG-INFO is available")
+
+        with io.open(self.path, encoding='utf-8', errors="replace") as f:
+            metadata = f.read()
+        self._warn_on_replacement(metadata)
+        return metadata
+
+    def _warn_on_replacement(self, metadata):
+        # Python 2.7 compat for: replacement_char = '�'
+        replacement_char = b'\xef\xbf\xbd'.decode('utf-8')
+        if replacement_char in metadata:
+            tmpl = "{self.path} could not be properly decoded in UTF-8"
+            msg = tmpl.format(**locals())
+            warnings.warn(msg)
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+
+class PathMetadata(DefaultProvider):
+    """Metadata provider for egg directories
+
+    Usage::
+
+        # Development eggs:
+
+        egg_info = "/path/to/PackageName.egg-info"
+        base_dir = os.path.dirname(egg_info)
+        metadata = PathMetadata(base_dir, egg_info)
+        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
+        dist = Distribution(basedir, project_name=dist_name, metadata=metadata)
+
+        # Unpacked egg directories:
+
+        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
+        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
+        dist = Distribution.from_filename(egg_path, metadata=metadata)
+    """
+
+    def __init__(self, path, egg_info):
+        self.module_path = path
+        self.egg_info = egg_info
+
+
+class EggMetadata(ZipProvider):
+    """Metadata provider for .egg files"""
+
+    def __init__(self, importer):
+        """Create a metadata provider from a zipimporter"""
+
+        self.zip_pre = importer.archive + os.sep
+        self.loader = importer
+        if importer.prefix:
+            self.module_path = os.path.join(importer.archive, importer.prefix)
+        else:
+            self.module_path = importer.archive
+        self._setup_prefix()
+
+
+_declare_state('dict', _distribution_finders={})
+
+
+def register_finder(importer_type, distribution_finder):
+    """Register `distribution_finder` to find distributions in sys.path items
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `distribution_finder` is a callable that, passed a path
+    item and the importer instance, yields ``Distribution`` instances found on
+    that path item.  See ``pkg_resources.find_on_path`` for an example."""
+    _distribution_finders[importer_type] = distribution_finder
+
+
+def find_distributions(path_item, only=False):
+    """Yield distributions accessible via `path_item`"""
+    importer = get_importer(path_item)
+    finder = _find_adapter(_distribution_finders, importer)
+    return finder(importer, path_item, only)
+
+
+def find_eggs_in_zip(importer, path_item, only=False):
+    """
+    Find eggs in zip files; possibly multiple nested eggs.
+    """
+    if importer.archive.endswith('.whl'):
+        # wheels are not supported with this finder
+        # they don't have PKG-INFO metadata, and won't ever contain eggs
+        return
+    metadata = EggMetadata(importer)
+    if metadata.has_metadata('PKG-INFO'):
+        yield Distribution.from_filename(path_item, metadata=metadata)
+    if only:
+        # don't yield nested distros
+        return
+    for subitem in metadata.resource_listdir(''):
+        if _is_egg_path(subitem):
+            subpath = os.path.join(path_item, subitem)
+            dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
+            for dist in dists:
+                yield dist
+        elif subitem.lower().endswith('.dist-info'):
+            subpath = os.path.join(path_item, subitem)
+            submeta = EggMetadata(zipimport.zipimporter(subpath))
+            submeta.egg_info = subpath
+            yield Distribution.from_location(path_item, subitem, submeta)
+
+
+register_finder(zipimport.zipimporter, find_eggs_in_zip)
+
+
+def find_nothing(importer, path_item, only=False):
+    return ()
+
+
+register_finder(object, find_nothing)
+
+
+def _by_version_descending(names):
+    """
+    Given a list of filenames, return them in descending order
+    by version number.
+
+    >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg'
+    >>> _by_version_descending(names)
+    ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar']
+    >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg'
+    >>> _by_version_descending(names)
+    ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg']
+    >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg'
+    >>> _by_version_descending(names)
+    ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg']
+    """
+    def _by_version(name):
+        """
+        Parse each component of the filename
+        """
+        name, ext = os.path.splitext(name)
+        parts = itertools.chain(name.split('-'), [ext])
+        return [packaging.version.parse(part) for part in parts]
+
+    return sorted(names, key=_by_version, reverse=True)
+
+
+def find_on_path(importer, path_item, only=False):
+    """Yield distributions accessible on a sys.path directory"""
+    path_item = _normalize_cached(path_item)
+
+    if _is_unpacked_egg(path_item):
+        yield Distribution.from_filename(
+            path_item, metadata=PathMetadata(
+                path_item, os.path.join(path_item, 'EGG-INFO')
+            )
+        )
+        return
+
+    entries = safe_listdir(path_item)
+
+    # for performance, before sorting by version,
+    # screen entries for only those that will yield
+    # distributions
+    filtered = (
+        entry
+        for entry in entries
+        if dist_factory(path_item, entry, only)
+    )
+
+    # scan for .egg and .egg-info in directory
+    path_item_entries = _by_version_descending(filtered)
+    for entry in path_item_entries:
+        fullpath = os.path.join(path_item, entry)
+        factory = dist_factory(path_item, entry, only)
+        for dist in factory(fullpath):
+            yield dist
+
+
+def dist_factory(path_item, entry, only):
+    """
+    Return a dist_factory for a path_item and entry
+    """
+    lower = entry.lower()
+    is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info')))
+    return (
+        distributions_from_metadata
+        if is_meta else
+        find_distributions
+        if not only and _is_egg_path(entry) else
+        resolve_egg_link
+        if not only and lower.endswith('.egg-link') else
+        NoDists()
+    )
+
+
+class NoDists:
+    """
+    >>> bool(NoDists())
+    False
+
+    >>> list(NoDists()('anything'))
+    []
+    """
+    def __bool__(self):
+        return False
+    if six.PY2:
+        __nonzero__ = __bool__
+
+    def __call__(self, fullpath):
+        return iter(())
+
+
+def safe_listdir(path):
+    """
+    Attempt to list contents of path, but suppress some exceptions.
+    """
+    try:
+        return os.listdir(path)
+    except (PermissionError, NotADirectoryError):
+        pass
+    except OSError as e:
+        # Ignore the directory if does not exist, not a directory or
+        # permission denied
+        ignorable = (
+            e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT)
+            # Python 2 on Windows needs to be handled this way :(
+            or getattr(e, "winerror", None) == 267
+        )
+        if not ignorable:
+            raise
+    return ()
+
+
+def distributions_from_metadata(path):
+    root = os.path.dirname(path)
+    if os.path.isdir(path):
+        if len(os.listdir(path)) == 0:
+            # empty metadata dir; skip
+            return
+        metadata = PathMetadata(root, path)
+    else:
+        metadata = FileMetadata(path)
+    entry = os.path.basename(path)
+    yield Distribution.from_location(
+        root, entry, metadata, precedence=DEVELOP_DIST,
+    )
+
+
+def non_empty_lines(path):
+    """
+    Yield non-empty lines from file at path
+    """
+    with open(path) as f:
+        for line in f:
+            line = line.strip()
+            if line:
+                yield line
+
+
+def resolve_egg_link(path):
+    """
+    Given a path to an .egg-link, resolve distributions
+    present in the referenced path.
+    """
+    referenced_paths = non_empty_lines(path)
+    resolved_paths = (
+        os.path.join(os.path.dirname(path), ref)
+        for ref in referenced_paths
+    )
+    dist_groups = map(find_distributions, resolved_paths)
+    return next(dist_groups, ())
+
+
+register_finder(pkgutil.ImpImporter, find_on_path)
+
+if hasattr(importlib_machinery, 'FileFinder'):
+    register_finder(importlib_machinery.FileFinder, find_on_path)
+
+_declare_state('dict', _namespace_handlers={})
+_declare_state('dict', _namespace_packages={})
+
+
+def register_namespace_handler(importer_type, namespace_handler):
+    """Register `namespace_handler` to declare namespace packages
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `namespace_handler` is a callable like this::
+
+        def namespace_handler(importer, path_entry, moduleName, module):
+            # return a path_entry to use for child packages
+
+    Namespace handlers are only called if the importer object has already
+    agreed that it can handle the relevant path item, and they should only
+    return a subpath if the module __path__ does not already contain an
+    equivalent subpath.  For an example namespace handler, see
+    ``pkg_resources.file_ns_handler``.
+    """
+    _namespace_handlers[importer_type] = namespace_handler
+
+
+def _handle_ns(packageName, path_item):
+    """Ensure that named package includes a subpath of path_item (if needed)"""
+
+    importer = get_importer(path_item)
+    if importer is None:
+        return None
+
+    # capture warnings due to #1111
+    with warnings.catch_warnings():
+        warnings.simplefilter("ignore")
+        loader = importer.find_module(packageName)
+
+    if loader is None:
+        return None
+    module = sys.modules.get(packageName)
+    if module is None:
+        module = sys.modules[packageName] = types.ModuleType(packageName)
+        module.__path__ = []
+        _set_parent_ns(packageName)
+    elif not hasattr(module, '__path__'):
+        raise TypeError("Not a package:", packageName)
+    handler = _find_adapter(_namespace_handlers, importer)
+    subpath = handler(importer, path_item, packageName, module)
+    if subpath is not None:
+        path = module.__path__
+        path.append(subpath)
+        loader.load_module(packageName)
+        _rebuild_mod_path(path, packageName, module)
+    return subpath
+
+
+def _rebuild_mod_path(orig_path, package_name, module):
+    """
+    Rebuild module.__path__ ensuring that all entries are ordered
+    corresponding to their sys.path order
+    """
+    sys_path = [_normalize_cached(p) for p in sys.path]
+
+    def safe_sys_path_index(entry):
+        """
+        Workaround for #520 and #513.
+        """
+        try:
+            return sys_path.index(entry)
+        except ValueError:
+            return float('inf')
+
+    def position_in_sys_path(path):
+        """
+        Return the ordinal of the path based on its position in sys.path
+        """
+        path_parts = path.split(os.sep)
+        module_parts = package_name.count('.') + 1
+        parts = path_parts[:-module_parts]
+        return safe_sys_path_index(_normalize_cached(os.sep.join(parts)))
+
+    new_path = sorted(orig_path, key=position_in_sys_path)
+    new_path = [_normalize_cached(p) for p in new_path]
+
+    if isinstance(module.__path__, list):
+        module.__path__[:] = new_path
+    else:
+        module.__path__ = new_path
+
+
+def declare_namespace(packageName):
+    """Declare that package 'packageName' is a namespace package"""
+
+    _imp.acquire_lock()
+    try:
+        if packageName in _namespace_packages:
+            return
+
+        path = sys.path
+        parent, _, _ = packageName.rpartition('.')
+
+        if parent:
+            declare_namespace(parent)
+            if parent not in _namespace_packages:
+                __import__(parent)
+            try:
+                path = sys.modules[parent].__path__
+            except AttributeError:
+                raise TypeError("Not a package:", parent)
+
+        # Track what packages are namespaces, so when new path items are added,
+        # they can be updated
+        _namespace_packages.setdefault(parent or None, []).append(packageName)
+        _namespace_packages.setdefault(packageName, [])
+
+        for path_item in path:
+            # Ensure all the parent's path items are reflected in the child,
+            # if they apply
+            _handle_ns(packageName, path_item)
+
+    finally:
+        _imp.release_lock()
+
+
+def fixup_namespace_packages(path_item, parent=None):
+    """Ensure that previously-declared namespace packages include path_item"""
+    _imp.acquire_lock()
+    try:
+        for package in _namespace_packages.get(parent, ()):
+            subpath = _handle_ns(package, path_item)
+            if subpath:
+                fixup_namespace_packages(subpath, package)
+    finally:
+        _imp.release_lock()
+
+
+def file_ns_handler(importer, path_item, packageName, module):
+    """Compute an ns-package subpath for a filesystem or zipfile importer"""
+
+    subpath = os.path.join(path_item, packageName.split('.')[-1])
+    normalized = _normalize_cached(subpath)
+    for item in module.__path__:
+        if _normalize_cached(item) == normalized:
+            break
+    else:
+        # Only return the path if it's not already there
+        return subpath
+
+
+register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
+register_namespace_handler(zipimport.zipimporter, file_ns_handler)
+
+if hasattr(importlib_machinery, 'FileFinder'):
+    register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
+
+
+def null_ns_handler(importer, path_item, packageName, module):
+    return None
+
+
+register_namespace_handler(object, null_ns_handler)
+
+
+def normalize_path(filename):
+    """Normalize a file/dir name for comparison purposes"""
+    return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
+
+
+def _cygwin_patch(filename):  # pragma: nocover
+    """
+    Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
+    symlink components. Using
+    os.path.abspath() works around this limitation. A fix in os.getcwd()
+    would probably better, in Cygwin even more so, except
+    that this seems to be by design...
+    """
+    return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
+
+
+def _normalize_cached(filename, _cache={}):
+    try:
+        return _cache[filename]
+    except KeyError:
+        _cache[filename] = result = normalize_path(filename)
+        return result
+
+
+def _is_egg_path(path):
+    """
+    Determine if given path appears to be an egg.
+    """
+    return path.lower().endswith('.egg')
+
+
+def _is_unpacked_egg(path):
+    """
+    Determine if given path appears to be an unpacked egg.
+    """
+    return (
+        _is_egg_path(path) and
+        os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO'))
+    )
+
+
+def _set_parent_ns(packageName):
+    parts = packageName.split('.')
+    name = parts.pop()
+    if parts:
+        parent = '.'.join(parts)
+        setattr(sys.modules[parent], name, sys.modules[packageName])
+
+
+def yield_lines(strs):
+    """Yield non-empty/non-comment lines of a string or sequence"""
+    if isinstance(strs, six.string_types):
+        for s in strs.splitlines():
+            s = s.strip()
+            # skip blank lines/comments
+            if s and not s.startswith('#'):
+                yield s
+    else:
+        for ss in strs:
+            for s in yield_lines(ss):
+                yield s
+
+
+MODULE = re.compile(r"\w+(\.\w+)*$").match
+EGG_NAME = re.compile(
+    r"""
+    (?P<name>[^-]+) (
+        -(?P<ver>[^-]+) (
+            -py(?P<pyver>[^-]+) (
+                -(?P<plat>.+)
+            )?
+        )?
+    )?
+    """,
+    re.VERBOSE | re.IGNORECASE,
+).match
+
+
+class EntryPoint:
+    """Object representing an advertised importable object"""
+
+    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
+        if not MODULE(module_name):
+            raise ValueError("Invalid module name", module_name)
+        self.name = name
+        self.module_name = module_name
+        self.attrs = tuple(attrs)
+        self.extras = tuple(extras)
+        self.dist = dist
+
+    def __str__(self):
+        s = "%s = %s" % (self.name, self.module_name)
+        if self.attrs:
+            s += ':' + '.'.join(self.attrs)
+        if self.extras:
+            s += ' [%s]' % ','.join(self.extras)
+        return s
+
+    def __repr__(self):
+        return "EntryPoint.parse(%r)" % str(self)
+
+    def load(self, require=True, *args, **kwargs):
+        """
+        Require packages for this EntryPoint, then resolve it.
+        """
+        if not require or args or kwargs:
+            warnings.warn(
+                "Parameters to load are deprecated.  Call .resolve and "
+                ".require separately.",
+                PkgResourcesDeprecationWarning,
+                stacklevel=2,
+            )
+        if require:
+            self.require(*args, **kwargs)
+        return self.resolve()
+
+    def resolve(self):
+        """
+        Resolve the entry point from its module and attrs.
+        """
+        module = __import__(self.module_name, fromlist=['__name__'], level=0)
+        try:
+            return functools.reduce(getattr, self.attrs, module)
+        except AttributeError as exc:
+            raise ImportError(str(exc))
+
+    def require(self, env=None, installer=None):
+        if self.extras and not self.dist:
+            raise UnknownExtra("Can't require() without a distribution", self)
+
+        # Get the requirements for this entry point with all its extras and
+        # then resolve them. We have to pass `extras` along when resolving so
+        # that the working set knows what extras we want. Otherwise, for
+        # dist-info distributions, the working set will assume that the
+        # requirements for that extra are purely optional and skip over them.
+        reqs = self.dist.requires(self.extras)
+        items = working_set.resolve(reqs, env, installer, extras=self.extras)
+        list(map(working_set.add, items))
+
+    pattern = re.compile(
+        r'\s*'
+        r'(?P<name>.+?)\s*'
+        r'=\s*'
+        r'(?P<module>[\w.]+)\s*'
+        r'(:\s*(?P<attr>[\w.]+))?\s*'
+        r'(?P<extras>\[.*\])?\s*$'
+    )
+
+    @classmethod
+    def parse(cls, src, dist=None):
+        """Parse a single entry point from string `src`
+
+        Entry point syntax follows the form::
+
+            name = some.module:some.attr [extra1, extra2]
+
+        The entry name and module name are required, but the ``:attrs`` and
+        ``[extras]`` parts are optional
+        """
+        m = cls.pattern.match(src)
+        if not m:
+            msg = "EntryPoint must be in 'name=module:attrs [extras]' format"
+            raise ValueError(msg, src)
+        res = m.groupdict()
+        extras = cls._parse_extras(res['extras'])
+        attrs = res['attr'].split('.') if res['attr'] else ()
+        return cls(res['name'], res['module'], attrs, extras, dist)
+
+    @classmethod
+    def _parse_extras(cls, extras_spec):
+        if not extras_spec:
+            return ()
+        req = Requirement.parse('x' + extras_spec)
+        if req.specs:
+            raise ValueError()
+        return req.extras
+
+    @classmethod
+    def parse_group(cls, group, lines, dist=None):
+        """Parse an entry point group"""
+        if not MODULE(group):
+            raise ValueError("Invalid group name", group)
+        this = {}
+        for line in yield_lines(lines):
+            ep = cls.parse(line, dist)
+            if ep.name in this:
+                raise ValueError("Duplicate entry point", group, ep.name)
+            this[ep.name] = ep
+        return this
+
+    @classmethod
+    def parse_map(cls, data, dist=None):
+        """Parse a map of entry point groups"""
+        if isinstance(data, dict):
+            data = data.items()
+        else:
+            data = split_sections(data)
+        maps = {}
+        for group, lines in data:
+            if group is None:
+                if not lines:
+                    continue
+                raise ValueError("Entry points must be listed in groups")
+            group = group.strip()
+            if group in maps:
+                raise ValueError("Duplicate group name", group)
+            maps[group] = cls.parse_group(group, lines, dist)
+        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
+    the value of the Version field, if present, or None otherwise.
+    """
+    def is_version_line(line):
+        return line.lower().startswith('version:')
+    version_lines = filter(is_version_line, lines)
+    line = next(iter(version_lines), '')
+    _, _, value = line.partition(':')
+    return safe_version(value.strip()) or None
+
+
+class Distribution:
+    """Wrap an actual or potential sys.path entry w/metadata"""
+    PKG_INFO = 'PKG-INFO'
+
+    def __init__(
+            self, location=None, metadata=None, project_name=None,
+            version=None, py_version=PY_MAJOR, platform=None,
+            precedence=EGG_DIST):
+        self.project_name = safe_name(project_name or 'Unknown')
+        if version is not None:
+            self._version = safe_version(version)
+        self.py_version = py_version
+        self.platform = platform
+        self.location = location
+        self.precedence = precedence
+        self._provider = metadata or empty_provider
+
+    @classmethod
+    def from_location(cls, location, basename, metadata=None, **kw):
+        project_name, version, py_version, platform = [None] * 4
+        basename, ext = os.path.splitext(basename)
+        if ext.lower() in _distributionImpl:
+            cls = _distributionImpl[ext.lower()]
+
+            match = EGG_NAME(basename)
+            if match:
+                project_name, version, py_version, platform = match.group(
+                    'name', 'ver', 'pyver', 'plat'
+                )
+        return cls(
+            location, metadata, project_name=project_name, version=version,
+            py_version=py_version, platform=platform, **kw
+        )._reload_version()
+
+    def _reload_version(self):
+        return self
+
+    @property
+    def hashcmp(self):
+        return (
+            self.parsed_version,
+            self.precedence,
+            self.key,
+            _remove_md5_fragment(self.location),
+            self.py_version or '',
+            self.platform or '',
+        )
+
+    def __hash__(self):
+        return hash(self.hashcmp)
+
+    def __lt__(self, other):
+        return self.hashcmp < other.hashcmp
+
+    def __le__(self, other):
+        return self.hashcmp <= other.hashcmp
+
+    def __gt__(self, other):
+        return self.hashcmp > other.hashcmp
+
+    def __ge__(self, other):
+        return self.hashcmp >= other.hashcmp
+
+    def __eq__(self, other):
+        if not isinstance(other, self.__class__):
+            # It's not a Distribution, so they are not equal
+            return False
+        return self.hashcmp == other.hashcmp
+
+    def __ne__(self, other):
+        return not self == other
+
+    # These properties have to be lazy so that we don't have to load any
+    # metadata until/unless it's actually needed.  (i.e., some distributions
+    # may not know their name or version without loading PKG-INFO)
+
+    @property
+    def key(self):
+        try:
+            return self._key
+        except AttributeError:
+            self._key = key = self.project_name.lower()
+            return key
+
+    @property
+    def parsed_version(self):
+        if not hasattr(self, "_parsed_version"):
+            self._parsed_version = parse_version(self.version)
+
+        return self._parsed_version
+
+    def _warn_legacy_version(self):
+        LV = packaging.version.LegacyVersion
+        is_legacy = isinstance(self._parsed_version, LV)
+        if not is_legacy:
+            return
+
+        # While an empty version is technically a legacy version and
+        # is not a valid PEP 440 version, it's also unlikely to
+        # actually come from someone and instead it is more likely that
+        # it comes from setuptools attempting to parse a filename and
+        # including it in the list. So for that we'll gate this warning
+        # on if the version is anything at all or not.
+        if not self.version:
+            return
+
+        tmpl = textwrap.dedent("""
+            '{project_name} ({version})' is being parsed as a legacy,
+            non PEP 440,
+            version. You may find odd behavior and sort order.
+            In particular it will be sorted as less than 0.0. It
+            is recommended to migrate to PEP 440 compatible
+            versions.
+            """).strip().replace('\n', ' ')
+
+        warnings.warn(tmpl.format(**vars(self)), PEP440Warning)
+
+    @property
+    def version(self):
+        try:
+            return self._version
+        except AttributeError:
+            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)
+
+            return version
+
+    @property
+    def _dep_map(self):
+        """
+        A map of extra to its list of (direct) requirements
+        for this distribution, including the null extra.
+        """
+        try:
+            return self.__dep_map
+        except AttributeError:
+            self.__dep_map = self._filter_extras(self._build_dep_map())
+        return self.__dep_map
+
+    @staticmethod
+    def _filter_extras(dm):
+        """
+        Given a mapping of extras to dependencies, strip off
+        environment markers and filter out any dependencies
+        not matching the markers.
+        """
+        for extra in list(filter(None, dm)):
+            new_extra = extra
+            reqs = dm.pop(extra)
+            new_extra, _, marker = extra.partition(':')
+            fails_marker = marker and (
+                invalid_marker(marker)
+                or not evaluate_marker(marker)
+            )
+            if fails_marker:
+                reqs = []
+            new_extra = safe_extra(new_extra) or None
+
+            dm.setdefault(new_extra, []).extend(reqs)
+        return dm
+
+    def _build_dep_map(self):
+        dm = {}
+        for name in 'requires.txt', 'depends.txt':
+            for extra, reqs in split_sections(self._get_metadata(name)):
+                dm.setdefault(extra, []).extend(parse_requirements(reqs))
+        return dm
+
+    def requires(self, extras=()):
+        """List of Requirements needed for this distro if `extras` are used"""
+        dm = self._dep_map
+        deps = []
+        deps.extend(dm.get(None, ()))
+        for ext in extras:
+            try:
+                deps.extend(dm[safe_extra(ext)])
+            except KeyError:
+                raise UnknownExtra(
+                    "%s has no such extra feature %r" % (self, ext)
+                )
+        return deps
+
+    def _get_metadata_path_for_display(self, name):
+        """
+        Return the path to the given metadata file, if available.
+        """
+        try:
+            # We need to access _get_metadata_path() on the provider object
+            # directly rather than through this class's __getattr__()
+            # since _get_metadata_path() is marked private.
+            path = self._provider._get_metadata_path(name)
+
+        # Handle exceptions e.g. in case the distribution's metadata
+        # provider doesn't support _get_metadata_path().
+        except Exception:
+            return '[could not detect]'
+
+        return path
+
+    def _get_metadata(self, name):
+        if self.has_metadata(name):
+            for line in self.get_metadata_lines(name):
+                yield line
+
+    def _get_version(self):
+        lines = self._get_metadata(self.PKG_INFO)
+        version = _version_from_file(lines)
+
+        return version
+
+    def activate(self, path=None, replace=False):
+        """Ensure distribution is importable on `path` (default=sys.path)"""
+        if path is None:
+            path = sys.path
+        self.insert_on(path, replace=replace)
+        if path is sys.path:
+            fixup_namespace_packages(self.location)
+            for pkg in self._get_metadata('namespace_packages.txt'):
+                if pkg in sys.modules:
+                    declare_namespace(pkg)
+
+    def egg_name(self):
+        """Return what this distribution's standard .egg filename should be"""
+        filename = "%s-%s-py%s" % (
+            to_filename(self.project_name), to_filename(self.version),
+            self.py_version or PY_MAJOR
+        )
+
+        if self.platform:
+            filename += '-' + self.platform
+        return filename
+
+    def __repr__(self):
+        if self.location:
+            return "%s (%s)" % (self, self.location)
+        else:
+            return str(self)
+
+    def __str__(self):
+        try:
+            version = getattr(self, 'version', None)
+        except ValueError:
+            version = None
+        version = version or "[unknown version]"
+        return "%s %s" % (self.project_name, version)
+
+    def __getattr__(self, attr):
+        """Delegate all unrecognized public attributes to .metadata provider"""
+        if attr.startswith('_'):
+            raise AttributeError(attr)
+        return getattr(self._provider, attr)
+
+    def __dir__(self):
+        return list(
+            set(super(Distribution, self).__dir__())
+            | set(
+                attr for attr in self._provider.__dir__()
+                if not attr.startswith('_')
+            )
+        )
+
+    if not hasattr(object, '__dir__'):
+        # python 2.7 not supported
+        del __dir__
+
+    @classmethod
+    def from_filename(cls, filename, metadata=None, **kw):
+        return cls.from_location(
+            _normalize_cached(filename), os.path.basename(filename), metadata,
+            **kw
+        )
+
+    def as_requirement(self):
+        """Return a ``Requirement`` that matches this distribution exactly"""
+        if isinstance(self.parsed_version, packaging.version.Version):
+            spec = "%s==%s" % (self.project_name, self.parsed_version)
+        else:
+            spec = "%s===%s" % (self.project_name, self.parsed_version)
+
+        return Requirement.parse(spec)
+
+    def load_entry_point(self, group, name):
+        """Return the `name` entry point of `group` or raise ImportError"""
+        ep = self.get_entry_info(group, name)
+        if ep is None:
+            raise ImportError("Entry point %r not found" % ((group, name),))
+        return ep.load()
+
+    def get_entry_map(self, group=None):
+        """Return the entry point map for `group`, or the full entry map"""
+        try:
+            ep_map = self._ep_map
+        except AttributeError:
+            ep_map = self._ep_map = EntryPoint.parse_map(
+                self._get_metadata('entry_points.txt'), self
+            )
+        if group is not None:
+            return ep_map.get(group, {})
+        return ep_map
+
+    def get_entry_info(self, group, name):
+        """Return the EntryPoint object for `group`+`name`, or ``None``"""
+        return self.get_entry_map(group).get(name)
+
+    def insert_on(self, path, loc=None, replace=False):
+        """Ensure self.location is on path
+
+        If replace=False (default):
+            - If location is already in path anywhere, do nothing.
+            - Else:
+              - If it's an egg and its parent directory is on path,
+                insert just ahead of the parent.
+              - Else: add to the end of path.
+        If replace=True:
+            - If location is already on path anywhere (not eggs)
+              or higher priority than its parent (eggs)
+              do nothing.
+            - Else:
+              - If it's an egg and its parent directory is on path,
+                insert just ahead of the parent,
+                removing any lower-priority entries.
+              - Else: add it to the front of path.
+        """
+
+        loc = loc or self.location
+        if not loc:
+            return
+
+        nloc = _normalize_cached(loc)
+        bdir = os.path.dirname(nloc)
+        npath = [(p and _normalize_cached(p) or p) for p in path]
+
+        for p, item in enumerate(npath):
+            if item == nloc:
+                if replace:
+                    break
+                else:
+                    # don't modify path (even removing duplicates) if
+                    # found and not replace
+                    return
+            elif item == bdir and self.precedence == EGG_DIST:
+                # if it's an .egg, give it precedence over its directory
+                # UNLESS it's already been added to sys.path and replace=False
+                if (not replace) and nloc in npath[p:]:
+                    return
+                if path is sys.path:
+                    self.check_version_conflict()
+                path.insert(p, loc)
+                npath.insert(p, nloc)
+                break
+        else:
+            if path is sys.path:
+                self.check_version_conflict()
+            if replace:
+                path.insert(0, loc)
+            else:
+                path.append(loc)
+            return
+
+        # p is the spot where we found or inserted loc; now remove duplicates
+        while True:
+            try:
+                np = npath.index(nloc, p + 1)
+            except ValueError:
+                break
+            else:
+                del npath[np], path[np]
+                # ha!
+                p = np
+
+        return
+
+    def check_version_conflict(self):
+        if self.key == 'setuptools':
+            # ignore the inevitable setuptools self-conflicts  :(
+            return
+
+        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
+        loc = normalize_path(self.location)
+        for modname in self._get_metadata('top_level.txt'):
+            if (modname not in sys.modules or modname in nsp
+                    or modname in _namespace_packages):
+                continue
+            if modname in ('pkg_resources', 'setuptools', 'site'):
+                continue
+            fn = getattr(sys.modules[modname], '__file__', None)
+            if fn and (normalize_path(fn).startswith(loc) or
+                       fn.startswith(self.location)):
+                continue
+            issue_warning(
+                "Module %s was already imported from %s, but %s is being added"
+                " to sys.path" % (modname, fn, self.location),
+            )
+
+    def has_version(self):
+        try:
+            self.version
+        except ValueError:
+            issue_warning("Unbuilt egg for " + repr(self))
+            return False
+        return True
+
+    def clone(self, **kw):
+        """Copy this distribution, substituting in any changed keyword args"""
+        names = 'project_name version py_version platform location precedence'
+        for attr in names.split():
+            kw.setdefault(attr, getattr(self, attr, None))
+        kw.setdefault('metadata', self._provider)
+        return self.__class__(**kw)
+
+    @property
+    def extras(self):
+        return [dep for dep in self._dep_map if dep]
+
+
+class EggInfoDistribution(Distribution):
+    def _reload_version(self):
+        """
+        Packages installed by distutils (e.g. numpy or scipy),
+        which uses an old safe_version, and so
+        their version numbers can get mangled when
+        converted to filenames (e.g., 1.11.0.dev0+2329eae to
+        1.11.0.dev0_2329eae). These distributions will not be
+        parsed properly
+        downstream by Distribution and safe_version, so
+        take an extra step and try to get the version number from
+        the metadata file itself instead of the filename.
+        """
+        md_version = self._get_version()
+        if md_version:
+            self._version = md_version
+        return self
+
+
+class DistInfoDistribution(Distribution):
+    """
+    Wrap an actual or potential sys.path entry
+    w/metadata, .dist-info style.
+    """
+    PKG_INFO = 'METADATA'
+    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")
+
+    @property
+    def _parsed_pkg_info(self):
+        """Parse and cache metadata"""
+        try:
+            return self._pkg_info
+        except AttributeError:
+            metadata = self.get_metadata(self.PKG_INFO)
+            self._pkg_info = email.parser.Parser().parsestr(metadata)
+            return self._pkg_info
+
+    @property
+    def _dep_map(self):
+        try:
+            return self.__dep_map
+        except AttributeError:
+            self.__dep_map = self._compute_dependencies()
+            return self.__dep_map
+
+    def _compute_dependencies(self):
+        """Recompute this distribution's dependencies."""
+        dm = self.__dep_map = {None: []}
+
+        reqs = []
+        # Including any condition expressions
+        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
+            reqs.extend(parse_requirements(req))
+
+        def reqs_for_extra(extra):
+            for req in reqs:
+                if not req.marker or req.marker.evaluate({'extra': extra}):
+                    yield req
+
+        common = frozenset(reqs_for_extra(None))
+        dm[None].extend(common)
+
+        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
+            s_extra = safe_extra(extra.strip())
+            dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common)
+
+        return dm
+
+
+_distributionImpl = {
+    '.egg': Distribution,
+    '.egg-info': EggInfoDistribution,
+    '.dist-info': DistInfoDistribution,
+}
+
+
+def issue_warning(*args, **kw):
+    level = 1
+    g = globals()
+    try:
+        # find the first stack frame that is *not* code in
+        # the pkg_resources module, to use for the warning
+        while sys._getframe(level).f_globals is g:
+            level += 1
+    except ValueError:
+        pass
+    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`
+
+    `strs` must be a string, or a (possibly-nested) iterable thereof.
+    """
+    # create a steppable iterator, so we can handle \-continuations
+    lines = iter(yield_lines(strs))
+
+    for line in lines:
+        # Drop comments -- a hash without a space may be in a URL.
+        if ' #' in line:
+            line = line[:line.find(' #')]
+        # If there is a line continuation, drop it, and append the next line.
+        if line.endswith('\\'):
+            line = line[:-2].strip()
+            try:
+                line += next(lines)
+            except StopIteration:
+                return
+        yield Requirement(line)
+
+
+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))
+        self.unsafe_name = self.name
+        project_name = safe_name(self.name)
+        self.project_name, self.key = project_name, project_name.lower()
+        self.specs = [
+            (spec.operator, spec.version) for spec in self.specifier]
+        self.extras = tuple(map(safe_extra, self.extras))
+        self.hashCmp = (
+            self.key,
+            self.specifier,
+            frozenset(self.extras),
+            str(self.marker) if self.marker else None,
+        )
+        self.__hash = hash(self.hashCmp)
+
+    def __eq__(self, other):
+        return (
+            isinstance(other, Requirement) and
+            self.hashCmp == other.hashCmp
+        )
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __contains__(self, item):
+        if isinstance(item, Distribution):
+            if item.key != self.key:
+                return False
+
+            item = item.version
+
+        # Allow prereleases always in order to match the previous behavior of
+        # this method. In the future this should be smarter and follow PEP 440
+        # more accurately.
+        return self.specifier.contains(item, prereleases=True)
+
+    def __hash__(self):
+        return self.__hash
+
+    def __repr__(self):
+        return "Requirement.parse(%r)" % str(self)
+
+    @staticmethod
+    def parse(s):
+        req, = parse_requirements(s)
+        return req
+
+
+def _always_object(classes):
+    """
+    Ensure object appears in the mro even
+    for old-style classes.
+    """
+    if object not in classes:
+        return classes + (object,)
+    return classes
+
+
+def _find_adapter(registry, ob):
+    """Return an adapter factory for `ob` from `registry`"""
+    types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
+    for t in types:
+        if t in registry:
+            return registry[t]
+
+
+def ensure_directory(path):
+    """Ensure that the parent directory of `path` exists"""
+    dirname = os.path.dirname(path)
+    py31compat.makedirs(dirname, exist_ok=True)
+
+
+def _bypass_ensure_directory(path):
+    """Sandbox-bypassing version of ensure_directory()"""
+    if not WRITE_SUPPORT:
+        raise IOError('"os.mkdir" not supported on this platform.')
+    dirname, filename = split(path)
+    if dirname and filename and not isdir(dirname):
+        _bypass_ensure_directory(dirname)
+        try:
+            mkdir(dirname, 0o755)
+        except FileExistsError:
+            pass
+
+
+def split_sections(s):
+    """Split a string or iterable thereof into (section, content) pairs
+
+    Each ``section`` is a stripped version of the section header ("[section]")
+    and each ``content`` is a list of stripped lines excluding blank lines and
+    comment-only lines.  If there are any such lines before the first section
+    header, they're returned in a first ``section`` of ``None``.
+    """
+    section = None
+    content = []
+    for line in yield_lines(s):
+        if line.startswith("["):
+            if line.endswith("]"):
+                if section or content:
+                    yield section, content
+                section = line[1:-1].strip()
+                content = []
+            else:
+                raise ValueError("Invalid section heading", line)
+        else:
+            content.append(line)
+
+    # wrap up last segment
+    yield section, content
+
+
+def _mkstemp(*args, **kw):
+    old_open = os.open
+    try:
+        # temporarily bypass sandboxing
+        os.open = os_open
+        return tempfile.mkstemp(*args, **kw)
+    finally:
+        # and then put it back
+        os.open = old_open
+
+
+# Silence the PEP440Warning by default, so that end users don't get hit by it
+# randomly just because they use pkg_resources. We want to append the rule
+# because we want earlier uses of filterwarnings to take precedence over this
+# one.
+warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
+
+
+# from jaraco.functools 1.3
+def _call_aside(f, *args, **kwargs):
+    f(*args, **kwargs)
+    return f
+
+
+@_call_aside
+def _initialize(g=globals()):
+    "Set up global resource manager (deliberately not state-saved)"
+    manager = ResourceManager()
+    g['_manager'] = manager
+    g.update(
+        (name, getattr(manager, name))
+        for name in dir(manager)
+        if not name.startswith('_')
+    )
+
+
+@_call_aside
+def _initialize_master_working_set():
+    """
+    Prepare the master working set and make the ``require()``
+    API available.
+
+    This function has explicit effects on the global state
+    of pkg_resources. It is intended to be invoked once at
+    the initialization of this module.
+
+    Invocation by other packages is unsupported and done
+    at their own risk.
+    """
+    working_set = WorkingSet._build_master()
+    _declare_state('object', working_set=working_set)
+
+    require = working_set.require
+    iter_entry_points = working_set.iter_entry_points
+    add_activation_listener = working_set.subscribe
+    run_script = working_set.run_script
+    # backward compatibility
+    run_main = run_script
+    # Activate all distributions already on sys.path with replace=False and
+    # ensure that all distributions added to the working set in the future
+    # (e.g. by calling ``require()``) will get activated as well,
+    # with higher priority (replace=True).
+    tuple(
+        dist.activate(replace=False)
+        for dist in working_set
+    )
+    add_activation_listener(
+        lambda dist: dist.activate(replace=True),
+        existing=False,
+    )
+    working_set.entries = []
+    # match order
+    list(map(working_set.add_entry, sys.path))
+    globals().update(locals())
+
+class PkgResourcesDeprecationWarning(Warning):
+    """
+    Base class for warning about deprecations in ``pkg_resources``
+
+    This class is not derived from ``DeprecationWarning``, and as such is
+    visible by default.
+    """
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..52d20af501c62d67526b10113907f18b8de0f5de
GIT binary patch
literal 136262
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
MPF7|{A#Q$k08v`aq5uE@

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b7710e6996ce998a931b2eade571cf4c2e085c79
GIT binary patch
literal 207
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaRmbdgML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWoclBesO9^X+cSTeonD|L3Vn4QEG91X;E@&v3`76YF<iyk$!x9
gW?p7Ve7s&kWeEoZ1A|R&eoARhsvXFQ#UK{~00ZtedjJ3c

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py
new file mode 100644
index 00000000..ae67001a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py
@@ -0,0 +1,608 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2005-2010 ActiveState Software Inc.
+# Copyright (c) 2013 Eddy Petrișor
+
+"""Utilities for determining application-specific dirs.
+
+See <http://github.com/ActiveState/appdirs> for details and usage.
+"""
+# Dev Notes:
+# - MSDN on where to store app data files:
+#   http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120
+# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html
+# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
+
+__version_info__ = (1, 4, 3)
+__version__ = '.'.join(map(str, __version_info__))
+
+
+import sys
+import os
+
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    unicode = str
+
+if sys.platform.startswith('java'):
+    import platform
+    os_name = platform.java_ver()[3][0]
+    if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc.
+        system = 'win32'
+    elif os_name.startswith('Mac'): # "Mac OS X", etc.
+        system = 'darwin'
+    else: # "Linux", "SunOS", "FreeBSD", etc.
+        # Setting this to "linux2" is not ideal, but only Windows or Mac
+        # are actually checked for and the rest of the module expects
+        # *sys.platform* style strings.
+        system = 'linux2'
+else:
+    system = sys.platform
+
+
+
+def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user data directories are:
+        Mac OS X:               ~/Library/Application Support/<AppName>
+        Unix:                   ~/.local/share/<AppName>    # or in $XDG_DATA_HOME, if defined
+        Win XP (not roaming):   C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName>
+        Win XP (roaming):       C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>
+        Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>
+        Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName>
+
+    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
+    That means, by default "~/.local/share/<AppName>".
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
+        path = os.path.normpath(_get_win_folder(const))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+    elif system == 'darwin':
+        path = os.path.expanduser('~/Library/Application Support/')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def site_data_dir(appname=None, appauthor=None, version=None, multipath=False):
+    r"""Return full path to the user-shared data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "multipath" is an optional parameter only applicable to *nix
+            which indicates that the entire list of data dirs should be
+            returned. By default, the first item from XDG_DATA_DIRS is
+            returned, or '/usr/local/share/<AppName>',
+            if XDG_DATA_DIRS is not set
+
+    Typical site data directories are:
+        Mac OS X:   /Library/Application Support/<AppName>
+        Unix:       /usr/local/share/<AppName> or /usr/share/<AppName>
+        Win XP:     C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName>
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
+        Win 7:      C:\ProgramData\<AppAuthor>\<AppName>   # Hidden, but writeable on Win 7.
+
+    For Unix, this is using the $XDG_DATA_DIRS[0] default.
+
+    WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+    elif system == 'darwin':
+        path = os.path.expanduser('/Library/Application Support')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        # XDG default for $XDG_DATA_DIRS
+        # only first, if multipath is False
+        path = os.getenv('XDG_DATA_DIRS',
+                         os.pathsep.join(['/usr/local/share', '/usr/share']))
+        pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
+        if appname:
+            if version:
+                appname = os.path.join(appname, version)
+            pathlist = [os.sep.join([x, appname]) for x in pathlist]
+
+        if multipath:
+            path = os.pathsep.join(pathlist)
+        else:
+            path = pathlist[0]
+        return path
+
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_config_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific config dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user config directories are:
+        Mac OS X:               same as user_data_dir
+        Unix:                   ~/.config/<AppName>     # or in $XDG_CONFIG_HOME, if defined
+        Win *:                  same as user_data_dir
+
+    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
+    That means, by default "~/.config/<AppName>".
+    """
+    if system in ["win32", "darwin"]:
+        path = user_data_dir(appname, appauthor, None, roaming)
+    else:
+        path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def site_config_dir(appname=None, appauthor=None, version=None, multipath=False):
+    r"""Return full path to the user-shared data dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "multipath" is an optional parameter only applicable to *nix
+            which indicates that the entire list of config dirs should be
+            returned. By default, the first item from XDG_CONFIG_DIRS is
+            returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set
+
+    Typical site config directories are:
+        Mac OS X:   same as site_data_dir
+        Unix:       /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in
+                    $XDG_CONFIG_DIRS
+        Win *:      same as site_data_dir
+        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
+
+    For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False
+
+    WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
+    """
+    if system in ["win32", "darwin"]:
+        path = site_data_dir(appname, appauthor)
+        if appname and version:
+            path = os.path.join(path, version)
+    else:
+        # XDG default for $XDG_CONFIG_DIRS
+        # only first, if multipath is False
+        path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg')
+        pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
+        if appname:
+            if version:
+                appname = os.path.join(appname, version)
+            pathlist = [os.sep.join([x, appname]) for x in pathlist]
+
+        if multipath:
+            path = os.pathsep.join(pathlist)
+        else:
+            path = pathlist[0]
+    return path
+
+
+def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True):
+    r"""Return full path to the user-specific cache dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "opinion" (boolean) can be False to disable the appending of
+            "Cache" to the base app data dir for Windows. See
+            discussion below.
+
+    Typical user cache directories are:
+        Mac OS X:   ~/Library/Caches/<AppName>
+        Unix:       ~/.cache/<AppName> (XDG default)
+        Win XP:     C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache
+        Vista:      C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache
+
+    On Windows the only suggestion in the MSDN docs is that local settings go in
+    the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming
+    app data dir (the default returned by `user_data_dir` above). Apps typically
+    put cache data somewhere *under* the given dir here. Some examples:
+        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
+        ...\Acme\SuperApp\Cache\1.0
+    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
+    This can be disabled with the `opinion=False` option.
+    """
+    if system == "win32":
+        if appauthor is None:
+            appauthor = appname
+        path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
+        if appname:
+            if appauthor is not False:
+                path = os.path.join(path, appauthor, appname)
+            else:
+                path = os.path.join(path, appname)
+            if opinion:
+                path = os.path.join(path, "Cache")
+    elif system == 'darwin':
+        path = os.path.expanduser('~/Library/Caches')
+        if appname:
+            path = os.path.join(path, appname)
+    else:
+        path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache'))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_state_dir(appname=None, appauthor=None, version=None, roaming=False):
+    r"""Return full path to the user-specific state dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "roaming" (boolean, default False) can be set True to use the Windows
+            roaming appdata directory. That means that for users on a Windows
+            network setup for roaming profiles, this user data will be
+            sync'd on login. See
+            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
+            for a discussion of issues.
+
+    Typical user state directories are:
+        Mac OS X:  same as user_data_dir
+        Unix:      ~/.local/state/<AppName>   # or in $XDG_STATE_HOME, if defined
+        Win *:     same as user_data_dir
+
+    For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state>
+    to extend the XDG spec and support $XDG_STATE_HOME.
+
+    That means, by default "~/.local/state/<AppName>".
+    """
+    if system in ["win32", "darwin"]:
+        path = user_data_dir(appname, appauthor, None, roaming)
+    else:
+        path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state"))
+        if appname:
+            path = os.path.join(path, appname)
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+def user_log_dir(appname=None, appauthor=None, version=None, opinion=True):
+    r"""Return full path to the user-specific log dir for this application.
+
+        "appname" is the name of application.
+            If None, just the system directory is returned.
+        "appauthor" (only used on Windows) is the name of the
+            appauthor or distributing body for this application. Typically
+            it is the owning company name. This falls back to appname. You may
+            pass False to disable it.
+        "version" is an optional version path element to append to the
+            path. You might want to use this if you want multiple versions
+            of your app to be able to run independently. If used, this
+            would typically be "<major>.<minor>".
+            Only applied when appname is present.
+        "opinion" (boolean) can be False to disable the appending of
+            "Logs" to the base app data dir for Windows, and "log" to the
+            base cache dir for Unix. See discussion below.
+
+    Typical user log directories are:
+        Mac OS X:   ~/Library/Logs/<AppName>
+        Unix:       ~/.cache/<AppName>/log  # or under $XDG_CACHE_HOME if defined
+        Win XP:     C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs
+        Vista:      C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs
+
+    On Windows the only suggestion in the MSDN docs is that local settings
+    go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in
+    examples of what some windows apps use for a logs dir.)
+
+    OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA`
+    value for Windows and appends "log" to the user cache dir for Unix.
+    This can be disabled with the `opinion=False` option.
+    """
+    if system == "darwin":
+        path = os.path.join(
+            os.path.expanduser('~/Library/Logs'),
+            appname)
+    elif system == "win32":
+        path = user_data_dir(appname, appauthor, version)
+        version = False
+        if opinion:
+            path = os.path.join(path, "Logs")
+    else:
+        path = user_cache_dir(appname, appauthor, version)
+        version = False
+        if opinion:
+            path = os.path.join(path, "log")
+    if appname and version:
+        path = os.path.join(path, version)
+    return path
+
+
+class AppDirs(object):
+    """Convenience wrapper for getting application dirs."""
+    def __init__(self, appname=None, appauthor=None, version=None,
+            roaming=False, multipath=False):
+        self.appname = appname
+        self.appauthor = appauthor
+        self.version = version
+        self.roaming = roaming
+        self.multipath = multipath
+
+    @property
+    def user_data_dir(self):
+        return user_data_dir(self.appname, self.appauthor,
+                             version=self.version, roaming=self.roaming)
+
+    @property
+    def site_data_dir(self):
+        return site_data_dir(self.appname, self.appauthor,
+                             version=self.version, multipath=self.multipath)
+
+    @property
+    def user_config_dir(self):
+        return user_config_dir(self.appname, self.appauthor,
+                               version=self.version, roaming=self.roaming)
+
+    @property
+    def site_config_dir(self):
+        return site_config_dir(self.appname, self.appauthor,
+                             version=self.version, multipath=self.multipath)
+
+    @property
+    def user_cache_dir(self):
+        return user_cache_dir(self.appname, self.appauthor,
+                              version=self.version)
+
+    @property
+    def user_state_dir(self):
+        return user_state_dir(self.appname, self.appauthor,
+                              version=self.version)
+
+    @property
+    def user_log_dir(self):
+        return user_log_dir(self.appname, self.appauthor,
+                            version=self.version)
+
+
+#---- internal support stuff
+
+def _get_win_folder_from_registry(csidl_name):
+    """This is a fallback technique at best. I'm not sure if using the
+    registry for this guarantees us the correct answer for all CSIDL_*
+    names.
+    """
+    if PY3:
+      import winreg as _winreg
+    else:
+      import _winreg
+
+    shell_folder_name = {
+        "CSIDL_APPDATA": "AppData",
+        "CSIDL_COMMON_APPDATA": "Common AppData",
+        "CSIDL_LOCAL_APPDATA": "Local AppData",
+    }[csidl_name]
+
+    key = _winreg.OpenKey(
+        _winreg.HKEY_CURRENT_USER,
+        r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
+    )
+    dir, type = _winreg.QueryValueEx(key, shell_folder_name)
+    return dir
+
+
+def _get_win_folder_with_pywin32(csidl_name):
+    from win32com.shell import shellcon, shell
+    dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0)
+    # Try to make this a unicode path because SHGetFolderPath does
+    # not return unicode strings when there is unicode data in the
+    # path.
+    try:
+        dir = unicode(dir)
+
+        # Downgrade to short path name if have highbit chars. See
+        # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+        has_high_char = False
+        for c in dir:
+            if ord(c) > 255:
+                has_high_char = True
+                break
+        if has_high_char:
+            try:
+                import win32api
+                dir = win32api.GetShortPathName(dir)
+            except ImportError:
+                pass
+    except UnicodeError:
+        pass
+    return dir
+
+
+def _get_win_folder_with_ctypes(csidl_name):
+    import ctypes
+
+    csidl_const = {
+        "CSIDL_APPDATA": 26,
+        "CSIDL_COMMON_APPDATA": 35,
+        "CSIDL_LOCAL_APPDATA": 28,
+    }[csidl_name]
+
+    buf = ctypes.create_unicode_buffer(1024)
+    ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in buf:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf2 = ctypes.create_unicode_buffer(1024)
+        if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
+            buf = buf2
+
+    return buf.value
+
+def _get_win_folder_with_jna(csidl_name):
+    import array
+    from com.sun import jna
+    from com.sun.jna.platform import win32
+
+    buf_size = win32.WinDef.MAX_PATH * 2
+    buf = array.zeros('c', buf_size)
+    shell = win32.Shell32.INSTANCE
+    shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf)
+    dir = jna.Native.toString(buf.tostring()).rstrip("\0")
+
+    # Downgrade to short path name if have highbit chars. See
+    # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+    has_high_char = False
+    for c in dir:
+        if ord(c) > 255:
+            has_high_char = True
+            break
+    if has_high_char:
+        buf = array.zeros('c', buf_size)
+        kernel = win32.Kernel32.INSTANCE
+        if kernel.GetShortPathName(dir, buf, buf_size):
+            dir = jna.Native.toString(buf.tostring()).rstrip("\0")
+
+    return dir
+
+if system == "win32":
+    try:
+        import win32com.shell
+        _get_win_folder = _get_win_folder_with_pywin32
+    except ImportError:
+        try:
+            from ctypes import windll
+            _get_win_folder = _get_win_folder_with_ctypes
+        except ImportError:
+            try:
+                import com.sun.jna
+                _get_win_folder = _get_win_folder_with_jna
+            except ImportError:
+                _get_win_folder = _get_win_folder_from_registry
+
+
+#---- self test code
+
+if __name__ == "__main__":
+    appname = "MyApp"
+    appauthor = "MyCompany"
+
+    props = ("user_data_dir",
+             "user_config_dir",
+             "user_cache_dir",
+             "user_state_dir",
+             "user_log_dir",
+             "site_data_dir",
+             "site_config_dir")
+
+    print("-- app dirs %s --" % __version__)
+
+    print("-- app dirs (with optional 'version')")
+    dirs = AppDirs(appname, appauthor, version="1.0")
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (without optional 'version')")
+    dirs = AppDirs(appname, appauthor)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (without optional 'appauthor')")
+    dirs = AppDirs(appname)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
+
+    print("\n-- app dirs (with disabled 'appauthor')")
+    dirs = AppDirs(appname, appauthor=False)
+    for prop in props:
+        print("%s: %s" % (prop, getattr(dirs, prop)))
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..90784235abf40c42cbbef2656182436045cbbfa2
GIT binary patch
literal 24286
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py
new file mode 100644
index 00000000..95d330ef
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py
@@ -0,0 +1,21 @@
+# 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
+
+__all__ = [
+    "__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"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD or Apache License, Version 2.0"
+__copyright__ = "Copyright 2014-2016 %s" % __author__
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..11e01791cf4982e03c83fcba31228bf8c6a7d6ce
GIT binary patch
literal 846
zcmZSn%*&NH<x)&C0~ByDFfceIFftSuF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGo-LEq_8riurZ{tGo)}Zq;N8%b1+1)Fr;uXM6oiYa5F@)F{JP?M6olZ
z@G?YkFr@G?L~$~t@H0elF{B7EL~%2u2r{H{GKfX-Fr)}E1ZxO0Ffe3-+@itEz`#(#
z&%nTtm{gpfQ(BT5pP5^bUsO^8a$-tmS!Qu&eqIS50|P@rQD$CAd|GK<atTO?lYxOD
zKE5QgBqudKzJwdhD=y8=O)RR6k1t^d^Gk~|;c{iEMIfW%<4d@}a*3rS8Tm!=@g)$0
zQgahCbKr_|GLuvDia`eRf)yv{7gQEyre~Bu)fXftXD6m-=A{=aF)%PV=NF|al$K=X
zWR_&67AvIX7byf(mSp7TDL~Yv78ffrFfe44loS+O>FcLwmSmJB=_Tjq>K9ZNB<e#H
zfed3|U|=vb)3YenWME)$$<Is7Nl^$cDNRc&QAo^7QOL{#1xQM1Vva&`eqKpYW>RTM
zeo=9;04Nf{svU~Ks`WDS!47i@c2USLQgAFtOwLGE@PT+rM<EOn6beRq2E}4v_d|WB
zU}RuuqHAPeXr`cA?56?pJ2bS?N=r(MQsd);K#>;2$iTo5!~}{tNH{0v<iy7Zfub@9
z<b@zskUSfR0Lce|qA~~+%t4@_*8mxTAc~tA7#Q>miZaU*OH%dA5{vZH@^eyBi;DHL
z3-z;$jm*sr3$u*O%M2~di*qW|%i~Q_OiT<63=Goq^h5LuG7EGw^NLFnb8>Xc6D>;v
zGxUp7OG*n$^7C_w^$W7o<BL*@^Gl18Q;YTE%Tn`F@{17Rtsftsn3P{y5+AQuPzg?O
kHo5sJr8%i~AYT-VFfcI4F!M9=GqW+WF|skSF@Z@&0OH%$$p8QV

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py
new file mode 100644
index 00000000..5ee62202
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py
@@ -0,0 +1,14 @@
+# 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
+
+from .__about__ import (
+    __author__, __copyright__, __email__, __license__, __summary__, __title__,
+    __uri__, __version__
+)
+
+__all__ = [
+    "__title__", "__summary__", "__uri__", "__version__", "__author__",
+    "__email__", "__license__", "__copyright__",
+]
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..89c384122befea615e680e4bcf9dd3d012153387
GIT binary patch
literal 668
zcmZSn%*&NH<x)&C0~ByDFfceIFftTZFfcHrFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`=YcF+{O3<gznFu`}dyFhp@M<Z?1ZaWdp`F+_1O<Z?4a
zaWmxdFhub%Fs86Dq_8riurZ{tGo)}Zq;N8%a51ECGo*7cMDa4D@Gt~x@G>wkWP)6z
z!OXzGP{Pl^z>t_!oS#!#k{X|xTaaH=QUY>lN@iJRab|vA2_FLkLqSnyUP*jfX<l+k
zW`15KBLf4221ro}7Xt%Be0*YQNk)EAe0&MW?D+WP{DR7&%=C<s`1le|u!7Xw#LS%d
z_!4d~FDElOHLo}o&Mz*_%}p$-gsU#eEXe`MvV&EZ7G=U!mZcVf+!P-l1hPE{q#y`n
zLlDRvK_LGGu`)0)1hIh#76t|eKMj!cq0USzEh#NZjgJok`928bi6ACW5P(dGk55d>
zFD;3WhnND=i)0koBCwSpwP4#yKw|Oni8(p(@fsil5kzql0|SG8K~ZK|Vo9ogSz?iX
zT7FJSYEiL%cA<WDv5~pCVPTe$d6}Vwd2vo<dU?D_iiwGVfq_AKo_>gaL1uw&W?peg
zVor{3d7@=$V1|BiYDsB9Nq&A#v3@~zdVEo8aeir0a%!=Dd|7H<N`8@kL1J=tVtQs?
nx_*3oW?p7Ve7s&kB{&*wa`RJ4b5iX<9x4U}iwu($8$TlezBQEq

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py
new file mode 100644
index 00000000..210bb80b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py
@@ -0,0 +1,30 @@
+# 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 sys
+
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+# flake8: noqa
+
+if PY3:
+    string_types = str,
+else:
+    string_types = basestring,
+
+
+def with_metaclass(meta, *bases):
+    """
+    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):
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ab096e428fe21497544a285b13e52b714c142d9b
GIT binary patch
literal 1472
zcmZSn%*&NH<x)&C0~9bZFfceIFftUEF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQw&M7*bgnvRFZ?B~zFgvY8m7*pP)-z(VW{sq73z2@I(m3~7uEQJf5U
zoD8X4P<9F{Lkj~#6gNW(6GN~D8v_GFCdfS+%nS?+CHxEw42em_`8lN}sqvY)1^GoK
zB^)5vWtL?YXXfXX@G&qj6clCVmBgo&<|UV8=I8lkg8Y#Q(w@x7z`y`vure?(u!DSN
z3ewBS(7_0@yq$reosl7p31o8{14A<dLu4%zLkR;z79&Fq6GI9!LkbJXG0iLt!5SbV
ziuD;77`PM^6cn6`QWHy36%rMa5{pw6l5-M^ixtW<OEMG^6>?Kc62Ss`V3j4D3=9l#
zF_f@o0=Y<vfq@~F0Tjdt=P)p|F@S<QC|CpJgJc#41_l@w25AytU;z1{hLNFzfuV+(
zp_!QhqSQ|V9CjeZB_NL{=M<NKIC+V=sU=*X5Y5Oejt4oqxCCT$iUugKN<f~22!a%Y
zTnjd*xRHT@LBF6Vvn;VBRlh8;NIxw<CndG0SU<Z^KfBn-+}yA*%gDUU(89bpr!u`f
z-Xz7u#K6G7AU#h%M86=jKsPh5xFj(rN4GrDvNSM5zc{s|w4fwEKc`r~AUi$2D784h
zv?w{XSU<ijH7_N<NWUO4IXf{uGcR2~J~=<PAhATRpt6LWfq@}DJ}<RAK3;}_fuR`W
zWClh^0s$q4_;`@_;^V;{jE~RFPbtkwjgJok`4{XDuqT5+N`pYL0Tvq^ehUIck~GXy
zY>eOpUy=$+=!r#@@!)g>b}rZp;HWIAEJ%fT4Wt+BA&A#NT!dPP7|6SW!>8b!3d$n!
zpyUPim<Y(<pajRjF3+sN14^BsD2tCzD=jH40>vOGF$aOtX%HyR!6~}9vbY4Kv@Ep<
zQ~<<h=B4F>B?2OiptLcVE-onoD=aQ4%FIiT2L)R(IE6qGI!G`GRJ=ff3}h3SHAq4W
flvr&bDcKGbM8%+jPKJqxS(s6ng^iJiiIW)sa9&~S

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py
new file mode 100644
index 00000000..ccc27861
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py
@@ -0,0 +1,68 @@
+# 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
+
+
+class Infinity(object):
+
+    def __repr__(self):
+        return "Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return False
+
+    def __le__(self, other):
+        return False
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return True
+
+    def __ge__(self, other):
+        return True
+
+    def __neg__(self):
+        return NegativeInfinity
+
+Infinity = Infinity()
+
+
+class NegativeInfinity(object):
+
+    def __repr__(self):
+        return "-Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return True
+
+    def __le__(self, other):
+        return True
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return False
+
+    def __ge__(self, other):
+        return False
+
+    def __neg__(self):
+        return Infinity
+
+NegativeInfinity = NegativeInfinity()
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7d91aa14ef72b36716cf2afcb247e6c2aa0f7ee5
GIT binary patch
literal 5370
zcmZSn%*&NH<x)&C0~9bbFfceIFftU!F)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpXEFr+auq%bqIFfcSTFhoYNGNiJCSW&DDDJ(E)R=6}9Ln<3snvEfajUiZr
zoq>TN6J)Oj$kq~m1_p-2q~iRX(vsBp%-n+fqLLC0kSj9FGK(|w^Gf&_7#IqQGV@B}
z(@OJ_OF%*(dC$DG%)HE!O1K{w85kIxKz@j1U|>jP069H{0pyA(CXjzx7(gCKVFHV=
zK-~{<GDwPzAqDK@D0Yx5K_VOsDePdyoD3-(U<MaMP_PCk0|P@c$SxRm2HD91axo)A
zum%$Y1A|`>$Y&a0KY~=1fMknPbJ8F}Ao1c>1_lQGf}+f_#FA9~vcw|&wEUcu)S_bj
z>_YwQVk2{N!@?{h^D;vV^WvP!^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6@<hwh
zzzqH3)RNMIlKlLfV*P^b^!TFG;{4L0<kVvQ__EZzl>8$7g2d$P#PrO(bp80^lA_Y&
zlG38oV!eV&aA3#B7o`>y#m9p@R}At310&pzAise9D8RtLP{P1a!pKm=z|hPHLctm!
z|M`J^4fbV5VsQqT0WuFP83gkDAoe)O#qsex3=9k~kAwUV!XU4KJr43g2?GPnvmo&j
zRt5$Jx5S*{RIuN{o&<~Kmt>?C4NC8_F)%R1$LEy9$AhvQDV`1DWME)G_%nzL#08~d
zus;V;QigglH9lSlOMIdy<Qhg$Le64jXl8=PEhyegK>o`t24}Fm<kS*QaKI(!Bo-IP
z#}A!gNG*(y7sVG0f{^@-91J|LG!6=fAYKLrh9FS!J9Ipqml_{0fyL9HJc~0ggYtJs
zQ7KYZ9_&dxy(B(fnnZ5~f#Q4U#AJGEe7qcz7eO%y!#HCSR7LrvrYDwUmZicP2!p&9
z0yT%?<MUF}<Kq<(-qqj+Wlm5#Cq6zeF*h|n9$YHL$LHp!l;)(y#|MEbpdgTfAdu1^
zPz4qQD%gWSVGsl=|AK@;`4?0KfXitFF?dRBa6<_c0>vN)voUcpqrxB&P-_cR)qpT4
z`Ugo1uNYJ*=)#j2$aRA|oq^MfCL)26+`J0{RjxsxxEkah1?34HB#(lsG7tu(9$W>-
zP$?V1d0l_FdJa^E8Da4pu?@E&)nEY^)~5J;3#zY67#M~}`wUzySzz%l-fRgfWrskM
z1zg=)4_D8Dnh|zLo&&`g4C5?NL3wtNR}`R@kt4!i;3ij)7^ux84kCs}0}IrEQU`ew
zdjrc4JRApYTc(wQ28H6|gFwxhAW#$sfhx`tP|cs8l$DxX0&cH?8)b;rB$zdLnv~%2
YEE`BO*$&jRD+V<PWSGTdIhn;|0UH}6tN;K2

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py
new file mode 100644
index 00000000..892e578e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py
@@ -0,0 +1,301 @@
+# 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 operator
+import os
+import platform
+import sys
+
+from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd
+from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString
+from pkg_resources.extern.pyparsing import Literal as L  # noqa
+
+from ._compat import string_types
+from .specifiers import Specifier, InvalidSpecifier
+
+
+__all__ = [
+    "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName",
+    "Marker", "default_environment",
+]
+
+
+class InvalidMarker(ValueError):
+    """
+    An invalid marker was found, users should refer to PEP 508.
+    """
+
+
+class UndefinedComparison(ValueError):
+    """
+    An invalid operation was attempted on a value that doesn't support it.
+    """
+
+
+class UndefinedEnvironmentName(ValueError):
+    """
+    A name was attempted to be used that does not exist inside of the
+    environment.
+    """
+
+
+class Node(object):
+
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return str(self.value)
+
+    def __repr__(self):
+        return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
+
+    def serialize(self):
+        raise NotImplementedError
+
+
+class Variable(Node):
+
+    def serialize(self):
+        return str(self)
+
+
+class Value(Node):
+
+    def serialize(self):
+        return '"{0}"'.format(self)
+
+
+class Op(Node):
+
+    def serialize(self):
+        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")
+)
+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'
+}
+VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
+
+VERSION_CMP = (
+    L("===") |
+    L("==") |
+    L(">=") |
+    L("<=") |
+    L("!=") |
+    L("~=") |
+    L(">") |
+    L("<")
+)
+
+MARKER_OP = VERSION_CMP | L("not in") | L("in")
+MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
+
+MARKER_VALUE = QuotedString("'") | QuotedString('"')
+MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
+
+BOOLOP = L("and") | L("or")
+
+MARKER_VAR = VARIABLE | MARKER_VALUE
+
+MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
+MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))
+
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+
+MARKER_EXPR = Forward()
+MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
+MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)
+
+MARKER = stringStart + MARKER_EXPR + stringEnd
+
+
+def _coerce_parse_result(results):
+    if isinstance(results, ParseResults):
+        return [_coerce_parse_result(i) for i in results]
+    else:
+        return results
+
+
+def _format_marker(marker, first=True):
+    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))):
+        return _format_marker(marker[0])
+
+    if isinstance(marker, list):
+        inner = (_format_marker(m, first=False) for m in marker)
+        if first:
+            return " ".join(inner)
+        else:
+            return "(" + " ".join(inner) + ")"
+    elif isinstance(marker, tuple):
+        return " ".join([m.serialize() for m in marker])
+    else:
+        return marker
+
+
+_operators = {
+    "in": lambda lhs, rhs: lhs in rhs,
+    "not in": lambda lhs, rhs: lhs not in rhs,
+    "<": operator.lt,
+    "<=": operator.le,
+    "==": operator.eq,
+    "!=": operator.ne,
+    ">=": operator.ge,
+    ">": operator.gt,
+}
+
+
+def _eval_op(lhs, op, rhs):
+    try:
+        spec = Specifier("".join([op.serialize(), rhs]))
+    except InvalidSpecifier:
+        pass
+    else:
+        return spec.contains(lhs)
+
+    oper = _operators.get(op.serialize())
+    if oper is None:
+        raise UndefinedComparison(
+            "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
+        )
+
+    return oper(lhs, rhs)
+
+
+_undefined = object()
+
+
+def _get_env(environment, name):
+    value = environment.get(name, _undefined)
+
+    if value is _undefined:
+        raise UndefinedEnvironmentName(
+            "{0!r} does not exist in evaluation environment.".format(name)
+        )
+
+    return value
+
+
+def _evaluate_markers(markers, environment):
+    groups = [[]]
+
+    for marker in markers:
+        assert isinstance(marker, (list, tuple, string_types))
+
+        if isinstance(marker, list):
+            groups[-1].append(_evaluate_markers(marker, environment))
+        elif isinstance(marker, tuple):
+            lhs, op, rhs = marker
+
+            if isinstance(lhs, Variable):
+                lhs_value = _get_env(environment, lhs.value)
+                rhs_value = rhs.value
+            else:
+                lhs_value = lhs.value
+                rhs_value = _get_env(environment, rhs.value)
+
+            groups[-1].append(_eval_op(lhs_value, op, rhs_value))
+        else:
+            assert marker in ["and", "or"]
+            if marker == "or":
+                groups.append([])
+
+    return any(all(item) for item in groups)
+
+
+def format_full_version(info):
+    version = '{0.major}.{0.minor}.{0.micro}'.format(info)
+    kind = info.releaselevel
+    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
+    else:
+        iver = '0'
+        implementation_name = ''
+
+    return {
+        "implementation_name": implementation_name,
+        "implementation_version": iver,
+        "os_name": os.name,
+        "platform_machine": platform.machine(),
+        "platform_release": platform.release(),
+        "platform_system": platform.system(),
+        "platform_version": platform.version(),
+        "python_full_version": platform.python_version(),
+        "platform_python_implementation": platform.python_implementation(),
+        "python_version": platform.python_version()[:3],
+        "sys_platform": sys.platform,
+    }
+
+
+class Marker(object):
+
+    def __init__(self, marker):
+        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])
+            raise InvalidMarker(err_str)
+
+    def __str__(self):
+        return _format_marker(self._markers)
+
+    def __repr__(self):
+        return "<Marker({0!r})>".format(str(self))
+
+    def evaluate(self, environment=None):
+        """Evaluate a marker.
+
+        Return the boolean from evaluating the given marker against the
+        environment. environment is an optional argument to override all or
+        part of the determined environment.
+
+        The environment is determined from the current Python process.
+        """
+        current_environment = default_environment()
+        if environment is not None:
+            current_environment.update(environment)
+
+        return _evaluate_markers(self._markers, current_environment)
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a7809d54de6d46a2b3cfb791c4a1e7b4dadc6404
GIT binary patch
literal 13957
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py
new file mode 100644
index 00000000..0c8c4a38
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py
@@ -0,0 +1,127 @@
+# 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 string
+import re
+
+from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException
+from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine
+from pkg_resources.extern.pyparsing import Literal as L  # noqa
+from pkg_resources.extern.six.moves.urllib import parse as urlparse
+
+from .markers import MARKER_EXPR, Marker
+from .specifiers import LegacySpecifier, Specifier, SpecifierSet
+
+
+class InvalidRequirement(ValueError):
+    """
+    An invalid requirement was found, users should refer to PEP 508.
+    """
+
+
+ALPHANUM = Word(string.ascii_letters + string.digits)
+
+LBRACKET = L("[").suppress()
+RBRACKET = L("]").suppress()
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+COMMA = L(",").suppress()
+SEMICOLON = L(";").suppress()
+AT = L("@").suppress()
+
+PUNCTUATION = Word("-_.")
+IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
+IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
+
+NAME = IDENTIFIER("name")
+EXTRA = IDENTIFIER
+
+URI = Regex(r'[^ ]+')("url")
+URL = (AT + URI)
+
+EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
+EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
+
+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_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
+_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])
+)
+MARKER_SEPERATOR = SEMICOLON
+MARKER = MARKER_SEPERATOR + 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)
+
+REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
+
+
+class Requirement(object):
+    """Parse a requirement.
+
+    Parse a given requirement string into its parts, such as name, specifier,
+    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
+    string.
+    """
+
+    # TODO: Can we test whether something is contained within a requirement?
+    #       If so how do we do that? Do we need to test against the _name_ of
+    #       the thing as well as the version? What about the markers?
+    # TODO: Can we normalize the name and extra name?
+
+    def __init__(self, requirement_string):
+        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]))
+
+        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")
+            self.url = req.url
+        else:
+            self.url = None
+        self.extras = set(req.extras.asList() if req.extras else [])
+        self.specifier = SpecifierSet(req.specifier)
+        self.marker = req.marker if req.marker else None
+
+    def __str__(self):
+        parts = [self.name]
+
+        if self.extras:
+            parts.append("[{0}]".format(",".join(sorted(self.extras))))
+
+        if self.specifier:
+            parts.append(str(self.specifier))
+
+        if self.url:
+            parts.append("@ {0}".format(self.url))
+
+        if self.marker:
+            parts.append("; {0}".format(self.marker))
+
+        return "".join(parts)
+
+    def __repr__(self):
+        return "<Requirement({0!r})>".format(str(self))
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e27de1b0553229f75cb5f8b32f986a5fcab77904
GIT binary patch
literal 5683
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py
new file mode 100644
index 00000000..7f5a76cf
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py
@@ -0,0 +1,774 @@
+# 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 abc
+import functools
+import itertools
+import re
+
+from ._compat import string_types, with_metaclass
+from .version import Version, LegacyVersion, parse
+
+
+class InvalidSpecifier(ValueError):
+    """
+    An invalid specifier was found, users should refer to PEP 440.
+    """
+
+
+class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
+
+    @abc.abstractmethod
+    def __str__(self):
+        """
+        Returns the str representation of this Specifier like object. This
+        should be representative of the Specifier itself.
+        """
+
+    @abc.abstractmethod
+    def __hash__(self):
+        """
+        Returns a hash value for this Specifier like object.
+        """
+
+    @abc.abstractmethod
+    def __eq__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are equal.
+        """
+
+    @abc.abstractmethod
+    def __ne__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are not equal.
+        """
+
+    @abc.abstractproperty
+    def prereleases(self):
+        """
+        Returns whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @prereleases.setter
+    def prereleases(self, value):
+        """
+        Sets whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @abc.abstractmethod
+    def contains(self, item, prereleases=None):
+        """
+        Determines if the given item is contained within this specifier.
+        """
+
+    @abc.abstractmethod
+    def filter(self, iterable, prereleases=None):
+        """
+        Takes an iterable of items and filters them so that only items which
+        are contained within this specifier are allowed in it.
+        """
+
+
+class _IndividualSpecifier(BaseSpecifier):
+
+    _operators = {}
+
+    def __init__(self, spec="", prereleases=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(),
+        )
+
+        # Store whether or not this Specifier should accept prereleases
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        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,
+        )
+
+    def __str__(self):
+        return "{0}{1}".format(*self._spec)
+
+    def __hash__(self):
+        return hash(self._spec)
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec == other._spec
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec != other._spec
+
+    def _get_operator(self, op):
+        return getattr(self, "_compare_{0}".format(self._operators[op]))
+
+    def _coerce_version(self, version):
+        if not isinstance(version, (LegacyVersion, Version)):
+            version = parse(version)
+        return version
+
+    @property
+    def operator(self):
+        return self._spec[0]
+
+    @property
+    def version(self):
+        return self._spec[1]
+
+    @property
+    def prereleases(self):
+        return self._prereleases
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # 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)
+
+        # 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:
+            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)
+
+    def filter(self, iterable, prereleases=None):
+        yielded = False
+        found_prereleases = []
+
+        kw = {"prereleases": prereleases if prereleases is not None else True}
+
+        # Attempt to iterate over all the values in the iterable and if any of
+        # them match, yield them.
+        for version in iterable:
+            parsed_version = self._coerce_version(version)
+
+            if self.contains(parsed_version, **kw):
+                # 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)):
+                    found_prereleases.append(version)
+                # Either this is not a prerelease, or we should have been
+                # accepting prereleases from the begining.
+                else:
+                    yielded = True
+                    yield version
+
+        # Now that we've iterated over everything, determine if we've yielded
+        # any values, and if we have not and we have any prereleases stored up
+        # then we will go ahead and yield the prereleases.
+        if not yielded and found_prereleases:
+            for version in found_prereleases:
+                yield version
+
+
+class LegacySpecifier(_IndividualSpecifier):
+
+    _regex_str = (
+        r"""
+        (?P<operator>(==|!=|<=|>=|<|>))
+        \s*
+        (?P<version>
+            [^,;\s)]* # Since this is a "legacy" specifier, and the version
+                      # string can be just about anything, we match everything
+                      # except for whitespace, a semi-colon for marker support,
+                      # a closing paren since versions can be enclosed in
+                      # them, and a comma since it's a version separator.
+        )
+        """
+    )
+
+    _regex = re.compile(
+        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+    }
+
+    def _coerce_version(self, version):
+        if not isinstance(version, LegacyVersion):
+            version = LegacyVersion(str(version))
+        return version
+
+    def _compare_equal(self, prospective, spec):
+        return prospective == self._coerce_version(spec)
+
+    def _compare_not_equal(self, prospective, spec):
+        return prospective != self._coerce_version(spec)
+
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= self._coerce_version(spec)
+
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= self._coerce_version(spec)
+
+    def _compare_less_than(self, prospective, spec):
+        return prospective < self._coerce_version(spec)
+
+    def _compare_greater_than(self, prospective, spec):
+        return prospective > self._coerce_version(spec)
+
+
+def _require_version_compare(fn):
+    @functools.wraps(fn)
+    def wrapped(self, prospective, spec):
+        if not isinstance(prospective, Version):
+            return False
+        return fn(self, prospective, spec)
+    return wrapped
+
+
+class Specifier(_IndividualSpecifier):
+
+    _regex_str = (
+        r"""
+        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
+        (?P<version>
+            (?:
+                # The identity operators allow for an escape hatch that will
+                # do an exact string match of the version you wish to install.
+                # This will not be parsed by PEP 440 and we cannot determine
+                # any semantic meaning from it. This operator is discouraged
+                # but included entirely as an escape hatch.
+                (?<====)  # Only match for the identity operator
+                \s*
+                [^\s]*    # We just match everything, except for whitespace
+                          # since we are only testing for strict identity.
+            )
+            |
+            (?:
+                # The (non)equality operators allow for wild card and local
+                # versions to be specified so we have to define these two
+                # operators separately to enable that.
+                (?<===|!=)            # Only match for equals and not equals
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+
+                # You cannot use a wild card and a dev or local version
+                # together so group them with a | and make them optional.
+                (?:
+                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
+                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
+                    |
+                    \.\*  # Wild card syntax of .*
+                )?
+            )
+            |
+            (?:
+                # The compatible operator requires at least two digits in the
+                # release segment.
+                (?<=~=)               # Only match for the compatible operator
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+            |
+            (?:
+                # All other operators only allow a sub set of what the
+                # (non)equality operators do. Specifically they do not allow
+                # local versions to be specified nor do they allow the prefix
+                # matching wild cards.
+                (?<!==|!=|~=)         # We have special cases for these
+                                      # operators so we want to make sure they
+                                      # don't match here.
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+        )
+        """
+    )
+
+    _regex = re.compile(
+        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "~=": "compatible",
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+        "===": "arbitrary",
+    }
+
+    @_require_version_compare
+    def _compare_compatible(self, prospective, spec):
+        # 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
+        # implementing it ourselves. The only thing we need to do is construct
+        # the other specifiers.
+
+        # We want everything but the last item in the version, but we want to
+        # ignore post and dev releases and we want to treat the pre-release as
+        # it's own separate segment.
+        prefix = ".".join(
+            list(
+                itertools.takewhile(
+                    lambda x: (not x.startswith("post") and not
+                               x.startswith("dev")),
+                    _version_split(spec),
+                )
+            )[:-1]
+        )
+
+        # Add the prefix notation to the end of our string
+        prefix += ".*"
+
+        return (self._get_operator(">=")(prospective, spec) and
+                self._get_operator("==")(prospective, prefix))
+
+    @_require_version_compare
+    def _compare_equal(self, prospective, spec):
+        # 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 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))
+
+            # 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)]
+
+            # Pad out our two sides with zeros so that they both equal the same
+            # length.
+            spec, prospective = _pad_version(spec, prospective)
+        else:
+            # Convert our spec string into a Version
+            spec = 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:
+                prospective = Version(prospective.public)
+
+        return prospective == spec
+
+    @_require_version_compare
+    def _compare_not_equal(self, prospective, spec):
+        return not self._compare_equal(prospective, spec)
+
+    @_require_version_compare
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= Version(spec)
+
+    @_require_version_compare
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= Version(spec)
+
+    @_require_version_compare
+    def _compare_less_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # 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
+        # instead of doing extra unneeded work.
+        if not prospective < spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a pre-release version, that we do not accept pre-release
+        # versions for the version mentioned in the specifier (e.g. <3.1 should
+        # not match 3.1.dev0, but should match 3.0.dev0).
+        if not spec.is_prerelease and prospective.is_prerelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # less than the spec version *and* it's not a pre-release of the same
+        # version in the spec.
+        return True
+
+    @_require_version_compare
+    def _compare_greater_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # 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
+        # instead of doing extra unneeded work.
+        if not prospective > spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a post-release version, that we do not accept
+        # post-release versions for the version mentioned in the specifier
+        # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0).
+        if not spec.is_postrelease and prospective.is_postrelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                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.
+        if prospective.local is not None:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # greater than the spec version *and* it's not a pre-release of the
+        # same version in the spec.
+        return True
+
+    def _compare_arbitrary(self, prospective, spec):
+        return str(prospective).lower() == str(spec).lower()
+
+    @property
+    def prereleases(self):
+        # If there is an explicit prereleases set for this, then we'll just
+        # blindly use that.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # Look at all of our specifiers and determine if they are inclusive
+        # operators, and if they are if they are including an explicit
+        # prerelease.
+        operator, version = self._spec
+        if operator in ["==", ">=", "<=", "~=", "==="]:
+            # The == specifier can include a trailing .*, if it does we
+            # want to remove before parsing.
+            if operator == "==" and version.endswith(".*"):
+                version = version[:-2]
+
+            # Parse the version, and if it is a pre-release than this
+            # specifier allows pre-releases.
+            if parse(version).is_prerelease:
+                return True
+
+        return False
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+
+_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
+
+
+def _version_split(version):
+    result = []
+    for item in version.split("."):
+        match = _prefix_regex.search(item)
+        if match:
+            result.extend(match.groups())
+        else:
+            result.append(item)
+    return result
+
+
+def _pad_version(left, right):
+    left_split, right_split = [], []
+
+    # Get the release segment of our versions
+    left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left)))
+    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]):])
+
+    # 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])),
+    )
+
+    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
+        # strip each item to remove leading/trailing whitespace.
+        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:
+            try:
+                parsed.add(Specifier(specifier))
+            except InvalidSpecifier:
+                parsed.add(LegacySpecifier(specifier))
+
+        # Turn our parsed specifiers into a frozen set and save them for later.
+        self._specs = frozenset(parsed)
+
+        # Store our prereleases value so we can use it later to determine if
+        # we accept prereleases or not.
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        pre = (
+            ", prereleases={0!r}".format(self.prereleases)
+            if self._prereleases is not None
+            else ""
+        )
+
+        return "<SpecifierSet({0!r}{1})>".format(str(self), pre)
+
+    def __str__(self):
+        return ",".join(sorted(str(s) for s in self._specs))
+
+    def __hash__(self):
+        return hash(self._specs)
+
+    def __and__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        specifier = SpecifierSet()
+        specifier._specs = frozenset(self._specs | other._specs)
+
+        if self._prereleases is None and other._prereleases is not None:
+            specifier._prereleases = other._prereleases
+        elif self._prereleases is not None and other._prereleases is None:
+            specifier._prereleases = self._prereleases
+        elif self._prereleases == other._prereleases:
+            specifier._prereleases = self._prereleases
+        else:
+            raise ValueError(
+                "Cannot combine SpecifierSets with True and False prerelease "
+                "overrides."
+            )
+
+        return specifier
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs == other._specs
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs != other._specs
+
+    def __len__(self):
+        return len(self._specs)
+
+    def __iter__(self):
+        return iter(self._specs)
+
+    @property
+    def prereleases(self):
+        # If we have been given an explicit prerelease modifier, then we'll
+        # pass that through here.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # If we don't have any specifiers, and we don't have a forced value,
+        # then we'll just return None since we don't know if this should have
+        # pre-releases or not.
+        if not self._specs:
+            return None
+
+        # Otherwise we'll see if any of the given specifiers accept
+        # prereleases, if any of them do we'll return True, otherwise False.
+        return any(s.prereleases for s in self._specs)
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # Ensure that our item is a Version or LegacyVersion instance.
+        if not isinstance(item, (LegacyVersion, Version)):
+            item = parse(item)
+
+        # 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.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # We can determine if we're going to allow pre-releases by looking to
+        # see if any of the underlying items supports them. If none of them do
+        # and this item is a pre-release then we do not allow it and we can
+        # short circuit that here.
+        # Note: This means that 1.0.dev1 would not be contained in something
+        #       like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0
+        if not prereleases and item.is_prerelease:
+            return False
+
+        # We simply dispatch to the underlying specs here to make sure that the
+        # 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
+        )
+
+    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.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # If we have any specifiers, then we want to wrap our iterable in the
+        # filter method for each one, this will act as a logical AND amongst
+        # each specifier.
+        if self._specs:
+            for spec in self._specs:
+                iterable = spec.filter(iterable, prereleases=bool(prereleases))
+            return iterable
+        # If we do not have any specifiers, then we need to have a rough filter
+        # 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 = []
+
+            for item in iterable:
+                # Ensure that we some kind of Version class for this item.
+                if not isinstance(item, (LegacyVersion, Version)):
+                    parsed_version = parse(item)
+                else:
+                    parsed_version = item
+
+                # Filter out any item which is parsed as a LegacyVersion
+                if isinstance(parsed_version, LegacyVersion):
+                    continue
+
+                # Store any item which is a pre-release for later unless we've
+                # already found a final version or we are accepting prereleases
+                if parsed_version.is_prerelease and not prereleases:
+                    if not filtered:
+                        found_prereleases.append(item)
+                else:
+                    filtered.append(item)
+
+            # If we've found no items except for pre-releases, then we'll go
+            # ahead and use the pre-releases
+            if not filtered and found_prereleases and prereleases is None:
+                return found_prereleases
+
+            return filtered
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f65e251d2534315782138465a936d0cdb1335645
GIT binary patch
literal 29374
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
Uigk#YaB_<MXAt5C9UCVN04Pe_00000

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py
new file mode 100644
index 00000000..942387ce
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py
@@ -0,0 +1,14 @@
+# 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/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5de25ef65b2b6c452842a4a71bf045ddf2a4da62
GIT binary patch
literal 708
zcmZSn%*&NH<x)&C0~9bZFfceIFftUoFfcHrFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQw&M7*bgnvRD~Xm>HTG8KT%2Qdk&T7#O118B&-Sf;Ctf7#K1^rfV=W
zFff$xGcYhDCKc!Bl$NB%XXX~<7nPK7fb7aF%Ph{!&nw|$U|=XH%FHW?Pb<w!F3HT#
z^DAa!U|@*Wjn|9SPG)3aU;tr|Va_0jih)dJV8~(wxwVFYp_z#xi;1C`fgxA}<Qcyb
zkZN6s<-!aM4Drc{dHH#n$%#3cRjKhssp+W|B_P9!OOr}KZq3OrPc6~_X)0l1U|`5g
z%uUq*J0C<8*E29M=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-
zRHm25o1~bS7#J8Br03~}=oe%b=w{{>mn7!o=$0p1mIh|%7pIn#7L?@Y=M?J~WT(d$
zr55Lx7A2<^>&KU+=B4Bp=@%p>XD6m-=B4YGmSpA>>lIX%2r@7*pm+l0Mji$RhGLM1
z8JILc;aS23@@srrX-R2OYJ7YU$n`-WUj=~_m4Jw%)Dm`(QTe$AnK`LJAm0Xov?9C<
eW(^8IgWP44o1apelWGTYC^$*TF!3<+GXnsIHm;)p

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py
new file mode 100644
index 00000000..83b5ee8c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py
@@ -0,0 +1,393 @@
+# 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 collections
+import itertools
+import re
+
+from ._structures import Infinity
+
+
+__all__ = [
+    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"
+]
+
+
+_Version = collections.namedtuple(
+    "_Version",
+    ["epoch", "release", "dev", "pre", "post", "local"],
+)
+
+
+def parse(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
+    a valid PEP 440 version or a legacy version.
+    """
+    try:
+        return Version(version)
+    except InvalidVersion:
+        return LegacyVersion(version)
+
+
+class InvalidVersion(ValueError):
+    """
+    An invalid version was found, users should refer to PEP 440.
+    """
+
+
+class _BaseVersion(object):
+
+    def __hash__(self):
+        return hash(self._key)
+
+    def __lt__(self, other):
+        return self._compare(other, lambda s, o: s < o)
+
+    def __le__(self, other):
+        return self._compare(other, lambda s, o: s <= o)
+
+    def __eq__(self, other):
+        return self._compare(other, lambda s, o: s == o)
+
+    def __ge__(self, other):
+        return self._compare(other, lambda s, o: s >= o)
+
+    def __gt__(self, other):
+        return self._compare(other, lambda s, o: s > o)
+
+    def __ne__(self, other):
+        return self._compare(other, lambda s, o: s != o)
+
+    def _compare(self, other, method):
+        if not isinstance(other, _BaseVersion):
+            return NotImplemented
+
+        return method(self._key, other._key)
+
+
+class LegacyVersion(_BaseVersion):
+
+    def __init__(self, version):
+        self._version = str(version)
+        self._key = _legacy_cmpkey(self._version)
+
+    def __str__(self):
+        return self._version
+
+    def __repr__(self):
+        return "<LegacyVersion({0})>".format(repr(str(self)))
+
+    @property
+    def public(self):
+        return self._version
+
+    @property
+    def base_version(self):
+        return self._version
+
+    @property
+    def local(self):
+        return None
+
+    @property
+    def is_prerelease(self):
+        return False
+
+    @property
+    def is_postrelease(self):
+        return False
+
+
+_legacy_version_component_re = re.compile(
+    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
+)
+
+_legacy_version_replacement_map = {
+    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
+}
+
+
+def _parse_version_parts(s):
+    for part in _legacy_version_component_re.split(s):
+        part = _legacy_version_replacement_map.get(part, part)
+
+        if not part or part == ".":
+            continue
+
+        if part[:1] in "0123456789":
+            # pad for numeric comparison
+            yield part.zfill(8)
+        else:
+            yield "*" + part
+
+    # ensure that alpha/beta/candidate are before final
+    yield "*final"
+
+
+def _legacy_cmpkey(version):
+    # 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,
+    # as before all PEP 440 versions.
+    epoch = -1
+
+    # This scheme is taken from pkg_resources.parse_version setuptools prior to
+    # it's adoption of the packaging library.
+    parts = []
+    for part in _parse_version_parts(version.lower()):
+        if part.startswith("*"):
+            # remove "-" before a prerelease tag
+            if part < "*final":
+                while parts and parts[-1] == "*final-":
+                    parts.pop()
+
+            # remove trailing zeros from each series of numeric parts
+            while parts and parts[-1] == "00000000":
+                parts.pop()
+
+        parts.append(part)
+    parts = tuple(parts)
+
+    return epoch, parts
+
+# Deliberately not anchored to the start and end of the string, to make it
+# easier for 3rd party code to reuse
+VERSION_PATTERN = r"""
+    v?
+    (?:
+        (?:(?P<epoch>[0-9]+)!)?                           # epoch
+        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
+        (?P<pre>                                          # pre-release
+            [-_\.]?
+            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
+            [-_\.]?
+            (?P<pre_n>[0-9]+)?
+        )?
+        (?P<post>                                         # post release
+            (?:-(?P<post_n1>[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?P<post_l>post|rev|r)
+                [-_\.]?
+                (?P<post_n2>[0-9]+)?
+            )
+        )?
+        (?P<dev>                                          # dev release
+            [-_\.]?
+            (?P<dev_l>dev)
+            [-_\.]?
+            (?P<dev_n>[0-9]+)?
+        )?
+    )
+    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
+"""
+
+
+class Version(_BaseVersion):
+
+    _regex = re.compile(
+        r"^\s*" + VERSION_PATTERN + r"\s*$",
+        re.VERBOSE | re.IGNORECASE,
+    )
+
+    def __init__(self, version):
+        # Validate the version and parse it into pieces
+        match = self._regex.search(version)
+        if not match:
+            raise InvalidVersion("Invalid version: '{0}'".format(version))
+
+        # Store the parsed out pieces of the version
+        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"),
+            ),
+            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"),
+            ),
+            local=_parse_local_version(match.group("local")),
+        )
+
+        # Generate a key which will be used for sorting
+        self._key = _cmpkey(
+            self._version.epoch,
+            self._version.release,
+            self._version.pre,
+            self._version.post,
+            self._version.dev,
+            self._version.local,
+        )
+
+    def __repr__(self):
+        return "<Version({0})>".format(repr(str(self)))
+
+    def __str__(self):
+        parts = []
+
+        # Epoch
+        if self._version.epoch != 0:
+            parts.append("{0}!".format(self._version.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self._version.release))
+
+        # Pre-release
+        if self._version.pre is not None:
+            parts.append("".join(str(x) for x in self._version.pre))
+
+        # Post-release
+        if self._version.post is not None:
+            parts.append(".post{0}".format(self._version.post[1]))
+
+        # Development release
+        if self._version.dev is not None:
+            parts.append(".dev{0}".format(self._version.dev[1]))
+
+        # Local version segment
+        if self._version.local is not None:
+            parts.append(
+                "+{0}".format(".".join(str(x) for x in self._version.local))
+            )
+
+        return "".join(parts)
+
+    @property
+    def public(self):
+        return str(self).split("+", 1)[0]
+
+    @property
+    def base_version(self):
+        parts = []
+
+        # Epoch
+        if self._version.epoch != 0:
+            parts.append("{0}!".format(self._version.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self._version.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)
+
+    @property
+    def is_postrelease(self):
+        return bool(self._version.post)
+
+
+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.
+        if number is None:
+            number = 0
+
+        # We normalize any letters to their lower case form
+        letter = letter.lower()
+
+        # We consider some words to be alternate spellings of other words and
+        # in those cases we want to normalize the spellings to our preferred
+        # spelling.
+        if letter == "alpha":
+            letter = "a"
+        elif letter == "beta":
+            letter = "b"
+        elif letter in ["c", "pre", "preview"]:
+            letter = "rc"
+        elif letter in ["rev", "r"]:
+            letter = "post"
+
+        return letter, int(number)
+    if not letter and number:
+        # We assume if we are given a number, but we are not given a letter
+        # then this is using the implicit post release syntax (e.g. 1.0-1)
+        letter = "post"
+
+        return letter, int(number)
+
+
+_local_version_seperators = re.compile(r"[\._-]")
+
+
+def _parse_local_version(local):
+    """
+    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)
+        )
+
+
+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(
+        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.
+    # We'll do this by abusing the pre segment, but we _only_ want to do this
+    # 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
+    # Versions without a pre-release (except as noted above) should sort after
+    # those with one.
+    elif pre is None:
+        pre = Infinity
+
+    # Versions without a post segment should sort before those with one.
+    if post is None:
+        post = -Infinity
+
+    # Versions without a development segment should sort after those with one.
+    if dev is None:
+        dev = Infinity
+
+    if local is None:
+        # Versions without a local segment should sort before those with one.
+        local = -Infinity
+    else:
+        # Versions with a local segment need that segment parsed to implement
+        # the sorting rules in PEP440.
+        # - Alpha numeric segments sort before numeric segments
+        # - Alpha numeric segments sort lexicographically
+        # - 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
+        )
+
+    return epoch, release, pre, post, dev, local
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d5de2569e0f5f2f989bffaa61995f300e527e5da
GIT binary patch
literal 17235
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
HnUfm;V6l-C

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py
new file mode 100644
index 00000000..cf75e1e5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py
@@ -0,0 +1,5742 @@
+# module pyparsing.py
+#
+# Copyright (c) 2003-2018  Paul T. McGuire
+#
+# 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.
+#
+
+__doc__ = \
+"""
+pyparsing module - Classes and methods to define and execute parsing grammars
+=============================================================================
+
+The pyparsing module is an alternative approach to creating and executing simple grammars,
+vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
+don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
+provides a library of classes that you use to construct the grammar directly in Python.
+
+Here is a program to parse "Hello, World!" (or any greeting of the form 
+C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements 
+(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to
+L{Literal} expressions)::
+
+    from pyparsing import Word, alphas
+
+    # define grammar of a greeting
+    greet = Word(alphas) + "," + Word(alphas) + "!"
+
+    hello = "Hello, World!"
+    print (hello, "->", greet.parseString(hello))
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the self-explanatory
+class names, and the use of '+', '|' and '^' operators.
+
+The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an
+object with named attributes.
+
+The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
+ - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
+ - quoted strings
+ - embedded comments
+
+
+Getting Started -
+-----------------
+Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing
+classes inherit from. Use the docstrings for examples of how to:
+ - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes
+ - construct character word-group expressions using the L{Word} class
+ - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes
+ - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones
+ - associate names with your parsed results using L{ParserElement.setResultsName}
+ - find some helpful expression short-cuts like L{delimitedList} and L{oneOf}
+ - find more useful common expressions in the L{pyparsing_common} namespace class
+"""
+
+__version__ = "2.2.1"
+__versionTime__ = "18 Sep 2018 00:49 UTC"
+__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"
+
+import string
+from weakref import ref as wkref
+import copy
+import sys
+import warnings
+import re
+import sre_constants
+import collections
+import pprint
+import traceback
+import types
+from datetime import datetime
+
+try:
+    from _thread import RLock
+except ImportError:
+    from threading import RLock
+
+try:
+    # Python 3
+    from collections.abc import Iterable
+    from collections.abc import MutableMapping
+except ImportError:
+    # Python 2.7
+    from collections import Iterable
+    from collections import MutableMapping
+
+try:
+    from collections import OrderedDict as _OrderedDict
+except ImportError:
+    try:
+        from ordereddict import OrderedDict as _OrderedDict
+    except ImportError:
+        _OrderedDict = None
+
+#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )
+
+__all__ = [
+'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
+'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
+'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
+'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
+'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
+'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 
+'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore',
+'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
+'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
+'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums',
+'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno',
+'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
+'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
+'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 
+'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
+'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
+'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass',
+'CloseMatch', 'tokenMap', 'pyparsing_common',
+]
+
+system_version = tuple(sys.version_info)[:3]
+PY_3 = system_version[0] == 3
+if PY_3:
+    _MAX_INT = sys.maxsize
+    basestring = str
+    unichr = chr
+    _ustr = str
+
+    # build list of single arg builtins, that can be used as parse actions
+    singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max]
+
+else:
+    _MAX_INT = sys.maxint
+    range = xrange
+
+    def _ustr(obj):
+        """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
+           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
+           then < returns the unicode object | encodes it with the default encoding | ... >.
+        """
+        if isinstance(obj,unicode):
+            return obj
+
+        try:
+            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
+            # it won't break any existing code.
+            return str(obj)
+
+        except UnicodeEncodeError:
+            # Else encode it
+            ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace')
+            xmlcharref = Regex(r'&#\d+;')
+            xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:])
+            return xmlcharref.transformString(ret)
+
+    # build list of single arg builtins, tolerant of Python version, that can be used as parse actions
+    singleArgBuiltins = []
+    import __builtin__
+    for fname in "sum len sorted reversed list tuple set any all min max".split():
+        try:
+            singleArgBuiltins.append(getattr(__builtin__,fname))
+        except AttributeError:
+            continue
+            
+_generatorType = type((y for y in range(1)))
+ 
+def _xml_escape(data):
+    """Escape &, <, >, ", ', etc. in a string of data."""
+
+    # ampersand must be replaced first
+    from_symbols = '&><"\''
+    to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split())
+    for from_,to_ in zip(from_symbols, to_symbols):
+        data = data.replace(from_, to_)
+    return data
+
+class _Constants(object):
+    pass
+
+alphas     = string.ascii_uppercase + string.ascii_lowercase
+nums       = "0123456789"
+hexnums    = nums + "ABCDEFabcdef"
+alphanums  = alphas + nums
+_bslash    = chr(92)
+printables = "".join(c for c in string.printable if c not in string.whitespace)
+
+class ParseBaseException(Exception):
+    """base exception class for all parsing runtime exceptions"""
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, pstr, loc=0, msg=None, elem=None ):
+        self.loc = loc
+        if msg is None:
+            self.msg = pstr
+            self.pstr = ""
+        else:
+            self.msg = msg
+            self.pstr = pstr
+        self.parserElement = elem
+        self.args = (pstr, loc, msg)
+
+    @classmethod
+    def _from_exception(cls, pe):
+        """
+        internal factory method to simplify creating one type of ParseException 
+        from another - avoids having __init__ signature conflicts among subclasses
+        """
+        return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement)
+
+    def __getattr__( self, aname ):
+        """supported attributes by name are:
+            - lineno - returns the line number of the exception text
+            - col - returns the column number of the exception text
+            - line - returns the line containing the exception text
+        """
+        if( aname == "lineno" ):
+            return lineno( self.loc, self.pstr )
+        elif( aname in ("col", "column") ):
+            return col( self.loc, self.pstr )
+        elif( aname == "line" ):
+            return line( self.loc, self.pstr )
+        else:
+            raise AttributeError(aname)
+
+    def __str__( self ):
+        return "%s (at char %d), (line:%d, col:%d)" % \
+                ( self.msg, self.loc, self.lineno, self.column )
+    def __repr__( self ):
+        return _ustr(self)
+    def markInputline( self, markerString = ">!<" ):
+        """Extracts the exception line from the input string, and marks
+           the location of the exception with a special symbol.
+        """
+        line_str = self.line
+        line_column = self.column - 1
+        if markerString:
+            line_str = "".join((line_str[:line_column],
+                                markerString, line_str[line_column:]))
+        return line_str.strip()
+    def __dir__(self):
+        return "lineno col line".split() + dir(type(self))
+
+class ParseException(ParseBaseException):
+    """
+    Exception thrown when parse expressions don't match class;
+    supported attributes by name are:
+     - lineno - returns the line number of the exception text
+     - col - returns the column number of the exception text
+     - line - returns the line containing the exception text
+        
+    Example::
+        try:
+            Word(nums).setName("integer").parseString("ABC")
+        except ParseException as pe:
+            print(pe)
+            print("column: {}".format(pe.col))
+            
+    prints::
+       Expected integer (at char 0), (line:1, col:1)
+        column: 1
+    """
+    pass
+
+class ParseFatalException(ParseBaseException):
+    """user-throwable exception thrown when inconsistent parse content
+       is found; stops all parsing immediately"""
+    pass
+
+class ParseSyntaxException(ParseFatalException):
+    """just like L{ParseFatalException}, but thrown internally when an
+       L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop 
+       immediately because an unbacktrackable syntax error has been found"""
+    pass
+
+#~ class ReparseException(ParseBaseException):
+    #~ """Experimental class - parse actions can raise this exception to cause
+       #~ pyparsing to reparse the input string:
+        #~ - with a modified input string, and/or
+        #~ - with a modified start location
+       #~ Set the values of the ReparseException in the constructor, and raise the
+       #~ exception in a parse action to cause pyparsing to use the new string/location.
+       #~ Setting the values as None causes no change to be made.
+       #~ """
+    #~ def __init_( self, newstring, restartLoc ):
+        #~ self.newParseText = newstring
+        #~ self.reparseLoc = restartLoc
+
+class RecursiveGrammarException(Exception):
+    """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive"""
+    def __init__( self, parseElementList ):
+        self.parseElementTrace = parseElementList
+
+    def __str__( self ):
+        return "RecursiveGrammarException: %s" % self.parseElementTrace
+
+class _ParseResultsWithOffset(object):
+    def __init__(self,p1,p2):
+        self.tup = (p1,p2)
+    def __getitem__(self,i):
+        return self.tup[i]
+    def __repr__(self):
+        return repr(self.tup[0])
+    def setOffset(self,i):
+        self.tup = (self.tup[0],i)
+
+class ParseResults(object):
+    """
+    Structured parse results, to provide multiple means of access to the parsed data:
+       - as a list (C{len(results)})
+       - by list index (C{results[0], results[1]}, etc.)
+       - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName})
+
+    Example::
+        integer = Word(nums)
+        date_str = (integer.setResultsName("year") + '/' 
+                        + integer.setResultsName("month") + '/' 
+                        + integer.setResultsName("day"))
+        # equivalent form:
+        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+        # parseString returns a ParseResults object
+        result = date_str.parseString("1999/12/31")
+
+        def test(s, fn=repr):
+            print("%s -> %s" % (s, fn(eval(s))))
+        test("list(result)")
+        test("result[0]")
+        test("result['month']")
+        test("result.day")
+        test("'month' in result")
+        test("'minutes' in result")
+        test("result.dump()", str)
+    prints::
+        list(result) -> ['1999', '/', '12', '/', '31']
+        result[0] -> '1999'
+        result['month'] -> '12'
+        result.day -> '31'
+        'month' in result -> True
+        'minutes' in result -> False
+        result.dump() -> ['1999', '/', '12', '/', '31']
+        - day: 31
+        - month: 12
+        - year: 1999
+    """
+    def __new__(cls, toklist=None, name=None, asList=True, modal=True ):
+        if isinstance(toklist, cls):
+            return toklist
+        retobj = object.__new__(cls)
+        retobj.__doinit = True
+        return retobj
+
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ):
+        if self.__doinit:
+            self.__doinit = False
+            self.__name = None
+            self.__parent = None
+            self.__accumNames = {}
+            self.__asList = asList
+            self.__modal = modal
+            if toklist is None:
+                toklist = []
+            if isinstance(toklist, list):
+                self.__toklist = toklist[:]
+            elif isinstance(toklist, _generatorType):
+                self.__toklist = list(toklist)
+            else:
+                self.__toklist = [toklist]
+            self.__tokdict = dict()
+
+        if name is not None and name:
+            if not modal:
+                self.__accumNames[name] = 0
+            if isinstance(name,int):
+                name = _ustr(name) # will always return a str, but use _ustr for consistency
+            self.__name = name
+            if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])):
+                if isinstance(toklist,basestring):
+                    toklist = [ toklist ]
+                if asList:
+                    if isinstance(toklist,ParseResults):
+                        self[name] = _ParseResultsWithOffset(toklist.copy(),0)
+                    else:
+                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0)
+                    self[name].__name = name
+                else:
+                    try:
+                        self[name] = toklist[0]
+                    except (KeyError,TypeError,IndexError):
+                        self[name] = toklist
+
+    def __getitem__( self, i ):
+        if isinstance( i, (int,slice) ):
+            return self.__toklist[i]
+        else:
+            if i not in self.__accumNames:
+                return self.__tokdict[i][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[i] ])
+
+    def __setitem__( self, k, v, isinstance=isinstance ):
+        if isinstance(v,_ParseResultsWithOffset):
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
+            sub = v[0]
+        elif isinstance(k,(int,slice)):
+            self.__toklist[k] = v
+            sub = v
+        else:
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
+            sub = v
+        if isinstance(sub,ParseResults):
+            sub.__parent = wkref(self)
+
+    def __delitem__( self, i ):
+        if isinstance(i,(int,slice)):
+            mylen = len( self.__toklist )
+            del self.__toklist[i]
+
+            # convert int to slice
+            if isinstance(i, int):
+                if i < 0:
+                    i += mylen
+                i = slice(i, i+1)
+            # get removed indices
+            removed = list(range(*i.indices(mylen)))
+            removed.reverse()
+            # fixup indices in token dictionary
+            for name,occurrences in self.__tokdict.items():
+                for j in removed:
+                    for k, (value, position) in enumerate(occurrences):
+                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
+        else:
+            del self.__tokdict[i]
+
+    def __contains__( self, k ):
+        return k in self.__tokdict
+
+    def __len__( self ): return len( self.__toklist )
+    def __bool__(self): return ( not not self.__toklist )
+    __nonzero__ = __bool__
+    def __iter__( self ): return iter( self.__toklist )
+    def __reversed__( self ): return iter( self.__toklist[::-1] )
+    def _iterkeys( self ):
+        if hasattr(self.__tokdict, "iterkeys"):
+            return self.__tokdict.iterkeys()
+        else:
+            return iter(self.__tokdict)
+
+    def _itervalues( self ):
+        return (self[k] for k in self._iterkeys())
+            
+    def _iteritems( self ):
+        return ((k, self[k]) for k in self._iterkeys())
+
+    if PY_3:
+        keys = _iterkeys       
+        """Returns an iterator of all named result keys (Python 3.x only)."""
+
+        values = _itervalues
+        """Returns an iterator of all named result values (Python 3.x only)."""
+
+        items = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 3.x only)."""
+
+    else:
+        iterkeys = _iterkeys
+        """Returns an iterator of all named result keys (Python 2.x only)."""
+
+        itervalues = _itervalues
+        """Returns an iterator of all named result values (Python 2.x only)."""
+
+        iteritems = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 2.x only)."""
+
+        def keys( self ):
+            """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iterkeys())
+
+        def values( self ):
+            """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.itervalues())
+                
+        def items( self ):
+            """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iteritems())
+
+    def haskeys( self ):
+        """Since keys() returns an iterator, this method is helpful in bypassing
+           code that looks for the existence of any defined results names."""
+        return bool(self.__tokdict)
+        
+    def pop( self, *args, **kwargs):
+        """
+        Removes and returns item at specified index (default=C{last}).
+        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
+        argument or an integer argument, it will use C{list} semantics
+        and pop tokens from the list of parsed tokens. If passed a 
+        non-integer argument (most likely a string), it will use C{dict}
+        semantics and pop the corresponding value from any defined 
+        results names. A second default return value argument is 
+        supported, just as in C{dict.pop()}.
+
+        Example::
+            def remove_first(tokens):
+                tokens.pop(0)
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']
+
+            label = Word(alphas)
+            patt = label("LABEL") + OneOrMore(Word(nums))
+            print(patt.parseString("AAB 123 321").dump())
+
+            # Use pop() in a parse action to remove named result (note that corresponding value is not
+            # removed from list form of results)
+            def remove_LABEL(tokens):
+                tokens.pop("LABEL")
+                return tokens
+            patt.addParseAction(remove_LABEL)
+            print(patt.parseString("AAB 123 321").dump())
+        prints::
+            ['AAB', '123', '321']
+            - LABEL: AAB
+
+            ['AAB', '123', '321']
+        """
+        if not args:
+            args = [-1]
+        for k,v in kwargs.items():
+            if k == 'default':
+                args = (args[0], v)
+            else:
+                raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
+        if (isinstance(args[0], int) or 
+                        len(args) == 1 or 
+                        args[0] in self):
+            index = args[0]
+            ret = self[index]
+            del self[index]
+            return ret
+        else:
+            defaultvalue = args[1]
+            return defaultvalue
+
+    def get(self, key, defaultValue=None):
+        """
+        Returns named result matching the given key, or if there is no
+        such name, then returns the given C{defaultValue} or C{None} if no
+        C{defaultValue} is specified.
+
+        Similar to C{dict.get()}.
+        
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            result = date_str.parseString("1999/12/31")
+            print(result.get("year")) # -> '1999'
+            print(result.get("hour", "not specified")) # -> 'not specified'
+            print(result.get("hour")) # -> None
+        """
+        if key in self:
+            return self[key]
+        else:
+            return defaultValue
+
+    def insert( self, index, insStr ):
+        """
+        Inserts new element at location index in the list of parsed tokens.
+        
+        Similar to C{list.insert()}.
+
+        Example::
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+
+            # use a parse action to insert the parse location in the front of the parsed results
+            def insert_locn(locn, tokens):
+                tokens.insert(0, locn)
+            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
+        """
+        self.__toklist.insert(index, insStr)
+        # fixup indices in token dictionary
+        for name,occurrences in self.__tokdict.items():
+            for k, (value, position) in enumerate(occurrences):
+                occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))
+
+    def append( self, item ):
+        """
+        Add single element to end of ParseResults list of elements.
+
+        Example::
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            
+            # use a parse action to compute the sum of the parsed integers, and add it to the end
+            def append_sum(tokens):
+                tokens.append(sum(map(int, tokens)))
+            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
+        """
+        self.__toklist.append(item)
+
+    def extend( self, itemseq ):
+        """
+        Add sequence of elements to end of ParseResults list of elements.
+
+        Example::
+            patt = OneOrMore(Word(alphas))
+            
+            # use a parse action to append the reverse of the matched strings, to make a palindrome
+            def make_palindrome(tokens):
+                tokens.extend(reversed([t[::-1] for t in tokens]))
+                return ''.join(tokens)
+            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
+        """
+        if isinstance(itemseq, ParseResults):
+            self += itemseq
+        else:
+            self.__toklist.extend(itemseq)
+
+    def clear( self ):
+        """
+        Clear all elements and results names.
+        """
+        del self.__toklist[:]
+        self.__tokdict.clear()
+
+    def __getattr__( self, name ):
+        try:
+            return self[name]
+        except KeyError:
+            return ""
+            
+        if name in self.__tokdict:
+            if name not in self.__accumNames:
+                return self.__tokdict[name][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[name] ])
+        else:
+            return ""
+
+    def __add__( self, other ):
+        ret = self.copy()
+        ret += other
+        return ret
+
+    def __iadd__( self, other ):
+        if other.__tokdict:
+            offset = len(self.__toklist)
+            addoffset = lambda a: offset if a<0 else a+offset
+            otheritems = other.__tokdict.items()
+            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
+                                for (k,vlist) in otheritems for v in vlist]
+            for k,v in otherdictitems:
+                self[k] = v
+                if isinstance(v[0],ParseResults):
+                    v[0].__parent = wkref(self)
+            
+        self.__toklist += other.__toklist
+        self.__accumNames.update( other.__accumNames )
+        return self
+
+    def __radd__(self, other):
+        if isinstance(other,int) and other == 0:
+            # useful for merging many ParseResults using sum() builtin
+            return self.copy()
+        else:
+            # this may raise a TypeError - so be it
+            return other + self
+        
+    def __repr__( self ):
+        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
+
+    def __str__( self ):
+        return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']'
+
+    def _asStringList( self, sep='' ):
+        out = []
+        for item in self.__toklist:
+            if out and sep:
+                out.append(sep)
+            if isinstance( item, ParseResults ):
+                out += item._asStringList()
+            else:
+                out.append( _ustr(item) )
+        return out
+
+    def asList( self ):
+        """
+        Returns the parse results as a nested list of matching tokens, all converted to strings.
+
+        Example::
+            patt = OneOrMore(Word(alphas))
+            result = patt.parseString("sldkj lsdkj sldkj")
+            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
+            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
+            
+            # Use asList() to create an actual list
+            result_list = result.asList()
+            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
+        """
+        return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist]
+
+    def asDict( self ):
+        """
+        Returns the named parse results as a nested dictionary.
+
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+            
+            result = date_str.parseString('12/31/1999')
+            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
+            
+            result_dict = result.asDict()
+            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}
+
+            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
+            import json
+            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
+            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
+        """
+        if PY_3:
+            item_fn = self.items
+        else:
+            item_fn = self.iteritems
+            
+        def toItem(obj):
+            if isinstance(obj, ParseResults):
+                if obj.haskeys():
+                    return obj.asDict()
+                else:
+                    return [toItem(v) for v in obj]
+            else:
+                return obj
+                
+        return dict((k,toItem(v)) for k,v in item_fn())
+
+    def copy( self ):
+        """
+        Returns a new copy of a C{ParseResults} object.
+        """
+        ret = ParseResults( self.__toklist )
+        ret.__tokdict = self.__tokdict.copy()
+        ret.__parent = self.__parent
+        ret.__accumNames.update( self.__accumNames )
+        ret.__name = self.__name
+        return ret
+
+    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
+        """
+        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
+        """
+        nl = "\n"
+        out = []
+        namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items()
+                                                            for v in vlist)
+        nextLevelIndent = indent + "  "
+
+        # collapse out indents if formatting is not desired
+        if not formatted:
+            indent = ""
+            nextLevelIndent = ""
+            nl = ""
+
+        selfTag = None
+        if doctag is not None:
+            selfTag = doctag
+        else:
+            if self.__name:
+                selfTag = self.__name
+
+        if not selfTag:
+            if namedItemsOnly:
+                return ""
+            else:
+                selfTag = "ITEM"
+
+        out += [ nl, indent, "<", selfTag, ">" ]
+
+        for i,res in enumerate(self.__toklist):
+            if isinstance(res,ParseResults):
+                if i in namedItems:
+                    out += [ res.asXML(namedItems[i],
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+                else:
+                    out += [ res.asXML(None,
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+            else:
+                # individual token, see if there is a name for it
+                resTag = None
+                if i in namedItems:
+                    resTag = namedItems[i]
+                if not resTag:
+                    if namedItemsOnly:
+                        continue
+                    else:
+                        resTag = "ITEM"
+                xmlBodyText = _xml_escape(_ustr(res))
+                out += [ nl, nextLevelIndent, "<", resTag, ">",
+                                                xmlBodyText,
+                                                "</", resTag, ">" ]
+
+        out += [ nl, indent, "</", selfTag, ">" ]
+        return "".join(out)
+
+    def __lookup(self,sub):
+        for k,vlist in self.__tokdict.items():
+            for v,loc in vlist:
+                if sub is v:
+                    return k
+        return None
+
+    def getName(self):
+        r"""
+        Returns the results name for this token expression. Useful when several 
+        different expressions might match at a particular location.
+
+        Example::
+            integer = Word(nums)
+            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
+            house_number_expr = Suppress('#') + Word(nums, alphanums)
+            user_data = (Group(house_number_expr)("house_number") 
+                        | Group(ssn_expr)("ssn")
+                        | Group(integer)("age"))
+            user_info = OneOrMore(user_data)
+            
+            result = user_info.parseString("22 111-22-3333 #221B")
+            for item in result:
+                print(item.getName(), ':', item[0])
+        prints::
+            age : 22
+            ssn : 111-22-3333
+            house_number : 221B
+        """
+        if self.__name:
+            return self.__name
+        elif self.__parent:
+            par = self.__parent()
+            if par:
+                return par.__lookup(self)
+            else:
+                return None
+        elif (len(self) == 1 and
+               len(self.__tokdict) == 1 and
+               next(iter(self.__tokdict.values()))[0][1] in (0,-1)):
+            return next(iter(self.__tokdict.keys()))
+        else:
+            return None
+
+    def dump(self, indent='', depth=0, full=True):
+        """
+        Diagnostic method for listing out the contents of a C{ParseResults}.
+        Accepts an optional C{indent} argument so that this string can be embedded
+        in a nested display of other data.
+
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+            
+            result = date_str.parseString('12/31/1999')
+            print(result.dump())
+        prints::
+            ['12', '/', '31', '/', '1999']
+            - day: 1999
+            - month: 31
+            - year: 12
+        """
+        out = []
+        NL = '\n'
+        out.append( indent+_ustr(self.asList()) )
+        if full:
+            if self.haskeys():
+                items = sorted((str(k), v) for k,v in self.items())
+                for k,v in items:
+                    if out:
+                        out.append(NL)
+                    out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
+                    if isinstance(v,ParseResults):
+                        if v:
+                            out.append( v.dump(indent,depth+1) )
+                        else:
+                            out.append(_ustr(v))
+                    else:
+                        out.append(repr(v))
+            elif any(isinstance(vv,ParseResults) for vv in self):
+                v = self
+                for i,vv in enumerate(v):
+                    if isinstance(vv,ParseResults):
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),vv.dump(indent,depth+1) ))
+                    else:
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),_ustr(vv)))
+            
+        return "".join(out)
+
+    def pprint(self, *args, **kwargs):
+        """
+        Pretty-printer for parsed results as a list, using the C{pprint} module.
+        Accepts additional positional or keyword args as defined for the 
+        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})
+
+        Example::
+            ident = Word(alphas, alphanums)
+            num = Word(nums)
+            func = Forward()
+            term = ident | num | Group('(' + func + ')')
+            func <<= ident + Group(Optional(delimitedList(term)))
+            result = func.parseString("fna a,b,(fnb c,d,200),100")
+            result.pprint(width=40)
+        prints::
+            ['fna',
+             ['a',
+              'b',
+              ['(', 'fnb', ['c', 'd', '200'], ')'],
+              '100']]
+        """
+        pprint.pprint(self.asList(), *args, **kwargs)
+
+    # add support for pickle protocol
+    def __getstate__(self):
+        return ( self.__toklist,
+                 ( self.__tokdict.copy(),
+                   self.__parent is not None and self.__parent() or None,
+                   self.__accumNames,
+                   self.__name ) )
+
+    def __setstate__(self,state):
+        self.__toklist = state[0]
+        (self.__tokdict,
+         par,
+         inAccumNames,
+         self.__name) = state[1]
+        self.__accumNames = {}
+        self.__accumNames.update(inAccumNames)
+        if par is not None:
+            self.__parent = wkref(par)
+        else:
+            self.__parent = None
+
+    def __getnewargs__(self):
+        return self.__toklist, self.__name, self.__asList, self.__modal
+
+    def __dir__(self):
+        return (dir(type(self)) + list(self.keys()))
+
+MutableMapping.register(ParseResults)
+
+def col (loc,strg):
+    """Returns current column within a string, counting newlines as line separators.
+   The first column is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    s = strg
+    return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc)
+
+def lineno(loc,strg):
+    """Returns current line number within a string, counting newlines as line separators.
+   The first line is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    return strg.count("\n",0,loc) + 1
+
+def line( loc, strg ):
+    """Returns the line of text containing loc within a string, counting newlines as line separators.
+       """
+    lastCR = strg.rfind("\n", 0, loc)
+    nextCR = strg.find("\n", loc)
+    if nextCR >= 0:
+        return strg[lastCR+1:nextCR]
+    else:
+        return strg[lastCR+1:]
+
+def _defaultStartDebugAction( instring, loc, expr ):
+    print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))
+
+def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
+    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))
+
+def _defaultExceptionDebugAction( instring, loc, expr, exc ):
+    print ("Exception raised:" + _ustr(exc))
+
+def nullDebugAction(*args):
+    """'Do-nothing' debug action, to suppress debugging output during parsing."""
+    pass
+
+# Only works on Python 3.x - nonlocal is toxic to Python 2 installs
+#~ 'decorator to trim function calls to match the arity of the target'
+#~ def _trim_arity(func, maxargs=3):
+    #~ if func in singleArgBuiltins:
+        #~ return lambda s,l,t: func(t)
+    #~ limit = 0
+    #~ foundArity = False
+    #~ def wrapper(*args):
+        #~ nonlocal limit,foundArity
+        #~ while 1:
+            #~ try:
+                #~ ret = func(*args[limit:])
+                #~ foundArity = True
+                #~ return ret
+            #~ except TypeError:
+                #~ if limit == maxargs or foundArity:
+                    #~ raise
+                #~ limit += 1
+                #~ continue
+    #~ return wrapper
+
+# this version is Python 2.x-3.x cross-compatible
+'decorator to trim function calls to match the arity of the target'
+def _trim_arity(func, maxargs=2):
+    if func in singleArgBuiltins:
+        return lambda s,l,t: func(t)
+    limit = [0]
+    foundArity = [False]
+    
+    # traceback return data structure changed in Py3.5 - normalize back to plain tuples
+    if system_version[:2] >= (3,5):
+        def extract_stack(limit=0):
+            # special handling for Python 3.5.0 - extra deep call stack by 1
+            offset = -3 if system_version == (3,5,0) else -2
+            frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset]
+            return [frame_summary[:2]]
+        def extract_tb(tb, limit=0):
+            frames = traceback.extract_tb(tb, limit=limit)
+            frame_summary = frames[-1]
+            return [frame_summary[:2]]
+    else:
+        extract_stack = traceback.extract_stack
+        extract_tb = traceback.extract_tb
+    
+    # synthesize what would be returned by traceback.extract_stack at the call to 
+    # user's parse action 'func', so that we don't incur call penalty at parse time
+    
+    LINE_DIFF = 6
+    # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND 
+    # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
+    this_line = extract_stack(limit=2)[-1]
+    pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF)
+
+    def wrapper(*args):
+        while 1:
+            try:
+                ret = func(*args[limit[0]:])
+                foundArity[0] = True
+                return ret
+            except TypeError:
+                # re-raise TypeErrors if they did not come from our arity testing
+                if foundArity[0]:
+                    raise
+                else:
+                    try:
+                        tb = sys.exc_info()[-1]
+                        if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth:
+                            raise
+                    finally:
+                        del tb
+
+                if limit[0] <= maxargs:
+                    limit[0] += 1
+                    continue
+                raise
+
+    # copy func name to wrapper for sensible debug output
+    func_name = "<parse action>"
+    try:
+        func_name = getattr(func, '__name__', 
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    wrapper.__name__ = func_name
+
+    return wrapper
+
+class ParserElement(object):
+    """Abstract base level parser element class."""
+    DEFAULT_WHITE_CHARS = " \n\t\r"
+    verbose_stacktrace = False
+
+    @staticmethod
+    def setDefaultWhitespaceChars( chars ):
+        r"""
+        Overrides the default whitespace chars
+
+        Example::
+            # default whitespace chars are space, <TAB> and newline
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
+            
+            # change to just treat newline as significant
+            ParserElement.setDefaultWhitespaceChars(" \t")
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
+        """
+        ParserElement.DEFAULT_WHITE_CHARS = chars
+
+    @staticmethod
+    def inlineLiteralsUsing(cls):
+        """
+        Set class to be used for inclusion of string literals into a parser.
+        
+        Example::
+            # default literal class used is Literal
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+
+            # change to Suppress
+            ParserElement.inlineLiteralsUsing(Suppress)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
+        """
+        ParserElement._literalStringClass = cls
+
+    def __init__( self, savelist=False ):
+        self.parseAction = list()
+        self.failAction = None
+        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
+        self.strRepr = None
+        self.resultsName = None
+        self.saveAsList = savelist
+        self.skipWhitespace = True
+        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        self.copyDefaultWhiteChars = True
+        self.mayReturnEmpty = False # used when checking for left-recursion
+        self.keepTabs = False
+        self.ignoreExprs = list()
+        self.debug = False
+        self.streamlined = False
+        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
+        self.errmsg = ""
+        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
+        self.debugActions = ( None, None, None ) #custom debug actions
+        self.re = None
+        self.callPreparse = True # used to avoid redundant calls to preParse
+        self.callDuringTry = False
+
+    def copy( self ):
+        """
+        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
+        for the same parsing pattern, using copies of the original parse element.
+        
+        Example::
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
+            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+            
+            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
+        prints::
+            [5120, 100, 655360, 268435456]
+        Equivalent form of C{expr.copy()} is just C{expr()}::
+            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+        """
+        cpy = copy.copy( self )
+        cpy.parseAction = self.parseAction[:]
+        cpy.ignoreExprs = self.ignoreExprs[:]
+        if self.copyDefaultWhiteChars:
+            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        return cpy
+
+    def setName( self, name ):
+        """
+        Define name for this expression, makes debugging and exception messages clearer.
+        
+        Example::
+            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
+            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
+        """
+        self.name = name
+        self.errmsg = "Expected " + self.name
+        if hasattr(self,"exception"):
+            self.exception.msg = self.errmsg
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        """
+        Define name for referencing matching tokens as a nested attribute
+        of the returned parse results.
+        NOTE: this returns a *copy* of the original C{ParserElement} object;
+        this is so that the client can define a basic element, such as an
+        integer, and reference it in multiple places with different names.
+
+        You can also set results names using the abbreviated syntax,
+        C{expr("name")} in place of C{expr.setResultsName("name")} - 
+        see L{I{__call__}<__call__>}.
+
+        Example::
+            date_str = (integer.setResultsName("year") + '/' 
+                        + integer.setResultsName("month") + '/' 
+                        + integer.setResultsName("day"))
+
+            # equivalent form:
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+        """
+        newself = self.copy()
+        if name.endswith("*"):
+            name = name[:-1]
+            listAllMatches=True
+        newself.resultsName = name
+        newself.modalResults = not listAllMatches
+        return newself
+
+    def setBreak(self,breakFlag = True):
+        """Method to invoke the Python pdb debugger when this element is
+           about to be parsed. Set C{breakFlag} to True to enable, False to
+           disable.
+        """
+        if breakFlag:
+            _parseMethod = self._parse
+            def breaker(instring, loc, doActions=True, callPreParse=True):
+                import pdb
+                pdb.set_trace()
+                return _parseMethod( instring, loc, doActions, callPreParse )
+            breaker._originalParseMethod = _parseMethod
+            self._parse = breaker
+        else:
+            if hasattr(self._parse,"_originalParseMethod"):
+                self._parse = self._parse._originalParseMethod
+        return self
+
+    def setParseAction( self, *fns, **kwargs ):
+        """
+        Define one or more actions to perform when successfully matching parse element definition.
+        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
+        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
+         - s   = the original string being parsed (see note below)
+         - loc = the location of the matching substring
+         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
+        If the functions in fns modify the tokens, they can return them as the return
+        value from fn, and the modified list of tokens will replace the original.
+        Otherwise, fn does not need to return any value.
+
+        Optional keyword arguments:
+         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing
+
+        Note: the default parsing behavior is to expand tabs in the input string
+        before starting the parsing process.  See L{I{parseString}<parseString>} for more information
+        on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+        consistent view of the parsed string, the parse location, and line and column
+        positions within the parsed string.
+        
+        Example::
+            integer = Word(nums)
+            date_str = integer + '/' + integer + '/' + integer
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+            # use parse action to convert to ints at parse time
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            date_str = integer + '/' + integer + '/' + integer
+
+            # note that integer fields are now ints, not strings
+            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
+        """
+        self.parseAction = list(map(_trim_arity, list(fns)))
+        self.callDuringTry = kwargs.get("callDuringTry", False)
+        return self
+
+    def addParseAction( self, *fns, **kwargs ):
+        """
+        Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.
+        
+        See examples in L{I{copy}<copy>}.
+        """
+        self.parseAction += list(map(_trim_arity, list(fns)))
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def addCondition(self, *fns, **kwargs):
+        """Add a boolean predicate function to expression's list of parse actions. See 
+        L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, 
+        functions passed to C{addCondition} need to return boolean success/fail of the condition.
+
+        Optional keyword arguments:
+         - message = define a custom message to be used in the raised exception
+         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
+         
+        Example::
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            year_int = integer.copy()
+            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
+            date_str = year_int + '/' + integer + '/' + integer
+
+            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
+        """
+        msg = kwargs.get("message", "failed user-defined condition")
+        exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException
+        for fn in fns:
+            def pa(s,l,t):
+                if not bool(_trim_arity(fn)(s,l,t)):
+                    raise exc_type(s,l,msg)
+            self.parseAction.append(pa)
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def setFailAction( self, fn ):
+        """Define action to perform if parsing fails at this expression.
+           Fail acton fn is a callable function that takes the arguments
+           C{fn(s,loc,expr,err)} where:
+            - s = string being parsed
+            - loc = location where expression match was attempted and failed
+            - expr = the parse expression that failed
+            - err = the exception thrown
+           The function returns no value.  It may throw C{L{ParseFatalException}}
+           if it is desired to stop parsing immediately."""
+        self.failAction = fn
+        return self
+
+    def _skipIgnorables( self, instring, loc ):
+        exprsFound = True
+        while exprsFound:
+            exprsFound = False
+            for e in self.ignoreExprs:
+                try:
+                    while 1:
+                        loc,dummy = e._parse( instring, loc )
+                        exprsFound = True
+                except ParseException:
+                    pass
+        return loc
+
+    def preParse( self, instring, loc ):
+        if self.ignoreExprs:
+            loc = self._skipIgnorables( instring, loc )
+
+        if self.skipWhitespace:
+            wt = self.whiteChars
+            instrlen = len(instring)
+            while loc < instrlen and instring[loc] in wt:
+                loc += 1
+
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        return loc, []
+
+    def postParse( self, instring, loc, tokenlist ):
+        return tokenlist
+
+    #~ @profile
+    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
+        debugging = ( self.debug ) #and doActions )
+
+        if debugging or self.failAction:
+            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
+            if (self.debugActions[0] ):
+                self.debugActions[0]( instring, loc, self )
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            try:
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            except ParseBaseException as err:
+                #~ print ("Exception raised:", err)
+                if self.debugActions[2]:
+                    self.debugActions[2]( instring, tokensStart, self, err )
+                if self.failAction:
+                    self.failAction( instring, tokensStart, self, err )
+                raise
+        else:
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            if self.mayIndexError or preloc >= len(instring):
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            else:
+                loc,tokens = self.parseImpl( instring, preloc, doActions )
+
+        tokens = self.postParse( instring, loc, tokens )
+
+        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
+        if self.parseAction and (doActions or self.callDuringTry):
+            if debugging:
+                try:
+                    for fn in self.parseAction:
+                        tokens = fn( instring, tokensStart, retTokens )
+                        if tokens is not None:
+                            retTokens = ParseResults( tokens,
+                                                      self.resultsName,
+                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                      modal=self.modalResults )
+                except ParseBaseException as err:
+                    #~ print "Exception raised in user parse action:", err
+                    if (self.debugActions[2] ):
+                        self.debugActions[2]( instring, tokensStart, self, err )
+                    raise
+            else:
+                for fn in self.parseAction:
+                    tokens = fn( instring, tokensStart, retTokens )
+                    if tokens is not None:
+                        retTokens = ParseResults( tokens,
+                                                  self.resultsName,
+                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                  modal=self.modalResults )
+        if debugging:
+            #~ print ("Matched",self,"->",retTokens.asList())
+            if (self.debugActions[1] ):
+                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )
+
+        return loc, retTokens
+
+    def tryParse( self, instring, loc ):
+        try:
+            return self._parse( instring, loc, doActions=False )[0]
+        except ParseFatalException:
+            raise ParseException( instring, loc, self.errmsg, self)
+    
+    def canParseNext(self, instring, loc):
+        try:
+            self.tryParse(instring, loc)
+        except (ParseException, IndexError):
+            return False
+        else:
+            return True
+
+    class _UnboundedCache(object):
+        def __init__(self):
+            cache = {}
+            self.not_in_cache = not_in_cache = object()
+
+            def get(self, key):
+                return cache.get(key, not_in_cache)
+
+            def set(self, key, value):
+                cache[key] = value
+
+            def clear(self):
+                cache.clear()
+                
+            def cache_len(self):
+                return len(cache)
+
+            self.get = types.MethodType(get, self)
+            self.set = types.MethodType(set, self)
+            self.clear = types.MethodType(clear, self)
+            self.__len__ = types.MethodType(cache_len, self)
+
+    if _OrderedDict is not None:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = _OrderedDict()
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    while len(cache) > size:
+                        try:
+                            cache.popitem(False)
+                        except KeyError:
+                            pass
+
+                def clear(self):
+                    cache.clear()
+
+                def cache_len(self):
+                    return len(cache)
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+                self.__len__ = types.MethodType(cache_len, self)
+
+    else:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = {}
+                key_fifo = collections.deque([], size)
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    while len(key_fifo) > size:
+                        cache.pop(key_fifo.popleft(), None)
+                    key_fifo.append(key)
+
+                def clear(self):
+                    cache.clear()
+                    key_fifo.clear()
+
+                def cache_len(self):
+                    return len(cache)
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+                self.__len__ = types.MethodType(cache_len, self)
+
+    # argument cache for optimizing repeated calls when backtracking through recursive expressions
+    packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail
+    packrat_cache_lock = RLock()
+    packrat_cache_stats = [0, 0]
+
+    # this method gets repeatedly called during backtracking with the same arguments -
+    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
+    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
+        HIT, MISS = 0, 1
+        lookup = (self, instring, loc, callPreParse, doActions)
+        with ParserElement.packrat_cache_lock:
+            cache = ParserElement.packrat_cache
+            value = cache.get(lookup)
+            if value is cache.not_in_cache:
+                ParserElement.packrat_cache_stats[MISS] += 1
+                try:
+                    value = self._parseNoCache(instring, loc, doActions, callPreParse)
+                except ParseBaseException as pe:
+                    # cache a copy of the exception, without the traceback
+                    cache.set(lookup, pe.__class__(*pe.args))
+                    raise
+                else:
+                    cache.set(lookup, (value[0], value[1].copy()))
+                    return value
+            else:
+                ParserElement.packrat_cache_stats[HIT] += 1
+                if isinstance(value, Exception):
+                    raise value
+                return (value[0], value[1].copy())
+
+    _parse = _parseNoCache
+
+    @staticmethod
+    def resetCache():
+        ParserElement.packrat_cache.clear()
+        ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats)
+
+    _packratEnabled = False
+    @staticmethod
+    def enablePackrat(cache_size_limit=128):
+        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
+           Repeated parse attempts at the same string location (which happens
+           often in many complex grammars) can immediately return a cached value,
+           instead of re-executing parsing/validating code.  Memoizing is done of
+           both valid results and parsing exceptions.
+           
+           Parameters:
+            - cache_size_limit - (default=C{128}) - if an integer value is provided
+              will limit the size of the packrat cache; if None is passed, then
+              the cache size will be unbounded; if 0 is passed, the cache will
+              be effectively disabled.
+            
+           This speedup may break existing programs that use parse actions that
+           have side-effects.  For this reason, packrat parsing is disabled when
+           you first import pyparsing.  To activate the packrat feature, your
+           program must call the class method C{ParserElement.enablePackrat()}.  If
+           your program uses C{psyco} to "compile as you go", you must call
+           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
+           Python will crash.  For best results, call C{enablePackrat()} immediately
+           after importing pyparsing.
+           
+           Example::
+               import pyparsing
+               pyparsing.ParserElement.enablePackrat()
+        """
+        if not ParserElement._packratEnabled:
+            ParserElement._packratEnabled = True
+            if cache_size_limit is None:
+                ParserElement.packrat_cache = ParserElement._UnboundedCache()
+            else:
+                ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit)
+            ParserElement._parse = ParserElement._parseCache
+
+    def parseString( self, instring, parseAll=False ):
+        """
+        Execute the parse expression with the given string.
+        This is the main interface to the client code, once the complete
+        expression has been built.
+
+        If you want the grammar to require that the entire input string be
+        successfully parsed, then set C{parseAll} to True (equivalent to ending
+        the grammar with C{L{StringEnd()}}).
+
+        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
+        in order to report proper column numbers in parse actions.
+        If the input string contains tabs and
+        the grammar uses parse actions that use the C{loc} argument to index into the
+        string being parsed, you can ensure you have a consistent view of the input
+        string by:
+         - calling C{parseWithTabs} on your grammar before calling C{parseString}
+           (see L{I{parseWithTabs}<parseWithTabs>})
+         - define your parse action using the full C{(s,loc,toks)} signature, and
+           reference the input string using the parse action's C{s} argument
+         - explictly expand the tabs in your input string before calling
+           C{parseString}
+        
+        Example::
+            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
+            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
+        """
+        ParserElement.resetCache()
+        if not self.streamlined:
+            self.streamline()
+            #~ self.saveAsList = True
+        for e in self.ignoreExprs:
+            e.streamline()
+        if not self.keepTabs:
+            instring = instring.expandtabs()
+        try:
+            loc, tokens = self._parse( instring, 0 )
+            if parseAll:
+                loc = self.preParse( instring, loc )
+                se = Empty() + StringEnd()
+                se._parse( instring, loc )
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+        else:
+            return tokens
+
+    def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
+        """
+        Scan the input string for expression matches.  Each match will return the
+        matching tokens, start location, and end location.  May be called with optional
+        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
+        C{overlap} is specified, then overlapping matches will be reported.
+
+        Note that the start and end locations are reported relative to the string
+        being parsed.  See L{I{parseString}<parseString>} for more information on parsing
+        strings with embedded tabs.
+
+        Example::
+            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
+            print(source)
+            for tokens,start,end in Word(alphas).scanString(source):
+                print(' '*start + '^'*(end-start))
+                print(' '*start + tokens[0])
+        
+        prints::
+        
+            sldjf123lsdjjkf345sldkjf879lkjsfd987
+            ^^^^^
+            sldjf
+                    ^^^^^^^
+                    lsdjjkf
+                              ^^^^^^
+                              sldkjf
+                                       ^^^^^^
+                                       lkjsfd
+        """
+        if not self.streamlined:
+            self.streamline()
+        for e in self.ignoreExprs:
+            e.streamline()
+
+        if not self.keepTabs:
+            instring = _ustr(instring).expandtabs()
+        instrlen = len(instring)
+        loc = 0
+        preparseFn = self.preParse
+        parseFn = self._parse
+        ParserElement.resetCache()
+        matches = 0
+        try:
+            while loc <= instrlen and matches < maxMatches:
+                try:
+                    preloc = preparseFn( instring, loc )
+                    nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
+                except ParseException:
+                    loc = preloc+1
+                else:
+                    if nextLoc > loc:
+                        matches += 1
+                        yield tokens, preloc, nextLoc
+                        if overlap:
+                            nextloc = preparseFn( instring, loc )
+                            if nextloc > loc:
+                                loc = nextLoc
+                            else:
+                                loc += 1
+                        else:
+                            loc = nextLoc
+                    else:
+                        loc = preloc+1
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def transformString( self, instring ):
+        """
+        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
+        be returned from a parse action.  To use C{transformString}, define a grammar and
+        attach a parse action to it that modifies the returned token list.
+        Invoking C{transformString()} on a target string will then scan for matches,
+        and replace the matched text patterns according to the logic in the parse
+        action.  C{transformString()} returns the resulting transformed string.
+        
+        Example::
+            wd = Word(alphas)
+            wd.setParseAction(lambda toks: toks[0].title())
+            
+            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
+        Prints::
+            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
+        """
+        out = []
+        lastE = 0
+        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
+        # keep string locs straight between transformString and scanString
+        self.keepTabs = True
+        try:
+            for t,s,e in self.scanString( instring ):
+                out.append( instring[lastE:s] )
+                if t:
+                    if isinstance(t,ParseResults):
+                        out += t.asList()
+                    elif isinstance(t,list):
+                        out += t
+                    else:
+                        out.append(t)
+                lastE = e
+            out.append(instring[lastE:])
+            out = [o for o in out if o]
+            return "".join(map(_ustr,_flatten(out)))
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def searchString( self, instring, maxMatches=_MAX_INT ):
+        """
+        Another extension to C{L{scanString}}, simplifying the access to the tokens found
+        to match the given parse expression.  May be called with optional
+        C{maxMatches} argument, to clip searching after 'n' matches are found.
+        
+        Example::
+            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
+            cap_word = Word(alphas.upper(), alphas.lower())
+            
+            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
+
+            # the sum() builtin can be used to merge results into a single ParseResults object
+            print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")))
+        prints::
+            [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']]
+            ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity']
+        """
+        try:
+            return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False):
+        """
+        Generator method to split a string using the given expression as a separator.
+        May be called with optional C{maxsplit} argument, to limit the number of splits;
+        and the optional C{includeSeparators} argument (default=C{False}), if the separating
+        matching text should be included in the split results.
+        
+        Example::        
+            punc = oneOf(list(".,;:/-!?"))
+            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
+        prints::
+            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
+        """
+        splits = 0
+        last = 0
+        for t,s,e in self.scanString(instring, maxMatches=maxsplit):
+            yield instring[last:s]
+            if includeSeparators:
+                yield t[0]
+            last = e
+        yield instring[last:]
+
+    def __add__(self, other ):
+        """
+        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
+        converts them to L{Literal}s by default.
+        
+        Example::
+            greet = Word(alphas) + "," + Word(alphas) + "!"
+            hello = "Hello, World!"
+            print (hello, "->", greet.parseString(hello))
+        Prints::
+            Hello, World! -> ['Hello', ',', 'World', '!']
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, other ] )
+
+    def __radd__(self, other ):
+        """
+        Implementation of + operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other + self
+
+    def __sub__(self, other):
+        """
+        Implementation of - operator, returns C{L{And}} with error stop
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return self + And._ErrorStop() + other
+
+    def __rsub__(self, other ):
+        """
+        Implementation of - operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other - self
+
+    def __mul__(self,other):
+        """
+        Implementation of * operator, allows use of C{expr * 3} in place of
+        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
+        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
+        may also include C{None} as in:
+         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
+              to C{expr*n + L{ZeroOrMore}(expr)}
+              (read as "at least n instances of C{expr}")
+         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
+              (read as "0 to n instances of C{expr}")
+         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
+         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}
+
+        Note that C{expr*(None,n)} does not raise an exception if
+        more than n exprs exist in the input stream; that is,
+        C{expr*(None,n)} does not enforce a maximum number of expr
+        occurrences.  If this behavior is desired, then write
+        C{expr*(None,n) + ~expr}
+        """
+        if isinstance(other,int):
+            minElements, optElements = other,0
+        elif isinstance(other,tuple):
+            other = (other + (None, None))[:2]
+            if other[0] is None:
+                other = (0, other[1])
+            if isinstance(other[0],int) and other[1] is None:
+                if other[0] == 0:
+                    return ZeroOrMore(self)
+                if other[0] == 1:
+                    return OneOrMore(self)
+                else:
+                    return self*other[0] + ZeroOrMore(self)
+            elif isinstance(other[0],int) and isinstance(other[1],int):
+                minElements, optElements = other
+                optElements -= minElements
+            else:
+                raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
+        else:
+            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))
+
+        if minElements < 0:
+            raise ValueError("cannot multiply ParserElement by negative value")
+        if optElements < 0:
+            raise ValueError("second tuple value must be greater or equal to first tuple value")
+        if minElements == optElements == 0:
+            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")
+
+        if (optElements):
+            def makeOptionalList(n):
+                if n>1:
+                    return Optional(self + makeOptionalList(n-1))
+                else:
+                    return Optional(self)
+            if minElements:
+                if minElements == 1:
+                    ret = self + makeOptionalList(optElements)
+                else:
+                    ret = And([self]*minElements) + makeOptionalList(optElements)
+            else:
+                ret = makeOptionalList(optElements)
+        else:
+            if minElements == 1:
+                ret = self
+            else:
+                ret = And([self]*minElements)
+        return ret
+
+    def __rmul__(self, other):
+        return self.__mul__(other)
+
+    def __or__(self, other ):
+        """
+        Implementation of | operator - returns C{L{MatchFirst}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return MatchFirst( [ self, other ] )
+
+    def __ror__(self, other ):
+        """
+        Implementation of | operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other | self
+
+    def __xor__(self, other ):
+        """
+        Implementation of ^ operator - returns C{L{Or}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Or( [ self, other ] )
+
+    def __rxor__(self, other ):
+        """
+        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other ^ self
+
+    def __and__(self, other ):
+        """
+        Implementation of & operator - returns C{L{Each}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Each( [ self, other ] )
+
+    def __rand__(self, other ):
+        """
+        Implementation of & operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other & self
+
+    def __invert__( self ):
+        """
+        Implementation of ~ operator - returns C{L{NotAny}}
+        """
+        return NotAny( self )
+
+    def __call__(self, name=None):
+        """
+        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
+        
+        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
+        passed as C{True}.
+           
+        If C{name} is omitted, same as calling C{L{copy}}.
+
+        Example::
+            # these are equivalent
+            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
+            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
+        """
+        if name is not None:
+            return self.setResultsName(name)
+        else:
+            return self.copy()
+
+    def suppress( self ):
+        """
+        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
+        cluttering up returned output.
+        """
+        return Suppress( self )
+
+    def leaveWhitespace( self ):
+        """
+        Disables the skipping of whitespace before matching the characters in the
+        C{ParserElement}'s defined pattern.  This is normally only used internally by
+        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
+        """
+        self.skipWhitespace = False
+        return self
+
+    def setWhitespaceChars( self, chars ):
+        """
+        Overrides the default whitespace chars
+        """
+        self.skipWhitespace = True
+        self.whiteChars = chars
+        self.copyDefaultWhiteChars = False
+        return self
+
+    def parseWithTabs( self ):
+        """
+        Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string.
+        Must be called before C{parseString} when the input grammar contains elements that
+        match C{<TAB>} characters.
+        """
+        self.keepTabs = True
+        return self
+
+    def ignore( self, other ):
+        """
+        Define expression to be ignored (e.g., comments) while doing pattern
+        matching; may be called repeatedly, to define multiple comment or other
+        ignorable patterns.
+        
+        Example::
+            patt = OneOrMore(Word(alphas))
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
+            
+            patt.ignore(cStyleComment)
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
+        """
+        if isinstance(other, basestring):
+            other = Suppress(other)
+
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                self.ignoreExprs.append(other)
+        else:
+            self.ignoreExprs.append( Suppress( other.copy() ) )
+        return self
+
+    def setDebugActions( self, startAction, successAction, exceptionAction ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        """
+        self.debugActions = (startAction or _defaultStartDebugAction,
+                             successAction or _defaultSuccessDebugAction,
+                             exceptionAction or _defaultExceptionDebugAction)
+        self.debug = True
+        return self
+
+    def setDebug( self, flag=True ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        Set C{flag} to True to enable, False to disable.
+
+        Example::
+            wd = Word(alphas).setName("alphaword")
+            integer = Word(nums).setName("numword")
+            term = wd | integer
+            
+            # turn on debugging for wd
+            wd.setDebug()
+
+            OneOrMore(term).parseString("abc 123 xyz 890")
+        
+        prints::
+            Match alphaword at loc 0(1,1)
+            Matched alphaword -> ['abc']
+            Match alphaword at loc 3(1,4)
+            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
+            Match alphaword at loc 7(1,8)
+            Matched alphaword -> ['xyz']
+            Match alphaword at loc 11(1,12)
+            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
+            Match alphaword at loc 15(1,16)
+            Exception raised:Expected alphaword (at char 15), (line:1, col:16)
+
+        The output shown is that produced by the default debug actions - custom debug actions can be
+        specified using L{setDebugActions}. Prior to attempting
+        to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"}
+        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
+        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
+        which makes debugging and exception messages easier to understand - for instance, the default
+        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
+        """
+        if flag:
+            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
+        else:
+            self.debug = False
+        return self
+
+    def __str__( self ):
+        return self.name
+
+    def __repr__( self ):
+        return _ustr(self)
+
+    def streamline( self ):
+        self.streamlined = True
+        self.strRepr = None
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        pass
+
+    def validate( self, validateTrace=[] ):
+        """
+        Check defined expressions for valid structure, check for infinite recursive definitions.
+        """
+        self.checkRecursion( [] )
+
+    def parseFile( self, file_or_filename, parseAll=False ):
+        """
+        Execute the parse expression on the given file or filename.
+        If a filename is specified (instead of a file object),
+        the entire file is opened, read, and closed before parsing.
+        """
+        try:
+            file_contents = file_or_filename.read()
+        except AttributeError:
+            with open(file_or_filename, "r") as f:
+                file_contents = f.read()
+        try:
+            return self.parseString(file_contents, parseAll)
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def __eq__(self,other):
+        if isinstance(other, ParserElement):
+            return self is other or vars(self) == vars(other)
+        elif isinstance(other, basestring):
+            return self.matches(other)
+        else:
+            return super(ParserElement,self)==other
+
+    def __ne__(self,other):
+        return not (self == other)
+
+    def __hash__(self):
+        return hash(id(self))
+
+    def __req__(self,other):
+        return self == other
+
+    def __rne__(self,other):
+        return not (self == other)
+
+    def matches(self, testString, parseAll=True):
+        """
+        Method for quick testing of a parser against a test string. Good for simple 
+        inline microtests of sub expressions while building up larger parser.
+           
+        Parameters:
+         - testString - to test against this expression for a match
+         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
+            
+        Example::
+            expr = Word(nums)
+            assert expr.matches("100")
+        """
+        try:
+            self.parseString(_ustr(testString), parseAll=parseAll)
+            return True
+        except ParseBaseException:
+            return False
+                
+    def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False):
+        """
+        Execute the parse expression on a series of test strings, showing each
+        test, the parsed results or where the parse failed. Quick and easy way to
+        run a parse expression against a list of sample strings.
+           
+        Parameters:
+         - tests - a list of separate test strings, or a multiline string of test strings
+         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
+         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
+              string; pass None to disable comment filtering
+         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
+              if False, only dump nested list
+         - printResults - (default=C{True}) prints test output to stdout
+         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing
+
+        Returns: a (success, results) tuple, where success indicates that all tests succeeded
+        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
+        test's output
+        
+        Example::
+            number_expr = pyparsing_common.number.copy()
+
+            result = number_expr.runTests('''
+                # unsigned integer
+                100
+                # negative integer
+                -100
+                # float with scientific notation
+                6.02e23
+                # integer with scientific notation
+                1e-12
+                ''')
+            print("Success" if result[0] else "Failed!")
+
+            result = number_expr.runTests('''
+                # stray character
+                100Z
+                # missing leading digit before '.'
+                -.100
+                # too many '.'
+                3.14.159
+                ''', failureTests=True)
+            print("Success" if result[0] else "Failed!")
+        prints::
+            # unsigned integer
+            100
+            [100]
+
+            # negative integer
+            -100
+            [-100]
+
+            # float with scientific notation
+            6.02e23
+            [6.02e+23]
+
+            # integer with scientific notation
+            1e-12
+            [1e-12]
+
+            Success
+            
+            # stray character
+            100Z
+               ^
+            FAIL: Expected end of text (at char 3), (line:1, col:4)
+
+            # missing leading digit before '.'
+            -.100
+            ^
+            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)
+
+            # too many '.'
+            3.14.159
+                ^
+            FAIL: Expected end of text (at char 4), (line:1, col:5)
+
+            Success
+
+        Each test string must be on a single line. If you want to test a string that spans multiple
+        lines, create a test like this::
+
+            expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines")
+        
+        (Note that this is a raw string literal, you must include the leading 'r'.)
+        """
+        if isinstance(tests, basestring):
+            tests = list(map(str.strip, tests.rstrip().splitlines()))
+        if isinstance(comment, basestring):
+            comment = Literal(comment)
+        allResults = []
+        comments = []
+        success = True
+        for t in tests:
+            if comment is not None and comment.matches(t, False) or comments and not t:
+                comments.append(t)
+                continue
+            if not t:
+                continue
+            out = ['\n'.join(comments), t]
+            comments = []
+            try:
+                t = t.replace(r'\n','\n')
+                result = self.parseString(t, parseAll=parseAll)
+                out.append(result.dump(full=fullDump))
+                success = success and not failureTests
+            except ParseBaseException as pe:
+                fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
+                if '\n' in t:
+                    out.append(line(pe.loc, t))
+                    out.append(' '*(col(pe.loc,t)-1) + '^' + fatal)
+                else:
+                    out.append(' '*pe.loc + '^' + fatal)
+                out.append("FAIL: " + str(pe))
+                success = success and failureTests
+                result = pe
+            except Exception as exc:
+                out.append("FAIL-EXCEPTION: " + str(exc))
+                success = success and failureTests
+                result = exc
+
+            if printResults:
+                if fullDump:
+                    out.append('')
+                print('\n'.join(out))
+
+            allResults.append((t, result))
+        
+        return success, allResults
+
+        
+class Token(ParserElement):
+    """
+    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
+    """
+    def __init__( self ):
+        super(Token,self).__init__( savelist=False )
+
+
+class Empty(Token):
+    """
+    An empty token, will always match.
+    """
+    def __init__( self ):
+        super(Empty,self).__init__()
+        self.name = "Empty"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+
+class NoMatch(Token):
+    """
+    A token that will never match.
+    """
+    def __init__( self ):
+        super(NoMatch,self).__init__()
+        self.name = "NoMatch"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.errmsg = "Unmatchable token"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Literal(Token):
+    """
+    Token to exactly match a specified string.
+    
+    Example::
+        Literal('blah').parseString('blah')  # -> ['blah']
+        Literal('blah').parseString('blahfooblah')  # -> ['blah']
+        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
+    
+    For case-insensitive matching, use L{CaselessLiteral}.
+    
+    For keyword matching (force word break before and after the matched string),
+    use L{Keyword} or L{CaselessKeyword}.
+    """
+    def __init__( self, matchString ):
+        super(Literal,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Literal; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+            self.__class__ = Empty
+        self.name = '"%s"' % _ustr(self.match)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+
+    # Performance tuning: this routine gets called a *lot*
+    # if this is a single character match string  and the first character matches,
+    # short-circuit as quickly as possible, and avoid calling startswith
+    #~ @profile
+    def parseImpl( self, instring, loc, doActions=True ):
+        if (instring[loc] == self.firstMatchChar and
+            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+_L = Literal
+ParserElement._literalStringClass = Literal
+
+class Keyword(Token):
+    """
+    Token to exactly match a specified string as a keyword, that is, it must be
+    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
+     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
+     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
+    Accepts two optional constructor arguments in addition to the keyword string:
+     - C{identChars} is a string of characters that would be valid identifier characters,
+          defaulting to all alphanumerics + "_" and "$"
+     - C{caseless} allows case-insensitive matching, default is C{False}.
+       
+    Example::
+        Keyword("start").parseString("start")  # -> ['start']
+        Keyword("start").parseString("starting")  # -> Exception
+
+    For case-insensitive matching, use L{CaselessKeyword}.
+    """
+    DEFAULT_KEYWORD_CHARS = alphanums+"_$"
+
+    def __init__( self, matchString, identChars=None, caseless=False ):
+        super(Keyword,self).__init__()
+        if identChars is None:
+            identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Keyword; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+        self.caseless = caseless
+        if caseless:
+            self.caselessmatch = matchString.upper()
+            identChars = identChars.upper()
+        self.identChars = set(identChars)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.caseless:
+            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
+                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        else:
+            if (instring[loc] == self.firstMatchChar and
+                (self.matchLen==1 or instring.startswith(self.match,loc)) and
+                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
+                (loc == 0 or instring[loc-1] not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+    def copy(self):
+        c = super(Keyword,self).copy()
+        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        return c
+
+    @staticmethod
+    def setDefaultKeywordChars( chars ):
+        """Overrides the default Keyword chars
+        """
+        Keyword.DEFAULT_KEYWORD_CHARS = chars
+
+class CaselessLiteral(Literal):
+    """
+    Token to match a specified string, ignoring case of letters.
+    Note: the matched results will always be in the case of the given
+    match string, NOT the case of the input text.
+
+    Example::
+        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
+        
+    (Contrast with example for L{CaselessKeyword}.)
+    """
+    def __init__( self, matchString ):
+        super(CaselessLiteral,self).__init__( matchString.upper() )
+        # Preserve the defining literal.
+        self.returnString = matchString
+        self.name = "'%s'" % self.returnString
+        self.errmsg = "Expected " + self.name
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[ loc:loc+self.matchLen ].upper() == self.match:
+            return loc+self.matchLen, self.returnString
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CaselessKeyword(Keyword):
+    """
+    Caseless version of L{Keyword}.
+
+    Example::
+        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
+        
+    (Contrast with example for L{CaselessLiteral}.)
+    """
+    def __init__( self, matchString, identChars=None ):
+        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CloseMatch(Token):
+    """
+    A variation on L{Literal} which matches "close" matches, that is, 
+    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
+     - C{match_string} - string to be matched
+     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
+    
+    The results from a successful parse will contain the matched text from the input string and the following named results:
+     - C{mismatches} - a list of the positions within the match_string where mismatches were found
+     - C{original} - the original match_string used to compare against the input string
+    
+    If C{mismatches} is an empty list, then the match was an exact match.
+    
+    Example::
+        patt = CloseMatch("ATCATCGAATGGA")
+        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
+        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)
+
+        # exact match
+        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})
+
+        # close match allowing up to 2 mismatches
+        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
+        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
+    """
+    def __init__(self, match_string, maxMismatches=1):
+        super(CloseMatch,self).__init__()
+        self.name = match_string
+        self.match_string = match_string
+        self.maxMismatches = maxMismatches
+        self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches)
+        self.mayIndexError = False
+        self.mayReturnEmpty = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        start = loc
+        instrlen = len(instring)
+        maxloc = start + len(self.match_string)
+
+        if maxloc <= instrlen:
+            match_string = self.match_string
+            match_stringloc = 0
+            mismatches = []
+            maxMismatches = self.maxMismatches
+
+            for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)):
+                src,mat = s_m
+                if src != mat:
+                    mismatches.append(match_stringloc)
+                    if len(mismatches) > maxMismatches:
+                        break
+            else:
+                loc = match_stringloc + 1
+                results = ParseResults([instring[start:loc]])
+                results['original'] = self.match_string
+                results['mismatches'] = mismatches
+                return loc, results
+
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Word(Token):
+    """
+    Token for matching words composed of allowed character sets.
+    Defined with string containing all allowed initial characters,
+    an optional string containing allowed body characters (if omitted,
+    defaults to the initial character set), and an optional minimum,
+    maximum, and/or exact length.  The default value for C{min} is 1 (a
+    minimum value < 1 is not valid); the default values for C{max} and C{exact}
+    are 0, meaning no maximum or exact length restriction. An optional
+    C{excludeChars} parameter can list characters that might be found in 
+    the input C{bodyChars} string; useful to define a word of all printables
+    except for one or two characters, for instance.
+    
+    L{srange} is useful for defining custom character set strings for defining 
+    C{Word} expressions, using range notation from regular expression character sets.
+    
+    A common mistake is to use C{Word} to match a specific literal string, as in 
+    C{Word("Address")}. Remember that C{Word} uses the string argument to define
+    I{sets} of matchable characters. This expression would match "Add", "AAA",
+    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
+    To match an exact literal string, use L{Literal} or L{Keyword}.
+
+    pyparsing includes helper strings for building Words:
+     - L{alphas}
+     - L{nums}
+     - L{alphanums}
+     - L{hexnums}
+     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
+     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
+     - L{printables} (any non-whitespace character)
+
+    Example::
+        # a word composed of digits
+        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
+        
+        # a word with a leading capital, and zero or more lowercase
+        capital_word = Word(alphas.upper(), alphas.lower())
+
+        # hostnames are alphanumeric, with leading alpha, and '-'
+        hostname = Word(alphas, alphanums+'-')
+        
+        # roman numeral (not a strict parser, accepts invalid mix of characters)
+        roman = Word("IVXLCDM")
+        
+        # any string of non-whitespace characters, except for ','
+        csv_value = Word(printables, excludeChars=",")
+    """
+    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
+        super(Word,self).__init__()
+        if excludeChars:
+            initChars = ''.join(c for c in initChars if c not in excludeChars)
+            if bodyChars:
+                bodyChars = ''.join(c for c in bodyChars if c not in excludeChars)
+        self.initCharsOrig = initChars
+        self.initChars = set(initChars)
+        if bodyChars :
+            self.bodyCharsOrig = bodyChars
+            self.bodyChars = set(bodyChars)
+        else:
+            self.bodyCharsOrig = initChars
+            self.bodyChars = set(initChars)
+
+        self.maxSpecified = max > 0
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.asKeyword = asKeyword
+
+        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
+            if self.bodyCharsOrig == self.initCharsOrig:
+                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
+            elif len(self.initCharsOrig) == 1:
+                self.reString = "%s[%s]*" % \
+                                      (re.escape(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            else:
+                self.reString = "[%s][%s]*" % \
+                                      (_escapeRegexRangeChars(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            if self.asKeyword:
+                self.reString = r"\b"+self.reString+r"\b"
+            try:
+                self.re = re.compile( self.reString )
+            except Exception:
+                self.re = None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.re:
+            result = self.re.match(instring,loc)
+            if not result:
+                raise ParseException(instring, loc, self.errmsg, self)
+
+            loc = result.end()
+            return loc, result.group()
+
+        if not(instring[ loc ] in self.initChars):
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        instrlen = len(instring)
+        bodychars = self.bodyChars
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, instrlen )
+        while loc < maxloc and instring[loc] in bodychars:
+            loc += 1
+
+        throwException = False
+        if loc - start < self.minLen:
+            throwException = True
+        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
+            throwException = True
+        if self.asKeyword:
+            if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars):
+                throwException = True
+
+        if throwException:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(Word,self).__str__()
+        except Exception:
+            pass
+
+
+        if self.strRepr is None:
+
+            def charsAsStr(s):
+                if len(s)>4:
+                    return s[:4]+"..."
+                else:
+                    return s
+
+            if ( self.initCharsOrig != self.bodyCharsOrig ):
+                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
+            else:
+                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
+
+        return self.strRepr
+
+
+class Regex(Token):
+    r"""
+    Token for matching strings that match a given regular expression.
+    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
+    If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as 
+    named parse results.
+
+    Example::
+        realnum = Regex(r"[+-]?\d+\.\d*")
+        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
+        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
+        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
+    """
+    compiledREtype = type(re.compile("[A-Z]"))
+    def __init__( self, pattern, flags=0):
+        """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags."""
+        super(Regex,self).__init__()
+
+        if isinstance(pattern, basestring):
+            if not pattern:
+                warnings.warn("null string passed to Regex; use Empty() instead",
+                        SyntaxWarning, stacklevel=2)
+
+            self.pattern = pattern
+            self.flags = flags
+
+            try:
+                self.re = re.compile(self.pattern, self.flags)
+                self.reString = self.pattern
+            except sre_constants.error:
+                warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
+                    SyntaxWarning, stacklevel=2)
+                raise
+
+        elif isinstance(pattern, Regex.compiledREtype):
+            self.re = pattern
+            self.pattern = \
+            self.reString = str(pattern)
+            self.flags = flags
+            
+        else:
+            raise ValueError("Regex may only be constructed with a string or a compiled RE object")
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = self.re.match(instring,loc)
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        d = result.groupdict()
+        ret = ParseResults(result.group())
+        if d:
+            for k in d:
+                ret[k] = d[k]
+        return loc,ret
+
+    def __str__( self ):
+        try:
+            return super(Regex,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "Re:(%s)" % repr(self.pattern)
+
+        return self.strRepr
+
+
+class QuotedString(Token):
+    r"""
+    Token for matching strings that are delimited by quoting characters.
+    
+    Defined with the following parameters:
+        - quoteChar - string of one or more characters defining the quote delimiting string
+        - escChar - character to escape quotes, typically backslash (default=C{None})
+        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
+        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
+        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
+        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
+        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})
+
+    Example::
+        qs = QuotedString('"')
+        print(qs.searchString('lsjdf "This is the quote" sldjf'))
+        complex_qs = QuotedString('{{', endQuoteChar='}}')
+        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
+        sql_qs = QuotedString('"', escQuote='""')
+        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
+    prints::
+        [['This is the quote']]
+        [['This is the "quote"']]
+        [['This is the quote with "embedded" quotes']]
+    """
+    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True):
+        super(QuotedString,self).__init__()
+
+        # remove white space from quote chars - wont work anyway
+        quoteChar = quoteChar.strip()
+        if not quoteChar:
+            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+            raise SyntaxError()
+
+        if endQuoteChar is None:
+            endQuoteChar = quoteChar
+        else:
+            endQuoteChar = endQuoteChar.strip()
+            if not endQuoteChar:
+                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+                raise SyntaxError()
+
+        self.quoteChar = quoteChar
+        self.quoteCharLen = len(quoteChar)
+        self.firstQuoteChar = quoteChar[0]
+        self.endQuoteChar = endQuoteChar
+        self.endQuoteCharLen = len(endQuoteChar)
+        self.escChar = escChar
+        self.escQuote = escQuote
+        self.unquoteResults = unquoteResults
+        self.convertWhitespaceEscapes = convertWhitespaceEscapes
+
+        if multiline:
+            self.flags = re.MULTILINE | re.DOTALL
+            self.pattern = r'%s(?:[^%s%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        else:
+            self.flags = 0
+            self.pattern = r'%s(?:[^%s\n\r%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        if len(self.endQuoteChar) > 1:
+            self.pattern += (
+                '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
+                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
+                                    for i in range(len(self.endQuoteChar)-1,0,-1)) + ')'
+                )
+        if escQuote:
+            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
+        if escChar:
+            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
+            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
+        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))
+
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except sre_constants.error:
+            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = result.group()
+
+        if self.unquoteResults:
+
+            # strip off quotes
+            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]
+
+            if isinstance(ret,basestring):
+                # replace escaped whitespace
+                if '\\' in ret and self.convertWhitespaceEscapes:
+                    ws_map = {
+                        r'\t' : '\t',
+                        r'\n' : '\n',
+                        r'\f' : '\f',
+                        r'\r' : '\r',
+                    }
+                    for wslit,wschar in ws_map.items():
+                        ret = ret.replace(wslit, wschar)
+
+                # replace escaped characters
+                if self.escChar:
+                    ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret)
+
+                # replace escaped quotes
+                if self.escQuote:
+                    ret = ret.replace(self.escQuote, self.endQuoteChar)
+
+        return loc, ret
+
+    def __str__( self ):
+        try:
+            return super(QuotedString,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)
+
+        return self.strRepr
+
+
+class CharsNotIn(Token):
+    """
+    Token for matching words composed of characters I{not} in a given set (will
+    include whitespace in matched characters if not listed in the provided exclusion set - see example).
+    Defined with string containing all disallowed characters, and an optional
+    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
+    minimum value < 1 is not valid); the default values for C{max} and C{exact}
+    are 0, meaning no maximum or exact length restriction.
+
+    Example::
+        # define a comma-separated-value as anything that is not a ','
+        csv_value = CharsNotIn(',')
+        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
+    prints::
+        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
+    """
+    def __init__( self, notChars, min=1, max=0, exact=0 ):
+        super(CharsNotIn,self).__init__()
+        self.skipWhitespace = False
+        self.notChars = notChars
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = ( self.minLen == 0 )
+        self.mayIndexError = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] in self.notChars:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        notchars = self.notChars
+        maxlen = min( start+self.maxLen, len(instring) )
+        while loc < maxlen and \
+              (instring[loc] not in notchars):
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(CharsNotIn, self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            if len(self.notChars) > 4:
+                self.strRepr = "!W:(%s...)" % self.notChars[:4]
+            else:
+                self.strRepr = "!W:(%s)" % self.notChars
+
+        return self.strRepr
+
+class White(Token):
+    """
+    Special matching class for matching whitespace.  Normally, whitespace is ignored
+    by pyparsing grammars.  This class is included when some whitespace structures
+    are significant.  Define with a string containing the whitespace characters to be
+    matched; default is C{" \\t\\r\\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
+    as defined for the C{L{Word}} class.
+    """
+    whiteStrs = {
+        " " : "<SPC>",
+        "\t": "<TAB>",
+        "\n": "<LF>",
+        "\r": "<CR>",
+        "\f": "<FF>",
+        }
+    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
+        super(White,self).__init__()
+        self.matchWhite = ws
+        self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) )
+        #~ self.leaveWhitespace()
+        self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite))
+        self.mayReturnEmpty = True
+        self.errmsg = "Expected " + self.name
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not(instring[ loc ] in self.matchWhite):
+            raise ParseException(instring, loc, self.errmsg, self)
+        start = loc
+        loc += 1
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, len(instring) )
+        while loc < maxloc and instring[loc] in self.matchWhite:
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+
+class _PositionToken(Token):
+    def __init__( self ):
+        super(_PositionToken,self).__init__()
+        self.name=self.__class__.__name__
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+class GoToColumn(_PositionToken):
+    """
+    Token to advance to a specific column of input text; useful for tabular report scraping.
+    """
+    def __init__( self, colno ):
+        super(GoToColumn,self).__init__()
+        self.col = colno
+
+    def preParse( self, instring, loc ):
+        if col(loc,instring) != self.col:
+            instrlen = len(instring)
+            if self.ignoreExprs:
+                loc = self._skipIgnorables( instring, loc )
+            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
+                loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        thiscol = col( loc, instring )
+        if thiscol > self.col:
+            raise ParseException( instring, loc, "Text not in expected column", self )
+        newloc = loc + self.col - thiscol
+        ret = instring[ loc: newloc ]
+        return newloc, ret
+
+
+class LineStart(_PositionToken):
+    """
+    Matches if current position is at the beginning of a line within the parse string
+    
+    Example::
+    
+        test = '''\
+        AAA this line
+        AAA and this line
+          AAA but not this one
+        B AAA and definitely not this one
+        '''
+
+        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
+            print(t)
+    
+    Prints::
+        ['AAA', ' this line']
+        ['AAA', ' and this line']    
+
+    """
+    def __init__( self ):
+        super(LineStart,self).__init__()
+        self.errmsg = "Expected start of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if col(loc, instring) == 1:
+            return loc, []
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class LineEnd(_PositionToken):
+    """
+    Matches if current position is at the end of a line within the parse string
+    """
+    def __init__( self ):
+        super(LineEnd,self).__init__()
+        self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") )
+        self.errmsg = "Expected end of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc<len(instring):
+            if instring[loc] == "\n":
+                return loc+1, "\n"
+            else:
+                raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class StringStart(_PositionToken):
+    """
+    Matches if current position is at the beginning of the parse string
+    """
+    def __init__( self ):
+        super(StringStart,self).__init__()
+        self.errmsg = "Expected start of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc != 0:
+            # see if entire string up to here is just whitespace and ignoreables
+            if loc != self.preParse( instring, 0 ):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class StringEnd(_PositionToken):
+    """
+    Matches if current position is at the end of the parse string
+    """
+    def __init__( self ):
+        super(StringEnd,self).__init__()
+        self.errmsg = "Expected end of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc < len(instring):
+            raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        elif loc > len(instring):
+            return loc, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class WordStart(_PositionToken):
+    """
+    Matches if the current position is at the beginning of a Word, and
+    is not preceded by any character in a given set of C{wordChars}
+    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
+    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
+    the string being parsed, or at the beginning of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordStart,self).__init__()
+        self.wordChars = set(wordChars)
+        self.errmsg = "Not at the start of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        if loc != 0:
+            if (instring[loc-1] in self.wordChars or
+                instring[loc] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class WordEnd(_PositionToken):
+    """
+    Matches if the current position is at the end of a Word, and
+    is not followed by any character in a given set of C{wordChars}
+    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
+    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
+    the string being parsed, or at the end of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordEnd,self).__init__()
+        self.wordChars = set(wordChars)
+        self.skipWhitespace = False
+        self.errmsg = "Not at the end of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        instrlen = len(instring)
+        if instrlen>0 and loc<instrlen:
+            if (instring[loc] in self.wordChars or
+                instring[loc-1] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+
+class ParseExpression(ParserElement):
+    """
+    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(ParseExpression,self).__init__(savelist)
+        if isinstance( exprs, _generatorType ):
+            exprs = list(exprs)
+
+        if isinstance( exprs, basestring ):
+            self.exprs = [ ParserElement._literalStringClass( exprs ) ]
+        elif isinstance( exprs, Iterable ):
+            exprs = list(exprs)
+            # if sequence of strings provided, wrap with Literal
+            if all(isinstance(expr, basestring) for expr in exprs):
+                exprs = map(ParserElement._literalStringClass, exprs)
+            self.exprs = list(exprs)
+        else:
+            try:
+                self.exprs = list( exprs )
+            except TypeError:
+                self.exprs = [ exprs ]
+        self.callPreparse = False
+
+    def __getitem__( self, i ):
+        return self.exprs[i]
+
+    def append( self, other ):
+        self.exprs.append( other )
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
+           all contained expressions."""
+        self.skipWhitespace = False
+        self.exprs = [ e.copy() for e in self.exprs ]
+        for e in self.exprs:
+            e.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseExpression, self).ignore( other )
+                for e in self.exprs:
+                    e.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseExpression, self).ignore( other )
+            for e in self.exprs:
+                e.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def __str__( self ):
+        try:
+            return super(ParseExpression,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
+        return self.strRepr
+
+    def streamline( self ):
+        super(ParseExpression,self).streamline()
+
+        for e in self.exprs:
+            e.streamline()
+
+        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
+        # but only if there are no parse actions or resultsNames on the nested And's
+        # (likewise for Or's and MatchFirst's)
+        if ( len(self.exprs) == 2 ):
+            other = self.exprs[0]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = other.exprs[:] + [ self.exprs[1] ]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+            other = self.exprs[-1]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = self.exprs[:-1] + other.exprs[:]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+        self.errmsg = "Expected " + _ustr(self)
+        
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ParseExpression,self).setResultsName(name,listAllMatches)
+        return ret
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        for e in self.exprs:
+            e.validate(tmp)
+        self.checkRecursion( [] )
+        
+    def copy(self):
+        ret = super(ParseExpression,self).copy()
+        ret.exprs = [e.copy() for e in self.exprs]
+        return ret
+
+class And(ParseExpression):
+    """
+    Requires all given C{ParseExpression}s to be found in the given order.
+    Expressions may be separated by whitespace.
+    May be constructed using the C{'+'} operator.
+    May also be constructed using the C{'-'} operator, which will suppress backtracking.
+
+    Example::
+        integer = Word(nums)
+        name_expr = OneOrMore(Word(alphas))
+
+        expr = And([integer("id"),name_expr("name"),integer("age")])
+        # more easily written as:
+        expr = integer("id") + name_expr("name") + integer("age")
+    """
+
+    class _ErrorStop(Empty):
+        def __init__(self, *args, **kwargs):
+            super(And._ErrorStop,self).__init__(*args, **kwargs)
+            self.name = '-'
+            self.leaveWhitespace()
+
+    def __init__( self, exprs, savelist = True ):
+        super(And,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.setWhitespaceChars( self.exprs[0].whiteChars )
+        self.skipWhitespace = self.exprs[0].skipWhitespace
+        self.callPreparse = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        # pass False as last arg to _parse for first element, since we already
+        # pre-parsed the string as part of our And pre-parsing
+        loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
+        errorStop = False
+        for e in self.exprs[1:]:
+            if isinstance(e, And._ErrorStop):
+                errorStop = True
+                continue
+            if errorStop:
+                try:
+                    loc, exprtokens = e._parse( instring, loc, doActions )
+                except ParseSyntaxException:
+                    raise
+                except ParseBaseException as pe:
+                    pe.__traceback__ = None
+                    raise ParseSyntaxException._from_exception(pe)
+                except IndexError:
+                    raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
+            else:
+                loc, exprtokens = e._parse( instring, loc, doActions )
+            if exprtokens or exprtokens.haskeys():
+                resultlist += exprtokens
+        return loc, resultlist
+
+    def __iadd__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #And( [ self, other ] )
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+            if not e.mayReturnEmpty:
+                break
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+
+class Or(ParseExpression):
+    """
+    Requires that at least one C{ParseExpression} is found.
+    If two expressions match, the expression that matches the longest string will be used.
+    May be constructed using the C{'^'} operator.
+
+    Example::
+        # construct Or using '^' operator
+        
+        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789"))
+    prints::
+        [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(Or,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        matches = []
+        for e in self.exprs:
+            try:
+                loc2 = e.tryParse( instring, loc )
+            except ParseException as err:
+                err.__traceback__ = None
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+            else:
+                # save match among all matches, to retry longest to shortest
+                matches.append((loc2, e))
+
+        if matches:
+            matches.sort(key=lambda x: -x[0])
+            for _,e in matches:
+                try:
+                    return e._parse( instring, loc, doActions )
+                except ParseException as err:
+                    err.__traceback__ = None
+                    if err.loc > maxExcLoc:
+                        maxException = err
+                        maxExcLoc = err.loc
+
+        if maxException is not None:
+            maxException.msg = self.errmsg
+            raise maxException
+        else:
+            raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+
+    def __ixor__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #Or( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class MatchFirst(ParseExpression):
+    """
+    Requires that at least one C{ParseExpression} is found.
+    If two expressions match, the first one listed is the one that will match.
+    May be constructed using the C{'|'} operator.
+
+    Example::
+        # construct MatchFirst using '|' operator
+        
+        # watch the order of expressions to match
+        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]
+
+        # put more selective expression first
+        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
+        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(MatchFirst,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        for e in self.exprs:
+            try:
+                ret = e._parse( instring, loc, doActions )
+                return ret
+            except ParseException as err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+
+        # only got here if no expression matched, raise exception for match that made it the furthest
+        else:
+            if maxException is not None:
+                maxException.msg = self.errmsg
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+    def __ior__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #MatchFirst( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class Each(ParseExpression):
+    """
+    Requires all given C{ParseExpression}s to be found, but in any order.
+    Expressions may be separated by whitespace.
+    May be constructed using the C{'&'} operator.
+
+    Example::
+        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
+        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
+        integer = Word(nums)
+        shape_attr = "shape:" + shape_type("shape")
+        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
+        color_attr = "color:" + color("color")
+        size_attr = "size:" + integer("size")
+
+        # use Each (using operator '&') to accept attributes in any order 
+        # (shape and posn are required, color and size are optional)
+        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)
+
+        shape_spec.runTests('''
+            shape: SQUARE color: BLACK posn: 100, 120
+            shape: CIRCLE size: 50 color: BLUE posn: 50,80
+            color:GREEN size:20 shape:TRIANGLE posn:20,40
+            '''
+            )
+    prints::
+        shape: SQUARE color: BLACK posn: 100, 120
+        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
+        - color: BLACK
+        - posn: ['100', ',', '120']
+          - x: 100
+          - y: 120
+        - shape: SQUARE
+
+
+        shape: CIRCLE size: 50 color: BLUE posn: 50,80
+        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
+        - color: BLUE
+        - posn: ['50', ',', '80']
+          - x: 50
+          - y: 80
+        - shape: CIRCLE
+        - size: 50
+
+
+        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
+        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
+        - color: GREEN
+        - posn: ['20', ',', '40']
+          - x: 20
+          - y: 40
+        - shape: TRIANGLE
+        - size: 20
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(Each,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.skipWhitespace = True
+        self.initExprGroups = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.initExprGroups:
+            self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional))
+            opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
+            opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)]
+            self.optionals = opt1 + opt2
+            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
+            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
+            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
+            self.required += self.multirequired
+            self.initExprGroups = False
+        tmpLoc = loc
+        tmpReqd = self.required[:]
+        tmpOpt  = self.optionals[:]
+        matchOrder = []
+
+        keepMatching = True
+        while keepMatching:
+            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
+            failed = []
+            for e in tmpExprs:
+                try:
+                    tmpLoc = e.tryParse( instring, tmpLoc )
+                except ParseException:
+                    failed.append(e)
+                else:
+                    matchOrder.append(self.opt1map.get(id(e),e))
+                    if e in tmpReqd:
+                        tmpReqd.remove(e)
+                    elif e in tmpOpt:
+                        tmpOpt.remove(e)
+            if len(failed) == len(tmpExprs):
+                keepMatching = False
+
+        if tmpReqd:
+            missing = ", ".join(_ustr(e) for e in tmpReqd)
+            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )
+
+        # add any unmatched Optionals, in case they have default values defined
+        matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt]
+
+        resultlist = []
+        for e in matchOrder:
+            loc,results = e._parse(instring,loc,doActions)
+            resultlist.append(results)
+
+        finalResults = sum(resultlist, ParseResults([]))
+        return loc, finalResults
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class ParseElementEnhance(ParserElement):
+    """
+    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(ParseElementEnhance,self).__init__(savelist)
+        if isinstance( expr, basestring ):
+            if issubclass(ParserElement._literalStringClass, Token):
+                expr = ParserElement._literalStringClass(expr)
+            else:
+                expr = ParserElement._literalStringClass(Literal(expr))
+        self.expr = expr
+        self.strRepr = None
+        if expr is not None:
+            self.mayIndexError = expr.mayIndexError
+            self.mayReturnEmpty = expr.mayReturnEmpty
+            self.setWhitespaceChars( expr.whiteChars )
+            self.skipWhitespace = expr.skipWhitespace
+            self.saveAsList = expr.saveAsList
+            self.callPreparse = expr.callPreparse
+            self.ignoreExprs.extend(expr.ignoreExprs)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr is not None:
+            return self.expr._parse( instring, loc, doActions, callPreParse=False )
+        else:
+            raise ParseException("",loc,self.errmsg,self)
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        self.expr = self.expr.copy()
+        if self.expr is not None:
+            self.expr.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseElementEnhance, self).ignore( other )
+                if self.expr is not None:
+                    self.expr.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseElementEnhance, self).ignore( other )
+            if self.expr is not None:
+                self.expr.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def streamline( self ):
+        super(ParseElementEnhance,self).streamline()
+        if self.expr is not None:
+            self.expr.streamline()
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        if self in parseElementList:
+            raise RecursiveGrammarException( parseElementList+[self] )
+        subRecCheckList = parseElementList[:] + [ self ]
+        if self.expr is not None:
+            self.expr.checkRecursion( subRecCheckList )
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        if self.expr is not None:
+            self.expr.validate(tmp)
+        self.checkRecursion( [] )
+
+    def __str__( self ):
+        try:
+            return super(ParseElementEnhance,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None and self.expr is not None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
+        return self.strRepr
+
+
+class FollowedBy(ParseElementEnhance):
+    """
+    Lookahead matching of the given parse expression.  C{FollowedBy}
+    does I{not} advance the parsing position within the input string, it only
+    verifies that the specified parse expression matches at the current
+    position.  C{FollowedBy} always returns a null token list.
+
+    Example::
+        # use FollowedBy to match a label only if it is followed by a ':'
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        
+        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
+    prints::
+        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
+    """
+    def __init__( self, expr ):
+        super(FollowedBy,self).__init__(expr)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self.expr.tryParse( instring, loc )
+        return loc, []
+
+
+class NotAny(ParseElementEnhance):
+    """
+    Lookahead to disallow matching with the given parse expression.  C{NotAny}
+    does I{not} advance the parsing position within the input string, it only
+    verifies that the specified parse expression does I{not} match at the current
+    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
+    always returns a null token list.  May be constructed using the '~' operator.
+
+    Example::
+        
+    """
+    def __init__( self, expr ):
+        super(NotAny,self).__init__(expr)
+        #~ self.leaveWhitespace()
+        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
+        self.mayReturnEmpty = True
+        self.errmsg = "Found unwanted token, "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr.canParseNext(instring, loc):
+            raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "~{" + _ustr(self.expr) + "}"
+
+        return self.strRepr
+
+class _MultipleMatch(ParseElementEnhance):
+    def __init__( self, expr, stopOn=None):
+        super(_MultipleMatch, self).__init__(expr)
+        self.saveAsList = True
+        ender = stopOn
+        if isinstance(ender, basestring):
+            ender = ParserElement._literalStringClass(ender)
+        self.not_ender = ~ender if ender is not None else None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self_expr_parse = self.expr._parse
+        self_skip_ignorables = self._skipIgnorables
+        check_ender = self.not_ender is not None
+        if check_ender:
+            try_not_ender = self.not_ender.tryParse
+        
+        # must be at least one (but first see if we are the stopOn sentinel;
+        # if so, fail)
+        if check_ender:
+            try_not_ender(instring, loc)
+        loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False )
+        try:
+            hasIgnoreExprs = (not not self.ignoreExprs)
+            while 1:
+                if check_ender:
+                    try_not_ender(instring, loc)
+                if hasIgnoreExprs:
+                    preloc = self_skip_ignorables( instring, loc )
+                else:
+                    preloc = loc
+                loc, tmptokens = self_expr_parse( instring, preloc, doActions )
+                if tmptokens or tmptokens.haskeys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+        
+class OneOrMore(_MultipleMatch):
+    """
+    Repetition of one or more of the given expression.
+    
+    Parameters:
+     - expr - expression that must match one or more times
+     - stopOn - (default=C{None}) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition 
+          expression)          
+
+    Example::
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: BLACK"
+        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]
+
+        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
+        
+        # could also be written as
+        (attr_expr * (1,)).parseString(text).pprint()
+    """
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + _ustr(self.expr) + "}..."
+
+        return self.strRepr
+
+class ZeroOrMore(_MultipleMatch):
+    """
+    Optional repetition of zero or more of the given expression.
+    
+    Parameters:
+     - expr - expression that must match zero or more times
+     - stopOn - (default=C{None}) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition 
+          expression)          
+
+    Example: similar to L{OneOrMore}
+    """
+    def __init__( self, expr, stopOn=None):
+        super(ZeroOrMore,self).__init__(expr, stopOn=stopOn)
+        self.mayReturnEmpty = True
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
+        except (ParseException,IndexError):
+            return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]..."
+
+        return self.strRepr
+
+class _NullToken(object):
+    def __bool__(self):
+        return False
+    __nonzero__ = __bool__
+    def __str__(self):
+        return ""
+
+_optionalNotMatched = _NullToken()
+class Optional(ParseElementEnhance):
+    """
+    Optional matching of the given expression.
+
+    Parameters:
+     - expr - expression that must match zero or more times
+     - default (optional) - value to be returned if the optional expression is not found.
+
+    Example::
+        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
+        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
+        zip.runTests('''
+            # traditional ZIP code
+            12345
+            
+            # ZIP+4 form
+            12101-0001
+            
+            # invalid ZIP
+            98765-
+            ''')
+    prints::
+        # traditional ZIP code
+        12345
+        ['12345']
+
+        # ZIP+4 form
+        12101-0001
+        ['12101-0001']
+
+        # invalid ZIP
+        98765-
+             ^
+        FAIL: Expected end of text (at char 5), (line:1, col:6)
+    """
+    def __init__( self, expr, default=_optionalNotMatched ):
+        super(Optional,self).__init__( expr, savelist=False )
+        self.saveAsList = self.expr.saveAsList
+        self.defaultValue = default
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+        except (ParseException,IndexError):
+            if self.defaultValue is not _optionalNotMatched:
+                if self.expr.resultsName:
+                    tokens = ParseResults([ self.defaultValue ])
+                    tokens[self.expr.resultsName] = self.defaultValue
+                else:
+                    tokens = [ self.defaultValue ]
+            else:
+                tokens = []
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]"
+
+        return self.strRepr
+
+class SkipTo(ParseElementEnhance):
+    """
+    Token for skipping over all undefined text until the matched expression is found.
+
+    Parameters:
+     - expr - target expression marking the end of the data to be skipped
+     - include - (default=C{False}) if True, the target expression is also parsed 
+          (the skipped text and target expression are returned as a 2-element list).
+     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
+          comments) that might contain false matches to the target expression
+     - failOn - (default=C{None}) define expressions that are not allowed to be 
+          included in the skipped test; if found before the target expression is found, 
+          the SkipTo is not a match
+
+    Example::
+        report = '''
+            Outstanding Issues Report - 1 Jan 2000
+
+               # | Severity | Description                               |  Days Open
+            -----+----------+-------------------------------------------+-----------
+             101 | Critical | Intermittent system crash                 |          6
+              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
+              79 | Minor    | System slow when running too many reports |         47
+            '''
+        integer = Word(nums)
+        SEP = Suppress('|')
+        # use SkipTo to simply match everything up until the next SEP
+        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
+        # - parse action will call token.strip() for each matched token, i.e., the description body
+        string_data = SkipTo(SEP, ignore=quotedString)
+        string_data.setParseAction(tokenMap(str.strip))
+        ticket_expr = (integer("issue_num") + SEP 
+                      + string_data("sev") + SEP 
+                      + string_data("desc") + SEP 
+                      + integer("days_open"))
+        
+        for tkt in ticket_expr.searchString(report):
+            print tkt.dump()
+    prints::
+        ['101', 'Critical', 'Intermittent system crash', '6']
+        - days_open: 6
+        - desc: Intermittent system crash
+        - issue_num: 101
+        - sev: Critical
+        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
+        - days_open: 14
+        - desc: Spelling error on Login ('log|n')
+        - issue_num: 94
+        - sev: Cosmetic
+        ['79', 'Minor', 'System slow when running too many reports', '47']
+        - days_open: 47
+        - desc: System slow when running too many reports
+        - issue_num: 79
+        - sev: Minor
+    """
+    def __init__( self, other, include=False, ignore=None, failOn=None ):
+        super( SkipTo, self ).__init__( other )
+        self.ignoreExpr = ignore
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.includeMatch = include
+        self.asList = False
+        if isinstance(failOn, basestring):
+            self.failOn = ParserElement._literalStringClass(failOn)
+        else:
+            self.failOn = failOn
+        self.errmsg = "No match found for "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        startloc = loc
+        instrlen = len(instring)
+        expr = self.expr
+        expr_parse = self.expr._parse
+        self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None
+        self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None
+        
+        tmploc = loc
+        while tmploc <= instrlen:
+            if self_failOn_canParseNext is not None:
+                # break if failOn expression matches
+                if self_failOn_canParseNext(instring, tmploc):
+                    break
+                    
+            if self_ignoreExpr_tryParse is not None:
+                # advance past ignore expressions
+                while 1:
+                    try:
+                        tmploc = self_ignoreExpr_tryParse(instring, tmploc)
+                    except ParseBaseException:
+                        break
+            
+            try:
+                expr_parse(instring, tmploc, doActions=False, callPreParse=False)
+            except (ParseException, IndexError):
+                # no match, advance loc in string
+                tmploc += 1
+            else:
+                # matched skipto expr, done
+                break
+
+        else:
+            # ran off the end of the input string without matching skipto expr, fail
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        # build up return values
+        loc = tmploc
+        skiptext = instring[startloc:loc]
+        skipresult = ParseResults(skiptext)
+        
+        if self.includeMatch:
+            loc, mat = expr_parse(instring,loc,doActions,callPreParse=False)
+            skipresult += mat
+
+        return loc, skipresult
+
+class Forward(ParseElementEnhance):
+    """
+    Forward declaration of an expression to be defined later -
+    used for recursive grammars, such as algebraic infix notation.
+    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.
+
+    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
+    Specifically, '|' has a lower precedence than '<<', so that::
+        fwdExpr << a | b | c
+    will actually be evaluated as::
+        (fwdExpr << a) | b | c
+    thereby leaving b and c out as parseable alternatives.  It is recommended that you
+    explicitly group the values inserted into the C{Forward}::
+        fwdExpr << (a | b | c)
+    Converting to use the '<<=' operator instead will avoid this problem.
+
+    See L{ParseResults.pprint} for an example of a recursive parser created using
+    C{Forward}.
+    """
+    def __init__( self, other=None ):
+        super(Forward,self).__init__( other, savelist=False )
+
+    def __lshift__( self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass(other)
+        self.expr = other
+        self.strRepr = None
+        self.mayIndexError = self.expr.mayIndexError
+        self.mayReturnEmpty = self.expr.mayReturnEmpty
+        self.setWhitespaceChars( self.expr.whiteChars )
+        self.skipWhitespace = self.expr.skipWhitespace
+        self.saveAsList = self.expr.saveAsList
+        self.ignoreExprs.extend(self.expr.ignoreExprs)
+        return self
+        
+    def __ilshift__(self, other):
+        return self << other
+    
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        return self
+
+    def streamline( self ):
+        if not self.streamlined:
+            self.streamlined = True
+            if self.expr is not None:
+                self.expr.streamline()
+        return self
+
+    def validate( self, validateTrace=[] ):
+        if self not in validateTrace:
+            tmp = validateTrace[:]+[self]
+            if self.expr is not None:
+                self.expr.validate(tmp)
+        self.checkRecursion([])
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+        return self.__class__.__name__ + ": ..."
+
+        # stubbed out for now - creates awful memory and perf issues
+        self._revertClass = self.__class__
+        self.__class__ = _ForwardNoRecurse
+        try:
+            if self.expr is not None:
+                retString = _ustr(self.expr)
+            else:
+                retString = "None"
+        finally:
+            self.__class__ = self._revertClass
+        return self.__class__.__name__ + ": " + retString
+
+    def copy(self):
+        if self.expr is not None:
+            return super(Forward,self).copy()
+        else:
+            ret = Forward()
+            ret <<= self
+            return ret
+
+class _ForwardNoRecurse(Forward):
+    def __str__( self ):
+        return "..."
+
+class TokenConverter(ParseElementEnhance):
+    """
+    Abstract subclass of C{ParseExpression}, for converting parsed results.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(TokenConverter,self).__init__( expr )#, savelist )
+        self.saveAsList = False
+
+class Combine(TokenConverter):
+    """
+    Converter to concatenate all matching tokens to a single string.
+    By default, the matching patterns must also be contiguous in the input string;
+    this can be disabled by specifying C{'adjacent=False'} in the constructor.
+
+    Example::
+        real = Word(nums) + '.' + Word(nums)
+        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
+        # will also erroneously match the following
+        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']
+
+        real = Combine(Word(nums) + '.' + Word(nums))
+        print(real.parseString('3.1416')) # -> ['3.1416']
+        # no match when there are internal spaces
+        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
+    """
+    def __init__( self, expr, joinString="", adjacent=True ):
+        super(Combine,self).__init__( expr )
+        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
+        if adjacent:
+            self.leaveWhitespace()
+        self.adjacent = adjacent
+        self.skipWhitespace = True
+        self.joinString = joinString
+        self.callPreparse = True
+
+    def ignore( self, other ):
+        if self.adjacent:
+            ParserElement.ignore(self, other)
+        else:
+            super( Combine, self).ignore( other )
+        return self
+
+    def postParse( self, instring, loc, tokenlist ):
+        retToks = tokenlist.copy()
+        del retToks[:]
+        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)
+
+        if self.resultsName and retToks.haskeys():
+            return [ retToks ]
+        else:
+            return retToks
+
+class Group(TokenConverter):
+    """
+    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.
+
+    Example::
+        ident = Word(alphas)
+        num = Word(nums)
+        term = ident | num
+        func = ident + Optional(delimitedList(term))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']
+
+        func = ident + Group(Optional(delimitedList(term)))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
+    """
+    def __init__( self, expr ):
+        super(Group,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        return [ tokenlist ]
+
+class Dict(TokenConverter):
+    """
+    Converter to return a repetitive expression as a list, but also as a dictionary.
+    Each element can also be referenced using the first token in the expression as its key.
+    Useful for tabular report scraping when the first column can be used as a item key.
+
+    Example::
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        
+        # print attributes as plain groups
+        print(OneOrMore(attr_expr).parseString(text).dump())
+        
+        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
+        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
+        print(result.dump())
+        
+        # access named fields as dict entries, or output as dict
+        print(result['shape'])        
+        print(result.asDict())
+    prints::
+        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']
+
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
+    See more examples at L{ParseResults} of accessing fields by results name.
+    """
+    def __init__( self, expr ):
+        super(Dict,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        for i,tok in enumerate(tokenlist):
+            if len(tok) == 0:
+                continue
+            ikey = tok[0]
+            if isinstance(ikey,int):
+                ikey = _ustr(tok[0]).strip()
+            if len(tok)==1:
+                tokenlist[ikey] = _ParseResultsWithOffset("",i)
+            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
+                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
+            else:
+                dictvalue = tok.copy() #ParseResults(i)
+                del dictvalue[0]
+                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()):
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
+                else:
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)
+
+        if self.resultsName:
+            return [ tokenlist ]
+        else:
+            return tokenlist
+
+
+class Suppress(TokenConverter):
+    """
+    Converter for ignoring the results of a parsed expression.
+
+    Example::
+        source = "a, b, c,d"
+        wd = Word(alphas)
+        wd_list1 = wd + ZeroOrMore(',' + wd)
+        print(wd_list1.parseString(source))
+
+        # often, delimiters that are useful during parsing are just in the
+        # way afterward - use Suppress to keep them out of the parsed output
+        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
+        print(wd_list2.parseString(source))
+    prints::
+        ['a', ',', 'b', ',', 'c', ',', 'd']
+        ['a', 'b', 'c', 'd']
+    (See also L{delimitedList}.)
+    """
+    def postParse( self, instring, loc, tokenlist ):
+        return []
+
+    def suppress( self ):
+        return self
+
+
+class OnlyOnce(object):
+    """
+    Wrapper for parse actions, to ensure they are only called once.
+    """
+    def __init__(self, methodCall):
+        self.callable = _trim_arity(methodCall)
+        self.called = False
+    def __call__(self,s,l,t):
+        if not self.called:
+            results = self.callable(s,l,t)
+            self.called = True
+            return results
+        raise ParseException(s,l,"")
+    def reset(self):
+        self.called = False
+
+def traceParseAction(f):
+    """
+    Decorator for debugging parse actions. 
+    
+    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
+    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.
+
+    Example::
+        wd = Word(alphas)
+
+        @traceParseAction
+        def remove_duplicate_chars(tokens):
+            return ''.join(sorted(set(''.join(tokens))))
+
+        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
+        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
+    prints::
+        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
+        <<leaving remove_duplicate_chars (ret: 'dfjkls')
+        ['dfjkls']
+    """
+    f = _trim_arity(f)
+    def z(*paArgs):
+        thisFunc = f.__name__
+        s,l,t = paArgs[-3:]
+        if len(paArgs)>3:
+            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
+        sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) )
+        try:
+            ret = f(*paArgs)
+        except Exception as exc:
+            sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) )
+            raise
+        sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) )
+        return ret
+    try:
+        z.__name__ = f.__name__
+    except AttributeError:
+        pass
+    return z
+
+#
+# global helpers
+#
+def delimitedList( expr, delim=",", combine=False ):
+    """
+    Helper to define a delimited list of expressions - the delimiter defaults to ','.
+    By default, the list elements and delimiters can have intervening whitespace, and
+    comments, but this can be overridden by passing C{combine=True} in the constructor.
+    If C{combine} is set to C{True}, the matching tokens are returned as a single token
+    string, with the delimiters included; otherwise, the matching tokens are returned
+    as a list of tokens, with the delimiters suppressed.
+
+    Example::
+        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
+        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
+    """
+    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
+    if combine:
+        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
+    else:
+        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)
+
+def countedArray( expr, intExpr=None ):
+    """
+    Helper to define a counted list of expressions.
+    This helper defines a pattern of the form::
+        integer expr expr expr...
+    where the leading integer tells how many expr expressions follow.
+    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
+    
+    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.
+
+    Example::
+        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']
+
+        # in this parser, the leading integer value is given in binary,
+        # '10' indicating that 2 values are in the array
+        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
+        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
+    """
+    arrayExpr = Forward()
+    def countFieldParseAction(s,l,t):
+        n = t[0]
+        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
+        return []
+    if intExpr is None:
+        intExpr = Word(nums).setParseAction(lambda t:int(t[0]))
+    else:
+        intExpr = intExpr.copy()
+    intExpr.setName("arrayLen")
+    intExpr.addParseAction(countFieldParseAction, callDuringTry=True)
+    return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...')
+
+def _flatten(L):
+    ret = []
+    for i in L:
+        if isinstance(i,list):
+            ret.extend(_flatten(i))
+        else:
+            ret.append(i)
+    return ret
+
+def matchPreviousLiteral(expr):
+    """
+    Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks
+    for a 'repeat' of a previous expression.  For example::
+        first = Word(nums)
+        second = matchPreviousLiteral(first)
+        matchExpr = first + ":" + second
+    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
+    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
+    If this is not desired, use C{matchPreviousExpr}.
+    Do I{not} use with packrat parsing enabled.
+    """
+    rep = Forward()
+    def copyTokenToRepeater(s,l,t):
+        if t:
+            if len(t) == 1:
+                rep << t[0]
+            else:
+                # flatten t tokens
+                tflat = _flatten(t.asList())
+                rep << And(Literal(tt) for tt in tflat)
+        else:
+            rep << Empty()
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def matchPreviousExpr(expr):
+    """
+    Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks
+    for a 'repeat' of a previous expression.  For example::
+        first = Word(nums)
+        second = matchPreviousExpr(first)
+        matchExpr = first + ":" + second
+    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
+    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
+    the expressions are evaluated first, and then compared, so
+    C{"1"} is compared with C{"10"}.
+    Do I{not} use with packrat parsing enabled.
+    """
+    rep = Forward()
+    e2 = expr.copy()
+    rep <<= e2
+    def copyTokenToRepeater(s,l,t):
+        matchTokens = _flatten(t.asList())
+        def mustMatchTheseTokens(s,l,t):
+            theseTokens = _flatten(t.asList())
+            if  theseTokens != matchTokens:
+                raise ParseException("",0,"")
+        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def _escapeRegexRangeChars(s):
+    #~  escape these chars: ^-]
+    for c in r"\^-]":
+        s = s.replace(c,_bslash+c)
+    s = s.replace("\n",r"\n")
+    s = s.replace("\t",r"\t")
+    return _ustr(s)
+
+def oneOf( strs, caseless=False, useRegex=True ):
+    """
+    Helper to quickly define a set of alternative Literals, and makes sure to do
+    longest-first testing when there is a conflict, regardless of the input order,
+    but returns a C{L{MatchFirst}} for best performance.
+
+    Parameters:
+     - strs - a string of space-delimited literals, or a collection of string literals
+     - caseless - (default=C{False}) - treat all literals as caseless
+     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
+          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
+          if creating a C{Regex} raises an exception)
+
+    Example::
+        comp_oper = oneOf("< = > <= >= !=")
+        var = Word(alphas)
+        number = Word(nums)
+        term = var | number
+        comparison_expr = term + comp_oper + term
+        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
+    prints::
+        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
+    """
+    if caseless:
+        isequal = ( lambda a,b: a.upper() == b.upper() )
+        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
+        parseElementClass = CaselessLiteral
+    else:
+        isequal = ( lambda a,b: a == b )
+        masks = ( lambda a,b: b.startswith(a) )
+        parseElementClass = Literal
+
+    symbols = []
+    if isinstance(strs,basestring):
+        symbols = strs.split()
+    elif isinstance(strs, Iterable):
+        symbols = list(strs)
+    else:
+        warnings.warn("Invalid argument to oneOf, expected string or iterable",
+                SyntaxWarning, stacklevel=2)
+    if not symbols:
+        return NoMatch()
+
+    i = 0
+    while i < len(symbols)-1:
+        cur = symbols[i]
+        for j,other in enumerate(symbols[i+1:]):
+            if ( isequal(other, cur) ):
+                del symbols[i+j+1]
+                break
+            elif ( masks(cur, other) ):
+                del symbols[i+j+1]
+                symbols.insert(i,other)
+                cur = other
+                break
+        else:
+            i += 1
+
+    if not caseless and useRegex:
+        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
+        try:
+            if len(symbols)==len("".join(symbols)):
+                return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols))
+            else:
+                return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols))
+        except Exception:
+            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
+                    SyntaxWarning, stacklevel=2)
+
+
+    # last resort, just use MatchFirst
+    return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols))
+
+def dictOf( key, value ):
+    """
+    Helper to easily and clearly define a dictionary by specifying the respective patterns
+    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
+    in the proper order.  The key pattern can include delimiting markers or punctuation,
+    as long as they are suppressed, thereby leaving the significant key text.  The value
+    pattern can include named results, so that the C{Dict} results can include named token
+    fields.
+
+    Example::
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        print(OneOrMore(attr_expr).parseString(text).dump())
+        
+        attr_label = label
+        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)
+
+        # similar to Dict, but simpler call format
+        result = dictOf(attr_label, attr_value).parseString(text)
+        print(result.dump())
+        print(result['shape'])
+        print(result.shape)  # object attribute access works too
+        print(result.asDict())
+    prints::
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        SQUARE
+        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
+    """
+    return Dict( ZeroOrMore( Group ( key + value ) ) )
+
+def originalTextFor(expr, asString=True):
+    """
+    Helper to return the original, untokenized text for a given expression.  Useful to
+    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
+    revert separate tokens with intervening whitespace back to the original matching
+    input text. By default, returns astring containing the original parsed text.  
+       
+    If the optional C{asString} argument is passed as C{False}, then the return value is a 
+    C{L{ParseResults}} containing any results names that were originally matched, and a 
+    single token containing the original matched text from the input string.  So if 
+    the expression passed to C{L{originalTextFor}} contains expressions with defined
+    results names, you must set C{asString} to C{False} if you want to preserve those
+    results name values.
+
+    Example::
+        src = "this is test <b> bold <i>text</i> </b> normal text "
+        for tag in ("b","i"):
+            opener,closer = makeHTMLTags(tag)
+            patt = originalTextFor(opener + SkipTo(closer) + closer)
+            print(patt.searchString(src)[0])
+    prints::
+        ['<b> bold <i>text</i> </b>']
+        ['<i>text</i>']
+    """
+    locMarker = Empty().setParseAction(lambda s,loc,t: loc)
+    endlocMarker = locMarker.copy()
+    endlocMarker.callPreparse = False
+    matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
+    if asString:
+        extractText = lambda s,l,t: s[t._original_start:t._original_end]
+    else:
+        def extractText(s,l,t):
+            t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]]
+    matchExpr.setParseAction(extractText)
+    matchExpr.ignoreExprs = expr.ignoreExprs
+    return matchExpr
+
+def ungroup(expr): 
+    """
+    Helper to undo pyparsing's default grouping of And expressions, even
+    if all but one are non-empty.
+    """
+    return TokenConverter(expr).setParseAction(lambda t:t[0])
+
+def locatedExpr(expr):
+    """
+    Helper to decorate a returned token with its starting and ending locations in the input string.
+    This helper adds the following results names:
+     - locn_start = location where matched expression begins
+     - locn_end = location where matched expression ends
+     - value = the actual parsed results
+
+    Be careful if the input text contains C{<TAB>} characters, you may want to call
+    C{L{ParserElement.parseWithTabs}}
+
+    Example::
+        wd = Word(alphas)
+        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
+            print(match)
+    prints::
+        [[0, 'ljsdf', 5]]
+        [[8, 'lksdjjf', 15]]
+        [[18, 'lkkjj', 23]]
+    """
+    locator = Empty().setParseAction(lambda s,l,t: l)
+    return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))
+
+
+# convenience constants for positional expressions
+empty       = Empty().setName("empty")
+lineStart   = LineStart().setName("lineStart")
+lineEnd     = LineEnd().setName("lineEnd")
+stringStart = StringStart().setName("stringStart")
+stringEnd   = StringEnd().setName("stringEnd")
+
+_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
+_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16)))
+_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8)))
+_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1)
+_charRange = Group(_singleChar + Suppress("-") + _singleChar)
+_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"
+
+def srange(s):
+    r"""
+    Helper to easily define string ranges for use in Word construction.  Borrows
+    syntax from regexp '[]' string range definitions::
+        srange("[0-9]")   -> "0123456789"
+        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
+        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
+    The input string must be enclosed in []'s, and the returned string is the expanded
+    character set joined into a single string.
+    The values enclosed in the []'s may be:
+     - a single character
+     - an escaped character with a leading backslash (such as C{\-} or C{\]})
+     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
+         (C{\0x##} is also supported for backwards compatibility) 
+     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
+     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
+     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
+    """
+    _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1))
+    try:
+        return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body)
+    except Exception:
+        return ""
+
+def matchOnlyAtCol(n):
+    """
+    Helper method for defining parse actions that require matching at a specific
+    column in the input text.
+    """
+    def verifyCol(strg,locn,toks):
+        if col(locn,strg) != n:
+            raise ParseException(strg,locn,"matched token not at column %d" % n)
+    return verifyCol
+
+def replaceWith(replStr):
+    """
+    Helper method for common parse actions that simply return a literal value.  Especially
+    useful when used with C{L{transformString<ParserElement.transformString>}()}.
+
+    Example::
+        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
+        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
+        term = na | num
+        
+        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
+    """
+    return lambda s,l,t: [replStr]
+
+def removeQuotes(s,l,t):
+    """
+    Helper parse action for removing quotation marks from parsed quoted strings.
+
+    Example::
+        # by default, quotation marks are included in parsed results
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]
+
+        # use removeQuotes to strip quotation marks from parsed results
+        quotedString.setParseAction(removeQuotes)
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
+    """
+    return t[0][1:-1]
+
+def tokenMap(func, *args):
+    """
+    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
+    args are passed, they are forwarded to the given function as additional arguments after
+    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
+    parsed data to an integer using base 16.
+
+    Example (compare the last to example in L{ParserElement.transformString}::
+        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
+        hex_ints.runTests('''
+            00 11 22 aa FF 0a 0d 1a
+            ''')
+        
+        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
+        OneOrMore(upperword).runTests('''
+            my kingdom for a horse
+            ''')
+
+        wd = Word(alphas).setParseAction(tokenMap(str.title))
+        OneOrMore(wd).setParseAction(' '.join).runTests('''
+            now is the winter of our discontent made glorious summer by this sun of york
+            ''')
+    prints::
+        00 11 22 aa FF 0a 0d 1a
+        [0, 17, 34, 170, 255, 10, 13, 26]
+
+        my kingdom for a horse
+        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']
+
+        now is the winter of our discontent made glorious summer by this sun of york
+        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
+    """
+    def pa(s,l,t):
+        return [func(tokn, *args) for tokn in t]
+
+    try:
+        func_name = getattr(func, '__name__', 
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    pa.__name__ = func_name
+
+    return pa
+
+upcaseTokens = tokenMap(lambda t: _ustr(t).upper())
+"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}"""
+
+downcaseTokens = tokenMap(lambda t: _ustr(t).lower())
+"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}"""
+    
+def _makeTags(tagStr, xml):
+    """Internal helper to construct opening and closing tag expressions, given a tag name"""
+    if isinstance(tagStr,basestring):
+        resname = tagStr
+        tagStr = Keyword(tagStr, caseless=not xml)
+    else:
+        resname = tagStr.name
+
+    tagAttrName = Word(alphas,alphanums+"_-:")
+    if (xml):
+        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
+        openTag = Suppress("<") + tagStr("tag") + \
+                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    else:
+        printablesLessRAbrack = "".join(c for c in printables if c not in ">")
+        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
+        openTag = Suppress("<") + tagStr("tag") + \
+                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
+                Optional( Suppress("=") + tagAttrValue ) ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    closeTag = Combine(_L("</") + tagStr + ">")
+
+    openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname)
+    closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname)
+    openTag.tag = resname
+    closeTag.tag = resname
+    return openTag, closeTag
+
+def makeHTMLTags(tagStr):
+    """
+    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
+    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.
+
+    Example::
+        text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
+        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
+        a,a_end = makeHTMLTags("A")
+        link_expr = a + SkipTo(a_end)("link_text") + a_end
+        
+        for link in link_expr.searchString(text):
+            # attributes in the <A> tag (like "href" shown here) are also accessible as named results
+            print(link.link_text, '->', link.href)
+    prints::
+        pyparsing -> http://pyparsing.wikispaces.com
+    """
+    return _makeTags( tagStr, False )
+
+def makeXMLTags(tagStr):
+    """
+    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
+    tags only in the given upper/lower case.
+
+    Example: similar to L{makeHTMLTags}
+    """
+    return _makeTags( tagStr, True )
+
+def withAttribute(*args,**attrDict):
+    """
+    Helper to create a validating parse action to be used with start tags created
+    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
+    with a required attribute value, to avoid false matches on common tags such as
+    C{<TD>} or C{<DIV>}.
+
+    Call C{withAttribute} with a series of attribute names and values. Specify the list
+    of filter attributes names and values as:
+     - keyword arguments, as in C{(align="right")}, or
+     - as an explicit dict with C{**} operator, when an attribute name is also a Python
+          reserved word, as in C{**{"class":"Customer", "align":"right"}}
+     - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
+    For attribute names with a namespace prefix, you must use the second form.  Attribute
+    names are matched insensitive to upper/lower case.
+       
+    If just testing for C{class} (with or without a namespace), use C{L{withClass}}.
+
+    To verify that the attribute exists, but without specifying a value, pass
+    C{withAttribute.ANY_VALUE} as the value.
+
+    Example::
+        html = '''
+            <div>
+            Some text
+            <div type="grid">1 4 0 1 0</div>
+            <div type="graph">1,3 2,3 1,1</div>
+            <div>this has no type</div>
+            </div>
+                
+        '''
+        div,div_end = makeHTMLTags("div")
+
+        # only match div tag having a type attribute with value "grid"
+        div_grid = div().setParseAction(withAttribute(type="grid"))
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+        
+        # construct a match with any div tag having a type attribute, regardless of the value
+        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+    prints::
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    if args:
+        attrs = args[:]
+    else:
+        attrs = attrDict.items()
+    attrs = [(k,v) for k,v in attrs]
+    def pa(s,l,tokens):
+        for attrName,attrValue in attrs:
+            if attrName not in tokens:
+                raise ParseException(s,l,"no matching attribute " + attrName)
+            if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue:
+                raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" %
+                                            (attrName, tokens[attrName], attrValue))
+    return pa
+withAttribute.ANY_VALUE = object()
+
+def withClass(classname, namespace=''):
+    """
+    Simplified version of C{L{withAttribute}} when matching on a div class - made
+    difficult because C{class} is a reserved word in Python.
+
+    Example::
+        html = '''
+            <div>
+            Some text
+            <div class="grid">1 4 0 1 0</div>
+            <div class="graph">1,3 2,3 1,1</div>
+            <div>this &lt;div&gt; has no class</div>
+            </div>
+                
+        '''
+        div,div_end = makeHTMLTags("div")
+        div_grid = div().setParseAction(withClass("grid"))
+        
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+        
+        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+    prints::
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    classattr = "%s:class" % namespace if namespace else "class"
+    return withAttribute(**{classattr : classname})        
+
+opAssoc = _Constants()
+opAssoc.LEFT = object()
+opAssoc.RIGHT = object()
+
+def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ):
+    """
+    Helper method for constructing grammars of expressions made up of
+    operators working in a precedence hierarchy.  Operators may be unary or
+    binary, left- or right-associative.  Parse actions can also be attached
+    to operator expressions. The generated parser will also recognize the use 
+    of parentheses to override operator precedences (see example below).
+    
+    Note: if you define a deep operator list, you may see performance issues
+    when using infixNotation. See L{ParserElement.enablePackrat} for a
+    mechanism to potentially improve your parser performance.
+
+    Parameters:
+     - baseExpr - expression representing the most basic element for the nested
+     - opList - list of tuples, one for each operator precedence level in the
+      expression grammar; each tuple is of the form
+      (opExpr, numTerms, rightLeftAssoc, parseAction), where:
+       - opExpr is the pyparsing expression for the operator;
+          may also be a string, which will be converted to a Literal;
+          if numTerms is 3, opExpr is a tuple of two expressions, for the
+          two operators separating the 3 terms
+       - numTerms is the number of terms for this operator (must
+          be 1, 2, or 3)
+       - rightLeftAssoc is the indicator whether the operator is
+          right or left associative, using the pyparsing-defined
+          constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}.
+       - parseAction is the parse action to be associated with
+          expressions matching this operator expression (the
+          parse action tuple member may be omitted); if the parse action
+          is passed a tuple or list of functions, this is equivalent to
+          calling C{setParseAction(*fn)} (L{ParserElement.setParseAction})
+     - lpar - expression for matching left-parentheses (default=C{Suppress('(')})
+     - rpar - expression for matching right-parentheses (default=C{Suppress(')')})
+
+    Example::
+        # simple example of four-function arithmetic with ints and variable names
+        integer = pyparsing_common.signed_integer
+        varname = pyparsing_common.identifier 
+        
+        arith_expr = infixNotation(integer | varname,
+            [
+            ('-', 1, opAssoc.RIGHT),
+            (oneOf('* /'), 2, opAssoc.LEFT),
+            (oneOf('+ -'), 2, opAssoc.LEFT),
+            ])
+        
+        arith_expr.runTests('''
+            5+3*6
+            (5+3)*6
+            -2--11
+            ''', fullDump=False)
+    prints::
+        5+3*6
+        [[5, '+', [3, '*', 6]]]
+
+        (5+3)*6
+        [[[5, '+', 3], '*', 6]]
+
+        -2--11
+        [[['-', 2], '-', ['-', 11]]]
+    """
+    ret = Forward()
+    lastExpr = baseExpr | ( lpar + ret + rpar )
+    for i,operDef in enumerate(opList):
+        opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4]
+        termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr
+        if arity == 3:
+            if opExpr is None or len(opExpr) != 2:
+                raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions")
+            opExpr1, opExpr2 = opExpr
+        thisExpr = Forward().setName(termName)
+        if rightLeftAssoc == opAssoc.LEFT:
+            if arity == 1:
+                matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \
+                            Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        elif rightLeftAssoc == opAssoc.RIGHT:
+            if arity == 1:
+                # try to avoid LR with this extra test
+                if not isinstance(opExpr, Optional):
+                    opExpr = Optional(opExpr)
+                matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \
+                            Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        else:
+            raise ValueError("operator must indicate right or left associativity")
+        if pa:
+            if isinstance(pa, (tuple, list)):
+                matchExpr.setParseAction(*pa)
+            else:
+                matchExpr.setParseAction(pa)
+        thisExpr <<= ( matchExpr.setName(termName) | lastExpr )
+        lastExpr = thisExpr
+    ret <<= lastExpr
+    return ret
+
+operatorPrecedence = infixNotation
+"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release."""
+
+dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes")
+sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes")
+quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'|
+                       Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes")
+unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal")
+
+def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
+    """
+    Helper method for defining nested lists enclosed in opening and closing
+    delimiters ("(" and ")" are the default).
+
+    Parameters:
+     - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression
+     - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression
+     - content - expression for items within the nested lists (default=C{None})
+     - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString})
+
+    If an expression is not provided for the content argument, the nested
+    expression will capture all whitespace-delimited content between delimiters
+    as a list of separate values.
+
+    Use the C{ignoreExpr} argument to define expressions that may contain
+    opening or closing characters that should not be treated as opening
+    or closing characters for nesting, such as quotedString or a comment
+    expression.  Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}.
+    The default is L{quotedString}, but if no expressions are to be ignored,
+    then pass C{None} for this argument.
+
+    Example::
+        data_type = oneOf("void int short long char float double")
+        decl_data_type = Combine(data_type + Optional(Word('*')))
+        ident = Word(alphas+'_', alphanums+'_')
+        number = pyparsing_common.number
+        arg = Group(decl_data_type + ident)
+        LPAR,RPAR = map(Suppress, "()")
+
+        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))
+
+        c_function = (decl_data_type("type") 
+                      + ident("name")
+                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR 
+                      + code_body("body"))
+        c_function.ignore(cStyleComment)
+        
+        source_code = '''
+            int is_odd(int x) { 
+                return (x%2); 
+            }
+                
+            int dec_to_hex(char hchar) { 
+                if (hchar >= '0' && hchar <= '9') { 
+                    return (ord(hchar)-ord('0')); 
+                } else { 
+                    return (10+ord(hchar)-ord('A'));
+                } 
+            }
+        '''
+        for func in c_function.searchString(source_code):
+            print("%(name)s (%(type)s) args: %(args)s" % func)
+
+    prints::
+        is_odd (int) args: [['int', 'x']]
+        dec_to_hex (int) args: [['char', 'hchar']]
+    """
+    if opener == closer:
+        raise ValueError("opening and closing strings cannot be the same")
+    if content is None:
+        if isinstance(opener,basestring) and isinstance(closer,basestring):
+            if len(opener) == 1 and len(closer)==1:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr +
+                                    CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS
+                                ).setParseAction(lambda t:t[0].strip()))
+            else:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr + 
+                                    ~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+        else:
+            raise ValueError("opening and closing arguments must be strings if no content expression is given")
+    ret = Forward()
+    if ignoreExpr is not None:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) )
+    else:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content )  + Suppress(closer) )
+    ret.setName('nested %s%s expression' % (opener,closer))
+    return ret
+
+def indentedBlock(blockStatementExpr, indentStack, indent=True):
+    """
+    Helper method for defining space-delimited indentation blocks, such as
+    those used to define block statements in Python source code.
+
+    Parameters:
+     - blockStatementExpr - expression defining syntax of statement that
+            is repeated within the indented block
+     - indentStack - list created by caller to manage indentation stack
+            (multiple statementWithIndentedBlock expressions within a single grammar
+            should share a common indentStack)
+     - indent - boolean indicating whether block must be indented beyond the
+            the current level; set to False for block of left-most statements
+            (default=C{True})
+
+    A valid block must contain at least one C{blockStatement}.
+
+    Example::
+        data = '''
+        def A(z):
+          A1
+          B = 100
+          G = A2
+          A2
+          A3
+        B
+        def BB(a,b,c):
+          BB1
+          def BBA():
+            bba1
+            bba2
+            bba3
+        C
+        D
+        def spam(x,y):
+             def eggs(z):
+                 pass
+        '''
+
+
+        indentStack = [1]
+        stmt = Forward()
+
+        identifier = Word(alphas, alphanums)
+        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
+        func_body = indentedBlock(stmt, indentStack)
+        funcDef = Group( funcDecl + func_body )
+
+        rvalue = Forward()
+        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
+        rvalue << (funcCall | identifier | Word(nums))
+        assignment = Group(identifier + "=" + rvalue)
+        stmt << ( funcDef | assignment | identifier )
+
+        module_body = OneOrMore(stmt)
+
+        parseTree = module_body.parseString(data)
+        parseTree.pprint()
+    prints::
+        [['def',
+          'A',
+          ['(', 'z', ')'],
+          ':',
+          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
+         'B',
+         ['def',
+          'BB',
+          ['(', 'a', 'b', 'c', ')'],
+          ':',
+          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
+         'C',
+         'D',
+         ['def',
+          'spam',
+          ['(', 'x', 'y', ')'],
+          ':',
+          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] 
+    """
+    def checkPeerIndent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if curCol != indentStack[-1]:
+            if curCol > indentStack[-1]:
+                raise ParseFatalException(s,l,"illegal nesting")
+            raise ParseException(s,l,"not a peer entry")
+
+    def checkSubIndent(s,l,t):
+        curCol = col(l,s)
+        if curCol > indentStack[-1]:
+            indentStack.append( curCol )
+        else:
+            raise ParseException(s,l,"not a subentry")
+
+    def checkUnindent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]):
+            raise ParseException(s,l,"not an unindent")
+        indentStack.pop()
+
+    NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress())
+    INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT')
+    PEER   = Empty().setParseAction(checkPeerIndent).setName('')
+    UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT')
+    if indent:
+        smExpr = Group( Optional(NL) +
+            #~ FollowedBy(blockStatementExpr) +
+            INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT)
+    else:
+        smExpr = Group( Optional(NL) +
+            (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) )
+    blockStatementExpr.ignore(_bslash + LineEnd())
+    return smExpr.setName('indented block')
+
+alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
+punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")
+
+anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag'))
+_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\''))
+commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity")
+def replaceHTMLEntity(t):
+    """Helper parser action to replace common HTML entities with their special characters"""
+    return _htmlEntityMap.get(t.entity)
+
+# it's easy to get these comment structures wrong - they're very common, so may as well make them available
+cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment")
+"Comment of the form C{/* ... */}"
+
+htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment")
+"Comment of the form C{<!-- ... -->}"
+
+restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line")
+dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment")
+"Comment of the form C{// ... (to end of line)}"
+
+cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment")
+"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}"
+
+javaStyleComment = cppStyleComment
+"Same as C{L{cppStyleComment}}"
+
+pythonStyleComment = Regex(r"#.*").setName("Python style comment")
+"Comment of the form C{# ... (to end of line)}"
+
+_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') +
+                                  Optional( Word(" \t") +
+                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
+commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList")
+"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas.
+   This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}."""
+
+# some other useful expressions - using lower-case class name since we are really using this as a namespace
+class pyparsing_common:
+    """
+    Here are some common low-level expressions that may be useful in jump-starting parser development:
+     - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>})
+     - common L{programming identifiers<identifier>}
+     - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>})
+     - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>}
+     - L{UUID<uuid>}
+     - L{comma-separated list<comma_separated_list>}
+    Parse actions:
+     - C{L{convertToInteger}}
+     - C{L{convertToFloat}}
+     - C{L{convertToDate}}
+     - C{L{convertToDatetime}}
+     - C{L{stripHTMLTags}}
+     - C{L{upcaseTokens}}
+     - C{L{downcaseTokens}}
+
+    Example::
+        pyparsing_common.number.runTests('''
+            # any int or real number, returned as the appropriate type
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.fnumber.runTests('''
+            # any int or real number, returned as float
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.hex_integer.runTests('''
+            # hex numbers
+            100
+            FF
+            ''')
+
+        pyparsing_common.fraction.runTests('''
+            # fractions
+            1/2
+            -3/4
+            ''')
+
+        pyparsing_common.mixed_integer.runTests('''
+            # mixed fractions
+            1
+            1/2
+            -3/4
+            1-3/4
+            ''')
+
+        import uuid
+        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+        pyparsing_common.uuid.runTests('''
+            # uuid
+            12345678-1234-5678-1234-567812345678
+            ''')
+    prints::
+        # any int or real number, returned as the appropriate type
+        100
+        [100]
+
+        -100
+        [-100]
+
+        +100
+        [100]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # any int or real number, returned as float
+        100
+        [100.0]
+
+        -100
+        [-100.0]
+
+        +100
+        [100.0]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # hex numbers
+        100
+        [256]
+
+        FF
+        [255]
+
+        # fractions
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        # mixed fractions
+        1
+        [1]
+
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        1-3/4
+        [1.75]
+
+        # uuid
+        12345678-1234-5678-1234-567812345678
+        [UUID('12345678-1234-5678-1234-567812345678')]
+    """
+
+    convertToInteger = tokenMap(int)
+    """
+    Parse action for converting parsed integers to Python int
+    """
+
+    convertToFloat = tokenMap(float)
+    """
+    Parse action for converting parsed numbers to Python float
+    """
+
+    integer = Word(nums).setName("integer").setParseAction(convertToInteger)
+    """expression that parses an unsigned integer, returns an int"""
+
+    hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16))
+    """expression that parses a hexadecimal integer, returns an int"""
+
+    signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger)
+    """expression that parses an integer with optional leading sign, returns an int"""
+
+    fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction")
+    """fractional expression of an integer divided by an integer, returns a float"""
+    fraction.addParseAction(lambda t: t[0]/t[-1])
+
+    mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction")
+    """mixed integer of the form 'integer - fraction', with optional leading integer, returns float"""
+    mixed_integer.addParseAction(sum)
+
+    real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat)
+    """expression that parses a floating point number and returns a float"""
+
+    sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat)
+    """expression that parses a floating point number with optional scientific notation and returns a float"""
+
+    # streamlining this expression makes the docs nicer-looking
+    number = (sci_real | real | signed_integer).streamline()
+    """any numeric expression, returns the corresponding Python type"""
+
+    fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat)
+    """any int or real number, returned as float"""
+    
+    identifier = Word(alphas+'_', alphanums+'_').setName("identifier")
+    """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')"""
+    
+    ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address")
+    "IPv4 address (C{0.0.0.0 - 255.255.255.255})"
+
+    _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer")
+    _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address")
+    _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address")
+    _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8)
+    _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address")
+    ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address")
+    "IPv6 address (long, short, or mixed form)"
+    
+    mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address")
+    "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)"
+
+    @staticmethod
+    def convertToDate(fmt="%Y-%m-%d"):
+        """
+        Helper to create a parse action for converting parsed date string to Python datetime.date
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"})
+
+        Example::
+            date_expr = pyparsing_common.iso8601_date.copy()
+            date_expr.setParseAction(pyparsing_common.convertToDate())
+            print(date_expr.parseString("1999-12-31"))
+        prints::
+            [datetime.date(1999, 12, 31)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt).date()
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    @staticmethod
+    def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"):
+        """
+        Helper to create a parse action for converting parsed datetime string to Python datetime.datetime
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"})
+
+        Example::
+            dt_expr = pyparsing_common.iso8601_datetime.copy()
+            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
+            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
+        prints::
+            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt)
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date")
+    "ISO8601 date (C{yyyy-mm-dd})"
+
+    iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime")
+    "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}"
+
+    uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID")
+    "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})"
+
+    _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress()
+    @staticmethod
+    def stripHTMLTags(s, l, tokens):
+        """
+        Parse action to remove HTML tags from web page HTML source
+
+        Example::
+            # strip HTML links from normal text 
+            text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
+            td,td_end = makeHTMLTags("TD")
+            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
+            
+            print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page'
+        """
+        return pyparsing_common._html_stripper.transformString(tokens[0])
+
+    _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') 
+                                        + Optional( White(" \t") ) ) ).streamline().setName("commaItem")
+    comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list")
+    """Predefined expression of 1 or more printable words or quoted strings, separated by commas."""
+
+    upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper()))
+    """Parse action to convert tokens to upper case."""
+
+    downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower()))
+    """Parse action to convert tokens to lower case."""
+
+
+if __name__ == "__main__":
+
+    selectToken    = CaselessLiteral("select")
+    fromToken      = CaselessLiteral("from")
+
+    ident          = Word(alphas, alphanums + "_$")
+
+    columnName     = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    columnNameList = Group(delimitedList(columnName)).setName("columns")
+    columnSpec     = ('*' | columnNameList)
+
+    tableName      = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    tableNameList  = Group(delimitedList(tableName)).setName("tables")
+    
+    simpleSQL      = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables")
+
+    # demo runTests method, including embedded comments in test string
+    simpleSQL.runTests("""
+        # '*' as column list and dotted table name
+        select * from SYS.XYZZY
+
+        # caseless match on "SELECT", and casts back to "select"
+        SELECT * from XYZZY, ABC
+
+        # list of column names, and mixed case SELECT keyword
+        Select AA,BB,CC from Sys.dual
+
+        # multiple tables
+        Select A, B, C from Sys.dual, Table2
+
+        # invalid SELECT keyword - should fail
+        Xelect A, B, C from Sys.dual
+
+        # incomplete command - should fail
+        Select
+
+        # invalid column name - should fail
+        Select ^^^ frox Sys.dual
+
+        """)
+
+    pyparsing_common.number.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    # any int or real number, returned as float
+    pyparsing_common.fnumber.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    pyparsing_common.hex_integer.runTests("""
+        100
+        FF
+        """)
+
+    import uuid
+    pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+    pyparsing_common.uuid.runTests("""
+        12345678-1234-5678-1234-567812345678
+        """)
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d862bdac8c396de59b19c5f4aa475bd9559f8360
GIT binary patch
literal 260224
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py
new file mode 100644
index 00000000..190c0239
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py
@@ -0,0 +1,868 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """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):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc b/venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b54f4cf634fafdd0132f8949b53f874afab542d1
GIT binary patch
literal 36102
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
HjGRmW&fmZv

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py b/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py
new file mode 100644
index 00000000..c1eb9e99
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py
@@ -0,0 +1,73 @@
+import sys
+
+
+class VendorImporter:
+    """
+    A PEP 302 meta path importer for finding optionally-vendored
+    or otherwise naturally-installed packages from root_name.
+    """
+
+    def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
+        self.root_name = root_name
+        self.vendored_names = set(vendored_names)
+        self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor')
+
+    @property
+    def search_path(self):
+        """
+        Search first the vendor package then as a natural package.
+        """
+        yield self.vendor_pkg + '.'
+        yield ''
+
+    def find_module(self, fullname, path=None):
+        """
+        Return self when fullname starts with root_name and the
+        target module is one vendored through this importer.
+        """
+        root, base, target = fullname.partition(self.root_name + '.')
+        if root:
+            return
+        if not any(map(target.startswith, self.vendored_names)):
+            return
+        return self
+
+    def load_module(self, fullname):
+        """
+        Iterate over the search path to locate and load fullname.
+        """
+        root, base, target = fullname.partition(self.root_name + '.')
+        for prefix in self.search_path:
+            try:
+                extant = prefix + target
+                __import__(extant)
+                mod = sys.modules[extant]
+                sys.modules[fullname] = mod
+                # mysterious hack:
+                # Remove the reference to the extant package/module
+                # on later Python versions to cause relative imports
+                # in the vendor package to resolve the same modules
+                # as those going through this importer.
+                if prefix and sys.version_info > (3, 3):
+                    del sys.modules[extant]
+                return mod
+            except ImportError:
+                pass
+        else:
+            raise ImportError(
+                "The '{target}' package is required; "
+                "normally this is bundled with this package so if you get "
+                "this warning, consult the packager of your "
+                "distribution.".format(**locals())
+            )
+
+    def install(self):
+        """
+        Install this importer into sys.meta_path if not already present.
+        """
+        if self not in sys.meta_path:
+            sys.meta_path.append(self)
+
+
+names = 'packaging', 'pyparsing', 'six', 'appdirs'
+VendorImporter(__name__, names).install()
diff --git a/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc b/venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f314e5904e0b2da702994bdfd34d2e4875dd10c9
GIT binary patch
literal 3325
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
FBLF?fHX8r{

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/pkg_resources/py31compat.py b/venv/lib/python2.7/site-packages/pkg_resources/py31compat.py
new file mode 100644
index 00000000..a381c424
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/pkg_resources/py31compat.py
@@ -0,0 +1,23 @@
+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/python2.7/site-packages/pkg_resources/py31compat.pyc b/venv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..76404171cda9f12e1238832145adf48bf6b2f933
GIT binary patch
literal 866
zcmZSn%*&NH<x)&C0~D|@FfceUFfbH1GB7ZtFfgPrGUPBYM8VmN3{i|QaVCZ+CWaIy
zh7@Lo9A<`G7KSJm2F6rYh7=Zt7Dk3BHilFdhAei5f>eeSc7{|YhAa*S7Upb5hWuoP
z6b^=L28KK)1}4TRPKH!YhN2RNR5pe@HilFNhAb|IC@zrA!5W+l3=En7|NsB*m&wS$
zz@PylN|-_J%dALdVqjnZu~``y7@R?3UJMKjm4XZ<3=CO}3^fc4&5R6;;dw?3EG0|~
z*<1`ot_+N|Obm=Qj0`-*HVidP3|Y(!CCm(2EDYJq3`K4XO$-c$ZVY*h3=t^|48dT_
z{4_wOmw>FwFD~I=U|`5i%uY?oEGjNxXJBCP4|Xjo$}cJbDM~FW%F8cdV_;x#b&c>0
z4$%O)tppUH1&JjYV7;jonZ+gX`PpDEq*f$rfI=Ni6c;ftFz6Q)WtJtDr0SO?7U`$u
z=cJ?-73*gg>Sq@lnVTCHW*M268CsYZ=TxSb$D5>>m>3us7^LUvhv*k%7U*W?6_+ID
z<mi?sT9yW8=ohD!lopia=jRmb7i6c$7o`^Gmlh?b7V8&O8XG3(=N2TE=oM6!@Gvki
z#KXK4Z)^ziVKEoTS&Yn#f{gr(l8l)ke`JFEp#cg8BraG2On_t|F~rTlzz_tArXY|Q
z*rUaj#o%B`ttd$?$_oM+4h}H4#GK;PAWjAbP$V!g1VkEvol}-tRGgWg7oVAzmS4ih
zz`&4~nwnA!cVrOA5#TUG5Cau@pwP0(%}*)KNwov{xftYJ9!4HU9wq^19v)6cc_siv
CVY;3G

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE
new file mode 100644
index 00000000..6e0693b4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2016 Jason R Coombs <jaraco@jaraco.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA
new file mode 100644
index 00000000..571a5cb2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/METADATA
@@ -0,0 +1,77 @@
+Metadata-Version: 2.1
+Name: setuptools
+Version: 41.0.1
+Summary: Easily download, build, install, upgrade, and uninstall Python packages
+Home-page: https://github.com/pypa/setuptools
+Author: Python Packaging Authority
+Author-email: distutils-sig@python.org
+License: UNKNOWN
+Project-URL: Documentation, https://setuptools.readthedocs.io/
+Keywords: CPAN PyPI distutils eggs package management
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: System :: Archiving :: Packaging
+Classifier: Topic :: System :: Systems Administration
+Classifier: Topic :: Utilities
+Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
+Description-Content-Type: text/x-rst; charset=UTF-8
+Provides-Extra: certs
+Requires-Dist: certifi (==2016.9.26) ; extra == 'certs'
+Provides-Extra: ssl
+Requires-Dist: wincertstore (==0.2) ; (sys_platform=='win32') and extra == 'ssl'
+
+.. image:: https://img.shields.io/pypi/v/setuptools.svg
+   :target: https://pypi.org/project/setuptools
+
+.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg
+    :target: https://setuptools.readthedocs.io
+
+.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20CI&logo=travis&logoColor=white
+   :target: https://travis-ci.org/pypa/setuptools
+
+.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20CI&logo=appveyor&logoColor=white
+   :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master
+
+.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
+   :target: https://codecov.io/gh/pypa/setuptools
+
+.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat
+   :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme
+
+.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg
+
+See the `Installation Instructions
+<https://packaging.python.org/installing/>`_ in the Python Packaging
+User's Guide for instructions on installing, upgrading, and uninstalling
+Setuptools.
+
+Questions and comments should be directed to the `distutils-sig
+mailing list <http://mail.python.org/pipermail/distutils-sig/>`_.
+Bug reports and especially tested patches may be
+submitted directly to the `bug tracker
+<https://github.com/pypa/setuptools/issues>`_.
+
+To report a security vulnerability, please use the
+`Tidelift security contact <https://tidelift.com/security>`_.
+Tidelift will coordinate the fix and disclosure.
+
+
+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/>`_.
+
+
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD
new file mode 100644
index 00000000..6a8a0a45
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/RECORD
@@ -0,0 +1,186 @@
+easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
+pkg_resources/__init__.py,sha256=pp8b7Asoaheso-q8lIMS1tpQp88xjAkYgCIRX-JsPlE,107982
+pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558
+pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701
+pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
+pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
+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/_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/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498
+setuptools/__init__.py,sha256=WBpCcn2lvdckotabeae1TTYonPOcgCIF3raD2zRWzBc,7283
+setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218
+setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592
+setuptools/build_meta.py,sha256=ioZE7tGSWY6vy7KLune0Iq334ugXuO39imcKC8prjBY,9387
+setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
+setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
+setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
+setuptools/config.py,sha256=lz19l1AtoHctpp1_tbYZv176nrEj4Gpf7ykNIYTIkAQ,20425
+setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935
+setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837
+setuptools/dist.py,sha256=qYPmmVlLPWCLHrILR0J74bqoYgTSZh5ocLeyRKqnVyU,49913
+setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729
+setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146
+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/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=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838
+setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199
+setuptools/package_index.py,sha256=F9LBC-hQ5fkjeEVflxif0mo_DzRMrepahdFTPenOtGM,40587
+setuptools/pep425tags.py,sha256=o_D_WVeWcXZiI2xjPSg7pouGOvaWRgGRxEDK9DzAXIA,10861
+setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536
+setuptools/py31compat.py,sha256=h2rtZghOfwoGYd8sQ0-auaKiF3TcL3qX0bX3VessqcE,838
+setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195
+setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276
+setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218
+setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
+setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302
+setuptools/ssl_support.py,sha256=nLjPUBBw7RTTx6O4RJZ5eAMGgjJG8beiDbkFXDZpLuM,8493
+setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996
+setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144
+setuptools/wheel.py,sha256=94uqXsOaKt91d9hW5z6ZppZmNSs_nO66R4uiwhcr4V0,8094
+setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
+setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
+setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
+setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720
+setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513
+setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860
+setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416
+setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239
+setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343
+setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025
+setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421
+setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556
+setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594
+setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426
+setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167
+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=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484
+setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897
+setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596
+setuptools/command/develop.py,sha256=MQlnGS6uP19erK2JCNOyQYoYyquk3PADrqrrinqqLtA,8184
+setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960
+setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273
+setuptools/command/egg_info.py,sha256=w73EdxYSOk2gsaAiHGL2dZrCldoPiuRr2eTfqcFvCds,25570
+setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683
+setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203
+setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840
+setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439
+setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
+setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986
+setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534
+setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164
+setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
+setuptools/command/sdist.py,sha256=gr5hFrDzUtGfp_0tu0sllzIyr3jMQegIkFmlDauQJxw,7388
+setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085
+setuptools/command/test.py,sha256=oePJ49u17ENKtrM-rOrrLlRhtNnrzcSr0IW-gE9XVq0,9285
+setuptools/command/upload.py,sha256=GxtNkIl7SA0r8mACkbDcSCN1m2_WPppK9gZXJmQSiow,6811
+setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311
+setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499
+setuptools-41.0.1.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078
+setuptools-41.0.1.dist-info/METADATA,sha256=_i0otxacylu95CLISnMjTjG7DZ2vYZOvwedcoJ06JNE,3303
+setuptools-41.0.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110
+setuptools-41.0.1.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239
+setuptools-41.0.1.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990
+setuptools-41.0.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38
+setuptools-41.0.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
+setuptools-41.0.1.dist-info/RECORD,,
+../../../bin/easy_install,sha256=96MparLHvDSTik0g2MA26XCGlnMd5pidfiW_Ls8rK5A,255
+../../../bin/easy_install-2.7,sha256=96MparLHvDSTik0g2MA26XCGlnMd5pidfiW_Ls8rK5A,255
+setuptools-41.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+setuptools/ssl_support.pyc,,
+setuptools/extern/__init__.pyc,,
+setuptools/command/install_scripts.pyc,,
+setuptools/extension.pyc,,
+setuptools/_vendor/packaging/_structures.pyc,,
+pkg_resources/_vendor/packaging/_compat.pyc,,
+setuptools/archive_util.pyc,,
+setuptools/command/dist_info.pyc,,
+setuptools/_vendor/packaging/__init__.pyc,,
+setuptools/command/bdist_wininst.pyc,,
+setuptools/_vendor/packaging/utils.pyc,,
+setuptools/command/upload.pyc,,
+setuptools/command/upload_docs.pyc,,
+setuptools/_vendor/packaging/markers.pyc,,
+setuptools/_vendor/packaging/_compat.pyc,,
+pkg_resources/py31compat.pyc,,
+setuptools/wheel.pyc,,
+setuptools/namespaces.pyc,,
+setuptools/_vendor/packaging/version.pyc,,
+pkg_resources/_vendor/six.pyc,,
+pkg_resources/_vendor/packaging/_structures.pyc,,
+setuptools/_vendor/packaging/requirements.pyc,,
+easy_install.pyc,,
+setuptools/_vendor/__init__.pyc,,
+setuptools/command/install_egg_info.pyc,,
+pkg_resources/_vendor/packaging/markers.pyc,,
+setuptools/site-patch.pyc,,
+setuptools/command/develop.pyc,,
+setuptools/windows_support.pyc,,
+setuptools/command/setopt.pyc,,
+setuptools/unicode_utils.pyc,,
+setuptools/command/build_ext.pyc,,
+setuptools/command/bdist_egg.pyc,,
+setuptools/py31compat.pyc,,
+setuptools/dep_util.pyc,,
+setuptools/command/sdist.pyc,,
+setuptools/command/saveopts.pyc,,
+setuptools/command/egg_info.pyc,,
+pkg_resources/_vendor/packaging/__init__.pyc,,
+setuptools/pep425tags.pyc,,
+setuptools/command/install.pyc,,
+setuptools/command/alias.pyc,,
+setuptools/__init__.pyc,,
+setuptools/command/easy_install.pyc,,
+setuptools/py27compat.pyc,,
+pkg_resources/extern/__init__.pyc,,
+setuptools/command/build_py.pyc,,
+setuptools/command/test.pyc,,
+setuptools/version.pyc,,
+setuptools/command/py36compat.pyc,,
+setuptools/glibc.pyc,,
+setuptools/dist.pyc,,
+setuptools/command/bdist_rpm.pyc,,
+setuptools/_vendor/six.pyc,,
+pkg_resources/_vendor/packaging/version.pyc,,
+pkg_resources/_vendor/packaging/utils.pyc,,
+setuptools/command/__init__.pyc,,
+setuptools/py33compat.pyc,,
+setuptools/msvc.pyc,,
+setuptools/_deprecation_warning.pyc,,
+pkg_resources/_vendor/packaging/__about__.pyc,,
+pkg_resources/__init__.pyc,,
+setuptools/build_meta.pyc,,
+pkg_resources/_vendor/__init__.pyc,,
+setuptools/_vendor/pyparsing.pyc,,
+setuptools/command/install_lib.pyc,,
+pkg_resources/_vendor/appdirs.pyc,,
+setuptools/_vendor/packaging/specifiers.pyc,,
+setuptools/lib2to3_ex.pyc,,
+setuptools/sandbox.pyc,,
+pkg_resources/_vendor/packaging/requirements.pyc,,
+pkg_resources/_vendor/pyparsing.pyc,,
+setuptools/_vendor/packaging/__about__.pyc,,
+setuptools/glob.pyc,,
+pkg_resources/_vendor/packaging/specifiers.pyc,,
+setuptools/command/rotate.pyc,,
+setuptools/config.pyc,,
+setuptools/command/build_clib.pyc,,
+setuptools/depends.pyc,,
+setuptools/package_index.pyc,,
+setuptools/monkey.pyc,,
+setuptools/launch.pyc,,
+setuptools/command/register.pyc,,
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL
new file mode 100644
index 00000000..c8240f03
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt
new file mode 100644
index 00000000..e87d0210
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt
@@ -0,0 +1,2 @@
+https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d
+https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt
new file mode 100644
index 00000000..4159fd0a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt
@@ -0,0 +1,65 @@
+[console_scripts]
+easy_install = setuptools.command.easy_install:main
+easy_install-3.6 = setuptools.command.easy_install:main
+
+[distutils.commands]
+alias = setuptools.command.alias:alias
+bdist_egg = setuptools.command.bdist_egg:bdist_egg
+bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
+bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst
+build_clib = setuptools.command.build_clib:build_clib
+build_ext = setuptools.command.build_ext:build_ext
+build_py = setuptools.command.build_py:build_py
+develop = setuptools.command.develop:develop
+dist_info = setuptools.command.dist_info:dist_info
+easy_install = setuptools.command.easy_install:easy_install
+egg_info = setuptools.command.egg_info:egg_info
+install = setuptools.command.install:install
+install_egg_info = setuptools.command.install_egg_info:install_egg_info
+install_lib = setuptools.command.install_lib:install_lib
+install_scripts = setuptools.command.install_scripts:install_scripts
+register = setuptools.command.register:register
+rotate = setuptools.command.rotate:rotate
+saveopts = setuptools.command.saveopts:saveopts
+sdist = setuptools.command.sdist:sdist
+setopt = setuptools.command.setopt:setopt
+test = setuptools.command.test:test
+upload = setuptools.command.upload:upload
+upload_docs = setuptools.command.upload_docs:upload_docs
+
+[distutils.setup_keywords]
+convert_2to3_doctests = setuptools.dist:assert_string_list
+dependency_links = setuptools.dist:assert_string_list
+eager_resources = setuptools.dist:assert_string_list
+entry_points = setuptools.dist:check_entry_points
+exclude_package_data = setuptools.dist:check_package_data
+extras_require = setuptools.dist:check_extras
+include_package_data = setuptools.dist:assert_bool
+install_requires = setuptools.dist:check_requirements
+namespace_packages = setuptools.dist:check_nsp
+package_data = setuptools.dist:check_package_data
+packages = setuptools.dist:check_packages
+python_requires = setuptools.dist:check_specifier
+setup_requires = setuptools.dist:check_requirements
+test_loader = setuptools.dist:check_importable
+test_runner = setuptools.dist:check_importable
+test_suite = setuptools.dist:check_test_suite
+tests_require = setuptools.dist:check_requirements
+use_2to3 = setuptools.dist:assert_bool
+use_2to3_exclude_fixers = setuptools.dist:assert_string_list
+use_2to3_fixers = setuptools.dist:assert_string_list
+zip_safe = setuptools.dist:assert_bool
+
+[egg_info.writers]
+PKG-INFO = setuptools.command.egg_info:write_pkg_info
+dependency_links.txt = setuptools.command.egg_info:overwrite_arg
+depends.txt = setuptools.command.egg_info:warn_depends_obsolete
+eager_resources.txt = setuptools.command.egg_info:overwrite_arg
+entry_points.txt = setuptools.command.egg_info:write_entries
+namespace_packages.txt = setuptools.command.egg_info:overwrite_arg
+requires.txt = setuptools.command.egg_info:write_requirements
+top_level.txt = setuptools.command.egg_info:write_toplevel_names
+
+[setuptools.installation]
+eggsecutable = setuptools.command.easy_install:bootstrap
+
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt
new file mode 100644
index 00000000..4577c6a7
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt
@@ -0,0 +1,3 @@
+easy_install
+pkg_resources
+setuptools
diff --git a/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools-41.0.1.dist-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/venv/lib/python2.7/site-packages/setuptools/__init__.py b/venv/lib/python2.7/site-packages/setuptools/__init__.py
new file mode 100644
index 00000000..a71b2bbd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/__init__.py
@@ -0,0 +1,228 @@
+"""Extensions to the 'distutils' for large or complex distributions"""
+
+import os
+import sys
+import functools
+import distutils.core
+import distutils.filelist
+import re
+from distutils.errors import DistutilsOptionError
+from distutils.util import convert_path
+from fnmatch import fnmatchcase
+
+from ._deprecation_warning import SetuptoolsDeprecationWarning
+
+from setuptools.extern.six import PY3, string_types
+from setuptools.extern.six.moves import filter, map
+
+import setuptools.version
+from setuptools.extension import Extension
+from setuptools.dist import Distribution, Feature
+from setuptools.depends import Require
+from . import monkey
+
+__metaclass__ = type
+
+
+__all__ = [
+    'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require',
+    'SetuptoolsDeprecationWarning',
+    'find_packages'
+]
+
+if PY3:
+  __all__.append('find_namespace_packages')
+
+__version__ = setuptools.version.__version__
+
+bootstrap_install_from = None
+
+# If we run 2to3 on .py files, should we also convert docstrings?
+# Default: yes; assume that we can detect doctests reliably
+run_2to3_on_doctests = True
+# Standard package names for fixer packages
+lib2to3_fixer_packages = ['lib2to3.fixes']
+
+
+class PackageFinder:
+    """
+    Generate a list of all Python packages found within a directory
+    """
+
+    @classmethod
+    def find(cls, where='.', exclude=(), include=('*',)):
+        """Return a list all Python packages found within directory 'where'
+
+        'where' is the root directory which will be searched for packages.  It
+        should be supplied as a "cross-platform" (i.e. URL-style) path; it will
+        be converted to the appropriate local path syntax.
+
+        'exclude' is a sequence of package names to exclude; '*' can be used
+        as a wildcard in the names, such that 'foo.*' will exclude all
+        subpackages of 'foo' (but not 'foo' itself).
+
+        'include' is a sequence of package names to include.  If it's
+        specified, only the named packages will be included.  If it's not
+        specified, all found packages will be included.  'include' can contain
+        shell style wildcard patterns just like 'exclude'.
+        """
+
+        return list(cls._find_packages_iter(
+            convert_path(where),
+            cls._build_filter('ez_setup', '*__pycache__', *exclude),
+            cls._build_filter(*include)))
+
+    @classmethod
+    def _find_packages_iter(cls, where, exclude, include):
+        """
+        All the packages found in 'where' that pass the 'include' filter, but
+        not the 'exclude' filter.
+        """
+        for root, dirs, files in os.walk(where, followlinks=True):
+            # Copy dirs to iterate over it, then empty dirs.
+            all_dirs = dirs[:]
+            dirs[:] = []
+
+            for dir in all_dirs:
+                full_path = os.path.join(root, dir)
+                rel_path = os.path.relpath(full_path, where)
+                package = rel_path.replace(os.path.sep, '.')
+
+                # Skip directory trees that are not valid packages
+                if ('.' in dir or not cls._looks_like_package(full_path)):
+                    continue
+
+                # Should this package be included?
+                if include(package) and not exclude(package):
+                    yield package
+
+                # Keep searching subdirectories, as there may be more packages
+                # down there, even if the parent was excluded.
+                dirs.append(dir)
+
+    @staticmethod
+    def _looks_like_package(path):
+        """Does a directory look like a package?"""
+        return os.path.isfile(os.path.join(path, '__init__.py'))
+
+    @staticmethod
+    def _build_filter(*patterns):
+        """
+        Given a list of patterns, return a callable that will be true only if
+        the input matches at least one of the patterns.
+        """
+        return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns)
+
+
+class PEP420PackageFinder(PackageFinder):
+    @staticmethod
+    def _looks_like_package(path):
+        return True
+
+
+find_packages = PackageFinder.find
+
+if PY3:
+  find_namespace_packages = PEP420PackageFinder.find
+
+
+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')
+    ))
+    # Honor setup.cfg's options.
+    dist.parse_config_files(ignore_option_errors=True)
+    if dist.setup_requires:
+        dist.fetch_build_eggs(dist.setup_requires)
+
+
+def setup(**attrs):
+    # Make sure we have any requirements needed to interpret 'attrs'.
+    _install_setup_requires(attrs)
+    return distutils.core.setup(**attrs)
+
+setup.__doc__ = distutils.core.setup.__doc__
+
+
+_Command = monkey.get_unpatched(distutils.core.Command)
+
+
+class Command(_Command):
+    __doc__ = _Command.__doc__
+
+    command_consumes_arguments = False
+
+    def __init__(self, dist, **kw):
+        """
+        Construct the command for dist, updating
+        vars(self) with any keyword parameters.
+        """
+        _Command.__init__(self, dist)
+        vars(self).update(kw)
+
+    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, string_types):
+            raise DistutilsOptionError("'%s' must be a %s (got `%s`)"
+                                       % (option, what, val))
+        return val
+
+    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, string_types):
+            setattr(self, option, re.split(r',\s*|\s+', val))
+        else:
+            if isinstance(val, list):
+                ok = all(isinstance(v, string_types) for v in val)
+            else:
+                ok = False
+            if not ok:
+                raise DistutilsOptionError(
+                      "'%s' must be a list of strings (got %r)"
+                      % (option, val))
+
+    def reinitialize_command(self, command, reinit_subcommands=0, **kw):
+        cmd = _Command.reinitialize_command(self, command, reinit_subcommands)
+        vars(cmd).update(kw)
+        return cmd
+
+
+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)
+
+
+# Apply monkey patches
+monkey.patch_all()
diff --git a/venv/lib/python2.7/site-packages/setuptools/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..84d57c1e0174118ecdeb4d5154fa42fd901041bd
GIT binary patch
literal 10541
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py b/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py
new file mode 100644
index 00000000..086b64dd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py
@@ -0,0 +1,7 @@
+class SetuptoolsDeprecationWarning(Warning):
+    """
+    Base class for warning deprecations in ``setuptools``
+
+    This class is not derived from ``DeprecationWarning``, and as such is
+    visible by default.
+    """
diff --git a/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc b/venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..55d670a5564ea026f52c63158e06f18e16092162
GIT binary patch
literal 690
zcmZSn%*&NH<x)&C0~9bbFfceUFfbHLF)%QsFfgPtFr+auq%bnHFfcSTFhoW%GNdpu
z1Z#lQmB=tKFa)QTlopia=jRl=q!tvVCMT9;=I4bc7UgB;rNd2SWME)$0-4Ik05%e2
z3IjtF6GKq221u@W5d#AQmx6+Vf>UB~szP#3VsWuTT7Hp2Im94^6olEu3YmEd2?@n;
zdlM44z*<8xGK-;FGm91S@=Fv_Qj0RnQd1Ptit=+65)v>Sn2?~OkeHXEkXWoxT$-Gr
zkXZ~isVuWNGbtxkA*oU!B{eOvG^a!lEDrHC2Ll5`e0*MFZfbmd2^W}?o1ape1LCrS
zxheU{@$nj<5JeEhl?)6F`UORqWr-!J`elhl`f2$&DXB%p`q_p0*~LcY=7xn?M&@OP
z7Usn{mFea2CMhN+1_lNO>3RAg`URN<x|w;!C5bsXy5)(MrGXjxhyXxl#v_GPJT&z5
w3Mzv@jsb@>69WSS8=Id7h%Ny+7aCV!6$s~oSp)0l5>P<fK!Vl|>~@eR0K{>>;s5{u

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8c5e8a8578f1b81aa4859228ffabc900553af3bf
GIT binary patch
literal 204
zcmZSn%*&NH<x)&C0~9baFfceUFfbIeFfcHrFfasbfJFQ>K+<SLaVY}>gML9#W?5oM
zs(x8wk$zf!PD*M~v3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4
zfo^7AaY<rMj&6CPWoclBesO9^X+cSTeoiqmGrlY}FD1W7KR!M)FS8^*Uaz3CgoA;B
S!6r99r8Fni4&=UKkn;dlRyAG#

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py
new file mode 100644
index 00000000..95d330ef
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py
@@ -0,0 +1,21 @@
+# 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
+
+__all__ = [
+    "__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"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD or Apache License, Version 2.0"
+__copyright__ = "Copyright 2014-2016 %s" % __author__
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2a1fdb75bd35c49e46f4ae915904f94fba1a4fc8
GIT binary patch
literal 843
zcmZSn%*&NH<x)&C0~ByDFfceIFftSuF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGo-LEq_8riurZ{tGo)}Zq;N8%b1+1)Fr;uXM6oiYa5F@)F{JP?M6olZ
z@G?YkFr@G?L~$~t@H0elF{B7EL~%2u2r{H{GKfX-Fr)}E1ZxO0Ffe3-+@itEz`#(#
z&%nTtm{gpfQ(BT5pP5^bUsO^8a$-tmS!Qu&eqIS50|P@rQD$CAd|GK<atTO?lYxOD
zKE5QgBqudKzJwdhD=y8=O)RR6k1t^d^Gk~|;c{iEMIfW%<4d@}a*3rS8Tm!=@g)$0
zQgahCbKr_|GLuvDia`eRf)yv{7gQEyre~Bu)fXftXD6m-=A{=aF)%PV=NF|al$K=X
zWR_&67AvIX7byf(mSp7TDL~Yv78ffrFfe44loS+O>FcLwmSmJB=_Tjq>K9ZNB<e#H
zfed3|U|=vb)3YenWME)$$<Is7Nl^$cDNRc&QAo^7QOL{#1xQM1Vva&`eqKpYW>RTM
zeo=9;04Nf{svU~Ks`WDS!47i@c2USLQgAFtOwLGE@PT+rM<EOn6beRq2E}4v_d|WB
zU}RuuqHAPeXr`cA?56?pJ2bS?N=r(MQsd);K#>;2$iTo5!~}{tNH{0v<iy7Zfub@9
z<b@zskUSfR0Lce|qA~~+%t4@_*8mxTAc`9p7#Q>miZaU*OH%dA5{vZH@^eyBi;DHL
z3-z;$jm*sr3$u*O%M2~di*qW|%i~Q_OiT<63=Goq^h5LuG7EGw^NLFnb8>Xc6D>;v
zGxUp7OG*n$^7C_wk(u#jsd*{+MTo%GkB?7G$}cU6kJl@x1gAEe-29Z%oK!oI7m7s~
X7#L)j`5F0{*%;Xv*_havz$7C8KOEJp

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py
new file mode 100644
index 00000000..5ee62202
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py
@@ -0,0 +1,14 @@
+# 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
+
+from .__about__ import (
+    __author__, __copyright__, __email__, __license__, __summary__, __title__,
+    __uri__, __version__
+)
+
+__all__ = [
+    "__title__", "__summary__", "__uri__", "__version__", "__author__",
+    "__email__", "__license__", "__copyright__",
+]
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d51185f95849eafbfbd2894d26fa0858b25629f5
GIT binary patch
literal 665
zcmZSn%*&NH<x)&C0~ByDFfceIFftTZFfcHrFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpVsGvu%^<gzkEu`=YcF+{O3<gznFu`}dyFhp@M<Z?1ZaWdp`F+_1O<Z?4a
zaWmxdFhub%Fs86Dq_8riurZ{tGo)}Zq;N8%a51ECGo*7cMDa4D@Gt~x@G>wkWP)6z
z!OXzGP{Pl^z>t_!oS#!#k{X|xTaaH=QUY>lN@iJRab|vA2_FLkLqSnyUP*jfX<l+k
zW`15KBLf4221ro}7Xt%Be0*YQNk)EAe0&MW?D+WP{DR7&%=C<s`1le|u!7Xw#LS%d
z_!4d~FDElOHLo}o&Mz*_%}p$-gsU#eEXe`MvV&EZ7G=U!mZcVf+!P-l1hPE{q#y`n
zLlDRvK_LGGu`)0)1hIh#76t|eKMj!cq0USzEh#NZjgJok`928bi6ACW5P(dGk55d>
zFD;3WhnND=i)0koBCwSpwP4#yKw|Oni8(p(@fsil5kzr40|SG8K~ZK|Vo9ogSz?iX
zT7FJSYEiL%cA<WDv5~pCVPTe$d6}Vwd2vo<dU?D_iiwGVfq_AKo_>gaL1uw&W?peg
zVor{3d7@=$V1|BiYDsB9Nq&A#F)}m0EHy7Bzev9zF*!RiJu@#|KR!M)FS8^*Uaz1M
a9EUc!`6;D2sdgaW6obM<hRKSJpAi7>5R>Bo

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py
new file mode 100644
index 00000000..210bb80b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py
@@ -0,0 +1,30 @@
+# 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 sys
+
+
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+# flake8: noqa
+
+if PY3:
+    string_types = str,
+else:
+    string_types = basestring,
+
+
+def with_metaclass(meta, *bases):
+    """
+    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):
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fdfe0b609e19c66b9725e170df18a3c02664641d
GIT binary patch
literal 1460
zcmZSn%*&NH<x)&C0~9bZFfceIFftUEF)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQw&M7*bgnvRFZ?B~zFgvY8m7*pP)-z(VW{sq73z2@I(m3~7uEQJf5U
zoD8X4P<9F{Lkj~#6gNW(6GN~D8v_GFCdfS+%nS?+CHxEw42em_`8lN}sqvY)1^GoK
zB^)5vWtL?YXXfXX@G&qj6clCVmBgo&<|UV8=I8lkg8Y#Q(w@x7z`y`vure?(u!DSN
z3ewBS(7_0@yq$reosl7p31o8{14A<dLu4%zLkR;z79&Fq6GI9!LkbJXG0iLt!5SbV
ziuD;77`PM^6cn6`QWHy36%rMa5{pw6l5-M^ixtW<OEMG^6>?Kc62Ss`V3j4D3=9l#
zF_f@o0=Y<vfq@~F0Tjdt=P)p|F@S<QC|CpJgJc#41_l@w25AytU;z1{hLNFzfuV+(
zp_!QhqSQ|V9CjeZB_NL{=M<NKIC+V=sU=*X5Y5Oejt4oqxCCT$iUugKN<f~22!a%Y
zTnjd*xQ>B=LBF6Vvn;VBRlh8;NIxw<CndG0SU<Z^KfBn-+}yA*%gDUU(89bpr!u`f
z-Xz7u#K6G7AU#h%M86=jKsPh5xFj(rN4GrDvNSM5zc{s|w4fwEKc^U(8DEx~my%zk
zUyzubotU1Pm#!b5oS$2eSfW=@S;Ef1zz`pwms%blFT=pVPz-V}10y7LfKozyJjieH
z@nGM@$LHp!l;)(y#|MEt3-$!qhe05vL7=Driwy#g1%aYR8s;N5MsQLuNd+bG#G=Z0
za0&vu73_X+B$iYbq(b}!(hK$t#9tsTLM=oL<kvyqO>hPU<&1bxssj5;1mtN@I%8m$
zXV%~WB}!0a#mA?WmXsEO;trICgFwkM2o&4kgj`%%Tmn*BmRbbL_wku|Y58D@fJh@K
zZ49Q1ONzh>i%W_!^U~u%VO9)I8<6x35)1;BDv<C3*#u?{hM)qaQ5#4CwgZJvF{p5p
SVd7yHW)x;&W8`7tWCj4W!(Dd(

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py
new file mode 100644
index 00000000..ccc27861
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py
@@ -0,0 +1,68 @@
+# 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
+
+
+class Infinity(object):
+
+    def __repr__(self):
+        return "Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return False
+
+    def __le__(self, other):
+        return False
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return True
+
+    def __ge__(self, other):
+        return True
+
+    def __neg__(self):
+        return NegativeInfinity
+
+Infinity = Infinity()
+
+
+class NegativeInfinity(object):
+
+    def __repr__(self):
+        return "-Infinity"
+
+    def __hash__(self):
+        return hash(repr(self))
+
+    def __lt__(self, other):
+        return True
+
+    def __le__(self, other):
+        return True
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not isinstance(other, self.__class__)
+
+    def __gt__(self, other):
+        return False
+
+    def __ge__(self, other):
+        return False
+
+    def __neg__(self):
+        return Infinity
+
+NegativeInfinity = NegativeInfinity()
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f901dff80c68ab559c3343ed320df4379e904d06
GIT binary patch
literal 5307
zcmZSn%*&NH<x)&C0~9bbFfceIFftU!F)%QsFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7ixFfpXEFr+auq%bqIFfcSTFhoYNGNiJCSW&DDDJ(E)R=6}9Ln<3snvEfajUiZr
zoq>TN6J)Oj$kq~m1_p-2q~iRX(vsBp%-n+fqLLC0kSj9FGK(|w^Gf&_7#IqQGV@B}
z(@OJ_OF%*(dC$DG%)HE!O1K{w85kIxKz@j1U|>jP069H{0pyA(CXjzx7(gCKVFHV=
zK-~{<GDwPzAqDK@D0Yx5K_VOsDePdyoD3-(U<MaMP_PCk0|P@c$SxRm2HD91axo)A
zum%$Y1A|`>$Y&a0KY~=1fMknPbJ8F}Ao1cR1_lQGf}+f_#FA9~vcw|&wEUcu)S_bj
z>_YwQVk2{N!@?{h^D;vV^WvP!^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6@<hwh
zzzqH3)RNMIlKlLfVq|7~S!!NNevy7bVsdt3dS+g_etdCBQE75XX;EsiUO^=|q~qg@
zQVWXW<3T<v2DzVs5$-{dN5CEwU|?V<VPGg>WT;_aXl4YVU=5Jx{J>rYdod%iI0MW8
znFp2(0{MKf`Woci_;?-$1_qd~L7oR;kiWpb206ckfdS@Ika!6z0|SFwVoq@?*yCUy
zg2nPnGE$2MpI_M+7#QN?b4udlK{<^Sp9XO<FfbrI8N>zRf)X#-lY=D%L;aT;A1{O@
zCehPx4I?Q1W-&4}Gr?mO6yqfz&t(>aGgV%4Y6&Me)RJ=&i;Lsqhe#Nt7RJYm;tK;o
zNFGKG10Gn?1_eS8F9QQZ5U9KzB0kPbjgObW;$u)g#hHIWc{-%16e;@->Xe;c5+5&3
zq921mF+D`$Fg-OsUJl8Bptyr!oN)-Mjr>y66H7A7Qeh2&!Cc{h+C1^`d8z5~@rnq)
zYH))xB&abHAD@?)n;IVvE{5XcbMsS5b5i5ugFtmn5J*7~NNEtLt_lJb<3XSR2m%#&
zLBgOs3(EH3QW-%ElJXhc6asm_801<uCQfEl7$gE}Pl0L`5C%p3AZf!DgQ@^sc;W)N
zZV;z1a7xicBrTE~a6zDYGzb(?gV~p$te}JBOHi!^!k~16tFRang&{b9>kmtxfeI}n
zEIuQ)X*P6PCE%jj6rWc?^>PUV!!T%pfomWOEPlnC6+va{U~iXzt5xe^=`&DU!4Ao1
zptyozoW&<7pAP0a0o3+!M0g6^s0tDTwTi?+#4u<=ftpC_ARl6HLivG*)Sykrv{KO6
zPJDb2sKF8hirgSj1z7^B-t&{PQj<%-Ei!Pk3(;5vvj$0v5j-Yk18D-=fjVo&pjuys
LSxlCbSxgoHRM8Df

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py
new file mode 100644
index 00000000..031332a3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py
@@ -0,0 +1,301 @@
+# 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 operator
+import os
+import platform
+import sys
+
+from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd
+from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString
+from setuptools.extern.pyparsing import Literal as L  # noqa
+
+from ._compat import string_types
+from .specifiers import Specifier, InvalidSpecifier
+
+
+__all__ = [
+    "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName",
+    "Marker", "default_environment",
+]
+
+
+class InvalidMarker(ValueError):
+    """
+    An invalid marker was found, users should refer to PEP 508.
+    """
+
+
+class UndefinedComparison(ValueError):
+    """
+    An invalid operation was attempted on a value that doesn't support it.
+    """
+
+
+class UndefinedEnvironmentName(ValueError):
+    """
+    A name was attempted to be used that does not exist inside of the
+    environment.
+    """
+
+
+class Node(object):
+
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return str(self.value)
+
+    def __repr__(self):
+        return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
+
+    def serialize(self):
+        raise NotImplementedError
+
+
+class Variable(Node):
+
+    def serialize(self):
+        return str(self)
+
+
+class Value(Node):
+
+    def serialize(self):
+        return '"{0}"'.format(self)
+
+
+class Op(Node):
+
+    def serialize(self):
+        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")
+)
+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'
+}
+VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
+
+VERSION_CMP = (
+    L("===") |
+    L("==") |
+    L(">=") |
+    L("<=") |
+    L("!=") |
+    L("~=") |
+    L(">") |
+    L("<")
+)
+
+MARKER_OP = VERSION_CMP | L("not in") | L("in")
+MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
+
+MARKER_VALUE = QuotedString("'") | QuotedString('"')
+MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
+
+BOOLOP = L("and") | L("or")
+
+MARKER_VAR = VARIABLE | MARKER_VALUE
+
+MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
+MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))
+
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+
+MARKER_EXPR = Forward()
+MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
+MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)
+
+MARKER = stringStart + MARKER_EXPR + stringEnd
+
+
+def _coerce_parse_result(results):
+    if isinstance(results, ParseResults):
+        return [_coerce_parse_result(i) for i in results]
+    else:
+        return results
+
+
+def _format_marker(marker, first=True):
+    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))):
+        return _format_marker(marker[0])
+
+    if isinstance(marker, list):
+        inner = (_format_marker(m, first=False) for m in marker)
+        if first:
+            return " ".join(inner)
+        else:
+            return "(" + " ".join(inner) + ")"
+    elif isinstance(marker, tuple):
+        return " ".join([m.serialize() for m in marker])
+    else:
+        return marker
+
+
+_operators = {
+    "in": lambda lhs, rhs: lhs in rhs,
+    "not in": lambda lhs, rhs: lhs not in rhs,
+    "<": operator.lt,
+    "<=": operator.le,
+    "==": operator.eq,
+    "!=": operator.ne,
+    ">=": operator.ge,
+    ">": operator.gt,
+}
+
+
+def _eval_op(lhs, op, rhs):
+    try:
+        spec = Specifier("".join([op.serialize(), rhs]))
+    except InvalidSpecifier:
+        pass
+    else:
+        return spec.contains(lhs)
+
+    oper = _operators.get(op.serialize())
+    if oper is None:
+        raise UndefinedComparison(
+            "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
+        )
+
+    return oper(lhs, rhs)
+
+
+_undefined = object()
+
+
+def _get_env(environment, name):
+    value = environment.get(name, _undefined)
+
+    if value is _undefined:
+        raise UndefinedEnvironmentName(
+            "{0!r} does not exist in evaluation environment.".format(name)
+        )
+
+    return value
+
+
+def _evaluate_markers(markers, environment):
+    groups = [[]]
+
+    for marker in markers:
+        assert isinstance(marker, (list, tuple, string_types))
+
+        if isinstance(marker, list):
+            groups[-1].append(_evaluate_markers(marker, environment))
+        elif isinstance(marker, tuple):
+            lhs, op, rhs = marker
+
+            if isinstance(lhs, Variable):
+                lhs_value = _get_env(environment, lhs.value)
+                rhs_value = rhs.value
+            else:
+                lhs_value = lhs.value
+                rhs_value = _get_env(environment, rhs.value)
+
+            groups[-1].append(_eval_op(lhs_value, op, rhs_value))
+        else:
+            assert marker in ["and", "or"]
+            if marker == "or":
+                groups.append([])
+
+    return any(all(item) for item in groups)
+
+
+def format_full_version(info):
+    version = '{0.major}.{0.minor}.{0.micro}'.format(info)
+    kind = info.releaselevel
+    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
+    else:
+        iver = '0'
+        implementation_name = ''
+
+    return {
+        "implementation_name": implementation_name,
+        "implementation_version": iver,
+        "os_name": os.name,
+        "platform_machine": platform.machine(),
+        "platform_release": platform.release(),
+        "platform_system": platform.system(),
+        "platform_version": platform.version(),
+        "python_full_version": platform.python_version(),
+        "platform_python_implementation": platform.python_implementation(),
+        "python_version": platform.python_version()[:3],
+        "sys_platform": sys.platform,
+    }
+
+
+class Marker(object):
+
+    def __init__(self, marker):
+        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])
+            raise InvalidMarker(err_str)
+
+    def __str__(self):
+        return _format_marker(self._markers)
+
+    def __repr__(self):
+        return "<Marker({0!r})>".format(str(self))
+
+    def evaluate(self, environment=None):
+        """Evaluate a marker.
+
+        Return the boolean from evaluating the given marker against the
+        environment. environment is an optional argument to override all or
+        part of the determined environment.
+
+        The environment is determined from the current Python process.
+        """
+        current_environment = default_environment()
+        if environment is not None:
+            current_environment.update(environment)
+
+        return _evaluate_markers(self._markers, current_environment)
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d213f515aa54bb90ec5d1d3fac1f4afb39a52b1c
GIT binary patch
literal 13849
zcmZSn%*&NH<x)&C0~D|_FfceIFftUEvM?~DFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQw&M!0MP7a#$InSYd27hA1`|o1Gzw9n5BC$l+kf<z$HBWXR=Wh~i?%
z<z|TDX2|7Xh~j~m$O2Zu%MiuOkjuvq#mA7#&k)7WkSo9tB>+*u3RWS=5GBOGn8L=8
z!p@K*%#bU>5G4ZPb1>wHGUSReM2RuviZeusGccxbGNf=Zq;NB&@GzwCGNiLIL`g8D
za5AJyGNdswr0_AcFfcSTFhoX4fz&}o`Qf6{AgxeQ0l26PLy90nsw~(9A-Jd<Ly9m%
zsvKBU1THGikRl2b6@!Z^Fr<jXL?z&&iVUej3@MTf&5U4%6o}yj5|W0qWZ*1WI7<%B
zl83Vt;4DQrO9{?WhO<=QELAv54bD=Bvozo=O*l&n%!*QC$Yf(kQD#U{VK7TkVn|VC
zFiVkRNKs=jOOa<tQD-nqkzz>EfKZwYW>LxvsY(o4Dhw&wV2?90FoL|O12PQ6&;>ET
zzSe`Y^x-T6ILi>uGJ>;=!K^4%hE!E>2%3QTAX81jtSB{xR5h^OW^lU&7*fnZlBog=
zDHb4xQ<OSGsybMeC0vydLy8qh5@eP&h~X5a0rE$xI)hV`CPOM8L#igoZ1Gf02JvP_
zhA1tDR4uR>Hpph!g0yC7gOXg74%mryNFurnsr+CmJ&<OQnK}%qdJN*Jx?nS%qVz%B
zRDFh2UWQZ+5F2EbxE*6EH<**k!yq1Iz>s1OvNFn$A=QW>#et!Pks->MA(Mk4#StW)
zV#;8a;sj=yFqoyXFl3o9q!>e3rVJ_i5SAH3iY|m@&X8gNVOcPw=s{SP3@JtoW>HoQ
zDb65+qO3u=p_zdp%7!7u1uSCAkm3qv*fFHIff@D;Deho~11K*-bB_l|1f2gI8B&-S
zf;BuD7#K1^#gPUx0|P?|KLZ0pVp4H_PH9PMd}eMzeo;vY2Ll5`N@iJRab|vA2_FLk
zLqSnyUP*jfX<l+kW`3TZ1`9|hNFpGys5sTNB004HBvHb{z`y_&3Q8?5%_%7^;bvf9
zC@v|=%u5e0Nh~TU;e_*D^HLzja4|42M5Pwx`xp7<7p0bfN=Wyj{L+FFb_NCpxBQ~=
z#G(|i!GWduC8;UFVAC`hK`sEP@X0JmElSME1PMSyL5_gf8DCOakXo$41X2sKIk+G-
zIWsLYwWvgZfq}s@uPiYqGX){YixBipEXqzTDiLO2U<l1iNlnYlOHFak&n-wS$}G;$
zE0I7Jcg-uyEXvQzP0cIuOUz9zVPjxmK+>O*nwD6aQxczwPzJ9KK#q0-RR^H3Ol1Jo
z0x1ljS|BJG?3ZF!1_lN$1qB5K$2^5hh<g=s!ERG1Pb^kQ%P-AK(NQQZPAw`{D9*?)
z%}G%xN=-{GQYgt+2yhKhFg38y1M7!GHYj4_<MR@8Q{&@HKmi{gpPQdjngim30y927
zB|kYnUIUyw;6!m90|SG8K~ZK|Vo9ogSz?iXT7FJSYEiL%cA<WDv5~pCVPTe$d6}Vw
zd2vo<dU?D_iiwGVfq_AKo_>gaL1uw&W?pegVor{3d7@=$V1|BiYDsB9Nq&A#F)}m0
zEHy7Bzev9zF*!RiJu@#|AL7$uy@JXhP%@PSB_2>@vN01Mf&o}UFux$RC=rxk!GV}q
zQj(fmP?DOWke{cJs8E)eQ<|z!l95=VkdmKToTpx*P+VF7$`=ZmB}jo8B*MVJ5F`pB
z#26SD24R?i61hA%VHN`qGX+puK?|jle1)V`P?}3YgpxvDeu+YAMP_k{LS|lZW=g6;
zewso_Mk+Y%A*K8w6@G#Y3=FF9@M9?fm3n^pDXEx=Plthl0iJzZz&SXD5mfL-F@p+S
zkO&Jy3Nu)Ql_4k?T=FG@k}?cCgGvEV0aU}tP{Y6w4{jYo3IRWGQ2;I&!D$mxo`D=w
zoSKss1S*RViEj|(RdDqYAD@|*SrQ+w2Ma$2#$-@w2f`pf!~I*r0P=4ZBdC&w`4^<1
z1XMc}mlQ$#2htV<%KwAQr;swUxTGjP-VlpNL2(53s0^q=Wn{>L`8A7)p@bRa?`B4Z
zW>BRJ^08krsOGY%HmKF8HdHLC)wBaA6L5W!mS2>c2&q2f<CAj|i;LsqAq9{$sO%Y}
z!2_voic$-T;^R%Qgb&Es;P3%eMI{UjO^l#^3@jCZWWhDCUw(;aZb42esD@2VaV;v!
zF9K(YL6{&oLB32a%1q43tV%TpaX>N4z^DOg6hI;jTw_Rqstr)82m%$*L5iSAgx9y=
zG(HG2a*#L!0|TgND+Wa*8xtop2!gYBSYlCTVp0y4q7YPQq7{YE#tdfuhemr119IjE
zMSIX7PSxPZvPFtoP(g(hwSzP+l^7TptYNNZV**zvVW6fCW^G1F6oRU(6j;gD%*YT7
zuATgfLCtujYJ*xONKTanC2(-e4!S}d9G}jxkYQj1x0DBed@3_AFgU_o&Bjy$Drfu)
zD2vRYn;$`)+G0=;44L>-VPIfzM~XjCA0iW0%Yi#5@nxw+;2yXfs0W^tSORJU#1~YS
zWaQ_8dg_o05v&wkO`_=rwcNqtP#tNdIXQ46L0y9an2|-PIjM=oso+jATo7hCipt!?
z<c!R`RPdkyTxD@(aY<?}WSjuvIGA2gd#1RuI3A`H+@;Si26sS<L2ak}Vm**E!403{
z%3?j3!eV4w^`OR~3PPPyj2t+6P_LqfL<y+I#V!LXrBW+OiV~ASg*XU<M8HiFkhvuc
z3?+;VSxgKyOrVikNhsCK1gWn;>CF!@loA9gV!>W?^zn2Ib`1tMVbfDfz$HovsProa
zlR03r1YFI7i9t};gKKr0oW$Iultep_pNc`vkz!Dg*xK5Hvlf)HgYax1lp=(xvjzLf
z4oun<gIYVF9${u4xLnH2gNHB3KydhiMm#`me@Mt8Y7UUy43J6#ltsW{7X)fN2AP7|
zOlF{p1mv{A5^zDFR$e(MBZFK8_P;uqR3gjIpkjS!__+%1XHc9b=B0q6I=_e<Z-ZMS
zC8Y&9sYAo>jc~t%a<v9HzBR$^TTqz*@AiR`EhvqHi;-p~h9Vt?bZ{5YC02-`mXV=^
ziJ=DE@r`3*C=_D|u3=yZPGMjO1}A?%a8Q6p=`xGK188~4sX-vKOF$z}@yYqAMail0
z1)vew_#*IlE4b|iE`cC?NO6-1&MIJH5EL{)pr%$YDEvT$1Op>Kqbw76Bn0F$c<K8V
zG-L}7suFN8l`u1;F@w6w#c~WKETE1eO1P#ml(0g((<zJ$*-Q*YX$%krDNGEK5F^r<
zK>9%vY#^l|2~ep6QC0%(hZk*t4${;xFt{``GSq_Or)UO43JXIPJE#@_=}2Kk;ftrR
zF^C7}Swbx=fmrhtss<^(nHg%B8L~J)(+{BdJ_D{q;86~$4*kHR*x(Wno|r&EQVbd#
z0`)6u7#L#3!6}CUlyXua35$_2jIodzR6{{p-{9PomRVF>;s;3)d<+Z>@u1d2Vo5w?
zOckueEitD!6`}%^Z1oJl={OghQozI@NG`>o9<@z+YF=tZL6O}8P`UxRl?_xeGcYIw
zIe;n!P&-%yq%g<{lx{#NDJQeIB*-2l32KCZ8z+v%#i>Q0QD5)~0=RO{NzDraHNwC{
zds+FJdEm|fV%P-|SV3+eQ$Z1tnU|MZ6y!DN>L8FGrhvi*G#JRhD95JAD9Omj#Lp<e
z$i~RaB*Dnfs0PVppuhuRa2*V4@7I7+QZ^gB)B#mvkVFA0*K;z8!68+YQ4CHJU}6xY
z3vji&2IOUsd%*<=$Xg(c?lpEyuLT8xQbzEgi$_pfVlCWLpzsH!IuHhXY7zqjL!~OH
zpaFHc89_xr789sEsbOMB2RBMVg%&eIc%C2wO9?YWHWx#Y1p^}^V;&zv1gP*~0hN59
zGOUD^A&U*6AEb?ip$5FvAe)1ssFk6F12k}*#R*aaN+L`Q&CH+ztBH{zj{&3-DhL|9
z1i90%1QZX&pymsF!c3vsK(VM6G^+w0&s0dvOHrscQY@;~(*UKsAYM=;_=5;g*%kyU
zrNGV5<ovvnL{N<fQWX!GtjRAb4l)L1Lr~`S%g;*<0(B9Bz~c&_@Bzmtqy<tC1d3R2
zmM$(xO$IYShJceUm>2}<7wpma)Uw2!`22$HpeP4b>I{s`jH-;hj4VvNOrnfDjLeME
z%;2;Q3StljCj%=6aLouBO=bj@gUw9fnu-a;2F0Eks9^z0A<UrI0}U}Vf@(}qyn&(%
zlt=uE^%)o#An^m5<wBXiQ2;rs6x^{?K%Tn+my3{C0LM%zY-ThFG-3pa3y>qhv%W|g
z!7%{p=RwBuK?!AWMMHXO321uuG$<NCK4V}MVgd!eC?xPfH4CV*0uFo~Mg~wLE*;!D
zsNi7)H5Fo67;Bk9*|LTi6bB{X(S2xp#RRFn0+t1}0~0`Pi4;Z#$t+fe5;jn~0Mrfy
z=U~P{0hmdUmc%oVbPO{?Eek^}D?=?CSeAvMgdN<RSq;jmpgAKJhAd8yNG&@<4I7AE
z%fXN*4a%umoD8+>FlAsVP=et=b^;ee4Ld^(D?<$jG@FB5QNzrT!pe}%#!&nN>IaYr
zGq`yr0Mebs3JQs4Mh1}TLIH;G5^hkdr-cC|32HxqN*eIUw_oP}|Ns97fksV(>=+mr
z;H?`_asjt)Km)#@){P*db<@nq0BP4CTEw8%Hn=)U%*g@QQ9+=AA8`80EJ+>AEthwo
zv<1p}Yzz>G!^1*@2UG%r8ZJRTAQrsQ666ai??4GJv7jI|FQo*O%fLlOX<|t#v>{gv
z9(4$c2k8V={z1_oO`u>+%&P>qiNO5<NJFMLC>A6OGBO>s#G*I|G&>G1I)frWCV&f0
zP;$@7D2@kDHiB1d6v24lYzrm^K@l1R8tl9V3Rlp;3j-r36ECA26F;LYBR?ZQ6F;L6
zBM%cNqY#q<lMo{hqX-i?(Sbq+RE2=^GN@e#Dks6kDX0!)1l5mO;H(WA>tSNZW@adI
z0+pg5E;EB9sK>^@kOi&^#m#FWl_6-<8)T+mF{nDKHqgsW%*rpS)dR6I^Wd!HqWoHL
zyE`p2FEIz)%7>JwAYI@UF3^FvoYb<^9Pktfc<!$lJf8&V4T7x6%uCA$M=Eq&44nM4
zGxJiw5d$U$LF|Bs9-(~><e|rppa_E$viyvkj695TjG%aA0Obu(<bWgQASjuFJ2xqi
zj+p_dN&}6>F*9VbfZ8FoVA(8YhAdW4iIK+xYOd5WfckH>j0~CFpg2omVKA#<02N|p
zC2SytDQpa8CG5~XSPDCY!wG6YrEowvTwo3-gu?>na6vfSU=BBg!vp5<KsXQ?UIv8}
zJ_a+88`&9B_!-QCH9##CKXBIrZ9o!Kj2Q%lfO4EVhyX1z2m)2eLE0d$CWrvdy9H^1
zSfCgUQUk5p0)<bIE=UYCt*!xTKY<fMMq+VdNl6j7WGt>M4$229DF6|<AR-PFnxOE_
zF9tU|V56*Hz0h$~FdLfwAgK;Kstd8r0Mt+h830adnPsU(K_GX790pnUG6>RJ5NNH|
zPf+55lm?*u&(Flh$i~FX$j->l$i>Ku1O*|94%8F@`3t-T3lsrpGnZHvaX{8_FoM?K
z1_f(?nx5bW8Yp9e%2jakO$D{nWk3}*C^>)!5g@HF(8>-_^W2F6w3-CeJWpU?tYu<g
z1eHRppfn4r%9+4zb1<30#2~H+s;-$q6@Cr4+yOPg85ttL14W<|;a3bwHPF>;(A8m9
zkhZsu0(f{xAr&-du8>%w0B(q9f~IpdKm>R&1{~eKjzQk8LEx4fSPNvC9XPqbYZ{Pc
z;8q?uq2=T!gI8ri$}rHh9=J9Ek0GRjlT&I@QG9Vp(cnrZQVa|XLW~Ry;5i3Sds~K)
zpOKAGmc->L;9-NH8c@an<>tY+6d?$-x<Cr#QBVR$T73hGMQ|zwWf)Mp1DB+bIe2h`
z4W!<$7_{Kd2C|G%1Kdy0w1YHUK(!UPasrQ14nmKER#eC$c^u>)kf%Wy>~YXULJ0$?
z2!{;tfrbn@8H!Xv%~sH44|qtHF^>VdMkk8}BmrNhQ>?<sz~BmM93_^dDkMTPoE{f=
zsT*jiW>9KLX;B_%^_xOcetu4BVxB@;QGPDGSCy9zmP^kpOU;AoR!B?-cX&Y(aC4A)
zP<qJyFon!wg~U9CeDIRn#2kghqV!VG(iqU1&-}8~q9V}pyTqIvh5RD8Sp|tjCD0{#
z3Mr{2sYSV<6|KmoB6%PrBNbT&WFL|quwP0tQWcU*i;7b7N)!UXlYR;XMfu68#l?^n
zexPvh1DB5Aaycj*R0V;`$I^n7#FA8S(+!e)K(PW&M3A;AC{aQU26f3`3u^~e83Ha9
zp?&031yD)@m8A@vpw^54lb;4?C>Ln~0jR_Q=SIj{A5c&PHGv8aQ0+6QJQgIxz`!5?
z^AH;oCkJT3j|Ql30-lG6k54NtDJ@Ekj|YvPF$952K2Y`ohX`nlC9x#GC<rtZ6jTao
zd4MJnOF&&a#EM_N)QXbSqCCBVN>DwMnU@{}P643$GYC|h27yvZ5I6`yp&G;qG6&RN
z4B`f*A&`|m;MyfV8MGd|BnZ@f0=o`0*aKeOT?`pn0*@zw42q9W%*lZ+cm^+d0S^F!
zD=)|>5~yPZt_AaxvQm>v!0VnM{VLFSRuE_&670h;#~@EfCm+`!Bal--<`<`yfY-Y_
zf)~bvtIsgkpkPmbzj$Zg0C49CQnSYU2Y{RSP+pj$PpB){N+*ARAO8Tb2jFs$dKk*}
z3~}`Z+YVZVT$EZ|4A$lo;27lU2WAFAn4sW+YH^JSKrzBG#NRgvG+zg)??GW5QdF7>
zuEW4%W;rDgDiutn7J{if2rnH<l>~)>q5{;v3<50>hV(f>ZFfj}6O?no2?&v-!K^{h
zHUtNsO)hw)yB)~)#h{8?hKYv}44IS|l^6w>1Q^9wI2n0Z#Ms2x#Ms67!L;~FMqX$O
z64Z)hXXIiM;B;l=WtL(TU=jmiCN3rsMgb-vMj<9nMhQkSCO&3Pb{=tNMlKY{%fczh
O$;`>kDb2~jDGmThBDD+v

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py
new file mode 100644
index 00000000..5b493416
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py
@@ -0,0 +1,127 @@
+# 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 string
+import re
+
+from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException
+from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine
+from setuptools.extern.pyparsing import Literal as L  # noqa
+from setuptools.extern.six.moves.urllib import parse as urlparse
+
+from .markers import MARKER_EXPR, Marker
+from .specifiers import LegacySpecifier, Specifier, SpecifierSet
+
+
+class InvalidRequirement(ValueError):
+    """
+    An invalid requirement was found, users should refer to PEP 508.
+    """
+
+
+ALPHANUM = Word(string.ascii_letters + string.digits)
+
+LBRACKET = L("[").suppress()
+RBRACKET = L("]").suppress()
+LPAREN = L("(").suppress()
+RPAREN = L(")").suppress()
+COMMA = L(",").suppress()
+SEMICOLON = L(";").suppress()
+AT = L("@").suppress()
+
+PUNCTUATION = Word("-_.")
+IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
+IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
+
+NAME = IDENTIFIER("name")
+EXTRA = IDENTIFIER
+
+URI = Regex(r'[^ ]+')("url")
+URL = (AT + URI)
+
+EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
+EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
+
+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_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
+_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])
+)
+MARKER_SEPERATOR = SEMICOLON
+MARKER = MARKER_SEPERATOR + 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)
+
+REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
+
+
+class Requirement(object):
+    """Parse a requirement.
+
+    Parse a given requirement string into its parts, such as name, specifier,
+    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
+    string.
+    """
+
+    # TODO: Can we test whether something is contained within a requirement?
+    #       If so how do we do that? Do we need to test against the _name_ of
+    #       the thing as well as the version? What about the markers?
+    # TODO: Can we normalize the name and extra name?
+
+    def __init__(self, requirement_string):
+        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]))
+
+        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")
+            self.url = req.url
+        else:
+            self.url = None
+        self.extras = set(req.extras.asList() if req.extras else [])
+        self.specifier = SpecifierSet(req.specifier)
+        self.marker = req.marker if req.marker else None
+
+    def __str__(self):
+        parts = [self.name]
+
+        if self.extras:
+            parts.append("[{0}]".format(",".join(sorted(self.extras))))
+
+        if self.specifier:
+            parts.append(str(self.specifier))
+
+        if self.url:
+            parts.append("@ {0}".format(self.url))
+
+        if self.marker:
+            parts.append("; {0}".format(self.marker))
+
+        return "".join(parts)
+
+    def __repr__(self):
+        return "<Requirement({0!r})>".format(str(self))
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d5c8f9033bd0799774bc125b4d7ae944ff95fe98
GIT binary patch
literal 5650
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
UB+AIf$i)Q00*nI85=?x|05gdSAOHXW

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py
new file mode 100644
index 00000000..7f5a76cf
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py
@@ -0,0 +1,774 @@
+# 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 abc
+import functools
+import itertools
+import re
+
+from ._compat import string_types, with_metaclass
+from .version import Version, LegacyVersion, parse
+
+
+class InvalidSpecifier(ValueError):
+    """
+    An invalid specifier was found, users should refer to PEP 440.
+    """
+
+
+class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
+
+    @abc.abstractmethod
+    def __str__(self):
+        """
+        Returns the str representation of this Specifier like object. This
+        should be representative of the Specifier itself.
+        """
+
+    @abc.abstractmethod
+    def __hash__(self):
+        """
+        Returns a hash value for this Specifier like object.
+        """
+
+    @abc.abstractmethod
+    def __eq__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are equal.
+        """
+
+    @abc.abstractmethod
+    def __ne__(self, other):
+        """
+        Returns a boolean representing whether or not the two Specifier like
+        objects are not equal.
+        """
+
+    @abc.abstractproperty
+    def prereleases(self):
+        """
+        Returns whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @prereleases.setter
+    def prereleases(self, value):
+        """
+        Sets whether or not pre-releases as a whole are allowed by this
+        specifier.
+        """
+
+    @abc.abstractmethod
+    def contains(self, item, prereleases=None):
+        """
+        Determines if the given item is contained within this specifier.
+        """
+
+    @abc.abstractmethod
+    def filter(self, iterable, prereleases=None):
+        """
+        Takes an iterable of items and filters them so that only items which
+        are contained within this specifier are allowed in it.
+        """
+
+
+class _IndividualSpecifier(BaseSpecifier):
+
+    _operators = {}
+
+    def __init__(self, spec="", prereleases=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(),
+        )
+
+        # Store whether or not this Specifier should accept prereleases
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        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,
+        )
+
+    def __str__(self):
+        return "{0}{1}".format(*self._spec)
+
+    def __hash__(self):
+        return hash(self._spec)
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec == other._spec
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            try:
+                other = self.__class__(other)
+            except InvalidSpecifier:
+                return NotImplemented
+        elif not isinstance(other, self.__class__):
+            return NotImplemented
+
+        return self._spec != other._spec
+
+    def _get_operator(self, op):
+        return getattr(self, "_compare_{0}".format(self._operators[op]))
+
+    def _coerce_version(self, version):
+        if not isinstance(version, (LegacyVersion, Version)):
+            version = parse(version)
+        return version
+
+    @property
+    def operator(self):
+        return self._spec[0]
+
+    @property
+    def version(self):
+        return self._spec[1]
+
+    @property
+    def prereleases(self):
+        return self._prereleases
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # 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)
+
+        # 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:
+            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)
+
+    def filter(self, iterable, prereleases=None):
+        yielded = False
+        found_prereleases = []
+
+        kw = {"prereleases": prereleases if prereleases is not None else True}
+
+        # Attempt to iterate over all the values in the iterable and if any of
+        # them match, yield them.
+        for version in iterable:
+            parsed_version = self._coerce_version(version)
+
+            if self.contains(parsed_version, **kw):
+                # 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)):
+                    found_prereleases.append(version)
+                # Either this is not a prerelease, or we should have been
+                # accepting prereleases from the begining.
+                else:
+                    yielded = True
+                    yield version
+
+        # Now that we've iterated over everything, determine if we've yielded
+        # any values, and if we have not and we have any prereleases stored up
+        # then we will go ahead and yield the prereleases.
+        if not yielded and found_prereleases:
+            for version in found_prereleases:
+                yield version
+
+
+class LegacySpecifier(_IndividualSpecifier):
+
+    _regex_str = (
+        r"""
+        (?P<operator>(==|!=|<=|>=|<|>))
+        \s*
+        (?P<version>
+            [^,;\s)]* # Since this is a "legacy" specifier, and the version
+                      # string can be just about anything, we match everything
+                      # except for whitespace, a semi-colon for marker support,
+                      # a closing paren since versions can be enclosed in
+                      # them, and a comma since it's a version separator.
+        )
+        """
+    )
+
+    _regex = re.compile(
+        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+    }
+
+    def _coerce_version(self, version):
+        if not isinstance(version, LegacyVersion):
+            version = LegacyVersion(str(version))
+        return version
+
+    def _compare_equal(self, prospective, spec):
+        return prospective == self._coerce_version(spec)
+
+    def _compare_not_equal(self, prospective, spec):
+        return prospective != self._coerce_version(spec)
+
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= self._coerce_version(spec)
+
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= self._coerce_version(spec)
+
+    def _compare_less_than(self, prospective, spec):
+        return prospective < self._coerce_version(spec)
+
+    def _compare_greater_than(self, prospective, spec):
+        return prospective > self._coerce_version(spec)
+
+
+def _require_version_compare(fn):
+    @functools.wraps(fn)
+    def wrapped(self, prospective, spec):
+        if not isinstance(prospective, Version):
+            return False
+        return fn(self, prospective, spec)
+    return wrapped
+
+
+class Specifier(_IndividualSpecifier):
+
+    _regex_str = (
+        r"""
+        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
+        (?P<version>
+            (?:
+                # The identity operators allow for an escape hatch that will
+                # do an exact string match of the version you wish to install.
+                # This will not be parsed by PEP 440 and we cannot determine
+                # any semantic meaning from it. This operator is discouraged
+                # but included entirely as an escape hatch.
+                (?<====)  # Only match for the identity operator
+                \s*
+                [^\s]*    # We just match everything, except for whitespace
+                          # since we are only testing for strict identity.
+            )
+            |
+            (?:
+                # The (non)equality operators allow for wild card and local
+                # versions to be specified so we have to define these two
+                # operators separately to enable that.
+                (?<===|!=)            # Only match for equals and not equals
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+
+                # You cannot use a wild card and a dev or local version
+                # together so group them with a | and make them optional.
+                (?:
+                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
+                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
+                    |
+                    \.\*  # Wild card syntax of .*
+                )?
+            )
+            |
+            (?:
+                # The compatible operator requires at least two digits in the
+                # release segment.
+                (?<=~=)               # Only match for the compatible operator
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+            |
+            (?:
+                # All other operators only allow a sub set of what the
+                # (non)equality operators do. Specifically they do not allow
+                # local versions to be specified nor do they allow the prefix
+                # matching wild cards.
+                (?<!==|!=|~=)         # We have special cases for these
+                                      # operators so we want to make sure they
+                                      # don't match here.
+
+                \s*
+                v?
+                (?:[0-9]+!)?          # epoch
+                [0-9]+(?:\.[0-9]+)*   # release
+                (?:                   # pre release
+                    [-_\.]?
+                    (a|b|c|rc|alpha|beta|pre|preview)
+                    [-_\.]?
+                    [0-9]*
+                )?
+                (?:                                   # post release
+                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+                )?
+                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
+            )
+        )
+        """
+    )
+
+    _regex = re.compile(
+        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+
+    _operators = {
+        "~=": "compatible",
+        "==": "equal",
+        "!=": "not_equal",
+        "<=": "less_than_equal",
+        ">=": "greater_than_equal",
+        "<": "less_than",
+        ">": "greater_than",
+        "===": "arbitrary",
+    }
+
+    @_require_version_compare
+    def _compare_compatible(self, prospective, spec):
+        # 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
+        # implementing it ourselves. The only thing we need to do is construct
+        # the other specifiers.
+
+        # We want everything but the last item in the version, but we want to
+        # ignore post and dev releases and we want to treat the pre-release as
+        # it's own separate segment.
+        prefix = ".".join(
+            list(
+                itertools.takewhile(
+                    lambda x: (not x.startswith("post") and not
+                               x.startswith("dev")),
+                    _version_split(spec),
+                )
+            )[:-1]
+        )
+
+        # Add the prefix notation to the end of our string
+        prefix += ".*"
+
+        return (self._get_operator(">=")(prospective, spec) and
+                self._get_operator("==")(prospective, prefix))
+
+    @_require_version_compare
+    def _compare_equal(self, prospective, spec):
+        # 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 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))
+
+            # 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)]
+
+            # Pad out our two sides with zeros so that they both equal the same
+            # length.
+            spec, prospective = _pad_version(spec, prospective)
+        else:
+            # Convert our spec string into a Version
+            spec = 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:
+                prospective = Version(prospective.public)
+
+        return prospective == spec
+
+    @_require_version_compare
+    def _compare_not_equal(self, prospective, spec):
+        return not self._compare_equal(prospective, spec)
+
+    @_require_version_compare
+    def _compare_less_than_equal(self, prospective, spec):
+        return prospective <= Version(spec)
+
+    @_require_version_compare
+    def _compare_greater_than_equal(self, prospective, spec):
+        return prospective >= Version(spec)
+
+    @_require_version_compare
+    def _compare_less_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # 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
+        # instead of doing extra unneeded work.
+        if not prospective < spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a pre-release version, that we do not accept pre-release
+        # versions for the version mentioned in the specifier (e.g. <3.1 should
+        # not match 3.1.dev0, but should match 3.0.dev0).
+        if not spec.is_prerelease and prospective.is_prerelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # less than the spec version *and* it's not a pre-release of the same
+        # version in the spec.
+        return True
+
+    @_require_version_compare
+    def _compare_greater_than(self, prospective, spec):
+        # Convert our spec to a Version instance, since we'll want to work with
+        # it as a version.
+        spec = Version(spec)
+
+        # 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
+        # instead of doing extra unneeded work.
+        if not prospective > spec:
+            return False
+
+        # This special case is here so that, unless the specifier itself
+        # includes is a post-release version, that we do not accept
+        # post-release versions for the version mentioned in the specifier
+        # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0).
+        if not spec.is_postrelease and prospective.is_postrelease:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                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.
+        if prospective.local is not None:
+            if Version(prospective.base_version) == Version(spec.base_version):
+                return False
+
+        # If we've gotten to here, it means that prospective version is both
+        # greater than the spec version *and* it's not a pre-release of the
+        # same version in the spec.
+        return True
+
+    def _compare_arbitrary(self, prospective, spec):
+        return str(prospective).lower() == str(spec).lower()
+
+    @property
+    def prereleases(self):
+        # If there is an explicit prereleases set for this, then we'll just
+        # blindly use that.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # Look at all of our specifiers and determine if they are inclusive
+        # operators, and if they are if they are including an explicit
+        # prerelease.
+        operator, version = self._spec
+        if operator in ["==", ">=", "<=", "~=", "==="]:
+            # The == specifier can include a trailing .*, if it does we
+            # want to remove before parsing.
+            if operator == "==" and version.endswith(".*"):
+                version = version[:-2]
+
+            # Parse the version, and if it is a pre-release than this
+            # specifier allows pre-releases.
+            if parse(version).is_prerelease:
+                return True
+
+        return False
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+
+_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
+
+
+def _version_split(version):
+    result = []
+    for item in version.split("."):
+        match = _prefix_regex.search(item)
+        if match:
+            result.extend(match.groups())
+        else:
+            result.append(item)
+    return result
+
+
+def _pad_version(left, right):
+    left_split, right_split = [], []
+
+    # Get the release segment of our versions
+    left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left)))
+    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]):])
+
+    # 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])),
+    )
+
+    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
+        # strip each item to remove leading/trailing whitespace.
+        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:
+            try:
+                parsed.add(Specifier(specifier))
+            except InvalidSpecifier:
+                parsed.add(LegacySpecifier(specifier))
+
+        # Turn our parsed specifiers into a frozen set and save them for later.
+        self._specs = frozenset(parsed)
+
+        # Store our prereleases value so we can use it later to determine if
+        # we accept prereleases or not.
+        self._prereleases = prereleases
+
+    def __repr__(self):
+        pre = (
+            ", prereleases={0!r}".format(self.prereleases)
+            if self._prereleases is not None
+            else ""
+        )
+
+        return "<SpecifierSet({0!r}{1})>".format(str(self), pre)
+
+    def __str__(self):
+        return ",".join(sorted(str(s) for s in self._specs))
+
+    def __hash__(self):
+        return hash(self._specs)
+
+    def __and__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        specifier = SpecifierSet()
+        specifier._specs = frozenset(self._specs | other._specs)
+
+        if self._prereleases is None and other._prereleases is not None:
+            specifier._prereleases = other._prereleases
+        elif self._prereleases is not None and other._prereleases is None:
+            specifier._prereleases = self._prereleases
+        elif self._prereleases == other._prereleases:
+            specifier._prereleases = self._prereleases
+        else:
+            raise ValueError(
+                "Cannot combine SpecifierSets with True and False prerelease "
+                "overrides."
+            )
+
+        return specifier
+
+    def __eq__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs == other._specs
+
+    def __ne__(self, other):
+        if isinstance(other, string_types):
+            other = SpecifierSet(other)
+        elif isinstance(other, _IndividualSpecifier):
+            other = SpecifierSet(str(other))
+        elif not isinstance(other, SpecifierSet):
+            return NotImplemented
+
+        return self._specs != other._specs
+
+    def __len__(self):
+        return len(self._specs)
+
+    def __iter__(self):
+        return iter(self._specs)
+
+    @property
+    def prereleases(self):
+        # If we have been given an explicit prerelease modifier, then we'll
+        # pass that through here.
+        if self._prereleases is not None:
+            return self._prereleases
+
+        # If we don't have any specifiers, and we don't have a forced value,
+        # then we'll just return None since we don't know if this should have
+        # pre-releases or not.
+        if not self._specs:
+            return None
+
+        # Otherwise we'll see if any of the given specifiers accept
+        # prereleases, if any of them do we'll return True, otherwise False.
+        return any(s.prereleases for s in self._specs)
+
+    @prereleases.setter
+    def prereleases(self, value):
+        self._prereleases = value
+
+    def __contains__(self, item):
+        return self.contains(item)
+
+    def contains(self, item, prereleases=None):
+        # Ensure that our item is a Version or LegacyVersion instance.
+        if not isinstance(item, (LegacyVersion, Version)):
+            item = parse(item)
+
+        # 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.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # We can determine if we're going to allow pre-releases by looking to
+        # see if any of the underlying items supports them. If none of them do
+        # and this item is a pre-release then we do not allow it and we can
+        # short circuit that here.
+        # Note: This means that 1.0.dev1 would not be contained in something
+        #       like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0
+        if not prereleases and item.is_prerelease:
+            return False
+
+        # We simply dispatch to the underlying specs here to make sure that the
+        # 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
+        )
+
+    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.
+        if prereleases is None:
+            prereleases = self.prereleases
+
+        # If we have any specifiers, then we want to wrap our iterable in the
+        # filter method for each one, this will act as a logical AND amongst
+        # each specifier.
+        if self._specs:
+            for spec in self._specs:
+                iterable = spec.filter(iterable, prereleases=bool(prereleases))
+            return iterable
+        # If we do not have any specifiers, then we need to have a rough filter
+        # 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 = []
+
+            for item in iterable:
+                # Ensure that we some kind of Version class for this item.
+                if not isinstance(item, (LegacyVersion, Version)):
+                    parsed_version = parse(item)
+                else:
+                    parsed_version = item
+
+                # Filter out any item which is parsed as a LegacyVersion
+                if isinstance(parsed_version, LegacyVersion):
+                    continue
+
+                # Store any item which is a pre-release for later unless we've
+                # already found a final version or we are accepting prereleases
+                if parsed_version.is_prerelease and not prereleases:
+                    if not filtered:
+                        found_prereleases.append(item)
+                else:
+                    filtered.append(item)
+
+            # If we've found no items except for pre-releases, then we'll go
+            # ahead and use the pre-releases
+            if not filtered and found_prereleases and prereleases is None:
+                return found_prereleases
+
+            return filtered
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1e9a03153b85fe526b0fcec6e04f3ca417f2593b
GIT binary patch
literal 29161
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
HuT2^NAjFLI

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py
new file mode 100644
index 00000000..942387ce
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py
@@ -0,0 +1,14 @@
+# 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/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..af8b5bb480cccac69811421519501abc42864216
GIT binary patch
literal 702
zcmZSn%*&NH<x)&C0~9bZFfceIFftUoFfcHrFfgPrGUPBY<T5fuF*4*bF+?#j<T5iv
zF*7iN<d_(8SQw&M7*bgnvRD~Xm>HTG8KT%2Qdk&T7#O118B&-Sf;Ctf7#K1^rfV=W
zFff$xGcYhDCKc!Bl$NB%XXX~<7nPK7fb7aF%Ph{!&nw|$U|=XH%FHW?Pb<w!F3HT#
z^DAa!U|@*Wjn|9SPG)3aU;tr|Va_0jih)dJV8~(wxwVFYp_z#xi;1C`fgxA}<Qcyb
zkZN6s<-!aM4Drc{dHH#n$%#3cRjKhssp+W|B_P9!OOr}KZq3OrPc6~_X)0l1U|`5g
z%uUq*J0C<8*Dx?J=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-
zRHm25o1~bS7#J8Br03~}=oe%b=w{{>mn7!o=$0p1mIh|%7pIn#7L?@Y=M*C|<I7U>
zQu2%R3lfvF6Vo&E()CMAGINUc3Mxwk85kH)d;oGF4+8^3G03+JOd6oTEa3uqG(N4g
zq_ikCK0XNK^dOLzf<TH&Ktxe$2|LKB{M>@foYWwYSA#%W5q<@;2HwLUN7>}&r<CTT
Q+JRgNP7E?kJk0#e015l7X#fBK

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py
new file mode 100644
index 00000000..83b5ee8c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py
@@ -0,0 +1,393 @@
+# 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 collections
+import itertools
+import re
+
+from ._structures import Infinity
+
+
+__all__ = [
+    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"
+]
+
+
+_Version = collections.namedtuple(
+    "_Version",
+    ["epoch", "release", "dev", "pre", "post", "local"],
+)
+
+
+def parse(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
+    a valid PEP 440 version or a legacy version.
+    """
+    try:
+        return Version(version)
+    except InvalidVersion:
+        return LegacyVersion(version)
+
+
+class InvalidVersion(ValueError):
+    """
+    An invalid version was found, users should refer to PEP 440.
+    """
+
+
+class _BaseVersion(object):
+
+    def __hash__(self):
+        return hash(self._key)
+
+    def __lt__(self, other):
+        return self._compare(other, lambda s, o: s < o)
+
+    def __le__(self, other):
+        return self._compare(other, lambda s, o: s <= o)
+
+    def __eq__(self, other):
+        return self._compare(other, lambda s, o: s == o)
+
+    def __ge__(self, other):
+        return self._compare(other, lambda s, o: s >= o)
+
+    def __gt__(self, other):
+        return self._compare(other, lambda s, o: s > o)
+
+    def __ne__(self, other):
+        return self._compare(other, lambda s, o: s != o)
+
+    def _compare(self, other, method):
+        if not isinstance(other, _BaseVersion):
+            return NotImplemented
+
+        return method(self._key, other._key)
+
+
+class LegacyVersion(_BaseVersion):
+
+    def __init__(self, version):
+        self._version = str(version)
+        self._key = _legacy_cmpkey(self._version)
+
+    def __str__(self):
+        return self._version
+
+    def __repr__(self):
+        return "<LegacyVersion({0})>".format(repr(str(self)))
+
+    @property
+    def public(self):
+        return self._version
+
+    @property
+    def base_version(self):
+        return self._version
+
+    @property
+    def local(self):
+        return None
+
+    @property
+    def is_prerelease(self):
+        return False
+
+    @property
+    def is_postrelease(self):
+        return False
+
+
+_legacy_version_component_re = re.compile(
+    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
+)
+
+_legacy_version_replacement_map = {
+    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
+}
+
+
+def _parse_version_parts(s):
+    for part in _legacy_version_component_re.split(s):
+        part = _legacy_version_replacement_map.get(part, part)
+
+        if not part or part == ".":
+            continue
+
+        if part[:1] in "0123456789":
+            # pad for numeric comparison
+            yield part.zfill(8)
+        else:
+            yield "*" + part
+
+    # ensure that alpha/beta/candidate are before final
+    yield "*final"
+
+
+def _legacy_cmpkey(version):
+    # 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,
+    # as before all PEP 440 versions.
+    epoch = -1
+
+    # This scheme is taken from pkg_resources.parse_version setuptools prior to
+    # it's adoption of the packaging library.
+    parts = []
+    for part in _parse_version_parts(version.lower()):
+        if part.startswith("*"):
+            # remove "-" before a prerelease tag
+            if part < "*final":
+                while parts and parts[-1] == "*final-":
+                    parts.pop()
+
+            # remove trailing zeros from each series of numeric parts
+            while parts and parts[-1] == "00000000":
+                parts.pop()
+
+        parts.append(part)
+    parts = tuple(parts)
+
+    return epoch, parts
+
+# Deliberately not anchored to the start and end of the string, to make it
+# easier for 3rd party code to reuse
+VERSION_PATTERN = r"""
+    v?
+    (?:
+        (?:(?P<epoch>[0-9]+)!)?                           # epoch
+        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
+        (?P<pre>                                          # pre-release
+            [-_\.]?
+            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
+            [-_\.]?
+            (?P<pre_n>[0-9]+)?
+        )?
+        (?P<post>                                         # post release
+            (?:-(?P<post_n1>[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?P<post_l>post|rev|r)
+                [-_\.]?
+                (?P<post_n2>[0-9]+)?
+            )
+        )?
+        (?P<dev>                                          # dev release
+            [-_\.]?
+            (?P<dev_l>dev)
+            [-_\.]?
+            (?P<dev_n>[0-9]+)?
+        )?
+    )
+    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
+"""
+
+
+class Version(_BaseVersion):
+
+    _regex = re.compile(
+        r"^\s*" + VERSION_PATTERN + r"\s*$",
+        re.VERBOSE | re.IGNORECASE,
+    )
+
+    def __init__(self, version):
+        # Validate the version and parse it into pieces
+        match = self._regex.search(version)
+        if not match:
+            raise InvalidVersion("Invalid version: '{0}'".format(version))
+
+        # Store the parsed out pieces of the version
+        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"),
+            ),
+            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"),
+            ),
+            local=_parse_local_version(match.group("local")),
+        )
+
+        # Generate a key which will be used for sorting
+        self._key = _cmpkey(
+            self._version.epoch,
+            self._version.release,
+            self._version.pre,
+            self._version.post,
+            self._version.dev,
+            self._version.local,
+        )
+
+    def __repr__(self):
+        return "<Version({0})>".format(repr(str(self)))
+
+    def __str__(self):
+        parts = []
+
+        # Epoch
+        if self._version.epoch != 0:
+            parts.append("{0}!".format(self._version.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self._version.release))
+
+        # Pre-release
+        if self._version.pre is not None:
+            parts.append("".join(str(x) for x in self._version.pre))
+
+        # Post-release
+        if self._version.post is not None:
+            parts.append(".post{0}".format(self._version.post[1]))
+
+        # Development release
+        if self._version.dev is not None:
+            parts.append(".dev{0}".format(self._version.dev[1]))
+
+        # Local version segment
+        if self._version.local is not None:
+            parts.append(
+                "+{0}".format(".".join(str(x) for x in self._version.local))
+            )
+
+        return "".join(parts)
+
+    @property
+    def public(self):
+        return str(self).split("+", 1)[0]
+
+    @property
+    def base_version(self):
+        parts = []
+
+        # Epoch
+        if self._version.epoch != 0:
+            parts.append("{0}!".format(self._version.epoch))
+
+        # Release segment
+        parts.append(".".join(str(x) for x in self._version.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)
+
+    @property
+    def is_postrelease(self):
+        return bool(self._version.post)
+
+
+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.
+        if number is None:
+            number = 0
+
+        # We normalize any letters to their lower case form
+        letter = letter.lower()
+
+        # We consider some words to be alternate spellings of other words and
+        # in those cases we want to normalize the spellings to our preferred
+        # spelling.
+        if letter == "alpha":
+            letter = "a"
+        elif letter == "beta":
+            letter = "b"
+        elif letter in ["c", "pre", "preview"]:
+            letter = "rc"
+        elif letter in ["rev", "r"]:
+            letter = "post"
+
+        return letter, int(number)
+    if not letter and number:
+        # We assume if we are given a number, but we are not given a letter
+        # then this is using the implicit post release syntax (e.g. 1.0-1)
+        letter = "post"
+
+        return letter, int(number)
+
+
+_local_version_seperators = re.compile(r"[\._-]")
+
+
+def _parse_local_version(local):
+    """
+    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)
+        )
+
+
+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(
+        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.
+    # We'll do this by abusing the pre segment, but we _only_ want to do this
+    # 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
+    # Versions without a pre-release (except as noted above) should sort after
+    # those with one.
+    elif pre is None:
+        pre = Infinity
+
+    # Versions without a post segment should sort before those with one.
+    if post is None:
+        post = -Infinity
+
+    # Versions without a development segment should sort after those with one.
+    if dev is None:
+        dev = Infinity
+
+    if local is None:
+        # Versions without a local segment should sort before those with one.
+        local = -Infinity
+    else:
+        # Versions with a local segment need that segment parsed to implement
+        # the sorting rules in PEP440.
+        # - Alpha numeric segments sort before numeric segments
+        # - Alpha numeric segments sort lexicographically
+        # - 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
+        )
+
+    return epoch, release, pre, post, dev, local
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..79c863a374537b60af52fcc3245a4988007811b1
GIT binary patch
literal 17088
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py
new file mode 100644
index 00000000..cf75e1e5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py
@@ -0,0 +1,5742 @@
+# module pyparsing.py
+#
+# Copyright (c) 2003-2018  Paul T. McGuire
+#
+# 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.
+#
+
+__doc__ = \
+"""
+pyparsing module - Classes and methods to define and execute parsing grammars
+=============================================================================
+
+The pyparsing module is an alternative approach to creating and executing simple grammars,
+vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
+don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
+provides a library of classes that you use to construct the grammar directly in Python.
+
+Here is a program to parse "Hello, World!" (or any greeting of the form 
+C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements 
+(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to
+L{Literal} expressions)::
+
+    from pyparsing import Word, alphas
+
+    # define grammar of a greeting
+    greet = Word(alphas) + "," + Word(alphas) + "!"
+
+    hello = "Hello, World!"
+    print (hello, "->", greet.parseString(hello))
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the self-explanatory
+class names, and the use of '+', '|' and '^' operators.
+
+The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an
+object with named attributes.
+
+The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
+ - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
+ - quoted strings
+ - embedded comments
+
+
+Getting Started -
+-----------------
+Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing
+classes inherit from. Use the docstrings for examples of how to:
+ - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes
+ - construct character word-group expressions using the L{Word} class
+ - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes
+ - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones
+ - associate names with your parsed results using L{ParserElement.setResultsName}
+ - find some helpful expression short-cuts like L{delimitedList} and L{oneOf}
+ - find more useful common expressions in the L{pyparsing_common} namespace class
+"""
+
+__version__ = "2.2.1"
+__versionTime__ = "18 Sep 2018 00:49 UTC"
+__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"
+
+import string
+from weakref import ref as wkref
+import copy
+import sys
+import warnings
+import re
+import sre_constants
+import collections
+import pprint
+import traceback
+import types
+from datetime import datetime
+
+try:
+    from _thread import RLock
+except ImportError:
+    from threading import RLock
+
+try:
+    # Python 3
+    from collections.abc import Iterable
+    from collections.abc import MutableMapping
+except ImportError:
+    # Python 2.7
+    from collections import Iterable
+    from collections import MutableMapping
+
+try:
+    from collections import OrderedDict as _OrderedDict
+except ImportError:
+    try:
+        from ordereddict import OrderedDict as _OrderedDict
+    except ImportError:
+        _OrderedDict = None
+
+#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )
+
+__all__ = [
+'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
+'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
+'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
+'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
+'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
+'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 
+'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore',
+'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
+'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
+'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums',
+'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno',
+'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
+'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
+'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 
+'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
+'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
+'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass',
+'CloseMatch', 'tokenMap', 'pyparsing_common',
+]
+
+system_version = tuple(sys.version_info)[:3]
+PY_3 = system_version[0] == 3
+if PY_3:
+    _MAX_INT = sys.maxsize
+    basestring = str
+    unichr = chr
+    _ustr = str
+
+    # build list of single arg builtins, that can be used as parse actions
+    singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max]
+
+else:
+    _MAX_INT = sys.maxint
+    range = xrange
+
+    def _ustr(obj):
+        """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
+           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
+           then < returns the unicode object | encodes it with the default encoding | ... >.
+        """
+        if isinstance(obj,unicode):
+            return obj
+
+        try:
+            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
+            # it won't break any existing code.
+            return str(obj)
+
+        except UnicodeEncodeError:
+            # Else encode it
+            ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace')
+            xmlcharref = Regex(r'&#\d+;')
+            xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:])
+            return xmlcharref.transformString(ret)
+
+    # build list of single arg builtins, tolerant of Python version, that can be used as parse actions
+    singleArgBuiltins = []
+    import __builtin__
+    for fname in "sum len sorted reversed list tuple set any all min max".split():
+        try:
+            singleArgBuiltins.append(getattr(__builtin__,fname))
+        except AttributeError:
+            continue
+            
+_generatorType = type((y for y in range(1)))
+ 
+def _xml_escape(data):
+    """Escape &, <, >, ", ', etc. in a string of data."""
+
+    # ampersand must be replaced first
+    from_symbols = '&><"\''
+    to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split())
+    for from_,to_ in zip(from_symbols, to_symbols):
+        data = data.replace(from_, to_)
+    return data
+
+class _Constants(object):
+    pass
+
+alphas     = string.ascii_uppercase + string.ascii_lowercase
+nums       = "0123456789"
+hexnums    = nums + "ABCDEFabcdef"
+alphanums  = alphas + nums
+_bslash    = chr(92)
+printables = "".join(c for c in string.printable if c not in string.whitespace)
+
+class ParseBaseException(Exception):
+    """base exception class for all parsing runtime exceptions"""
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, pstr, loc=0, msg=None, elem=None ):
+        self.loc = loc
+        if msg is None:
+            self.msg = pstr
+            self.pstr = ""
+        else:
+            self.msg = msg
+            self.pstr = pstr
+        self.parserElement = elem
+        self.args = (pstr, loc, msg)
+
+    @classmethod
+    def _from_exception(cls, pe):
+        """
+        internal factory method to simplify creating one type of ParseException 
+        from another - avoids having __init__ signature conflicts among subclasses
+        """
+        return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement)
+
+    def __getattr__( self, aname ):
+        """supported attributes by name are:
+            - lineno - returns the line number of the exception text
+            - col - returns the column number of the exception text
+            - line - returns the line containing the exception text
+        """
+        if( aname == "lineno" ):
+            return lineno( self.loc, self.pstr )
+        elif( aname in ("col", "column") ):
+            return col( self.loc, self.pstr )
+        elif( aname == "line" ):
+            return line( self.loc, self.pstr )
+        else:
+            raise AttributeError(aname)
+
+    def __str__( self ):
+        return "%s (at char %d), (line:%d, col:%d)" % \
+                ( self.msg, self.loc, self.lineno, self.column )
+    def __repr__( self ):
+        return _ustr(self)
+    def markInputline( self, markerString = ">!<" ):
+        """Extracts the exception line from the input string, and marks
+           the location of the exception with a special symbol.
+        """
+        line_str = self.line
+        line_column = self.column - 1
+        if markerString:
+            line_str = "".join((line_str[:line_column],
+                                markerString, line_str[line_column:]))
+        return line_str.strip()
+    def __dir__(self):
+        return "lineno col line".split() + dir(type(self))
+
+class ParseException(ParseBaseException):
+    """
+    Exception thrown when parse expressions don't match class;
+    supported attributes by name are:
+     - lineno - returns the line number of the exception text
+     - col - returns the column number of the exception text
+     - line - returns the line containing the exception text
+        
+    Example::
+        try:
+            Word(nums).setName("integer").parseString("ABC")
+        except ParseException as pe:
+            print(pe)
+            print("column: {}".format(pe.col))
+            
+    prints::
+       Expected integer (at char 0), (line:1, col:1)
+        column: 1
+    """
+    pass
+
+class ParseFatalException(ParseBaseException):
+    """user-throwable exception thrown when inconsistent parse content
+       is found; stops all parsing immediately"""
+    pass
+
+class ParseSyntaxException(ParseFatalException):
+    """just like L{ParseFatalException}, but thrown internally when an
+       L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop 
+       immediately because an unbacktrackable syntax error has been found"""
+    pass
+
+#~ class ReparseException(ParseBaseException):
+    #~ """Experimental class - parse actions can raise this exception to cause
+       #~ pyparsing to reparse the input string:
+        #~ - with a modified input string, and/or
+        #~ - with a modified start location
+       #~ Set the values of the ReparseException in the constructor, and raise the
+       #~ exception in a parse action to cause pyparsing to use the new string/location.
+       #~ Setting the values as None causes no change to be made.
+       #~ """
+    #~ def __init_( self, newstring, restartLoc ):
+        #~ self.newParseText = newstring
+        #~ self.reparseLoc = restartLoc
+
+class RecursiveGrammarException(Exception):
+    """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive"""
+    def __init__( self, parseElementList ):
+        self.parseElementTrace = parseElementList
+
+    def __str__( self ):
+        return "RecursiveGrammarException: %s" % self.parseElementTrace
+
+class _ParseResultsWithOffset(object):
+    def __init__(self,p1,p2):
+        self.tup = (p1,p2)
+    def __getitem__(self,i):
+        return self.tup[i]
+    def __repr__(self):
+        return repr(self.tup[0])
+    def setOffset(self,i):
+        self.tup = (self.tup[0],i)
+
+class ParseResults(object):
+    """
+    Structured parse results, to provide multiple means of access to the parsed data:
+       - as a list (C{len(results)})
+       - by list index (C{results[0], results[1]}, etc.)
+       - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName})
+
+    Example::
+        integer = Word(nums)
+        date_str = (integer.setResultsName("year") + '/' 
+                        + integer.setResultsName("month") + '/' 
+                        + integer.setResultsName("day"))
+        # equivalent form:
+        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+
+        # parseString returns a ParseResults object
+        result = date_str.parseString("1999/12/31")
+
+        def test(s, fn=repr):
+            print("%s -> %s" % (s, fn(eval(s))))
+        test("list(result)")
+        test("result[0]")
+        test("result['month']")
+        test("result.day")
+        test("'month' in result")
+        test("'minutes' in result")
+        test("result.dump()", str)
+    prints::
+        list(result) -> ['1999', '/', '12', '/', '31']
+        result[0] -> '1999'
+        result['month'] -> '12'
+        result.day -> '31'
+        'month' in result -> True
+        'minutes' in result -> False
+        result.dump() -> ['1999', '/', '12', '/', '31']
+        - day: 31
+        - month: 12
+        - year: 1999
+    """
+    def __new__(cls, toklist=None, name=None, asList=True, modal=True ):
+        if isinstance(toklist, cls):
+            return toklist
+        retobj = object.__new__(cls)
+        retobj.__doinit = True
+        return retobj
+
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ):
+        if self.__doinit:
+            self.__doinit = False
+            self.__name = None
+            self.__parent = None
+            self.__accumNames = {}
+            self.__asList = asList
+            self.__modal = modal
+            if toklist is None:
+                toklist = []
+            if isinstance(toklist, list):
+                self.__toklist = toklist[:]
+            elif isinstance(toklist, _generatorType):
+                self.__toklist = list(toklist)
+            else:
+                self.__toklist = [toklist]
+            self.__tokdict = dict()
+
+        if name is not None and name:
+            if not modal:
+                self.__accumNames[name] = 0
+            if isinstance(name,int):
+                name = _ustr(name) # will always return a str, but use _ustr for consistency
+            self.__name = name
+            if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])):
+                if isinstance(toklist,basestring):
+                    toklist = [ toklist ]
+                if asList:
+                    if isinstance(toklist,ParseResults):
+                        self[name] = _ParseResultsWithOffset(toklist.copy(),0)
+                    else:
+                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0)
+                    self[name].__name = name
+                else:
+                    try:
+                        self[name] = toklist[0]
+                    except (KeyError,TypeError,IndexError):
+                        self[name] = toklist
+
+    def __getitem__( self, i ):
+        if isinstance( i, (int,slice) ):
+            return self.__toklist[i]
+        else:
+            if i not in self.__accumNames:
+                return self.__tokdict[i][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[i] ])
+
+    def __setitem__( self, k, v, isinstance=isinstance ):
+        if isinstance(v,_ParseResultsWithOffset):
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
+            sub = v[0]
+        elif isinstance(k,(int,slice)):
+            self.__toklist[k] = v
+            sub = v
+        else:
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
+            sub = v
+        if isinstance(sub,ParseResults):
+            sub.__parent = wkref(self)
+
+    def __delitem__( self, i ):
+        if isinstance(i,(int,slice)):
+            mylen = len( self.__toklist )
+            del self.__toklist[i]
+
+            # convert int to slice
+            if isinstance(i, int):
+                if i < 0:
+                    i += mylen
+                i = slice(i, i+1)
+            # get removed indices
+            removed = list(range(*i.indices(mylen)))
+            removed.reverse()
+            # fixup indices in token dictionary
+            for name,occurrences in self.__tokdict.items():
+                for j in removed:
+                    for k, (value, position) in enumerate(occurrences):
+                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
+        else:
+            del self.__tokdict[i]
+
+    def __contains__( self, k ):
+        return k in self.__tokdict
+
+    def __len__( self ): return len( self.__toklist )
+    def __bool__(self): return ( not not self.__toklist )
+    __nonzero__ = __bool__
+    def __iter__( self ): return iter( self.__toklist )
+    def __reversed__( self ): return iter( self.__toklist[::-1] )
+    def _iterkeys( self ):
+        if hasattr(self.__tokdict, "iterkeys"):
+            return self.__tokdict.iterkeys()
+        else:
+            return iter(self.__tokdict)
+
+    def _itervalues( self ):
+        return (self[k] for k in self._iterkeys())
+            
+    def _iteritems( self ):
+        return ((k, self[k]) for k in self._iterkeys())
+
+    if PY_3:
+        keys = _iterkeys       
+        """Returns an iterator of all named result keys (Python 3.x only)."""
+
+        values = _itervalues
+        """Returns an iterator of all named result values (Python 3.x only)."""
+
+        items = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 3.x only)."""
+
+    else:
+        iterkeys = _iterkeys
+        """Returns an iterator of all named result keys (Python 2.x only)."""
+
+        itervalues = _itervalues
+        """Returns an iterator of all named result values (Python 2.x only)."""
+
+        iteritems = _iteritems
+        """Returns an iterator of all named result key-value tuples (Python 2.x only)."""
+
+        def keys( self ):
+            """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iterkeys())
+
+        def values( self ):
+            """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.itervalues())
+                
+        def items( self ):
+            """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x)."""
+            return list(self.iteritems())
+
+    def haskeys( self ):
+        """Since keys() returns an iterator, this method is helpful in bypassing
+           code that looks for the existence of any defined results names."""
+        return bool(self.__tokdict)
+        
+    def pop( self, *args, **kwargs):
+        """
+        Removes and returns item at specified index (default=C{last}).
+        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
+        argument or an integer argument, it will use C{list} semantics
+        and pop tokens from the list of parsed tokens. If passed a 
+        non-integer argument (most likely a string), it will use C{dict}
+        semantics and pop the corresponding value from any defined 
+        results names. A second default return value argument is 
+        supported, just as in C{dict.pop()}.
+
+        Example::
+            def remove_first(tokens):
+                tokens.pop(0)
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']
+
+            label = Word(alphas)
+            patt = label("LABEL") + OneOrMore(Word(nums))
+            print(patt.parseString("AAB 123 321").dump())
+
+            # Use pop() in a parse action to remove named result (note that corresponding value is not
+            # removed from list form of results)
+            def remove_LABEL(tokens):
+                tokens.pop("LABEL")
+                return tokens
+            patt.addParseAction(remove_LABEL)
+            print(patt.parseString("AAB 123 321").dump())
+        prints::
+            ['AAB', '123', '321']
+            - LABEL: AAB
+
+            ['AAB', '123', '321']
+        """
+        if not args:
+            args = [-1]
+        for k,v in kwargs.items():
+            if k == 'default':
+                args = (args[0], v)
+            else:
+                raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
+        if (isinstance(args[0], int) or 
+                        len(args) == 1 or 
+                        args[0] in self):
+            index = args[0]
+            ret = self[index]
+            del self[index]
+            return ret
+        else:
+            defaultvalue = args[1]
+            return defaultvalue
+
+    def get(self, key, defaultValue=None):
+        """
+        Returns named result matching the given key, or if there is no
+        such name, then returns the given C{defaultValue} or C{None} if no
+        C{defaultValue} is specified.
+
+        Similar to C{dict.get()}.
+        
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            result = date_str.parseString("1999/12/31")
+            print(result.get("year")) # -> '1999'
+            print(result.get("hour", "not specified")) # -> 'not specified'
+            print(result.get("hour")) # -> None
+        """
+        if key in self:
+            return self[key]
+        else:
+            return defaultValue
+
+    def insert( self, index, insStr ):
+        """
+        Inserts new element at location index in the list of parsed tokens.
+        
+        Similar to C{list.insert()}.
+
+        Example::
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+
+            # use a parse action to insert the parse location in the front of the parsed results
+            def insert_locn(locn, tokens):
+                tokens.insert(0, locn)
+            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
+        """
+        self.__toklist.insert(index, insStr)
+        # fixup indices in token dictionary
+        for name,occurrences in self.__tokdict.items():
+            for k, (value, position) in enumerate(occurrences):
+                occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))
+
+    def append( self, item ):
+        """
+        Add single element to end of ParseResults list of elements.
+
+        Example::
+            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
+            
+            # use a parse action to compute the sum of the parsed integers, and add it to the end
+            def append_sum(tokens):
+                tokens.append(sum(map(int, tokens)))
+            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
+        """
+        self.__toklist.append(item)
+
+    def extend( self, itemseq ):
+        """
+        Add sequence of elements to end of ParseResults list of elements.
+
+        Example::
+            patt = OneOrMore(Word(alphas))
+            
+            # use a parse action to append the reverse of the matched strings, to make a palindrome
+            def make_palindrome(tokens):
+                tokens.extend(reversed([t[::-1] for t in tokens]))
+                return ''.join(tokens)
+            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
+        """
+        if isinstance(itemseq, ParseResults):
+            self += itemseq
+        else:
+            self.__toklist.extend(itemseq)
+
+    def clear( self ):
+        """
+        Clear all elements and results names.
+        """
+        del self.__toklist[:]
+        self.__tokdict.clear()
+
+    def __getattr__( self, name ):
+        try:
+            return self[name]
+        except KeyError:
+            return ""
+            
+        if name in self.__tokdict:
+            if name not in self.__accumNames:
+                return self.__tokdict[name][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[name] ])
+        else:
+            return ""
+
+    def __add__( self, other ):
+        ret = self.copy()
+        ret += other
+        return ret
+
+    def __iadd__( self, other ):
+        if other.__tokdict:
+            offset = len(self.__toklist)
+            addoffset = lambda a: offset if a<0 else a+offset
+            otheritems = other.__tokdict.items()
+            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
+                                for (k,vlist) in otheritems for v in vlist]
+            for k,v in otherdictitems:
+                self[k] = v
+                if isinstance(v[0],ParseResults):
+                    v[0].__parent = wkref(self)
+            
+        self.__toklist += other.__toklist
+        self.__accumNames.update( other.__accumNames )
+        return self
+
+    def __radd__(self, other):
+        if isinstance(other,int) and other == 0:
+            # useful for merging many ParseResults using sum() builtin
+            return self.copy()
+        else:
+            # this may raise a TypeError - so be it
+            return other + self
+        
+    def __repr__( self ):
+        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
+
+    def __str__( self ):
+        return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']'
+
+    def _asStringList( self, sep='' ):
+        out = []
+        for item in self.__toklist:
+            if out and sep:
+                out.append(sep)
+            if isinstance( item, ParseResults ):
+                out += item._asStringList()
+            else:
+                out.append( _ustr(item) )
+        return out
+
+    def asList( self ):
+        """
+        Returns the parse results as a nested list of matching tokens, all converted to strings.
+
+        Example::
+            patt = OneOrMore(Word(alphas))
+            result = patt.parseString("sldkj lsdkj sldkj")
+            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
+            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
+            
+            # Use asList() to create an actual list
+            result_list = result.asList()
+            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
+        """
+        return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist]
+
+    def asDict( self ):
+        """
+        Returns the named parse results as a nested dictionary.
+
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+            
+            result = date_str.parseString('12/31/1999')
+            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
+            
+            result_dict = result.asDict()
+            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}
+
+            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
+            import json
+            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
+            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
+        """
+        if PY_3:
+            item_fn = self.items
+        else:
+            item_fn = self.iteritems
+            
+        def toItem(obj):
+            if isinstance(obj, ParseResults):
+                if obj.haskeys():
+                    return obj.asDict()
+                else:
+                    return [toItem(v) for v in obj]
+            else:
+                return obj
+                
+        return dict((k,toItem(v)) for k,v in item_fn())
+
+    def copy( self ):
+        """
+        Returns a new copy of a C{ParseResults} object.
+        """
+        ret = ParseResults( self.__toklist )
+        ret.__tokdict = self.__tokdict.copy()
+        ret.__parent = self.__parent
+        ret.__accumNames.update( self.__accumNames )
+        ret.__name = self.__name
+        return ret
+
+    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
+        """
+        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
+        """
+        nl = "\n"
+        out = []
+        namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items()
+                                                            for v in vlist)
+        nextLevelIndent = indent + "  "
+
+        # collapse out indents if formatting is not desired
+        if not formatted:
+            indent = ""
+            nextLevelIndent = ""
+            nl = ""
+
+        selfTag = None
+        if doctag is not None:
+            selfTag = doctag
+        else:
+            if self.__name:
+                selfTag = self.__name
+
+        if not selfTag:
+            if namedItemsOnly:
+                return ""
+            else:
+                selfTag = "ITEM"
+
+        out += [ nl, indent, "<", selfTag, ">" ]
+
+        for i,res in enumerate(self.__toklist):
+            if isinstance(res,ParseResults):
+                if i in namedItems:
+                    out += [ res.asXML(namedItems[i],
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+                else:
+                    out += [ res.asXML(None,
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+            else:
+                # individual token, see if there is a name for it
+                resTag = None
+                if i in namedItems:
+                    resTag = namedItems[i]
+                if not resTag:
+                    if namedItemsOnly:
+                        continue
+                    else:
+                        resTag = "ITEM"
+                xmlBodyText = _xml_escape(_ustr(res))
+                out += [ nl, nextLevelIndent, "<", resTag, ">",
+                                                xmlBodyText,
+                                                "</", resTag, ">" ]
+
+        out += [ nl, indent, "</", selfTag, ">" ]
+        return "".join(out)
+
+    def __lookup(self,sub):
+        for k,vlist in self.__tokdict.items():
+            for v,loc in vlist:
+                if sub is v:
+                    return k
+        return None
+
+    def getName(self):
+        r"""
+        Returns the results name for this token expression. Useful when several 
+        different expressions might match at a particular location.
+
+        Example::
+            integer = Word(nums)
+            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
+            house_number_expr = Suppress('#') + Word(nums, alphanums)
+            user_data = (Group(house_number_expr)("house_number") 
+                        | Group(ssn_expr)("ssn")
+                        | Group(integer)("age"))
+            user_info = OneOrMore(user_data)
+            
+            result = user_info.parseString("22 111-22-3333 #221B")
+            for item in result:
+                print(item.getName(), ':', item[0])
+        prints::
+            age : 22
+            ssn : 111-22-3333
+            house_number : 221B
+        """
+        if self.__name:
+            return self.__name
+        elif self.__parent:
+            par = self.__parent()
+            if par:
+                return par.__lookup(self)
+            else:
+                return None
+        elif (len(self) == 1 and
+               len(self.__tokdict) == 1 and
+               next(iter(self.__tokdict.values()))[0][1] in (0,-1)):
+            return next(iter(self.__tokdict.keys()))
+        else:
+            return None
+
+    def dump(self, indent='', depth=0, full=True):
+        """
+        Diagnostic method for listing out the contents of a C{ParseResults}.
+        Accepts an optional C{indent} argument so that this string can be embedded
+        in a nested display of other data.
+
+        Example::
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+            
+            result = date_str.parseString('12/31/1999')
+            print(result.dump())
+        prints::
+            ['12', '/', '31', '/', '1999']
+            - day: 1999
+            - month: 31
+            - year: 12
+        """
+        out = []
+        NL = '\n'
+        out.append( indent+_ustr(self.asList()) )
+        if full:
+            if self.haskeys():
+                items = sorted((str(k), v) for k,v in self.items())
+                for k,v in items:
+                    if out:
+                        out.append(NL)
+                    out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
+                    if isinstance(v,ParseResults):
+                        if v:
+                            out.append( v.dump(indent,depth+1) )
+                        else:
+                            out.append(_ustr(v))
+                    else:
+                        out.append(repr(v))
+            elif any(isinstance(vv,ParseResults) for vv in self):
+                v = self
+                for i,vv in enumerate(v):
+                    if isinstance(vv,ParseResults):
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),vv.dump(indent,depth+1) ))
+                    else:
+                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),_ustr(vv)))
+            
+        return "".join(out)
+
+    def pprint(self, *args, **kwargs):
+        """
+        Pretty-printer for parsed results as a list, using the C{pprint} module.
+        Accepts additional positional or keyword args as defined for the 
+        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})
+
+        Example::
+            ident = Word(alphas, alphanums)
+            num = Word(nums)
+            func = Forward()
+            term = ident | num | Group('(' + func + ')')
+            func <<= ident + Group(Optional(delimitedList(term)))
+            result = func.parseString("fna a,b,(fnb c,d,200),100")
+            result.pprint(width=40)
+        prints::
+            ['fna',
+             ['a',
+              'b',
+              ['(', 'fnb', ['c', 'd', '200'], ')'],
+              '100']]
+        """
+        pprint.pprint(self.asList(), *args, **kwargs)
+
+    # add support for pickle protocol
+    def __getstate__(self):
+        return ( self.__toklist,
+                 ( self.__tokdict.copy(),
+                   self.__parent is not None and self.__parent() or None,
+                   self.__accumNames,
+                   self.__name ) )
+
+    def __setstate__(self,state):
+        self.__toklist = state[0]
+        (self.__tokdict,
+         par,
+         inAccumNames,
+         self.__name) = state[1]
+        self.__accumNames = {}
+        self.__accumNames.update(inAccumNames)
+        if par is not None:
+            self.__parent = wkref(par)
+        else:
+            self.__parent = None
+
+    def __getnewargs__(self):
+        return self.__toklist, self.__name, self.__asList, self.__modal
+
+    def __dir__(self):
+        return (dir(type(self)) + list(self.keys()))
+
+MutableMapping.register(ParseResults)
+
+def col (loc,strg):
+    """Returns current column within a string, counting newlines as line separators.
+   The first column is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    s = strg
+    return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc)
+
+def lineno(loc,strg):
+    """Returns current line number within a string, counting newlines as line separators.
+   The first line is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    return strg.count("\n",0,loc) + 1
+
+def line( loc, strg ):
+    """Returns the line of text containing loc within a string, counting newlines as line separators.
+       """
+    lastCR = strg.rfind("\n", 0, loc)
+    nextCR = strg.find("\n", loc)
+    if nextCR >= 0:
+        return strg[lastCR+1:nextCR]
+    else:
+        return strg[lastCR+1:]
+
+def _defaultStartDebugAction( instring, loc, expr ):
+    print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))
+
+def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
+    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))
+
+def _defaultExceptionDebugAction( instring, loc, expr, exc ):
+    print ("Exception raised:" + _ustr(exc))
+
+def nullDebugAction(*args):
+    """'Do-nothing' debug action, to suppress debugging output during parsing."""
+    pass
+
+# Only works on Python 3.x - nonlocal is toxic to Python 2 installs
+#~ 'decorator to trim function calls to match the arity of the target'
+#~ def _trim_arity(func, maxargs=3):
+    #~ if func in singleArgBuiltins:
+        #~ return lambda s,l,t: func(t)
+    #~ limit = 0
+    #~ foundArity = False
+    #~ def wrapper(*args):
+        #~ nonlocal limit,foundArity
+        #~ while 1:
+            #~ try:
+                #~ ret = func(*args[limit:])
+                #~ foundArity = True
+                #~ return ret
+            #~ except TypeError:
+                #~ if limit == maxargs or foundArity:
+                    #~ raise
+                #~ limit += 1
+                #~ continue
+    #~ return wrapper
+
+# this version is Python 2.x-3.x cross-compatible
+'decorator to trim function calls to match the arity of the target'
+def _trim_arity(func, maxargs=2):
+    if func in singleArgBuiltins:
+        return lambda s,l,t: func(t)
+    limit = [0]
+    foundArity = [False]
+    
+    # traceback return data structure changed in Py3.5 - normalize back to plain tuples
+    if system_version[:2] >= (3,5):
+        def extract_stack(limit=0):
+            # special handling for Python 3.5.0 - extra deep call stack by 1
+            offset = -3 if system_version == (3,5,0) else -2
+            frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset]
+            return [frame_summary[:2]]
+        def extract_tb(tb, limit=0):
+            frames = traceback.extract_tb(tb, limit=limit)
+            frame_summary = frames[-1]
+            return [frame_summary[:2]]
+    else:
+        extract_stack = traceback.extract_stack
+        extract_tb = traceback.extract_tb
+    
+    # synthesize what would be returned by traceback.extract_stack at the call to 
+    # user's parse action 'func', so that we don't incur call penalty at parse time
+    
+    LINE_DIFF = 6
+    # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND 
+    # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
+    this_line = extract_stack(limit=2)[-1]
+    pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF)
+
+    def wrapper(*args):
+        while 1:
+            try:
+                ret = func(*args[limit[0]:])
+                foundArity[0] = True
+                return ret
+            except TypeError:
+                # re-raise TypeErrors if they did not come from our arity testing
+                if foundArity[0]:
+                    raise
+                else:
+                    try:
+                        tb = sys.exc_info()[-1]
+                        if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth:
+                            raise
+                    finally:
+                        del tb
+
+                if limit[0] <= maxargs:
+                    limit[0] += 1
+                    continue
+                raise
+
+    # copy func name to wrapper for sensible debug output
+    func_name = "<parse action>"
+    try:
+        func_name = getattr(func, '__name__', 
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    wrapper.__name__ = func_name
+
+    return wrapper
+
+class ParserElement(object):
+    """Abstract base level parser element class."""
+    DEFAULT_WHITE_CHARS = " \n\t\r"
+    verbose_stacktrace = False
+
+    @staticmethod
+    def setDefaultWhitespaceChars( chars ):
+        r"""
+        Overrides the default whitespace chars
+
+        Example::
+            # default whitespace chars are space, <TAB> and newline
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
+            
+            # change to just treat newline as significant
+            ParserElement.setDefaultWhitespaceChars(" \t")
+            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
+        """
+        ParserElement.DEFAULT_WHITE_CHARS = chars
+
+    @staticmethod
+    def inlineLiteralsUsing(cls):
+        """
+        Set class to be used for inclusion of string literals into a parser.
+        
+        Example::
+            # default literal class used is Literal
+            integer = Word(nums)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+
+            # change to Suppress
+            ParserElement.inlineLiteralsUsing(Suppress)
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
+        """
+        ParserElement._literalStringClass = cls
+
+    def __init__( self, savelist=False ):
+        self.parseAction = list()
+        self.failAction = None
+        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
+        self.strRepr = None
+        self.resultsName = None
+        self.saveAsList = savelist
+        self.skipWhitespace = True
+        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        self.copyDefaultWhiteChars = True
+        self.mayReturnEmpty = False # used when checking for left-recursion
+        self.keepTabs = False
+        self.ignoreExprs = list()
+        self.debug = False
+        self.streamlined = False
+        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
+        self.errmsg = ""
+        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
+        self.debugActions = ( None, None, None ) #custom debug actions
+        self.re = None
+        self.callPreparse = True # used to avoid redundant calls to preParse
+        self.callDuringTry = False
+
+    def copy( self ):
+        """
+        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
+        for the same parsing pattern, using copies of the original parse element.
+        
+        Example::
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
+            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+            
+            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
+        prints::
+            [5120, 100, 655360, 268435456]
+        Equivalent form of C{expr.copy()} is just C{expr()}::
+            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
+        """
+        cpy = copy.copy( self )
+        cpy.parseAction = self.parseAction[:]
+        cpy.ignoreExprs = self.ignoreExprs[:]
+        if self.copyDefaultWhiteChars:
+            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        return cpy
+
+    def setName( self, name ):
+        """
+        Define name for this expression, makes debugging and exception messages clearer.
+        
+        Example::
+            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
+            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
+        """
+        self.name = name
+        self.errmsg = "Expected " + self.name
+        if hasattr(self,"exception"):
+            self.exception.msg = self.errmsg
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        """
+        Define name for referencing matching tokens as a nested attribute
+        of the returned parse results.
+        NOTE: this returns a *copy* of the original C{ParserElement} object;
+        this is so that the client can define a basic element, such as an
+        integer, and reference it in multiple places with different names.
+
+        You can also set results names using the abbreviated syntax,
+        C{expr("name")} in place of C{expr.setResultsName("name")} - 
+        see L{I{__call__}<__call__>}.
+
+        Example::
+            date_str = (integer.setResultsName("year") + '/' 
+                        + integer.setResultsName("month") + '/' 
+                        + integer.setResultsName("day"))
+
+            # equivalent form:
+            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
+        """
+        newself = self.copy()
+        if name.endswith("*"):
+            name = name[:-1]
+            listAllMatches=True
+        newself.resultsName = name
+        newself.modalResults = not listAllMatches
+        return newself
+
+    def setBreak(self,breakFlag = True):
+        """Method to invoke the Python pdb debugger when this element is
+           about to be parsed. Set C{breakFlag} to True to enable, False to
+           disable.
+        """
+        if breakFlag:
+            _parseMethod = self._parse
+            def breaker(instring, loc, doActions=True, callPreParse=True):
+                import pdb
+                pdb.set_trace()
+                return _parseMethod( instring, loc, doActions, callPreParse )
+            breaker._originalParseMethod = _parseMethod
+            self._parse = breaker
+        else:
+            if hasattr(self._parse,"_originalParseMethod"):
+                self._parse = self._parse._originalParseMethod
+        return self
+
+    def setParseAction( self, *fns, **kwargs ):
+        """
+        Define one or more actions to perform when successfully matching parse element definition.
+        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
+        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
+         - s   = the original string being parsed (see note below)
+         - loc = the location of the matching substring
+         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
+        If the functions in fns modify the tokens, they can return them as the return
+        value from fn, and the modified list of tokens will replace the original.
+        Otherwise, fn does not need to return any value.
+
+        Optional keyword arguments:
+         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing
+
+        Note: the default parsing behavior is to expand tabs in the input string
+        before starting the parsing process.  See L{I{parseString}<parseString>} for more information
+        on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
+        consistent view of the parsed string, the parse location, and line and column
+        positions within the parsed string.
+        
+        Example::
+            integer = Word(nums)
+            date_str = integer + '/' + integer + '/' + integer
+
+            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']
+
+            # use parse action to convert to ints at parse time
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            date_str = integer + '/' + integer + '/' + integer
+
+            # note that integer fields are now ints, not strings
+            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
+        """
+        self.parseAction = list(map(_trim_arity, list(fns)))
+        self.callDuringTry = kwargs.get("callDuringTry", False)
+        return self
+
+    def addParseAction( self, *fns, **kwargs ):
+        """
+        Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.
+        
+        See examples in L{I{copy}<copy>}.
+        """
+        self.parseAction += list(map(_trim_arity, list(fns)))
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def addCondition(self, *fns, **kwargs):
+        """Add a boolean predicate function to expression's list of parse actions. See 
+        L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, 
+        functions passed to C{addCondition} need to return boolean success/fail of the condition.
+
+        Optional keyword arguments:
+         - message = define a custom message to be used in the raised exception
+         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
+         
+        Example::
+            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
+            year_int = integer.copy()
+            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
+            date_str = year_int + '/' + integer + '/' + integer
+
+            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
+        """
+        msg = kwargs.get("message", "failed user-defined condition")
+        exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException
+        for fn in fns:
+            def pa(s,l,t):
+                if not bool(_trim_arity(fn)(s,l,t)):
+                    raise exc_type(s,l,msg)
+            self.parseAction.append(pa)
+        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
+        return self
+
+    def setFailAction( self, fn ):
+        """Define action to perform if parsing fails at this expression.
+           Fail acton fn is a callable function that takes the arguments
+           C{fn(s,loc,expr,err)} where:
+            - s = string being parsed
+            - loc = location where expression match was attempted and failed
+            - expr = the parse expression that failed
+            - err = the exception thrown
+           The function returns no value.  It may throw C{L{ParseFatalException}}
+           if it is desired to stop parsing immediately."""
+        self.failAction = fn
+        return self
+
+    def _skipIgnorables( self, instring, loc ):
+        exprsFound = True
+        while exprsFound:
+            exprsFound = False
+            for e in self.ignoreExprs:
+                try:
+                    while 1:
+                        loc,dummy = e._parse( instring, loc )
+                        exprsFound = True
+                except ParseException:
+                    pass
+        return loc
+
+    def preParse( self, instring, loc ):
+        if self.ignoreExprs:
+            loc = self._skipIgnorables( instring, loc )
+
+        if self.skipWhitespace:
+            wt = self.whiteChars
+            instrlen = len(instring)
+            while loc < instrlen and instring[loc] in wt:
+                loc += 1
+
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        return loc, []
+
+    def postParse( self, instring, loc, tokenlist ):
+        return tokenlist
+
+    #~ @profile
+    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
+        debugging = ( self.debug ) #and doActions )
+
+        if debugging or self.failAction:
+            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
+            if (self.debugActions[0] ):
+                self.debugActions[0]( instring, loc, self )
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            try:
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            except ParseBaseException as err:
+                #~ print ("Exception raised:", err)
+                if self.debugActions[2]:
+                    self.debugActions[2]( instring, tokensStart, self, err )
+                if self.failAction:
+                    self.failAction( instring, tokensStart, self, err )
+                raise
+        else:
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = preloc
+            if self.mayIndexError or preloc >= len(instring):
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            else:
+                loc,tokens = self.parseImpl( instring, preloc, doActions )
+
+        tokens = self.postParse( instring, loc, tokens )
+
+        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
+        if self.parseAction and (doActions or self.callDuringTry):
+            if debugging:
+                try:
+                    for fn in self.parseAction:
+                        tokens = fn( instring, tokensStart, retTokens )
+                        if tokens is not None:
+                            retTokens = ParseResults( tokens,
+                                                      self.resultsName,
+                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                      modal=self.modalResults )
+                except ParseBaseException as err:
+                    #~ print "Exception raised in user parse action:", err
+                    if (self.debugActions[2] ):
+                        self.debugActions[2]( instring, tokensStart, self, err )
+                    raise
+            else:
+                for fn in self.parseAction:
+                    tokens = fn( instring, tokensStart, retTokens )
+                    if tokens is not None:
+                        retTokens = ParseResults( tokens,
+                                                  self.resultsName,
+                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                  modal=self.modalResults )
+        if debugging:
+            #~ print ("Matched",self,"->",retTokens.asList())
+            if (self.debugActions[1] ):
+                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )
+
+        return loc, retTokens
+
+    def tryParse( self, instring, loc ):
+        try:
+            return self._parse( instring, loc, doActions=False )[0]
+        except ParseFatalException:
+            raise ParseException( instring, loc, self.errmsg, self)
+    
+    def canParseNext(self, instring, loc):
+        try:
+            self.tryParse(instring, loc)
+        except (ParseException, IndexError):
+            return False
+        else:
+            return True
+
+    class _UnboundedCache(object):
+        def __init__(self):
+            cache = {}
+            self.not_in_cache = not_in_cache = object()
+
+            def get(self, key):
+                return cache.get(key, not_in_cache)
+
+            def set(self, key, value):
+                cache[key] = value
+
+            def clear(self):
+                cache.clear()
+                
+            def cache_len(self):
+                return len(cache)
+
+            self.get = types.MethodType(get, self)
+            self.set = types.MethodType(set, self)
+            self.clear = types.MethodType(clear, self)
+            self.__len__ = types.MethodType(cache_len, self)
+
+    if _OrderedDict is not None:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = _OrderedDict()
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    while len(cache) > size:
+                        try:
+                            cache.popitem(False)
+                        except KeyError:
+                            pass
+
+                def clear(self):
+                    cache.clear()
+
+                def cache_len(self):
+                    return len(cache)
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+                self.__len__ = types.MethodType(cache_len, self)
+
+    else:
+        class _FifoCache(object):
+            def __init__(self, size):
+                self.not_in_cache = not_in_cache = object()
+
+                cache = {}
+                key_fifo = collections.deque([], size)
+
+                def get(self, key):
+                    return cache.get(key, not_in_cache)
+
+                def set(self, key, value):
+                    cache[key] = value
+                    while len(key_fifo) > size:
+                        cache.pop(key_fifo.popleft(), None)
+                    key_fifo.append(key)
+
+                def clear(self):
+                    cache.clear()
+                    key_fifo.clear()
+
+                def cache_len(self):
+                    return len(cache)
+
+                self.get = types.MethodType(get, self)
+                self.set = types.MethodType(set, self)
+                self.clear = types.MethodType(clear, self)
+                self.__len__ = types.MethodType(cache_len, self)
+
+    # argument cache for optimizing repeated calls when backtracking through recursive expressions
+    packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail
+    packrat_cache_lock = RLock()
+    packrat_cache_stats = [0, 0]
+
+    # this method gets repeatedly called during backtracking with the same arguments -
+    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
+    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
+        HIT, MISS = 0, 1
+        lookup = (self, instring, loc, callPreParse, doActions)
+        with ParserElement.packrat_cache_lock:
+            cache = ParserElement.packrat_cache
+            value = cache.get(lookup)
+            if value is cache.not_in_cache:
+                ParserElement.packrat_cache_stats[MISS] += 1
+                try:
+                    value = self._parseNoCache(instring, loc, doActions, callPreParse)
+                except ParseBaseException as pe:
+                    # cache a copy of the exception, without the traceback
+                    cache.set(lookup, pe.__class__(*pe.args))
+                    raise
+                else:
+                    cache.set(lookup, (value[0], value[1].copy()))
+                    return value
+            else:
+                ParserElement.packrat_cache_stats[HIT] += 1
+                if isinstance(value, Exception):
+                    raise value
+                return (value[0], value[1].copy())
+
+    _parse = _parseNoCache
+
+    @staticmethod
+    def resetCache():
+        ParserElement.packrat_cache.clear()
+        ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats)
+
+    _packratEnabled = False
+    @staticmethod
+    def enablePackrat(cache_size_limit=128):
+        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
+           Repeated parse attempts at the same string location (which happens
+           often in many complex grammars) can immediately return a cached value,
+           instead of re-executing parsing/validating code.  Memoizing is done of
+           both valid results and parsing exceptions.
+           
+           Parameters:
+            - cache_size_limit - (default=C{128}) - if an integer value is provided
+              will limit the size of the packrat cache; if None is passed, then
+              the cache size will be unbounded; if 0 is passed, the cache will
+              be effectively disabled.
+            
+           This speedup may break existing programs that use parse actions that
+           have side-effects.  For this reason, packrat parsing is disabled when
+           you first import pyparsing.  To activate the packrat feature, your
+           program must call the class method C{ParserElement.enablePackrat()}.  If
+           your program uses C{psyco} to "compile as you go", you must call
+           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
+           Python will crash.  For best results, call C{enablePackrat()} immediately
+           after importing pyparsing.
+           
+           Example::
+               import pyparsing
+               pyparsing.ParserElement.enablePackrat()
+        """
+        if not ParserElement._packratEnabled:
+            ParserElement._packratEnabled = True
+            if cache_size_limit is None:
+                ParserElement.packrat_cache = ParserElement._UnboundedCache()
+            else:
+                ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit)
+            ParserElement._parse = ParserElement._parseCache
+
+    def parseString( self, instring, parseAll=False ):
+        """
+        Execute the parse expression with the given string.
+        This is the main interface to the client code, once the complete
+        expression has been built.
+
+        If you want the grammar to require that the entire input string be
+        successfully parsed, then set C{parseAll} to True (equivalent to ending
+        the grammar with C{L{StringEnd()}}).
+
+        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
+        in order to report proper column numbers in parse actions.
+        If the input string contains tabs and
+        the grammar uses parse actions that use the C{loc} argument to index into the
+        string being parsed, you can ensure you have a consistent view of the input
+        string by:
+         - calling C{parseWithTabs} on your grammar before calling C{parseString}
+           (see L{I{parseWithTabs}<parseWithTabs>})
+         - define your parse action using the full C{(s,loc,toks)} signature, and
+           reference the input string using the parse action's C{s} argument
+         - explictly expand the tabs in your input string before calling
+           C{parseString}
+        
+        Example::
+            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
+            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
+        """
+        ParserElement.resetCache()
+        if not self.streamlined:
+            self.streamline()
+            #~ self.saveAsList = True
+        for e in self.ignoreExprs:
+            e.streamline()
+        if not self.keepTabs:
+            instring = instring.expandtabs()
+        try:
+            loc, tokens = self._parse( instring, 0 )
+            if parseAll:
+                loc = self.preParse( instring, loc )
+                se = Empty() + StringEnd()
+                se._parse( instring, loc )
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+        else:
+            return tokens
+
+    def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
+        """
+        Scan the input string for expression matches.  Each match will return the
+        matching tokens, start location, and end location.  May be called with optional
+        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
+        C{overlap} is specified, then overlapping matches will be reported.
+
+        Note that the start and end locations are reported relative to the string
+        being parsed.  See L{I{parseString}<parseString>} for more information on parsing
+        strings with embedded tabs.
+
+        Example::
+            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
+            print(source)
+            for tokens,start,end in Word(alphas).scanString(source):
+                print(' '*start + '^'*(end-start))
+                print(' '*start + tokens[0])
+        
+        prints::
+        
+            sldjf123lsdjjkf345sldkjf879lkjsfd987
+            ^^^^^
+            sldjf
+                    ^^^^^^^
+                    lsdjjkf
+                              ^^^^^^
+                              sldkjf
+                                       ^^^^^^
+                                       lkjsfd
+        """
+        if not self.streamlined:
+            self.streamline()
+        for e in self.ignoreExprs:
+            e.streamline()
+
+        if not self.keepTabs:
+            instring = _ustr(instring).expandtabs()
+        instrlen = len(instring)
+        loc = 0
+        preparseFn = self.preParse
+        parseFn = self._parse
+        ParserElement.resetCache()
+        matches = 0
+        try:
+            while loc <= instrlen and matches < maxMatches:
+                try:
+                    preloc = preparseFn( instring, loc )
+                    nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
+                except ParseException:
+                    loc = preloc+1
+                else:
+                    if nextLoc > loc:
+                        matches += 1
+                        yield tokens, preloc, nextLoc
+                        if overlap:
+                            nextloc = preparseFn( instring, loc )
+                            if nextloc > loc:
+                                loc = nextLoc
+                            else:
+                                loc += 1
+                        else:
+                            loc = nextLoc
+                    else:
+                        loc = preloc+1
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def transformString( self, instring ):
+        """
+        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
+        be returned from a parse action.  To use C{transformString}, define a grammar and
+        attach a parse action to it that modifies the returned token list.
+        Invoking C{transformString()} on a target string will then scan for matches,
+        and replace the matched text patterns according to the logic in the parse
+        action.  C{transformString()} returns the resulting transformed string.
+        
+        Example::
+            wd = Word(alphas)
+            wd.setParseAction(lambda toks: toks[0].title())
+            
+            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
+        Prints::
+            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
+        """
+        out = []
+        lastE = 0
+        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
+        # keep string locs straight between transformString and scanString
+        self.keepTabs = True
+        try:
+            for t,s,e in self.scanString( instring ):
+                out.append( instring[lastE:s] )
+                if t:
+                    if isinstance(t,ParseResults):
+                        out += t.asList()
+                    elif isinstance(t,list):
+                        out += t
+                    else:
+                        out.append(t)
+                lastE = e
+            out.append(instring[lastE:])
+            out = [o for o in out if o]
+            return "".join(map(_ustr,_flatten(out)))
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def searchString( self, instring, maxMatches=_MAX_INT ):
+        """
+        Another extension to C{L{scanString}}, simplifying the access to the tokens found
+        to match the given parse expression.  May be called with optional
+        C{maxMatches} argument, to clip searching after 'n' matches are found.
+        
+        Example::
+            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
+            cap_word = Word(alphas.upper(), alphas.lower())
+            
+            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
+
+            # the sum() builtin can be used to merge results into a single ParseResults object
+            print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")))
+        prints::
+            [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']]
+            ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity']
+        """
+        try:
+            return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False):
+        """
+        Generator method to split a string using the given expression as a separator.
+        May be called with optional C{maxsplit} argument, to limit the number of splits;
+        and the optional C{includeSeparators} argument (default=C{False}), if the separating
+        matching text should be included in the split results.
+        
+        Example::        
+            punc = oneOf(list(".,;:/-!?"))
+            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
+        prints::
+            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
+        """
+        splits = 0
+        last = 0
+        for t,s,e in self.scanString(instring, maxMatches=maxsplit):
+            yield instring[last:s]
+            if includeSeparators:
+                yield t[0]
+            last = e
+        yield instring[last:]
+
+    def __add__(self, other ):
+        """
+        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
+        converts them to L{Literal}s by default.
+        
+        Example::
+            greet = Word(alphas) + "," + Word(alphas) + "!"
+            hello = "Hello, World!"
+            print (hello, "->", greet.parseString(hello))
+        Prints::
+            Hello, World! -> ['Hello', ',', 'World', '!']
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, other ] )
+
+    def __radd__(self, other ):
+        """
+        Implementation of + operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other + self
+
+    def __sub__(self, other):
+        """
+        Implementation of - operator, returns C{L{And}} with error stop
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return self + And._ErrorStop() + other
+
+    def __rsub__(self, other ):
+        """
+        Implementation of - operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other - self
+
+    def __mul__(self,other):
+        """
+        Implementation of * operator, allows use of C{expr * 3} in place of
+        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
+        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
+        may also include C{None} as in:
+         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
+              to C{expr*n + L{ZeroOrMore}(expr)}
+              (read as "at least n instances of C{expr}")
+         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
+              (read as "0 to n instances of C{expr}")
+         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
+         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}
+
+        Note that C{expr*(None,n)} does not raise an exception if
+        more than n exprs exist in the input stream; that is,
+        C{expr*(None,n)} does not enforce a maximum number of expr
+        occurrences.  If this behavior is desired, then write
+        C{expr*(None,n) + ~expr}
+        """
+        if isinstance(other,int):
+            minElements, optElements = other,0
+        elif isinstance(other,tuple):
+            other = (other + (None, None))[:2]
+            if other[0] is None:
+                other = (0, other[1])
+            if isinstance(other[0],int) and other[1] is None:
+                if other[0] == 0:
+                    return ZeroOrMore(self)
+                if other[0] == 1:
+                    return OneOrMore(self)
+                else:
+                    return self*other[0] + ZeroOrMore(self)
+            elif isinstance(other[0],int) and isinstance(other[1],int):
+                minElements, optElements = other
+                optElements -= minElements
+            else:
+                raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
+        else:
+            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))
+
+        if minElements < 0:
+            raise ValueError("cannot multiply ParserElement by negative value")
+        if optElements < 0:
+            raise ValueError("second tuple value must be greater or equal to first tuple value")
+        if minElements == optElements == 0:
+            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")
+
+        if (optElements):
+            def makeOptionalList(n):
+                if n>1:
+                    return Optional(self + makeOptionalList(n-1))
+                else:
+                    return Optional(self)
+            if minElements:
+                if minElements == 1:
+                    ret = self + makeOptionalList(optElements)
+                else:
+                    ret = And([self]*minElements) + makeOptionalList(optElements)
+            else:
+                ret = makeOptionalList(optElements)
+        else:
+            if minElements == 1:
+                ret = self
+            else:
+                ret = And([self]*minElements)
+        return ret
+
+    def __rmul__(self, other):
+        return self.__mul__(other)
+
+    def __or__(self, other ):
+        """
+        Implementation of | operator - returns C{L{MatchFirst}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return MatchFirst( [ self, other ] )
+
+    def __ror__(self, other ):
+        """
+        Implementation of | operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other | self
+
+    def __xor__(self, other ):
+        """
+        Implementation of ^ operator - returns C{L{Or}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Or( [ self, other ] )
+
+    def __rxor__(self, other ):
+        """
+        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other ^ self
+
+    def __and__(self, other ):
+        """
+        Implementation of & operator - returns C{L{Each}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Each( [ self, other ] )
+
+    def __rand__(self, other ):
+        """
+        Implementation of & operator when left operand is not a C{L{ParserElement}}
+        """
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other & self
+
+    def __invert__( self ):
+        """
+        Implementation of ~ operator - returns C{L{NotAny}}
+        """
+        return NotAny( self )
+
+    def __call__(self, name=None):
+        """
+        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
+        
+        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
+        passed as C{True}.
+           
+        If C{name} is omitted, same as calling C{L{copy}}.
+
+        Example::
+            # these are equivalent
+            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
+            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
+        """
+        if name is not None:
+            return self.setResultsName(name)
+        else:
+            return self.copy()
+
+    def suppress( self ):
+        """
+        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
+        cluttering up returned output.
+        """
+        return Suppress( self )
+
+    def leaveWhitespace( self ):
+        """
+        Disables the skipping of whitespace before matching the characters in the
+        C{ParserElement}'s defined pattern.  This is normally only used internally by
+        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
+        """
+        self.skipWhitespace = False
+        return self
+
+    def setWhitespaceChars( self, chars ):
+        """
+        Overrides the default whitespace chars
+        """
+        self.skipWhitespace = True
+        self.whiteChars = chars
+        self.copyDefaultWhiteChars = False
+        return self
+
+    def parseWithTabs( self ):
+        """
+        Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string.
+        Must be called before C{parseString} when the input grammar contains elements that
+        match C{<TAB>} characters.
+        """
+        self.keepTabs = True
+        return self
+
+    def ignore( self, other ):
+        """
+        Define expression to be ignored (e.g., comments) while doing pattern
+        matching; may be called repeatedly, to define multiple comment or other
+        ignorable patterns.
+        
+        Example::
+            patt = OneOrMore(Word(alphas))
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
+            
+            patt.ignore(cStyleComment)
+            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
+        """
+        if isinstance(other, basestring):
+            other = Suppress(other)
+
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                self.ignoreExprs.append(other)
+        else:
+            self.ignoreExprs.append( Suppress( other.copy() ) )
+        return self
+
+    def setDebugActions( self, startAction, successAction, exceptionAction ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        """
+        self.debugActions = (startAction or _defaultStartDebugAction,
+                             successAction or _defaultSuccessDebugAction,
+                             exceptionAction or _defaultExceptionDebugAction)
+        self.debug = True
+        return self
+
+    def setDebug( self, flag=True ):
+        """
+        Enable display of debugging messages while doing pattern matching.
+        Set C{flag} to True to enable, False to disable.
+
+        Example::
+            wd = Word(alphas).setName("alphaword")
+            integer = Word(nums).setName("numword")
+            term = wd | integer
+            
+            # turn on debugging for wd
+            wd.setDebug()
+
+            OneOrMore(term).parseString("abc 123 xyz 890")
+        
+        prints::
+            Match alphaword at loc 0(1,1)
+            Matched alphaword -> ['abc']
+            Match alphaword at loc 3(1,4)
+            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
+            Match alphaword at loc 7(1,8)
+            Matched alphaword -> ['xyz']
+            Match alphaword at loc 11(1,12)
+            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
+            Match alphaword at loc 15(1,16)
+            Exception raised:Expected alphaword (at char 15), (line:1, col:16)
+
+        The output shown is that produced by the default debug actions - custom debug actions can be
+        specified using L{setDebugActions}. Prior to attempting
+        to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"}
+        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
+        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
+        which makes debugging and exception messages easier to understand - for instance, the default
+        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
+        """
+        if flag:
+            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
+        else:
+            self.debug = False
+        return self
+
+    def __str__( self ):
+        return self.name
+
+    def __repr__( self ):
+        return _ustr(self)
+
+    def streamline( self ):
+        self.streamlined = True
+        self.strRepr = None
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        pass
+
+    def validate( self, validateTrace=[] ):
+        """
+        Check defined expressions for valid structure, check for infinite recursive definitions.
+        """
+        self.checkRecursion( [] )
+
+    def parseFile( self, file_or_filename, parseAll=False ):
+        """
+        Execute the parse expression on the given file or filename.
+        If a filename is specified (instead of a file object),
+        the entire file is opened, read, and closed before parsing.
+        """
+        try:
+            file_contents = file_or_filename.read()
+        except AttributeError:
+            with open(file_or_filename, "r") as f:
+                file_contents = f.read()
+        try:
+            return self.parseString(file_contents, parseAll)
+        except ParseBaseException as exc:
+            if ParserElement.verbose_stacktrace:
+                raise
+            else:
+                # catch and re-raise exception from here, clears out pyparsing internal stack trace
+                raise exc
+
+    def __eq__(self,other):
+        if isinstance(other, ParserElement):
+            return self is other or vars(self) == vars(other)
+        elif isinstance(other, basestring):
+            return self.matches(other)
+        else:
+            return super(ParserElement,self)==other
+
+    def __ne__(self,other):
+        return not (self == other)
+
+    def __hash__(self):
+        return hash(id(self))
+
+    def __req__(self,other):
+        return self == other
+
+    def __rne__(self,other):
+        return not (self == other)
+
+    def matches(self, testString, parseAll=True):
+        """
+        Method for quick testing of a parser against a test string. Good for simple 
+        inline microtests of sub expressions while building up larger parser.
+           
+        Parameters:
+         - testString - to test against this expression for a match
+         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
+            
+        Example::
+            expr = Word(nums)
+            assert expr.matches("100")
+        """
+        try:
+            self.parseString(_ustr(testString), parseAll=parseAll)
+            return True
+        except ParseBaseException:
+            return False
+                
+    def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False):
+        """
+        Execute the parse expression on a series of test strings, showing each
+        test, the parsed results or where the parse failed. Quick and easy way to
+        run a parse expression against a list of sample strings.
+           
+        Parameters:
+         - tests - a list of separate test strings, or a multiline string of test strings
+         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
+         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
+              string; pass None to disable comment filtering
+         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
+              if False, only dump nested list
+         - printResults - (default=C{True}) prints test output to stdout
+         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing
+
+        Returns: a (success, results) tuple, where success indicates that all tests succeeded
+        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
+        test's output
+        
+        Example::
+            number_expr = pyparsing_common.number.copy()
+
+            result = number_expr.runTests('''
+                # unsigned integer
+                100
+                # negative integer
+                -100
+                # float with scientific notation
+                6.02e23
+                # integer with scientific notation
+                1e-12
+                ''')
+            print("Success" if result[0] else "Failed!")
+
+            result = number_expr.runTests('''
+                # stray character
+                100Z
+                # missing leading digit before '.'
+                -.100
+                # too many '.'
+                3.14.159
+                ''', failureTests=True)
+            print("Success" if result[0] else "Failed!")
+        prints::
+            # unsigned integer
+            100
+            [100]
+
+            # negative integer
+            -100
+            [-100]
+
+            # float with scientific notation
+            6.02e23
+            [6.02e+23]
+
+            # integer with scientific notation
+            1e-12
+            [1e-12]
+
+            Success
+            
+            # stray character
+            100Z
+               ^
+            FAIL: Expected end of text (at char 3), (line:1, col:4)
+
+            # missing leading digit before '.'
+            -.100
+            ^
+            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)
+
+            # too many '.'
+            3.14.159
+                ^
+            FAIL: Expected end of text (at char 4), (line:1, col:5)
+
+            Success
+
+        Each test string must be on a single line. If you want to test a string that spans multiple
+        lines, create a test like this::
+
+            expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines")
+        
+        (Note that this is a raw string literal, you must include the leading 'r'.)
+        """
+        if isinstance(tests, basestring):
+            tests = list(map(str.strip, tests.rstrip().splitlines()))
+        if isinstance(comment, basestring):
+            comment = Literal(comment)
+        allResults = []
+        comments = []
+        success = True
+        for t in tests:
+            if comment is not None and comment.matches(t, False) or comments and not t:
+                comments.append(t)
+                continue
+            if not t:
+                continue
+            out = ['\n'.join(comments), t]
+            comments = []
+            try:
+                t = t.replace(r'\n','\n')
+                result = self.parseString(t, parseAll=parseAll)
+                out.append(result.dump(full=fullDump))
+                success = success and not failureTests
+            except ParseBaseException as pe:
+                fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
+                if '\n' in t:
+                    out.append(line(pe.loc, t))
+                    out.append(' '*(col(pe.loc,t)-1) + '^' + fatal)
+                else:
+                    out.append(' '*pe.loc + '^' + fatal)
+                out.append("FAIL: " + str(pe))
+                success = success and failureTests
+                result = pe
+            except Exception as exc:
+                out.append("FAIL-EXCEPTION: " + str(exc))
+                success = success and failureTests
+                result = exc
+
+            if printResults:
+                if fullDump:
+                    out.append('')
+                print('\n'.join(out))
+
+            allResults.append((t, result))
+        
+        return success, allResults
+
+        
+class Token(ParserElement):
+    """
+    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
+    """
+    def __init__( self ):
+        super(Token,self).__init__( savelist=False )
+
+
+class Empty(Token):
+    """
+    An empty token, will always match.
+    """
+    def __init__( self ):
+        super(Empty,self).__init__()
+        self.name = "Empty"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+
+class NoMatch(Token):
+    """
+    A token that will never match.
+    """
+    def __init__( self ):
+        super(NoMatch,self).__init__()
+        self.name = "NoMatch"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.errmsg = "Unmatchable token"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Literal(Token):
+    """
+    Token to exactly match a specified string.
+    
+    Example::
+        Literal('blah').parseString('blah')  # -> ['blah']
+        Literal('blah').parseString('blahfooblah')  # -> ['blah']
+        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
+    
+    For case-insensitive matching, use L{CaselessLiteral}.
+    
+    For keyword matching (force word break before and after the matched string),
+    use L{Keyword} or L{CaselessKeyword}.
+    """
+    def __init__( self, matchString ):
+        super(Literal,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Literal; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+            self.__class__ = Empty
+        self.name = '"%s"' % _ustr(self.match)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+
+    # Performance tuning: this routine gets called a *lot*
+    # if this is a single character match string  and the first character matches,
+    # short-circuit as quickly as possible, and avoid calling startswith
+    #~ @profile
+    def parseImpl( self, instring, loc, doActions=True ):
+        if (instring[loc] == self.firstMatchChar and
+            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+_L = Literal
+ParserElement._literalStringClass = Literal
+
+class Keyword(Token):
+    """
+    Token to exactly match a specified string as a keyword, that is, it must be
+    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
+     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
+     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
+    Accepts two optional constructor arguments in addition to the keyword string:
+     - C{identChars} is a string of characters that would be valid identifier characters,
+          defaulting to all alphanumerics + "_" and "$"
+     - C{caseless} allows case-insensitive matching, default is C{False}.
+       
+    Example::
+        Keyword("start").parseString("start")  # -> ['start']
+        Keyword("start").parseString("starting")  # -> Exception
+
+    For case-insensitive matching, use L{CaselessKeyword}.
+    """
+    DEFAULT_KEYWORD_CHARS = alphanums+"_$"
+
+    def __init__( self, matchString, identChars=None, caseless=False ):
+        super(Keyword,self).__init__()
+        if identChars is None:
+            identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Keyword; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.mayIndexError = False
+        self.caseless = caseless
+        if caseless:
+            self.caselessmatch = matchString.upper()
+            identChars = identChars.upper()
+        self.identChars = set(identChars)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.caseless:
+            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
+                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        else:
+            if (instring[loc] == self.firstMatchChar and
+                (self.matchLen==1 or instring.startswith(self.match,loc)) and
+                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
+                (loc == 0 or instring[loc-1] not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+    def copy(self):
+        c = super(Keyword,self).copy()
+        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        return c
+
+    @staticmethod
+    def setDefaultKeywordChars( chars ):
+        """Overrides the default Keyword chars
+        """
+        Keyword.DEFAULT_KEYWORD_CHARS = chars
+
+class CaselessLiteral(Literal):
+    """
+    Token to match a specified string, ignoring case of letters.
+    Note: the matched results will always be in the case of the given
+    match string, NOT the case of the input text.
+
+    Example::
+        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
+        
+    (Contrast with example for L{CaselessKeyword}.)
+    """
+    def __init__( self, matchString ):
+        super(CaselessLiteral,self).__init__( matchString.upper() )
+        # Preserve the defining literal.
+        self.returnString = matchString
+        self.name = "'%s'" % self.returnString
+        self.errmsg = "Expected " + self.name
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[ loc:loc+self.matchLen ].upper() == self.match:
+            return loc+self.matchLen, self.returnString
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CaselessKeyword(Keyword):
+    """
+    Caseless version of L{Keyword}.
+
+    Example::
+        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
+        
+    (Contrast with example for L{CaselessLiteral}.)
+    """
+    def __init__( self, matchString, identChars=None ):
+        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
+            return loc+self.matchLen, self.match
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class CloseMatch(Token):
+    """
+    A variation on L{Literal} which matches "close" matches, that is, 
+    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
+     - C{match_string} - string to be matched
+     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
+    
+    The results from a successful parse will contain the matched text from the input string and the following named results:
+     - C{mismatches} - a list of the positions within the match_string where mismatches were found
+     - C{original} - the original match_string used to compare against the input string
+    
+    If C{mismatches} is an empty list, then the match was an exact match.
+    
+    Example::
+        patt = CloseMatch("ATCATCGAATGGA")
+        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
+        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)
+
+        # exact match
+        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})
+
+        # close match allowing up to 2 mismatches
+        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
+        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
+    """
+    def __init__(self, match_string, maxMismatches=1):
+        super(CloseMatch,self).__init__()
+        self.name = match_string
+        self.match_string = match_string
+        self.maxMismatches = maxMismatches
+        self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches)
+        self.mayIndexError = False
+        self.mayReturnEmpty = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        start = loc
+        instrlen = len(instring)
+        maxloc = start + len(self.match_string)
+
+        if maxloc <= instrlen:
+            match_string = self.match_string
+            match_stringloc = 0
+            mismatches = []
+            maxMismatches = self.maxMismatches
+
+            for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)):
+                src,mat = s_m
+                if src != mat:
+                    mismatches.append(match_stringloc)
+                    if len(mismatches) > maxMismatches:
+                        break
+            else:
+                loc = match_stringloc + 1
+                results = ParseResults([instring[start:loc]])
+                results['original'] = self.match_string
+                results['mismatches'] = mismatches
+                return loc, results
+
+        raise ParseException(instring, loc, self.errmsg, self)
+
+
+class Word(Token):
+    """
+    Token for matching words composed of allowed character sets.
+    Defined with string containing all allowed initial characters,
+    an optional string containing allowed body characters (if omitted,
+    defaults to the initial character set), and an optional minimum,
+    maximum, and/or exact length.  The default value for C{min} is 1 (a
+    minimum value < 1 is not valid); the default values for C{max} and C{exact}
+    are 0, meaning no maximum or exact length restriction. An optional
+    C{excludeChars} parameter can list characters that might be found in 
+    the input C{bodyChars} string; useful to define a word of all printables
+    except for one or two characters, for instance.
+    
+    L{srange} is useful for defining custom character set strings for defining 
+    C{Word} expressions, using range notation from regular expression character sets.
+    
+    A common mistake is to use C{Word} to match a specific literal string, as in 
+    C{Word("Address")}. Remember that C{Word} uses the string argument to define
+    I{sets} of matchable characters. This expression would match "Add", "AAA",
+    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
+    To match an exact literal string, use L{Literal} or L{Keyword}.
+
+    pyparsing includes helper strings for building Words:
+     - L{alphas}
+     - L{nums}
+     - L{alphanums}
+     - L{hexnums}
+     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
+     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
+     - L{printables} (any non-whitespace character)
+
+    Example::
+        # a word composed of digits
+        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
+        
+        # a word with a leading capital, and zero or more lowercase
+        capital_word = Word(alphas.upper(), alphas.lower())
+
+        # hostnames are alphanumeric, with leading alpha, and '-'
+        hostname = Word(alphas, alphanums+'-')
+        
+        # roman numeral (not a strict parser, accepts invalid mix of characters)
+        roman = Word("IVXLCDM")
+        
+        # any string of non-whitespace characters, except for ','
+        csv_value = Word(printables, excludeChars=",")
+    """
+    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
+        super(Word,self).__init__()
+        if excludeChars:
+            initChars = ''.join(c for c in initChars if c not in excludeChars)
+            if bodyChars:
+                bodyChars = ''.join(c for c in bodyChars if c not in excludeChars)
+        self.initCharsOrig = initChars
+        self.initChars = set(initChars)
+        if bodyChars :
+            self.bodyCharsOrig = bodyChars
+            self.bodyChars = set(bodyChars)
+        else:
+            self.bodyCharsOrig = initChars
+            self.bodyChars = set(initChars)
+
+        self.maxSpecified = max > 0
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.asKeyword = asKeyword
+
+        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
+            if self.bodyCharsOrig == self.initCharsOrig:
+                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
+            elif len(self.initCharsOrig) == 1:
+                self.reString = "%s[%s]*" % \
+                                      (re.escape(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            else:
+                self.reString = "[%s][%s]*" % \
+                                      (_escapeRegexRangeChars(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            if self.asKeyword:
+                self.reString = r"\b"+self.reString+r"\b"
+            try:
+                self.re = re.compile( self.reString )
+            except Exception:
+                self.re = None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.re:
+            result = self.re.match(instring,loc)
+            if not result:
+                raise ParseException(instring, loc, self.errmsg, self)
+
+            loc = result.end()
+            return loc, result.group()
+
+        if not(instring[ loc ] in self.initChars):
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        instrlen = len(instring)
+        bodychars = self.bodyChars
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, instrlen )
+        while loc < maxloc and instring[loc] in bodychars:
+            loc += 1
+
+        throwException = False
+        if loc - start < self.minLen:
+            throwException = True
+        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
+            throwException = True
+        if self.asKeyword:
+            if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars):
+                throwException = True
+
+        if throwException:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(Word,self).__str__()
+        except Exception:
+            pass
+
+
+        if self.strRepr is None:
+
+            def charsAsStr(s):
+                if len(s)>4:
+                    return s[:4]+"..."
+                else:
+                    return s
+
+            if ( self.initCharsOrig != self.bodyCharsOrig ):
+                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
+            else:
+                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
+
+        return self.strRepr
+
+
+class Regex(Token):
+    r"""
+    Token for matching strings that match a given regular expression.
+    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
+    If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as 
+    named parse results.
+
+    Example::
+        realnum = Regex(r"[+-]?\d+\.\d*")
+        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
+        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
+        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
+    """
+    compiledREtype = type(re.compile("[A-Z]"))
+    def __init__( self, pattern, flags=0):
+        """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags."""
+        super(Regex,self).__init__()
+
+        if isinstance(pattern, basestring):
+            if not pattern:
+                warnings.warn("null string passed to Regex; use Empty() instead",
+                        SyntaxWarning, stacklevel=2)
+
+            self.pattern = pattern
+            self.flags = flags
+
+            try:
+                self.re = re.compile(self.pattern, self.flags)
+                self.reString = self.pattern
+            except sre_constants.error:
+                warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
+                    SyntaxWarning, stacklevel=2)
+                raise
+
+        elif isinstance(pattern, Regex.compiledREtype):
+            self.re = pattern
+            self.pattern = \
+            self.reString = str(pattern)
+            self.flags = flags
+            
+        else:
+            raise ValueError("Regex may only be constructed with a string or a compiled RE object")
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = self.re.match(instring,loc)
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        d = result.groupdict()
+        ret = ParseResults(result.group())
+        if d:
+            for k in d:
+                ret[k] = d[k]
+        return loc,ret
+
+    def __str__( self ):
+        try:
+            return super(Regex,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "Re:(%s)" % repr(self.pattern)
+
+        return self.strRepr
+
+
+class QuotedString(Token):
+    r"""
+    Token for matching strings that are delimited by quoting characters.
+    
+    Defined with the following parameters:
+        - quoteChar - string of one or more characters defining the quote delimiting string
+        - escChar - character to escape quotes, typically backslash (default=C{None})
+        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
+        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
+        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
+        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
+        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})
+
+    Example::
+        qs = QuotedString('"')
+        print(qs.searchString('lsjdf "This is the quote" sldjf'))
+        complex_qs = QuotedString('{{', endQuoteChar='}}')
+        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
+        sql_qs = QuotedString('"', escQuote='""')
+        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
+    prints::
+        [['This is the quote']]
+        [['This is the "quote"']]
+        [['This is the quote with "embedded" quotes']]
+    """
+    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True):
+        super(QuotedString,self).__init__()
+
+        # remove white space from quote chars - wont work anyway
+        quoteChar = quoteChar.strip()
+        if not quoteChar:
+            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+            raise SyntaxError()
+
+        if endQuoteChar is None:
+            endQuoteChar = quoteChar
+        else:
+            endQuoteChar = endQuoteChar.strip()
+            if not endQuoteChar:
+                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+                raise SyntaxError()
+
+        self.quoteChar = quoteChar
+        self.quoteCharLen = len(quoteChar)
+        self.firstQuoteChar = quoteChar[0]
+        self.endQuoteChar = endQuoteChar
+        self.endQuoteCharLen = len(endQuoteChar)
+        self.escChar = escChar
+        self.escQuote = escQuote
+        self.unquoteResults = unquoteResults
+        self.convertWhitespaceEscapes = convertWhitespaceEscapes
+
+        if multiline:
+            self.flags = re.MULTILINE | re.DOTALL
+            self.pattern = r'%s(?:[^%s%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        else:
+            self.flags = 0
+            self.pattern = r'%s(?:[^%s\n\r%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        if len(self.endQuoteChar) > 1:
+            self.pattern += (
+                '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
+                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
+                                    for i in range(len(self.endQuoteChar)-1,0,-1)) + ')'
+                )
+        if escQuote:
+            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
+        if escChar:
+            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
+            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
+        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))
+
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except sre_constants.error:
+            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
+        if not result:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        loc = result.end()
+        ret = result.group()
+
+        if self.unquoteResults:
+
+            # strip off quotes
+            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]
+
+            if isinstance(ret,basestring):
+                # replace escaped whitespace
+                if '\\' in ret and self.convertWhitespaceEscapes:
+                    ws_map = {
+                        r'\t' : '\t',
+                        r'\n' : '\n',
+                        r'\f' : '\f',
+                        r'\r' : '\r',
+                    }
+                    for wslit,wschar in ws_map.items():
+                        ret = ret.replace(wslit, wschar)
+
+                # replace escaped characters
+                if self.escChar:
+                    ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret)
+
+                # replace escaped quotes
+                if self.escQuote:
+                    ret = ret.replace(self.escQuote, self.endQuoteChar)
+
+        return loc, ret
+
+    def __str__( self ):
+        try:
+            return super(QuotedString,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)
+
+        return self.strRepr
+
+
+class CharsNotIn(Token):
+    """
+    Token for matching words composed of characters I{not} in a given set (will
+    include whitespace in matched characters if not listed in the provided exclusion set - see example).
+    Defined with string containing all disallowed characters, and an optional
+    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
+    minimum value < 1 is not valid); the default values for C{max} and C{exact}
+    are 0, meaning no maximum or exact length restriction.
+
+    Example::
+        # define a comma-separated-value as anything that is not a ','
+        csv_value = CharsNotIn(',')
+        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
+    prints::
+        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
+    """
+    def __init__( self, notChars, min=1, max=0, exact=0 ):
+        super(CharsNotIn,self).__init__()
+        self.skipWhitespace = False
+        self.notChars = notChars
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = ( self.minLen == 0 )
+        self.mayIndexError = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] in self.notChars:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        start = loc
+        loc += 1
+        notchars = self.notChars
+        maxlen = min( start+self.maxLen, len(instring) )
+        while loc < maxlen and \
+              (instring[loc] not in notchars):
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(CharsNotIn, self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            if len(self.notChars) > 4:
+                self.strRepr = "!W:(%s...)" % self.notChars[:4]
+            else:
+                self.strRepr = "!W:(%s)" % self.notChars
+
+        return self.strRepr
+
+class White(Token):
+    """
+    Special matching class for matching whitespace.  Normally, whitespace is ignored
+    by pyparsing grammars.  This class is included when some whitespace structures
+    are significant.  Define with a string containing the whitespace characters to be
+    matched; default is C{" \\t\\r\\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
+    as defined for the C{L{Word}} class.
+    """
+    whiteStrs = {
+        " " : "<SPC>",
+        "\t": "<TAB>",
+        "\n": "<LF>",
+        "\r": "<CR>",
+        "\f": "<FF>",
+        }
+    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
+        super(White,self).__init__()
+        self.matchWhite = ws
+        self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) )
+        #~ self.leaveWhitespace()
+        self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite))
+        self.mayReturnEmpty = True
+        self.errmsg = "Expected " + self.name
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not(instring[ loc ] in self.matchWhite):
+            raise ParseException(instring, loc, self.errmsg, self)
+        start = loc
+        loc += 1
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, len(instring) )
+        while loc < maxloc and instring[loc] in self.matchWhite:
+            loc += 1
+
+        if loc - start < self.minLen:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        return loc, instring[start:loc]
+
+
+class _PositionToken(Token):
+    def __init__( self ):
+        super(_PositionToken,self).__init__()
+        self.name=self.__class__.__name__
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+class GoToColumn(_PositionToken):
+    """
+    Token to advance to a specific column of input text; useful for tabular report scraping.
+    """
+    def __init__( self, colno ):
+        super(GoToColumn,self).__init__()
+        self.col = colno
+
+    def preParse( self, instring, loc ):
+        if col(loc,instring) != self.col:
+            instrlen = len(instring)
+            if self.ignoreExprs:
+                loc = self._skipIgnorables( instring, loc )
+            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
+                loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        thiscol = col( loc, instring )
+        if thiscol > self.col:
+            raise ParseException( instring, loc, "Text not in expected column", self )
+        newloc = loc + self.col - thiscol
+        ret = instring[ loc: newloc ]
+        return newloc, ret
+
+
+class LineStart(_PositionToken):
+    """
+    Matches if current position is at the beginning of a line within the parse string
+    
+    Example::
+    
+        test = '''\
+        AAA this line
+        AAA and this line
+          AAA but not this one
+        B AAA and definitely not this one
+        '''
+
+        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
+            print(t)
+    
+    Prints::
+        ['AAA', ' this line']
+        ['AAA', ' and this line']    
+
+    """
+    def __init__( self ):
+        super(LineStart,self).__init__()
+        self.errmsg = "Expected start of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if col(loc, instring) == 1:
+            return loc, []
+        raise ParseException(instring, loc, self.errmsg, self)
+
+class LineEnd(_PositionToken):
+    """
+    Matches if current position is at the end of a line within the parse string
+    """
+    def __init__( self ):
+        super(LineEnd,self).__init__()
+        self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") )
+        self.errmsg = "Expected end of line"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc<len(instring):
+            if instring[loc] == "\n":
+                return loc+1, "\n"
+            else:
+                raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class StringStart(_PositionToken):
+    """
+    Matches if current position is at the beginning of the parse string
+    """
+    def __init__( self ):
+        super(StringStart,self).__init__()
+        self.errmsg = "Expected start of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc != 0:
+            # see if entire string up to here is just whitespace and ignoreables
+            if loc != self.preParse( instring, 0 ):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class StringEnd(_PositionToken):
+    """
+    Matches if current position is at the end of the parse string
+    """
+    def __init__( self ):
+        super(StringEnd,self).__init__()
+        self.errmsg = "Expected end of text"
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc < len(instring):
+            raise ParseException(instring, loc, self.errmsg, self)
+        elif loc == len(instring):
+            return loc+1, []
+        elif loc > len(instring):
+            return loc, []
+        else:
+            raise ParseException(instring, loc, self.errmsg, self)
+
+class WordStart(_PositionToken):
+    """
+    Matches if the current position is at the beginning of a Word, and
+    is not preceded by any character in a given set of C{wordChars}
+    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
+    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
+    the string being parsed, or at the beginning of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordStart,self).__init__()
+        self.wordChars = set(wordChars)
+        self.errmsg = "Not at the start of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        if loc != 0:
+            if (instring[loc-1] in self.wordChars or
+                instring[loc] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+class WordEnd(_PositionToken):
+    """
+    Matches if the current position is at the end of a Word, and
+    is not followed by any character in a given set of C{wordChars}
+    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
+    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
+    the string being parsed, or at the end of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordEnd,self).__init__()
+        self.wordChars = set(wordChars)
+        self.skipWhitespace = False
+        self.errmsg = "Not at the end of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        instrlen = len(instring)
+        if instrlen>0 and loc<instrlen:
+            if (instring[loc] in self.wordChars or
+                instring[loc-1] not in self.wordChars):
+                raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+
+class ParseExpression(ParserElement):
+    """
+    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(ParseExpression,self).__init__(savelist)
+        if isinstance( exprs, _generatorType ):
+            exprs = list(exprs)
+
+        if isinstance( exprs, basestring ):
+            self.exprs = [ ParserElement._literalStringClass( exprs ) ]
+        elif isinstance( exprs, Iterable ):
+            exprs = list(exprs)
+            # if sequence of strings provided, wrap with Literal
+            if all(isinstance(expr, basestring) for expr in exprs):
+                exprs = map(ParserElement._literalStringClass, exprs)
+            self.exprs = list(exprs)
+        else:
+            try:
+                self.exprs = list( exprs )
+            except TypeError:
+                self.exprs = [ exprs ]
+        self.callPreparse = False
+
+    def __getitem__( self, i ):
+        return self.exprs[i]
+
+    def append( self, other ):
+        self.exprs.append( other )
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
+           all contained expressions."""
+        self.skipWhitespace = False
+        self.exprs = [ e.copy() for e in self.exprs ]
+        for e in self.exprs:
+            e.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseExpression, self).ignore( other )
+                for e in self.exprs:
+                    e.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseExpression, self).ignore( other )
+            for e in self.exprs:
+                e.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def __str__( self ):
+        try:
+            return super(ParseExpression,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
+        return self.strRepr
+
+    def streamline( self ):
+        super(ParseExpression,self).streamline()
+
+        for e in self.exprs:
+            e.streamline()
+
+        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
+        # but only if there are no parse actions or resultsNames on the nested And's
+        # (likewise for Or's and MatchFirst's)
+        if ( len(self.exprs) == 2 ):
+            other = self.exprs[0]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = other.exprs[:] + [ self.exprs[1] ]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+            other = self.exprs[-1]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = self.exprs[:-1] + other.exprs[:]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+        self.errmsg = "Expected " + _ustr(self)
+        
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ParseExpression,self).setResultsName(name,listAllMatches)
+        return ret
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        for e in self.exprs:
+            e.validate(tmp)
+        self.checkRecursion( [] )
+        
+    def copy(self):
+        ret = super(ParseExpression,self).copy()
+        ret.exprs = [e.copy() for e in self.exprs]
+        return ret
+
+class And(ParseExpression):
+    """
+    Requires all given C{ParseExpression}s to be found in the given order.
+    Expressions may be separated by whitespace.
+    May be constructed using the C{'+'} operator.
+    May also be constructed using the C{'-'} operator, which will suppress backtracking.
+
+    Example::
+        integer = Word(nums)
+        name_expr = OneOrMore(Word(alphas))
+
+        expr = And([integer("id"),name_expr("name"),integer("age")])
+        # more easily written as:
+        expr = integer("id") + name_expr("name") + integer("age")
+    """
+
+    class _ErrorStop(Empty):
+        def __init__(self, *args, **kwargs):
+            super(And._ErrorStop,self).__init__(*args, **kwargs)
+            self.name = '-'
+            self.leaveWhitespace()
+
+    def __init__( self, exprs, savelist = True ):
+        super(And,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.setWhitespaceChars( self.exprs[0].whiteChars )
+        self.skipWhitespace = self.exprs[0].skipWhitespace
+        self.callPreparse = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        # pass False as last arg to _parse for first element, since we already
+        # pre-parsed the string as part of our And pre-parsing
+        loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
+        errorStop = False
+        for e in self.exprs[1:]:
+            if isinstance(e, And._ErrorStop):
+                errorStop = True
+                continue
+            if errorStop:
+                try:
+                    loc, exprtokens = e._parse( instring, loc, doActions )
+                except ParseSyntaxException:
+                    raise
+                except ParseBaseException as pe:
+                    pe.__traceback__ = None
+                    raise ParseSyntaxException._from_exception(pe)
+                except IndexError:
+                    raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
+            else:
+                loc, exprtokens = e._parse( instring, loc, doActions )
+            if exprtokens or exprtokens.haskeys():
+                resultlist += exprtokens
+        return loc, resultlist
+
+    def __iadd__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #And( [ self, other ] )
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+            if not e.mayReturnEmpty:
+                break
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+
+class Or(ParseExpression):
+    """
+    Requires that at least one C{ParseExpression} is found.
+    If two expressions match, the expression that matches the longest string will be used.
+    May be constructed using the C{'^'} operator.
+
+    Example::
+        # construct Or using '^' operator
+        
+        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789"))
+    prints::
+        [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(Or,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        matches = []
+        for e in self.exprs:
+            try:
+                loc2 = e.tryParse( instring, loc )
+            except ParseException as err:
+                err.__traceback__ = None
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+            else:
+                # save match among all matches, to retry longest to shortest
+                matches.append((loc2, e))
+
+        if matches:
+            matches.sort(key=lambda x: -x[0])
+            for _,e in matches:
+                try:
+                    return e._parse( instring, loc, doActions )
+                except ParseException as err:
+                    err.__traceback__ = None
+                    if err.loc > maxExcLoc:
+                        maxException = err
+                        maxExcLoc = err.loc
+
+        if maxException is not None:
+            maxException.msg = self.errmsg
+            raise maxException
+        else:
+            raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+
+    def __ixor__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #Or( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class MatchFirst(ParseExpression):
+    """
+    Requires that at least one C{ParseExpression} is found.
+    If two expressions match, the first one listed is the one that will match.
+    May be constructed using the C{'|'} operator.
+
+    Example::
+        # construct MatchFirst using '|' operator
+        
+        # watch the order of expressions to match
+        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
+        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]
+
+        # put more selective expression first
+        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
+        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(MatchFirst,self).__init__(exprs, savelist)
+        if self.exprs:
+            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        for e in self.exprs:
+            try:
+                ret = e._parse( instring, loc, doActions )
+                return ret
+            except ParseException as err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+
+        # only got here if no expression matched, raise exception for match that made it the furthest
+        else:
+            if maxException is not None:
+                maxException.msg = self.errmsg
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+    def __ior__(self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass( other )
+        return self.append( other ) #MatchFirst( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class Each(ParseExpression):
+    """
+    Requires all given C{ParseExpression}s to be found, but in any order.
+    Expressions may be separated by whitespace.
+    May be constructed using the C{'&'} operator.
+
+    Example::
+        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
+        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
+        integer = Word(nums)
+        shape_attr = "shape:" + shape_type("shape")
+        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
+        color_attr = "color:" + color("color")
+        size_attr = "size:" + integer("size")
+
+        # use Each (using operator '&') to accept attributes in any order 
+        # (shape and posn are required, color and size are optional)
+        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)
+
+        shape_spec.runTests('''
+            shape: SQUARE color: BLACK posn: 100, 120
+            shape: CIRCLE size: 50 color: BLUE posn: 50,80
+            color:GREEN size:20 shape:TRIANGLE posn:20,40
+            '''
+            )
+    prints::
+        shape: SQUARE color: BLACK posn: 100, 120
+        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
+        - color: BLACK
+        - posn: ['100', ',', '120']
+          - x: 100
+          - y: 120
+        - shape: SQUARE
+
+
+        shape: CIRCLE size: 50 color: BLUE posn: 50,80
+        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
+        - color: BLUE
+        - posn: ['50', ',', '80']
+          - x: 50
+          - y: 80
+        - shape: CIRCLE
+        - size: 50
+
+
+        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
+        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
+        - color: GREEN
+        - posn: ['20', ',', '40']
+          - x: 20
+          - y: 40
+        - shape: TRIANGLE
+        - size: 20
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(Each,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
+        self.skipWhitespace = True
+        self.initExprGroups = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.initExprGroups:
+            self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional))
+            opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
+            opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)]
+            self.optionals = opt1 + opt2
+            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
+            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
+            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
+            self.required += self.multirequired
+            self.initExprGroups = False
+        tmpLoc = loc
+        tmpReqd = self.required[:]
+        tmpOpt  = self.optionals[:]
+        matchOrder = []
+
+        keepMatching = True
+        while keepMatching:
+            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
+            failed = []
+            for e in tmpExprs:
+                try:
+                    tmpLoc = e.tryParse( instring, tmpLoc )
+                except ParseException:
+                    failed.append(e)
+                else:
+                    matchOrder.append(self.opt1map.get(id(e),e))
+                    if e in tmpReqd:
+                        tmpReqd.remove(e)
+                    elif e in tmpOpt:
+                        tmpOpt.remove(e)
+            if len(failed) == len(tmpExprs):
+                keepMatching = False
+
+        if tmpReqd:
+            missing = ", ".join(_ustr(e) for e in tmpReqd)
+            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )
+
+        # add any unmatched Optionals, in case they have default values defined
+        matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt]
+
+        resultlist = []
+        for e in matchOrder:
+            loc,results = e._parse(instring,loc,doActions)
+            resultlist.append(results)
+
+        finalResults = sum(resultlist, ParseResults([]))
+        return loc, finalResults
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class ParseElementEnhance(ParserElement):
+    """
+    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(ParseElementEnhance,self).__init__(savelist)
+        if isinstance( expr, basestring ):
+            if issubclass(ParserElement._literalStringClass, Token):
+                expr = ParserElement._literalStringClass(expr)
+            else:
+                expr = ParserElement._literalStringClass(Literal(expr))
+        self.expr = expr
+        self.strRepr = None
+        if expr is not None:
+            self.mayIndexError = expr.mayIndexError
+            self.mayReturnEmpty = expr.mayReturnEmpty
+            self.setWhitespaceChars( expr.whiteChars )
+            self.skipWhitespace = expr.skipWhitespace
+            self.saveAsList = expr.saveAsList
+            self.callPreparse = expr.callPreparse
+            self.ignoreExprs.extend(expr.ignoreExprs)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr is not None:
+            return self.expr._parse( instring, loc, doActions, callPreParse=False )
+        else:
+            raise ParseException("",loc,self.errmsg,self)
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        self.expr = self.expr.copy()
+        if self.expr is not None:
+            self.expr.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseElementEnhance, self).ignore( other )
+                if self.expr is not None:
+                    self.expr.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseElementEnhance, self).ignore( other )
+            if self.expr is not None:
+                self.expr.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def streamline( self ):
+        super(ParseElementEnhance,self).streamline()
+        if self.expr is not None:
+            self.expr.streamline()
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        if self in parseElementList:
+            raise RecursiveGrammarException( parseElementList+[self] )
+        subRecCheckList = parseElementList[:] + [ self ]
+        if self.expr is not None:
+            self.expr.checkRecursion( subRecCheckList )
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        if self.expr is not None:
+            self.expr.validate(tmp)
+        self.checkRecursion( [] )
+
+    def __str__( self ):
+        try:
+            return super(ParseElementEnhance,self).__str__()
+        except Exception:
+            pass
+
+        if self.strRepr is None and self.expr is not None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
+        return self.strRepr
+
+
+class FollowedBy(ParseElementEnhance):
+    """
+    Lookahead matching of the given parse expression.  C{FollowedBy}
+    does I{not} advance the parsing position within the input string, it only
+    verifies that the specified parse expression matches at the current
+    position.  C{FollowedBy} always returns a null token list.
+
+    Example::
+        # use FollowedBy to match a label only if it is followed by a ':'
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        
+        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
+    prints::
+        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
+    """
+    def __init__( self, expr ):
+        super(FollowedBy,self).__init__(expr)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self.expr.tryParse( instring, loc )
+        return loc, []
+
+
+class NotAny(ParseElementEnhance):
+    """
+    Lookahead to disallow matching with the given parse expression.  C{NotAny}
+    does I{not} advance the parsing position within the input string, it only
+    verifies that the specified parse expression does I{not} match at the current
+    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
+    always returns a null token list.  May be constructed using the '~' operator.
+
+    Example::
+        
+    """
+    def __init__( self, expr ):
+        super(NotAny,self).__init__(expr)
+        #~ self.leaveWhitespace()
+        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
+        self.mayReturnEmpty = True
+        self.errmsg = "Found unwanted token, "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr.canParseNext(instring, loc):
+            raise ParseException(instring, loc, self.errmsg, self)
+        return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "~{" + _ustr(self.expr) + "}"
+
+        return self.strRepr
+
+class _MultipleMatch(ParseElementEnhance):
+    def __init__( self, expr, stopOn=None):
+        super(_MultipleMatch, self).__init__(expr)
+        self.saveAsList = True
+        ender = stopOn
+        if isinstance(ender, basestring):
+            ender = ParserElement._literalStringClass(ender)
+        self.not_ender = ~ender if ender is not None else None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self_expr_parse = self.expr._parse
+        self_skip_ignorables = self._skipIgnorables
+        check_ender = self.not_ender is not None
+        if check_ender:
+            try_not_ender = self.not_ender.tryParse
+        
+        # must be at least one (but first see if we are the stopOn sentinel;
+        # if so, fail)
+        if check_ender:
+            try_not_ender(instring, loc)
+        loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False )
+        try:
+            hasIgnoreExprs = (not not self.ignoreExprs)
+            while 1:
+                if check_ender:
+                    try_not_ender(instring, loc)
+                if hasIgnoreExprs:
+                    preloc = self_skip_ignorables( instring, loc )
+                else:
+                    preloc = loc
+                loc, tmptokens = self_expr_parse( instring, preloc, doActions )
+                if tmptokens or tmptokens.haskeys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+        
+class OneOrMore(_MultipleMatch):
+    """
+    Repetition of one or more of the given expression.
+    
+    Parameters:
+     - expr - expression that must match one or more times
+     - stopOn - (default=C{None}) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition 
+          expression)          
+
+    Example::
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: BLACK"
+        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]
+
+        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
+        
+        # could also be written as
+        (attr_expr * (1,)).parseString(text).pprint()
+    """
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + _ustr(self.expr) + "}..."
+
+        return self.strRepr
+
+class ZeroOrMore(_MultipleMatch):
+    """
+    Optional repetition of zero or more of the given expression.
+    
+    Parameters:
+     - expr - expression that must match zero or more times
+     - stopOn - (default=C{None}) - expression for a terminating sentinel
+          (only required if the sentinel would ordinarily match the repetition 
+          expression)          
+
+    Example: similar to L{OneOrMore}
+    """
+    def __init__( self, expr, stopOn=None):
+        super(ZeroOrMore,self).__init__(expr, stopOn=stopOn)
+        self.mayReturnEmpty = True
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
+        except (ParseException,IndexError):
+            return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]..."
+
+        return self.strRepr
+
+class _NullToken(object):
+    def __bool__(self):
+        return False
+    __nonzero__ = __bool__
+    def __str__(self):
+        return ""
+
+_optionalNotMatched = _NullToken()
+class Optional(ParseElementEnhance):
+    """
+    Optional matching of the given expression.
+
+    Parameters:
+     - expr - expression that must match zero or more times
+     - default (optional) - value to be returned if the optional expression is not found.
+
+    Example::
+        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
+        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
+        zip.runTests('''
+            # traditional ZIP code
+            12345
+            
+            # ZIP+4 form
+            12101-0001
+            
+            # invalid ZIP
+            98765-
+            ''')
+    prints::
+        # traditional ZIP code
+        12345
+        ['12345']
+
+        # ZIP+4 form
+        12101-0001
+        ['12101-0001']
+
+        # invalid ZIP
+        98765-
+             ^
+        FAIL: Expected end of text (at char 5), (line:1, col:6)
+    """
+    def __init__( self, expr, default=_optionalNotMatched ):
+        super(Optional,self).__init__( expr, savelist=False )
+        self.saveAsList = self.expr.saveAsList
+        self.defaultValue = default
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+        except (ParseException,IndexError):
+            if self.defaultValue is not _optionalNotMatched:
+                if self.expr.resultsName:
+                    tokens = ParseResults([ self.defaultValue ])
+                    tokens[self.expr.resultsName] = self.defaultValue
+                else:
+                    tokens = [ self.defaultValue ]
+            else:
+                tokens = []
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]"
+
+        return self.strRepr
+
+class SkipTo(ParseElementEnhance):
+    """
+    Token for skipping over all undefined text until the matched expression is found.
+
+    Parameters:
+     - expr - target expression marking the end of the data to be skipped
+     - include - (default=C{False}) if True, the target expression is also parsed 
+          (the skipped text and target expression are returned as a 2-element list).
+     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
+          comments) that might contain false matches to the target expression
+     - failOn - (default=C{None}) define expressions that are not allowed to be 
+          included in the skipped test; if found before the target expression is found, 
+          the SkipTo is not a match
+
+    Example::
+        report = '''
+            Outstanding Issues Report - 1 Jan 2000
+
+               # | Severity | Description                               |  Days Open
+            -----+----------+-------------------------------------------+-----------
+             101 | Critical | Intermittent system crash                 |          6
+              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
+              79 | Minor    | System slow when running too many reports |         47
+            '''
+        integer = Word(nums)
+        SEP = Suppress('|')
+        # use SkipTo to simply match everything up until the next SEP
+        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
+        # - parse action will call token.strip() for each matched token, i.e., the description body
+        string_data = SkipTo(SEP, ignore=quotedString)
+        string_data.setParseAction(tokenMap(str.strip))
+        ticket_expr = (integer("issue_num") + SEP 
+                      + string_data("sev") + SEP 
+                      + string_data("desc") + SEP 
+                      + integer("days_open"))
+        
+        for tkt in ticket_expr.searchString(report):
+            print tkt.dump()
+    prints::
+        ['101', 'Critical', 'Intermittent system crash', '6']
+        - days_open: 6
+        - desc: Intermittent system crash
+        - issue_num: 101
+        - sev: Critical
+        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
+        - days_open: 14
+        - desc: Spelling error on Login ('log|n')
+        - issue_num: 94
+        - sev: Cosmetic
+        ['79', 'Minor', 'System slow when running too many reports', '47']
+        - days_open: 47
+        - desc: System slow when running too many reports
+        - issue_num: 79
+        - sev: Minor
+    """
+    def __init__( self, other, include=False, ignore=None, failOn=None ):
+        super( SkipTo, self ).__init__( other )
+        self.ignoreExpr = ignore
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.includeMatch = include
+        self.asList = False
+        if isinstance(failOn, basestring):
+            self.failOn = ParserElement._literalStringClass(failOn)
+        else:
+            self.failOn = failOn
+        self.errmsg = "No match found for "+_ustr(self.expr)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        startloc = loc
+        instrlen = len(instring)
+        expr = self.expr
+        expr_parse = self.expr._parse
+        self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None
+        self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None
+        
+        tmploc = loc
+        while tmploc <= instrlen:
+            if self_failOn_canParseNext is not None:
+                # break if failOn expression matches
+                if self_failOn_canParseNext(instring, tmploc):
+                    break
+                    
+            if self_ignoreExpr_tryParse is not None:
+                # advance past ignore expressions
+                while 1:
+                    try:
+                        tmploc = self_ignoreExpr_tryParse(instring, tmploc)
+                    except ParseBaseException:
+                        break
+            
+            try:
+                expr_parse(instring, tmploc, doActions=False, callPreParse=False)
+            except (ParseException, IndexError):
+                # no match, advance loc in string
+                tmploc += 1
+            else:
+                # matched skipto expr, done
+                break
+
+        else:
+            # ran off the end of the input string without matching skipto expr, fail
+            raise ParseException(instring, loc, self.errmsg, self)
+
+        # build up return values
+        loc = tmploc
+        skiptext = instring[startloc:loc]
+        skipresult = ParseResults(skiptext)
+        
+        if self.includeMatch:
+            loc, mat = expr_parse(instring,loc,doActions,callPreParse=False)
+            skipresult += mat
+
+        return loc, skipresult
+
+class Forward(ParseElementEnhance):
+    """
+    Forward declaration of an expression to be defined later -
+    used for recursive grammars, such as algebraic infix notation.
+    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.
+
+    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
+    Specifically, '|' has a lower precedence than '<<', so that::
+        fwdExpr << a | b | c
+    will actually be evaluated as::
+        (fwdExpr << a) | b | c
+    thereby leaving b and c out as parseable alternatives.  It is recommended that you
+    explicitly group the values inserted into the C{Forward}::
+        fwdExpr << (a | b | c)
+    Converting to use the '<<=' operator instead will avoid this problem.
+
+    See L{ParseResults.pprint} for an example of a recursive parser created using
+    C{Forward}.
+    """
+    def __init__( self, other=None ):
+        super(Forward,self).__init__( other, savelist=False )
+
+    def __lshift__( self, other ):
+        if isinstance( other, basestring ):
+            other = ParserElement._literalStringClass(other)
+        self.expr = other
+        self.strRepr = None
+        self.mayIndexError = self.expr.mayIndexError
+        self.mayReturnEmpty = self.expr.mayReturnEmpty
+        self.setWhitespaceChars( self.expr.whiteChars )
+        self.skipWhitespace = self.expr.skipWhitespace
+        self.saveAsList = self.expr.saveAsList
+        self.ignoreExprs.extend(self.expr.ignoreExprs)
+        return self
+        
+    def __ilshift__(self, other):
+        return self << other
+    
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        return self
+
+    def streamline( self ):
+        if not self.streamlined:
+            self.streamlined = True
+            if self.expr is not None:
+                self.expr.streamline()
+        return self
+
+    def validate( self, validateTrace=[] ):
+        if self not in validateTrace:
+            tmp = validateTrace[:]+[self]
+            if self.expr is not None:
+                self.expr.validate(tmp)
+        self.checkRecursion([])
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+        return self.__class__.__name__ + ": ..."
+
+        # stubbed out for now - creates awful memory and perf issues
+        self._revertClass = self.__class__
+        self.__class__ = _ForwardNoRecurse
+        try:
+            if self.expr is not None:
+                retString = _ustr(self.expr)
+            else:
+                retString = "None"
+        finally:
+            self.__class__ = self._revertClass
+        return self.__class__.__name__ + ": " + retString
+
+    def copy(self):
+        if self.expr is not None:
+            return super(Forward,self).copy()
+        else:
+            ret = Forward()
+            ret <<= self
+            return ret
+
+class _ForwardNoRecurse(Forward):
+    def __str__( self ):
+        return "..."
+
+class TokenConverter(ParseElementEnhance):
+    """
+    Abstract subclass of C{ParseExpression}, for converting parsed results.
+    """
+    def __init__( self, expr, savelist=False ):
+        super(TokenConverter,self).__init__( expr )#, savelist )
+        self.saveAsList = False
+
+class Combine(TokenConverter):
+    """
+    Converter to concatenate all matching tokens to a single string.
+    By default, the matching patterns must also be contiguous in the input string;
+    this can be disabled by specifying C{'adjacent=False'} in the constructor.
+
+    Example::
+        real = Word(nums) + '.' + Word(nums)
+        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
+        # will also erroneously match the following
+        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']
+
+        real = Combine(Word(nums) + '.' + Word(nums))
+        print(real.parseString('3.1416')) # -> ['3.1416']
+        # no match when there are internal spaces
+        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
+    """
+    def __init__( self, expr, joinString="", adjacent=True ):
+        super(Combine,self).__init__( expr )
+        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
+        if adjacent:
+            self.leaveWhitespace()
+        self.adjacent = adjacent
+        self.skipWhitespace = True
+        self.joinString = joinString
+        self.callPreparse = True
+
+    def ignore( self, other ):
+        if self.adjacent:
+            ParserElement.ignore(self, other)
+        else:
+            super( Combine, self).ignore( other )
+        return self
+
+    def postParse( self, instring, loc, tokenlist ):
+        retToks = tokenlist.copy()
+        del retToks[:]
+        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)
+
+        if self.resultsName and retToks.haskeys():
+            return [ retToks ]
+        else:
+            return retToks
+
+class Group(TokenConverter):
+    """
+    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.
+
+    Example::
+        ident = Word(alphas)
+        num = Word(nums)
+        term = ident | num
+        func = ident + Optional(delimitedList(term))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']
+
+        func = ident + Group(Optional(delimitedList(term)))
+        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
+    """
+    def __init__( self, expr ):
+        super(Group,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        return [ tokenlist ]
+
+class Dict(TokenConverter):
+    """
+    Converter to return a repetitive expression as a list, but also as a dictionary.
+    Each element can also be referenced using the first token in the expression as its key.
+    Useful for tabular report scraping when the first column can be used as a item key.
+
+    Example::
+        data_word = Word(alphas)
+        label = data_word + FollowedBy(':')
+        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))
+
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        
+        # print attributes as plain groups
+        print(OneOrMore(attr_expr).parseString(text).dump())
+        
+        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
+        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
+        print(result.dump())
+        
+        # access named fields as dict entries, or output as dict
+        print(result['shape'])        
+        print(result.asDict())
+    prints::
+        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']
+
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
+    See more examples at L{ParseResults} of accessing fields by results name.
+    """
+    def __init__( self, expr ):
+        super(Dict,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        for i,tok in enumerate(tokenlist):
+            if len(tok) == 0:
+                continue
+            ikey = tok[0]
+            if isinstance(ikey,int):
+                ikey = _ustr(tok[0]).strip()
+            if len(tok)==1:
+                tokenlist[ikey] = _ParseResultsWithOffset("",i)
+            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
+                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
+            else:
+                dictvalue = tok.copy() #ParseResults(i)
+                del dictvalue[0]
+                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()):
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
+                else:
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)
+
+        if self.resultsName:
+            return [ tokenlist ]
+        else:
+            return tokenlist
+
+
+class Suppress(TokenConverter):
+    """
+    Converter for ignoring the results of a parsed expression.
+
+    Example::
+        source = "a, b, c,d"
+        wd = Word(alphas)
+        wd_list1 = wd + ZeroOrMore(',' + wd)
+        print(wd_list1.parseString(source))
+
+        # often, delimiters that are useful during parsing are just in the
+        # way afterward - use Suppress to keep them out of the parsed output
+        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
+        print(wd_list2.parseString(source))
+    prints::
+        ['a', ',', 'b', ',', 'c', ',', 'd']
+        ['a', 'b', 'c', 'd']
+    (See also L{delimitedList}.)
+    """
+    def postParse( self, instring, loc, tokenlist ):
+        return []
+
+    def suppress( self ):
+        return self
+
+
+class OnlyOnce(object):
+    """
+    Wrapper for parse actions, to ensure they are only called once.
+    """
+    def __init__(self, methodCall):
+        self.callable = _trim_arity(methodCall)
+        self.called = False
+    def __call__(self,s,l,t):
+        if not self.called:
+            results = self.callable(s,l,t)
+            self.called = True
+            return results
+        raise ParseException(s,l,"")
+    def reset(self):
+        self.called = False
+
+def traceParseAction(f):
+    """
+    Decorator for debugging parse actions. 
+    
+    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
+    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.
+
+    Example::
+        wd = Word(alphas)
+
+        @traceParseAction
+        def remove_duplicate_chars(tokens):
+            return ''.join(sorted(set(''.join(tokens))))
+
+        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
+        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
+    prints::
+        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
+        <<leaving remove_duplicate_chars (ret: 'dfjkls')
+        ['dfjkls']
+    """
+    f = _trim_arity(f)
+    def z(*paArgs):
+        thisFunc = f.__name__
+        s,l,t = paArgs[-3:]
+        if len(paArgs)>3:
+            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
+        sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) )
+        try:
+            ret = f(*paArgs)
+        except Exception as exc:
+            sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) )
+            raise
+        sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) )
+        return ret
+    try:
+        z.__name__ = f.__name__
+    except AttributeError:
+        pass
+    return z
+
+#
+# global helpers
+#
+def delimitedList( expr, delim=",", combine=False ):
+    """
+    Helper to define a delimited list of expressions - the delimiter defaults to ','.
+    By default, the list elements and delimiters can have intervening whitespace, and
+    comments, but this can be overridden by passing C{combine=True} in the constructor.
+    If C{combine} is set to C{True}, the matching tokens are returned as a single token
+    string, with the delimiters included; otherwise, the matching tokens are returned
+    as a list of tokens, with the delimiters suppressed.
+
+    Example::
+        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
+        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
+    """
+    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
+    if combine:
+        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
+    else:
+        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)
+
+def countedArray( expr, intExpr=None ):
+    """
+    Helper to define a counted list of expressions.
+    This helper defines a pattern of the form::
+        integer expr expr expr...
+    where the leading integer tells how many expr expressions follow.
+    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
+    
+    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.
+
+    Example::
+        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']
+
+        # in this parser, the leading integer value is given in binary,
+        # '10' indicating that 2 values are in the array
+        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
+        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
+    """
+    arrayExpr = Forward()
+    def countFieldParseAction(s,l,t):
+        n = t[0]
+        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
+        return []
+    if intExpr is None:
+        intExpr = Word(nums).setParseAction(lambda t:int(t[0]))
+    else:
+        intExpr = intExpr.copy()
+    intExpr.setName("arrayLen")
+    intExpr.addParseAction(countFieldParseAction, callDuringTry=True)
+    return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...')
+
+def _flatten(L):
+    ret = []
+    for i in L:
+        if isinstance(i,list):
+            ret.extend(_flatten(i))
+        else:
+            ret.append(i)
+    return ret
+
+def matchPreviousLiteral(expr):
+    """
+    Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks
+    for a 'repeat' of a previous expression.  For example::
+        first = Word(nums)
+        second = matchPreviousLiteral(first)
+        matchExpr = first + ":" + second
+    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
+    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
+    If this is not desired, use C{matchPreviousExpr}.
+    Do I{not} use with packrat parsing enabled.
+    """
+    rep = Forward()
+    def copyTokenToRepeater(s,l,t):
+        if t:
+            if len(t) == 1:
+                rep << t[0]
+            else:
+                # flatten t tokens
+                tflat = _flatten(t.asList())
+                rep << And(Literal(tt) for tt in tflat)
+        else:
+            rep << Empty()
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def matchPreviousExpr(expr):
+    """
+    Helper to define an expression that is indirectly defined from
+    the tokens matched in a previous expression, that is, it looks
+    for a 'repeat' of a previous expression.  For example::
+        first = Word(nums)
+        second = matchPreviousExpr(first)
+        matchExpr = first + ":" + second
+    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
+    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
+    the expressions are evaluated first, and then compared, so
+    C{"1"} is compared with C{"10"}.
+    Do I{not} use with packrat parsing enabled.
+    """
+    rep = Forward()
+    e2 = expr.copy()
+    rep <<= e2
+    def copyTokenToRepeater(s,l,t):
+        matchTokens = _flatten(t.asList())
+        def mustMatchTheseTokens(s,l,t):
+            theseTokens = _flatten(t.asList())
+            if  theseTokens != matchTokens:
+                raise ParseException("",0,"")
+        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    rep.setName('(prev) ' + _ustr(expr))
+    return rep
+
+def _escapeRegexRangeChars(s):
+    #~  escape these chars: ^-]
+    for c in r"\^-]":
+        s = s.replace(c,_bslash+c)
+    s = s.replace("\n",r"\n")
+    s = s.replace("\t",r"\t")
+    return _ustr(s)
+
+def oneOf( strs, caseless=False, useRegex=True ):
+    """
+    Helper to quickly define a set of alternative Literals, and makes sure to do
+    longest-first testing when there is a conflict, regardless of the input order,
+    but returns a C{L{MatchFirst}} for best performance.
+
+    Parameters:
+     - strs - a string of space-delimited literals, or a collection of string literals
+     - caseless - (default=C{False}) - treat all literals as caseless
+     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
+          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
+          if creating a C{Regex} raises an exception)
+
+    Example::
+        comp_oper = oneOf("< = > <= >= !=")
+        var = Word(alphas)
+        number = Word(nums)
+        term = var | number
+        comparison_expr = term + comp_oper + term
+        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
+    prints::
+        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
+    """
+    if caseless:
+        isequal = ( lambda a,b: a.upper() == b.upper() )
+        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
+        parseElementClass = CaselessLiteral
+    else:
+        isequal = ( lambda a,b: a == b )
+        masks = ( lambda a,b: b.startswith(a) )
+        parseElementClass = Literal
+
+    symbols = []
+    if isinstance(strs,basestring):
+        symbols = strs.split()
+    elif isinstance(strs, Iterable):
+        symbols = list(strs)
+    else:
+        warnings.warn("Invalid argument to oneOf, expected string or iterable",
+                SyntaxWarning, stacklevel=2)
+    if not symbols:
+        return NoMatch()
+
+    i = 0
+    while i < len(symbols)-1:
+        cur = symbols[i]
+        for j,other in enumerate(symbols[i+1:]):
+            if ( isequal(other, cur) ):
+                del symbols[i+j+1]
+                break
+            elif ( masks(cur, other) ):
+                del symbols[i+j+1]
+                symbols.insert(i,other)
+                cur = other
+                break
+        else:
+            i += 1
+
+    if not caseless and useRegex:
+        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
+        try:
+            if len(symbols)==len("".join(symbols)):
+                return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols))
+            else:
+                return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols))
+        except Exception:
+            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
+                    SyntaxWarning, stacklevel=2)
+
+
+    # last resort, just use MatchFirst
+    return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols))
+
+def dictOf( key, value ):
+    """
+    Helper to easily and clearly define a dictionary by specifying the respective patterns
+    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
+    in the proper order.  The key pattern can include delimiting markers or punctuation,
+    as long as they are suppressed, thereby leaving the significant key text.  The value
+    pattern can include named results, so that the C{Dict} results can include named token
+    fields.
+
+    Example::
+        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
+        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
+        print(OneOrMore(attr_expr).parseString(text).dump())
+        
+        attr_label = label
+        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)
+
+        # similar to Dict, but simpler call format
+        result = dictOf(attr_label, attr_value).parseString(text)
+        print(result.dump())
+        print(result['shape'])
+        print(result.shape)  # object attribute access works too
+        print(result.asDict())
+    prints::
+        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
+        - color: light blue
+        - posn: upper left
+        - shape: SQUARE
+        - texture: burlap
+        SQUARE
+        SQUARE
+        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
+    """
+    return Dict( ZeroOrMore( Group ( key + value ) ) )
+
+def originalTextFor(expr, asString=True):
+    """
+    Helper to return the original, untokenized text for a given expression.  Useful to
+    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
+    revert separate tokens with intervening whitespace back to the original matching
+    input text. By default, returns astring containing the original parsed text.  
+       
+    If the optional C{asString} argument is passed as C{False}, then the return value is a 
+    C{L{ParseResults}} containing any results names that were originally matched, and a 
+    single token containing the original matched text from the input string.  So if 
+    the expression passed to C{L{originalTextFor}} contains expressions with defined
+    results names, you must set C{asString} to C{False} if you want to preserve those
+    results name values.
+
+    Example::
+        src = "this is test <b> bold <i>text</i> </b> normal text "
+        for tag in ("b","i"):
+            opener,closer = makeHTMLTags(tag)
+            patt = originalTextFor(opener + SkipTo(closer) + closer)
+            print(patt.searchString(src)[0])
+    prints::
+        ['<b> bold <i>text</i> </b>']
+        ['<i>text</i>']
+    """
+    locMarker = Empty().setParseAction(lambda s,loc,t: loc)
+    endlocMarker = locMarker.copy()
+    endlocMarker.callPreparse = False
+    matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
+    if asString:
+        extractText = lambda s,l,t: s[t._original_start:t._original_end]
+    else:
+        def extractText(s,l,t):
+            t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]]
+    matchExpr.setParseAction(extractText)
+    matchExpr.ignoreExprs = expr.ignoreExprs
+    return matchExpr
+
+def ungroup(expr): 
+    """
+    Helper to undo pyparsing's default grouping of And expressions, even
+    if all but one are non-empty.
+    """
+    return TokenConverter(expr).setParseAction(lambda t:t[0])
+
+def locatedExpr(expr):
+    """
+    Helper to decorate a returned token with its starting and ending locations in the input string.
+    This helper adds the following results names:
+     - locn_start = location where matched expression begins
+     - locn_end = location where matched expression ends
+     - value = the actual parsed results
+
+    Be careful if the input text contains C{<TAB>} characters, you may want to call
+    C{L{ParserElement.parseWithTabs}}
+
+    Example::
+        wd = Word(alphas)
+        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
+            print(match)
+    prints::
+        [[0, 'ljsdf', 5]]
+        [[8, 'lksdjjf', 15]]
+        [[18, 'lkkjj', 23]]
+    """
+    locator = Empty().setParseAction(lambda s,l,t: l)
+    return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))
+
+
+# convenience constants for positional expressions
+empty       = Empty().setName("empty")
+lineStart   = LineStart().setName("lineStart")
+lineEnd     = LineEnd().setName("lineEnd")
+stringStart = StringStart().setName("stringStart")
+stringEnd   = StringEnd().setName("stringEnd")
+
+_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
+_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16)))
+_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8)))
+_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1)
+_charRange = Group(_singleChar + Suppress("-") + _singleChar)
+_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"
+
+def srange(s):
+    r"""
+    Helper to easily define string ranges for use in Word construction.  Borrows
+    syntax from regexp '[]' string range definitions::
+        srange("[0-9]")   -> "0123456789"
+        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
+        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
+    The input string must be enclosed in []'s, and the returned string is the expanded
+    character set joined into a single string.
+    The values enclosed in the []'s may be:
+     - a single character
+     - an escaped character with a leading backslash (such as C{\-} or C{\]})
+     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
+         (C{\0x##} is also supported for backwards compatibility) 
+     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
+     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
+     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
+    """
+    _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1))
+    try:
+        return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body)
+    except Exception:
+        return ""
+
+def matchOnlyAtCol(n):
+    """
+    Helper method for defining parse actions that require matching at a specific
+    column in the input text.
+    """
+    def verifyCol(strg,locn,toks):
+        if col(locn,strg) != n:
+            raise ParseException(strg,locn,"matched token not at column %d" % n)
+    return verifyCol
+
+def replaceWith(replStr):
+    """
+    Helper method for common parse actions that simply return a literal value.  Especially
+    useful when used with C{L{transformString<ParserElement.transformString>}()}.
+
+    Example::
+        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
+        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
+        term = na | num
+        
+        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
+    """
+    return lambda s,l,t: [replStr]
+
+def removeQuotes(s,l,t):
+    """
+    Helper parse action for removing quotation marks from parsed quoted strings.
+
+    Example::
+        # by default, quotation marks are included in parsed results
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]
+
+        # use removeQuotes to strip quotation marks from parsed results
+        quotedString.setParseAction(removeQuotes)
+        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
+    """
+    return t[0][1:-1]
+
+def tokenMap(func, *args):
+    """
+    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
+    args are passed, they are forwarded to the given function as additional arguments after
+    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
+    parsed data to an integer using base 16.
+
+    Example (compare the last to example in L{ParserElement.transformString}::
+        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
+        hex_ints.runTests('''
+            00 11 22 aa FF 0a 0d 1a
+            ''')
+        
+        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
+        OneOrMore(upperword).runTests('''
+            my kingdom for a horse
+            ''')
+
+        wd = Word(alphas).setParseAction(tokenMap(str.title))
+        OneOrMore(wd).setParseAction(' '.join).runTests('''
+            now is the winter of our discontent made glorious summer by this sun of york
+            ''')
+    prints::
+        00 11 22 aa FF 0a 0d 1a
+        [0, 17, 34, 170, 255, 10, 13, 26]
+
+        my kingdom for a horse
+        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']
+
+        now is the winter of our discontent made glorious summer by this sun of york
+        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
+    """
+    def pa(s,l,t):
+        return [func(tokn, *args) for tokn in t]
+
+    try:
+        func_name = getattr(func, '__name__', 
+                            getattr(func, '__class__').__name__)
+    except Exception:
+        func_name = str(func)
+    pa.__name__ = func_name
+
+    return pa
+
+upcaseTokens = tokenMap(lambda t: _ustr(t).upper())
+"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}"""
+
+downcaseTokens = tokenMap(lambda t: _ustr(t).lower())
+"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}"""
+    
+def _makeTags(tagStr, xml):
+    """Internal helper to construct opening and closing tag expressions, given a tag name"""
+    if isinstance(tagStr,basestring):
+        resname = tagStr
+        tagStr = Keyword(tagStr, caseless=not xml)
+    else:
+        resname = tagStr.name
+
+    tagAttrName = Word(alphas,alphanums+"_-:")
+    if (xml):
+        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
+        openTag = Suppress("<") + tagStr("tag") + \
+                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    else:
+        printablesLessRAbrack = "".join(c for c in printables if c not in ">")
+        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
+        openTag = Suppress("<") + tagStr("tag") + \
+                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
+                Optional( Suppress("=") + tagAttrValue ) ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    closeTag = Combine(_L("</") + tagStr + ">")
+
+    openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname)
+    closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname)
+    openTag.tag = resname
+    closeTag.tag = resname
+    return openTag, closeTag
+
+def makeHTMLTags(tagStr):
+    """
+    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
+    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.
+
+    Example::
+        text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
+        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
+        a,a_end = makeHTMLTags("A")
+        link_expr = a + SkipTo(a_end)("link_text") + a_end
+        
+        for link in link_expr.searchString(text):
+            # attributes in the <A> tag (like "href" shown here) are also accessible as named results
+            print(link.link_text, '->', link.href)
+    prints::
+        pyparsing -> http://pyparsing.wikispaces.com
+    """
+    return _makeTags( tagStr, False )
+
+def makeXMLTags(tagStr):
+    """
+    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
+    tags only in the given upper/lower case.
+
+    Example: similar to L{makeHTMLTags}
+    """
+    return _makeTags( tagStr, True )
+
+def withAttribute(*args,**attrDict):
+    """
+    Helper to create a validating parse action to be used with start tags created
+    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
+    with a required attribute value, to avoid false matches on common tags such as
+    C{<TD>} or C{<DIV>}.
+
+    Call C{withAttribute} with a series of attribute names and values. Specify the list
+    of filter attributes names and values as:
+     - keyword arguments, as in C{(align="right")}, or
+     - as an explicit dict with C{**} operator, when an attribute name is also a Python
+          reserved word, as in C{**{"class":"Customer", "align":"right"}}
+     - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
+    For attribute names with a namespace prefix, you must use the second form.  Attribute
+    names are matched insensitive to upper/lower case.
+       
+    If just testing for C{class} (with or without a namespace), use C{L{withClass}}.
+
+    To verify that the attribute exists, but without specifying a value, pass
+    C{withAttribute.ANY_VALUE} as the value.
+
+    Example::
+        html = '''
+            <div>
+            Some text
+            <div type="grid">1 4 0 1 0</div>
+            <div type="graph">1,3 2,3 1,1</div>
+            <div>this has no type</div>
+            </div>
+                
+        '''
+        div,div_end = makeHTMLTags("div")
+
+        # only match div tag having a type attribute with value "grid"
+        div_grid = div().setParseAction(withAttribute(type="grid"))
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+        
+        # construct a match with any div tag having a type attribute, regardless of the value
+        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+    prints::
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    if args:
+        attrs = args[:]
+    else:
+        attrs = attrDict.items()
+    attrs = [(k,v) for k,v in attrs]
+    def pa(s,l,tokens):
+        for attrName,attrValue in attrs:
+            if attrName not in tokens:
+                raise ParseException(s,l,"no matching attribute " + attrName)
+            if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue:
+                raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" %
+                                            (attrName, tokens[attrName], attrValue))
+    return pa
+withAttribute.ANY_VALUE = object()
+
+def withClass(classname, namespace=''):
+    """
+    Simplified version of C{L{withAttribute}} when matching on a div class - made
+    difficult because C{class} is a reserved word in Python.
+
+    Example::
+        html = '''
+            <div>
+            Some text
+            <div class="grid">1 4 0 1 0</div>
+            <div class="graph">1,3 2,3 1,1</div>
+            <div>this &lt;div&gt; has no class</div>
+            </div>
+                
+        '''
+        div,div_end = makeHTMLTags("div")
+        div_grid = div().setParseAction(withClass("grid"))
+        
+        grid_expr = div_grid + SkipTo(div | div_end)("body")
+        for grid_header in grid_expr.searchString(html):
+            print(grid_header.body)
+        
+        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
+        div_expr = div_any_type + SkipTo(div | div_end)("body")
+        for div_header in div_expr.searchString(html):
+            print(div_header.body)
+    prints::
+        1 4 0 1 0
+
+        1 4 0 1 0
+        1,3 2,3 1,1
+    """
+    classattr = "%s:class" % namespace if namespace else "class"
+    return withAttribute(**{classattr : classname})        
+
+opAssoc = _Constants()
+opAssoc.LEFT = object()
+opAssoc.RIGHT = object()
+
+def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ):
+    """
+    Helper method for constructing grammars of expressions made up of
+    operators working in a precedence hierarchy.  Operators may be unary or
+    binary, left- or right-associative.  Parse actions can also be attached
+    to operator expressions. The generated parser will also recognize the use 
+    of parentheses to override operator precedences (see example below).
+    
+    Note: if you define a deep operator list, you may see performance issues
+    when using infixNotation. See L{ParserElement.enablePackrat} for a
+    mechanism to potentially improve your parser performance.
+
+    Parameters:
+     - baseExpr - expression representing the most basic element for the nested
+     - opList - list of tuples, one for each operator precedence level in the
+      expression grammar; each tuple is of the form
+      (opExpr, numTerms, rightLeftAssoc, parseAction), where:
+       - opExpr is the pyparsing expression for the operator;
+          may also be a string, which will be converted to a Literal;
+          if numTerms is 3, opExpr is a tuple of two expressions, for the
+          two operators separating the 3 terms
+       - numTerms is the number of terms for this operator (must
+          be 1, 2, or 3)
+       - rightLeftAssoc is the indicator whether the operator is
+          right or left associative, using the pyparsing-defined
+          constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}.
+       - parseAction is the parse action to be associated with
+          expressions matching this operator expression (the
+          parse action tuple member may be omitted); if the parse action
+          is passed a tuple or list of functions, this is equivalent to
+          calling C{setParseAction(*fn)} (L{ParserElement.setParseAction})
+     - lpar - expression for matching left-parentheses (default=C{Suppress('(')})
+     - rpar - expression for matching right-parentheses (default=C{Suppress(')')})
+
+    Example::
+        # simple example of four-function arithmetic with ints and variable names
+        integer = pyparsing_common.signed_integer
+        varname = pyparsing_common.identifier 
+        
+        arith_expr = infixNotation(integer | varname,
+            [
+            ('-', 1, opAssoc.RIGHT),
+            (oneOf('* /'), 2, opAssoc.LEFT),
+            (oneOf('+ -'), 2, opAssoc.LEFT),
+            ])
+        
+        arith_expr.runTests('''
+            5+3*6
+            (5+3)*6
+            -2--11
+            ''', fullDump=False)
+    prints::
+        5+3*6
+        [[5, '+', [3, '*', 6]]]
+
+        (5+3)*6
+        [[[5, '+', 3], '*', 6]]
+
+        -2--11
+        [[['-', 2], '-', ['-', 11]]]
+    """
+    ret = Forward()
+    lastExpr = baseExpr | ( lpar + ret + rpar )
+    for i,operDef in enumerate(opList):
+        opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4]
+        termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr
+        if arity == 3:
+            if opExpr is None or len(opExpr) != 2:
+                raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions")
+            opExpr1, opExpr2 = opExpr
+        thisExpr = Forward().setName(termName)
+        if rightLeftAssoc == opAssoc.LEFT:
+            if arity == 1:
+                matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \
+                            Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        elif rightLeftAssoc == opAssoc.RIGHT:
+            if arity == 1:
+                # try to avoid LR with this extra test
+                if not isinstance(opExpr, Optional):
+                    opExpr = Optional(opExpr)
+                matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \
+                            Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        else:
+            raise ValueError("operator must indicate right or left associativity")
+        if pa:
+            if isinstance(pa, (tuple, list)):
+                matchExpr.setParseAction(*pa)
+            else:
+                matchExpr.setParseAction(pa)
+        thisExpr <<= ( matchExpr.setName(termName) | lastExpr )
+        lastExpr = thisExpr
+    ret <<= lastExpr
+    return ret
+
+operatorPrecedence = infixNotation
+"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release."""
+
+dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes")
+sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes")
+quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'|
+                       Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes")
+unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal")
+
+def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
+    """
+    Helper method for defining nested lists enclosed in opening and closing
+    delimiters ("(" and ")" are the default).
+
+    Parameters:
+     - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression
+     - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression
+     - content - expression for items within the nested lists (default=C{None})
+     - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString})
+
+    If an expression is not provided for the content argument, the nested
+    expression will capture all whitespace-delimited content between delimiters
+    as a list of separate values.
+
+    Use the C{ignoreExpr} argument to define expressions that may contain
+    opening or closing characters that should not be treated as opening
+    or closing characters for nesting, such as quotedString or a comment
+    expression.  Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}.
+    The default is L{quotedString}, but if no expressions are to be ignored,
+    then pass C{None} for this argument.
+
+    Example::
+        data_type = oneOf("void int short long char float double")
+        decl_data_type = Combine(data_type + Optional(Word('*')))
+        ident = Word(alphas+'_', alphanums+'_')
+        number = pyparsing_common.number
+        arg = Group(decl_data_type + ident)
+        LPAR,RPAR = map(Suppress, "()")
+
+        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))
+
+        c_function = (decl_data_type("type") 
+                      + ident("name")
+                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR 
+                      + code_body("body"))
+        c_function.ignore(cStyleComment)
+        
+        source_code = '''
+            int is_odd(int x) { 
+                return (x%2); 
+            }
+                
+            int dec_to_hex(char hchar) { 
+                if (hchar >= '0' && hchar <= '9') { 
+                    return (ord(hchar)-ord('0')); 
+                } else { 
+                    return (10+ord(hchar)-ord('A'));
+                } 
+            }
+        '''
+        for func in c_function.searchString(source_code):
+            print("%(name)s (%(type)s) args: %(args)s" % func)
+
+    prints::
+        is_odd (int) args: [['int', 'x']]
+        dec_to_hex (int) args: [['char', 'hchar']]
+    """
+    if opener == closer:
+        raise ValueError("opening and closing strings cannot be the same")
+    if content is None:
+        if isinstance(opener,basestring) and isinstance(closer,basestring):
+            if len(opener) == 1 and len(closer)==1:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr +
+                                    CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS
+                                ).setParseAction(lambda t:t[0].strip()))
+            else:
+                if ignoreExpr is not None:
+                    content = (Combine(OneOrMore(~ignoreExpr + 
+                                    ~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+                else:
+                    content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) +
+                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                                ).setParseAction(lambda t:t[0].strip()))
+        else:
+            raise ValueError("opening and closing arguments must be strings if no content expression is given")
+    ret = Forward()
+    if ignoreExpr is not None:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) )
+    else:
+        ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content )  + Suppress(closer) )
+    ret.setName('nested %s%s expression' % (opener,closer))
+    return ret
+
+def indentedBlock(blockStatementExpr, indentStack, indent=True):
+    """
+    Helper method for defining space-delimited indentation blocks, such as
+    those used to define block statements in Python source code.
+
+    Parameters:
+     - blockStatementExpr - expression defining syntax of statement that
+            is repeated within the indented block
+     - indentStack - list created by caller to manage indentation stack
+            (multiple statementWithIndentedBlock expressions within a single grammar
+            should share a common indentStack)
+     - indent - boolean indicating whether block must be indented beyond the
+            the current level; set to False for block of left-most statements
+            (default=C{True})
+
+    A valid block must contain at least one C{blockStatement}.
+
+    Example::
+        data = '''
+        def A(z):
+          A1
+          B = 100
+          G = A2
+          A2
+          A3
+        B
+        def BB(a,b,c):
+          BB1
+          def BBA():
+            bba1
+            bba2
+            bba3
+        C
+        D
+        def spam(x,y):
+             def eggs(z):
+                 pass
+        '''
+
+
+        indentStack = [1]
+        stmt = Forward()
+
+        identifier = Word(alphas, alphanums)
+        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
+        func_body = indentedBlock(stmt, indentStack)
+        funcDef = Group( funcDecl + func_body )
+
+        rvalue = Forward()
+        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
+        rvalue << (funcCall | identifier | Word(nums))
+        assignment = Group(identifier + "=" + rvalue)
+        stmt << ( funcDef | assignment | identifier )
+
+        module_body = OneOrMore(stmt)
+
+        parseTree = module_body.parseString(data)
+        parseTree.pprint()
+    prints::
+        [['def',
+          'A',
+          ['(', 'z', ')'],
+          ':',
+          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
+         'B',
+         ['def',
+          'BB',
+          ['(', 'a', 'b', 'c', ')'],
+          ':',
+          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
+         'C',
+         'D',
+         ['def',
+          'spam',
+          ['(', 'x', 'y', ')'],
+          ':',
+          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] 
+    """
+    def checkPeerIndent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if curCol != indentStack[-1]:
+            if curCol > indentStack[-1]:
+                raise ParseFatalException(s,l,"illegal nesting")
+            raise ParseException(s,l,"not a peer entry")
+
+    def checkSubIndent(s,l,t):
+        curCol = col(l,s)
+        if curCol > indentStack[-1]:
+            indentStack.append( curCol )
+        else:
+            raise ParseException(s,l,"not a subentry")
+
+    def checkUnindent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]):
+            raise ParseException(s,l,"not an unindent")
+        indentStack.pop()
+
+    NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress())
+    INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT')
+    PEER   = Empty().setParseAction(checkPeerIndent).setName('')
+    UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT')
+    if indent:
+        smExpr = Group( Optional(NL) +
+            #~ FollowedBy(blockStatementExpr) +
+            INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT)
+    else:
+        smExpr = Group( Optional(NL) +
+            (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) )
+    blockStatementExpr.ignore(_bslash + LineEnd())
+    return smExpr.setName('indented block')
+
+alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
+punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")
+
+anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag'))
+_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\''))
+commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity")
+def replaceHTMLEntity(t):
+    """Helper parser action to replace common HTML entities with their special characters"""
+    return _htmlEntityMap.get(t.entity)
+
+# it's easy to get these comment structures wrong - they're very common, so may as well make them available
+cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment")
+"Comment of the form C{/* ... */}"
+
+htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment")
+"Comment of the form C{<!-- ... -->}"
+
+restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line")
+dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment")
+"Comment of the form C{// ... (to end of line)}"
+
+cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment")
+"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}"
+
+javaStyleComment = cppStyleComment
+"Same as C{L{cppStyleComment}}"
+
+pythonStyleComment = Regex(r"#.*").setName("Python style comment")
+"Comment of the form C{# ... (to end of line)}"
+
+_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') +
+                                  Optional( Word(" \t") +
+                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
+commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList")
+"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas.
+   This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}."""
+
+# some other useful expressions - using lower-case class name since we are really using this as a namespace
+class pyparsing_common:
+    """
+    Here are some common low-level expressions that may be useful in jump-starting parser development:
+     - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>})
+     - common L{programming identifiers<identifier>}
+     - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>})
+     - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>}
+     - L{UUID<uuid>}
+     - L{comma-separated list<comma_separated_list>}
+    Parse actions:
+     - C{L{convertToInteger}}
+     - C{L{convertToFloat}}
+     - C{L{convertToDate}}
+     - C{L{convertToDatetime}}
+     - C{L{stripHTMLTags}}
+     - C{L{upcaseTokens}}
+     - C{L{downcaseTokens}}
+
+    Example::
+        pyparsing_common.number.runTests('''
+            # any int or real number, returned as the appropriate type
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.fnumber.runTests('''
+            # any int or real number, returned as float
+            100
+            -100
+            +100
+            3.14159
+            6.02e23
+            1e-12
+            ''')
+
+        pyparsing_common.hex_integer.runTests('''
+            # hex numbers
+            100
+            FF
+            ''')
+
+        pyparsing_common.fraction.runTests('''
+            # fractions
+            1/2
+            -3/4
+            ''')
+
+        pyparsing_common.mixed_integer.runTests('''
+            # mixed fractions
+            1
+            1/2
+            -3/4
+            1-3/4
+            ''')
+
+        import uuid
+        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+        pyparsing_common.uuid.runTests('''
+            # uuid
+            12345678-1234-5678-1234-567812345678
+            ''')
+    prints::
+        # any int or real number, returned as the appropriate type
+        100
+        [100]
+
+        -100
+        [-100]
+
+        +100
+        [100]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # any int or real number, returned as float
+        100
+        [100.0]
+
+        -100
+        [-100.0]
+
+        +100
+        [100.0]
+
+        3.14159
+        [3.14159]
+
+        6.02e23
+        [6.02e+23]
+
+        1e-12
+        [1e-12]
+
+        # hex numbers
+        100
+        [256]
+
+        FF
+        [255]
+
+        # fractions
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        # mixed fractions
+        1
+        [1]
+
+        1/2
+        [0.5]
+
+        -3/4
+        [-0.75]
+
+        1-3/4
+        [1.75]
+
+        # uuid
+        12345678-1234-5678-1234-567812345678
+        [UUID('12345678-1234-5678-1234-567812345678')]
+    """
+
+    convertToInteger = tokenMap(int)
+    """
+    Parse action for converting parsed integers to Python int
+    """
+
+    convertToFloat = tokenMap(float)
+    """
+    Parse action for converting parsed numbers to Python float
+    """
+
+    integer = Word(nums).setName("integer").setParseAction(convertToInteger)
+    """expression that parses an unsigned integer, returns an int"""
+
+    hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16))
+    """expression that parses a hexadecimal integer, returns an int"""
+
+    signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger)
+    """expression that parses an integer with optional leading sign, returns an int"""
+
+    fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction")
+    """fractional expression of an integer divided by an integer, returns a float"""
+    fraction.addParseAction(lambda t: t[0]/t[-1])
+
+    mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction")
+    """mixed integer of the form 'integer - fraction', with optional leading integer, returns float"""
+    mixed_integer.addParseAction(sum)
+
+    real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat)
+    """expression that parses a floating point number and returns a float"""
+
+    sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat)
+    """expression that parses a floating point number with optional scientific notation and returns a float"""
+
+    # streamlining this expression makes the docs nicer-looking
+    number = (sci_real | real | signed_integer).streamline()
+    """any numeric expression, returns the corresponding Python type"""
+
+    fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat)
+    """any int or real number, returned as float"""
+    
+    identifier = Word(alphas+'_', alphanums+'_').setName("identifier")
+    """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')"""
+    
+    ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address")
+    "IPv4 address (C{0.0.0.0 - 255.255.255.255})"
+
+    _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer")
+    _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address")
+    _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address")
+    _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8)
+    _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address")
+    ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address")
+    "IPv6 address (long, short, or mixed form)"
+    
+    mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address")
+    "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)"
+
+    @staticmethod
+    def convertToDate(fmt="%Y-%m-%d"):
+        """
+        Helper to create a parse action for converting parsed date string to Python datetime.date
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"})
+
+        Example::
+            date_expr = pyparsing_common.iso8601_date.copy()
+            date_expr.setParseAction(pyparsing_common.convertToDate())
+            print(date_expr.parseString("1999-12-31"))
+        prints::
+            [datetime.date(1999, 12, 31)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt).date()
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    @staticmethod
+    def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"):
+        """
+        Helper to create a parse action for converting parsed datetime string to Python datetime.datetime
+
+        Params -
+         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"})
+
+        Example::
+            dt_expr = pyparsing_common.iso8601_datetime.copy()
+            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
+            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
+        prints::
+            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
+        """
+        def cvt_fn(s,l,t):
+            try:
+                return datetime.strptime(t[0], fmt)
+            except ValueError as ve:
+                raise ParseException(s, l, str(ve))
+        return cvt_fn
+
+    iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date")
+    "ISO8601 date (C{yyyy-mm-dd})"
+
+    iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime")
+    "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}"
+
+    uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID")
+    "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})"
+
+    _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress()
+    @staticmethod
+    def stripHTMLTags(s, l, tokens):
+        """
+        Parse action to remove HTML tags from web page HTML source
+
+        Example::
+            # strip HTML links from normal text 
+            text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
+            td,td_end = makeHTMLTags("TD")
+            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
+            
+            print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page'
+        """
+        return pyparsing_common._html_stripper.transformString(tokens[0])
+
+    _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') 
+                                        + Optional( White(" \t") ) ) ).streamline().setName("commaItem")
+    comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list")
+    """Predefined expression of 1 or more printable words or quoted strings, separated by commas."""
+
+    upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper()))
+    """Parse action to convert tokens to upper case."""
+
+    downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower()))
+    """Parse action to convert tokens to lower case."""
+
+
+if __name__ == "__main__":
+
+    selectToken    = CaselessLiteral("select")
+    fromToken      = CaselessLiteral("from")
+
+    ident          = Word(alphas, alphanums + "_$")
+
+    columnName     = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    columnNameList = Group(delimitedList(columnName)).setName("columns")
+    columnSpec     = ('*' | columnNameList)
+
+    tableName      = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
+    tableNameList  = Group(delimitedList(tableName)).setName("tables")
+    
+    simpleSQL      = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables")
+
+    # demo runTests method, including embedded comments in test string
+    simpleSQL.runTests("""
+        # '*' as column list and dotted table name
+        select * from SYS.XYZZY
+
+        # caseless match on "SELECT", and casts back to "select"
+        SELECT * from XYZZY, ABC
+
+        # list of column names, and mixed case SELECT keyword
+        Select AA,BB,CC from Sys.dual
+
+        # multiple tables
+        Select A, B, C from Sys.dual, Table2
+
+        # invalid SELECT keyword - should fail
+        Xelect A, B, C from Sys.dual
+
+        # incomplete command - should fail
+        Select
+
+        # invalid column name - should fail
+        Select ^^^ frox Sys.dual
+
+        """)
+
+    pyparsing_common.number.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    # any int or real number, returned as float
+    pyparsing_common.fnumber.runTests("""
+        100
+        -100
+        +100
+        3.14159
+        6.02e23
+        1e-12
+        """)
+
+    pyparsing_common.hex_integer.runTests("""
+        100
+        FF
+        """)
+
+    import uuid
+    pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
+    pyparsing_common.uuid.runTests("""
+        12345678-1234-5678-1234-567812345678
+        """)
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b60adc48163d304637ece6e2abafa183d1f899a8
GIT binary patch
literal 258913
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/six.py b/venv/lib/python2.7/site-packages/setuptools/_vendor/six.py
new file mode 100644
index 00000000..190c0239
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/_vendor/six.py
@@ -0,0 +1,868 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2015 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.10.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    def create_unbound_method(func, cls):
+        return func
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
+else:
+    def iterkeys(d, **kw):
+        return d.iterkeys(**kw)
+
+    def itervalues(d, **kw):
+        return d.itervalues(**kw)
+
+    def iteritems(d, **kw):
+        return d.iteritems(**kw)
+
+    def iterlists(d, **kw):
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+
+    def u(s):
+        return s
+    unichr = chr
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+
+    def byte2int(bs):
+        return ord(bs[0])
+
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    iterbytes = functools.partial(itertools.imap, ord)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped, assigned, updated)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+    """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):
+
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+                importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc b/venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7b9b279fad0df017a2177eb3c152bb7f1f59f1a5
GIT binary patch
literal 35865
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/archive_util.py b/venv/lib/python2.7/site-packages/setuptools/archive_util.py
new file mode 100644
index 00000000..81436044
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/archive_util.py
@@ -0,0 +1,173 @@
+"""Utilities for extracting common archive formats"""
+
+import zipfile
+import tarfile
+import os
+import shutil
+import posixpath
+import contextlib
+from distutils.errors import DistutilsError
+
+from pkg_resources import ensure_directory
+
+__all__ = [
+    "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter",
+    "UnrecognizedFormat", "extraction_drivers", "unpack_directory",
+]
+
+
+class UnrecognizedFormat(DistutilsError):
+    """Couldn't recognize the archive type"""
+
+
+def default_filter(src, dst):
+    """The default progress/filter callback; returns True for all files"""
+    return dst
+
+
+def unpack_archive(filename, extract_dir, progress_filter=default_filter,
+        drivers=None):
+    """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``
+
+    `progress_filter` is a function taking two arguments: a source path
+    internal to the archive ('/'-separated), and a filesystem path where it
+    will be extracted.  The callback must return the desired extract path
+    (which may be the same as the one passed in), or else ``None`` to skip
+    that file or directory.  The callback can thus be used to report on the
+    progress of the extraction, as well as to filter the items extracted or
+    alter their extraction paths.
+
+    `drivers`, if supplied, must be a non-empty sequence of functions with the
+    same signature as this function (minus the `drivers` argument), that raise
+    ``UnrecognizedFormat`` if they do not support extracting the designated
+    archive type.  The `drivers` are tried in sequence until one is found that
+    does not raise an error, or until all are exhausted (in which case
+    ``UnrecognizedFormat`` is raised).  If you do not supply a sequence of
+    drivers, the module's ``extraction_drivers`` constant will be used, which
+    means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that
+    order.
+    """
+    for driver in drivers or extraction_drivers:
+        try:
+            driver(filename, extract_dir, progress_filter)
+        except UnrecognizedFormat:
+            continue
+        else:
+            return
+    else:
+        raise UnrecognizedFormat(
+            "Not a recognized archive type: %s" % filename
+        )
+
+
+def unpack_directory(filename, extract_dir, progress_filter=default_filter):
+    """"Unpack" a directory, using the same interface as for archives
+
+    Raises ``UnrecognizedFormat`` if `filename` is not a directory
+    """
+    if not os.path.isdir(filename):
+        raise UnrecognizedFormat("%s is not a directory" % filename)
+
+    paths = {
+        filename: ('', extract_dir),
+    }
+    for base, dirs, files in os.walk(filename):
+        src, dst = paths[base]
+        for d in dirs:
+            paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d)
+        for f in files:
+            target = os.path.join(dst, f)
+            target = progress_filter(src + f, target)
+            if not target:
+                # skip non-files
+                continue
+            ensure_directory(target)
+            f = os.path.join(base, f)
+            shutil.copyfile(f, target)
+            shutil.copystat(f, target)
+
+
+def unpack_zipfile(filename, extract_dir, progress_filter=default_filter):
+    """Unpack zip `filename` to `extract_dir`
+
+    Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
+    by ``zipfile.is_zipfile()``).  See ``unpack_archive()`` for an explanation
+    of the `progress_filter` argument.
+    """
+
+    if not zipfile.is_zipfile(filename):
+        raise UnrecognizedFormat("%s is not a zip file" % (filename,))
+
+    with zipfile.ZipFile(filename) as z:
+        for info in z.infolist():
+            name = info.filename
+
+            # don't extract absolute paths or ones with .. in them
+            if name.startswith('/') or '..' in name.split('/'):
+                continue
+
+            target = os.path.join(extract_dir, *name.split('/'))
+            target = progress_filter(name, target)
+            if not target:
+                continue
+            if name.endswith('/'):
+                # directory
+                ensure_directory(target)
+            else:
+                # file
+                ensure_directory(target)
+                data = z.read(info.filename)
+                with open(target, 'wb') as f:
+                    f.write(data)
+            unix_attributes = info.external_attr >> 16
+            if unix_attributes:
+                os.chmod(target, unix_attributes)
+
+
+def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
+    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
+
+    Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
+    by ``tarfile.open()``).  See ``unpack_archive()`` for an explanation
+    of the `progress_filter` argument.
+    """
+    try:
+        tarobj = tarfile.open(filename)
+    except tarfile.TarError:
+        raise UnrecognizedFormat(
+            "%s is not a compressed or uncompressed tar file" % (filename,)
+        )
+    with contextlib.closing(tarobj):
+        # don't do any chowning!
+        tarobj.chown = lambda *args: None
+        for member in tarobj:
+            name = member.name
+            # don't extract absolute paths or ones with .. in them
+            if not name.startswith('/') and '..' not in name.split('/'):
+                prelim_dst = os.path.join(extract_dir, *name.split('/'))
+
+                # resolve any links and to extract the link targets as normal
+                # files
+                while member is not None and (member.islnk() or member.issym()):
+                    linkpath = member.linkname
+                    if member.issym():
+                        base = posixpath.dirname(member.name)
+                        linkpath = posixpath.join(base, linkpath)
+                        linkpath = posixpath.normpath(linkpath)
+                    member = tarobj._getmember(linkpath)
+
+                if member is not None and (member.isfile() or member.isdir()):
+                    final_dst = progress_filter(name, prelim_dst)
+                    if final_dst:
+                        if final_dst.endswith(os.sep):
+                            final_dst = final_dst[:-1]
+                        try:
+                            # XXX Ugh
+                            tarobj._extract_member(member, final_dst)
+                        except tarfile.ExtractError:
+                            # chown/chmod/mkfifo/mknode/makedev failed
+                            pass
+        return True
+
+
+extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile
diff --git a/venv/lib/python2.7/site-packages/setuptools/archive_util.pyc b/venv/lib/python2.7/site-packages/setuptools/archive_util.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..74d3782957329b6ece3f7b493a955ddd1340ddee
GIT binary patch
literal 6574
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/build_meta.py b/venv/lib/python2.7/site-packages/setuptools/build_meta.py
new file mode 100644
index 00000000..e40904a5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/build_meta.py
@@ -0,0 +1,254 @@
+"""A PEP 517 interface to setuptools
+
+Previously, when a user or a command line tool (let's call it a "frontend")
+needed to make a request of setuptools to take a certain action, for
+example, generating a list of installation requirements, the frontend would
+would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line.
+
+PEP 517 defines a different method of interfacing with setuptools. Rather
+than calling "setup.py" directly, the frontend should:
+
+  1. Set the current directory to the directory with a setup.py file
+  2. Import this module into a safe python interpreter (one in which
+     setuptools can potentially set global variables or crash hard).
+  3. Call one of the functions defined in PEP 517.
+
+What each function does is defined in PEP 517. However, here is a "casual"
+definition of the functions (this definition should not be relied on for
+bug reports or API stability):
+
+  - `build_wheel`: build a wheel in the folder and return the basename
+  - `get_requires_for_build_wheel`: get the `setup_requires` to build
+  - `prepare_metadata_for_build_wheel`: get the `install_requires`
+  - `build_sdist`: build an sdist in the folder and return the basename
+  - `get_requires_for_build_sdist`: get the `setup_requires` to build
+
+Again, this is not a formal definition! Just a "taste" of the module.
+"""
+
+import io
+import os
+import sys
+import tokenize
+import shutil
+import contextlib
+
+import setuptools
+import distutils
+from setuptools.py31compat import TemporaryDirectory
+
+from pkg_resources import parse_requirements
+
+__all__ = ['get_requires_for_build_sdist',
+           'get_requires_for_build_wheel',
+           'prepare_metadata_for_build_wheel',
+           'build_wheel',
+           'build_sdist',
+           '__legacy__',
+           'SetupRequirementsError']
+
+class SetupRequirementsError(BaseException):
+    def __init__(self, specifiers):
+        self.specifiers = specifiers
+
+
+class Distribution(setuptools.dist.Distribution):
+    def fetch_build_eggs(self, specifiers):
+        specifier_list = list(map(str, parse_requirements(specifiers)))
+
+        raise SetupRequirementsError(specifier_list)
+
+    @classmethod
+    @contextlib.contextmanager
+    def patch(cls):
+        """
+        Replace
+        distutils.dist.Distribution with this class
+        for the duration of this context.
+        """
+        orig = distutils.core.Distribution
+        distutils.core.Distribution = cls
+        try:
+            yield
+        finally:
+            distutils.core.Distribution = orig
+
+
+def _to_str(s):
+    """
+    Convert a filename to a string (on Python 2, explicitly
+    a byte string, not Unicode) as distutils checks for the
+    exact type str.
+    """
+    if sys.version_info[0] == 2 and not isinstance(s, str):
+        # Assume it's Unicode, as that's what the PEP says
+        # should be provided.
+        return s.encode(sys.getfilesystemencoding())
+    return s
+
+
+def _get_immediate_subdirectories(a_dir):
+    return [name for name in os.listdir(a_dir)
+            if os.path.isdir(os.path.join(a_dir, name))]
+
+
+def _file_with_extension(directory, extension):
+    matching = (
+        f for f in os.listdir(directory)
+        if f.endswith(extension)
+    )
+    file, = matching
+    return file
+
+
+def _open_setup_script(setup_script):
+    if not os.path.exists(setup_script):
+        # Supply a default setup.py
+        return io.StringIO(u"from setuptools import setup; setup()")
+
+    return getattr(tokenize, 'open', open)(setup_script)
+
+
+class _BuildMetaBackend(object):
+
+    def _fix_config(self, config_settings):
+        config_settings = config_settings or {}
+        config_settings.setdefault('--global-option', [])
+        return config_settings
+
+    def _get_build_requires(self, config_settings, requirements):
+        config_settings = self._fix_config(config_settings)
+
+        sys.argv = sys.argv[:1] + ['egg_info'] + \
+            config_settings["--global-option"]
+        try:
+            with Distribution.patch():
+                self.run_setup()
+        except SetupRequirementsError as e:
+            requirements += e.specifiers
+
+        return requirements
+
+    def run_setup(self, setup_script='setup.py'):
+        # Note that we can reuse our build directory between calls
+        # Correctness comes first, then optimization later
+        __file__ = setup_script
+        __name__ = '__main__'
+
+        with _open_setup_script(__file__) as f:
+            code = f.read().replace(r'\r\n', r'\n')
+
+        exec(compile(code, __file__, 'exec'), locals())
+
+    def get_requires_for_build_wheel(self, config_settings=None):
+        config_settings = self._fix_config(config_settings)
+        return self._get_build_requires(config_settings, requirements=['wheel'])
+
+    def get_requires_for_build_sdist(self, config_settings=None):
+        config_settings = self._fix_config(config_settings)
+        return self._get_build_requires(config_settings, requirements=[])
+
+    def prepare_metadata_for_build_wheel(self, metadata_directory,
+                                         config_settings=None):
+        sys.argv = sys.argv[:1] + ['dist_info', '--egg-base',
+                                   _to_str(metadata_directory)]
+        self.run_setup()
+
+        dist_info_directory = metadata_directory
+        while True:
+            dist_infos = [f for f in os.listdir(dist_info_directory)
+                          if f.endswith('.dist-info')]
+
+            if (len(dist_infos) == 0 and
+                len(_get_immediate_subdirectories(dist_info_directory)) == 1):
+
+                dist_info_directory = os.path.join(
+                    dist_info_directory, os.listdir(dist_info_directory)[0])
+                continue
+
+            assert len(dist_infos) == 1
+            break
+
+        # PEP 517 requires that the .dist-info directory be placed in the
+        # metadata_directory. To comply, we MUST copy the directory to the root
+        if dist_info_directory != metadata_directory:
+            shutil.move(
+                os.path.join(dist_info_directory, dist_infos[0]),
+                metadata_directory)
+            shutil.rmtree(dist_info_directory, ignore_errors=True)
+
+        return dist_infos[0]
+
+    def build_wheel(self, wheel_directory, config_settings=None,
+                    metadata_directory=None):
+        config_settings = self._fix_config(config_settings)
+        wheel_directory = os.path.abspath(wheel_directory)
+
+        # Build the wheel in a temporary directory, then copy to the target
+        with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir:
+            sys.argv = (sys.argv[:1] +
+                        ['bdist_wheel', '--dist-dir', tmp_dist_dir] +
+                        config_settings["--global-option"])
+            self.run_setup()
+
+            wheel_basename = _file_with_extension(tmp_dist_dir, '.whl')
+            wheel_path = os.path.join(wheel_directory, wheel_basename)
+            if os.path.exists(wheel_path):
+                # os.rename will fail overwriting on non-unix env
+                os.remove(wheel_path)
+            os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path)
+
+        return wheel_basename
+
+    def build_sdist(self, sdist_directory, config_settings=None):
+        config_settings = self._fix_config(config_settings)
+        sdist_directory = os.path.abspath(sdist_directory)
+        sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \
+            config_settings["--global-option"] + \
+            ["--dist-dir", sdist_directory]
+        self.run_setup()
+
+        return _file_with_extension(sdist_directory, '.tar.gz')
+
+
+class _BuildMetaLegacyBackend(_BuildMetaBackend):
+    """Compatibility backend for setuptools
+
+    This is a version of setuptools.build_meta that endeavors to maintain backwards
+    compatibility with pre-PEP 517 modes of invocation. It exists as a temporary
+    bridge between the old packaging mechanism and the new packaging mechanism,
+    and will eventually be removed.
+    """
+    def run_setup(self, setup_script='setup.py'):
+        # In order to maintain compatibility with scripts assuming that
+        # the setup.py script is in a directory on the PYTHONPATH, inject
+        # '' into sys.path. (pypa/setuptools#1642)
+        sys_path = list(sys.path)           # Save the original path
+
+        script_dir = os.path.dirname(os.path.abspath(setup_script))
+        if script_dir not in sys.path:
+            sys.path.insert(0, script_dir)
+
+        try:
+            super(_BuildMetaLegacyBackend,
+                  self).run_setup(setup_script=setup_script)
+        finally:
+            # While PEP 517 frontends should be calling each hook in a fresh
+            # subprocess according to the standard (and thus it should not be
+            # strictly necessary to restore the old sys.path), we'll restore
+            # the original path so that the path manipulation does not persist
+            # within the hook after run_setup is called.
+            sys.path[:] = sys_path
+
+# The primary backend
+_BACKEND = _BuildMetaBackend()
+
+get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel
+get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist
+prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel
+build_wheel = _BACKEND.build_wheel
+build_sdist = _BACKEND.build_sdist
+
+
+# The legacy backend
+__legacy__ = _BuildMetaLegacyBackend()
diff --git a/venv/lib/python2.7/site-packages/setuptools/build_meta.pyc b/venv/lib/python2.7/site-packages/setuptools/build_meta.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b460a4f906887916480f1727a7266681d374af48
GIT binary patch
literal 10676
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/cli-32.exe b/venv/lib/python2.7/site-packages/setuptools/cli-32.exe
new file mode 100644
index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083
GIT binary patch
literal 65536
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
Wd~sli`QpG3^2GskkPu7?OalPivUv{x

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/cli-64.exe b/venv/lib/python2.7/site-packages/setuptools/cli-64.exe
new file mode 100644
index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f
GIT binary patch
literal 74752
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%0DUkH(*X
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/cli.exe b/venv/lib/python2.7/site-packages/setuptools/cli.exe
new file mode 100644
index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083
GIT binary patch
literal 65536
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
Wd~sli`QpG3^2GskkPu7?OalPivUv{x

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/__init__.py b/venv/lib/python2.7/site-packages/setuptools/command/__init__.py
new file mode 100644
index 00000000..fe619e2e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/__init__.py
@@ -0,0 +1,18 @@
+__all__ = [
+    'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop',
+    'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts',
+    'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts',
+    'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib',
+    'dist_info',
+]
+
+from distutils.command.bdist import bdist
+import sys
+
+from setuptools.command import install_scripts
+
+if 'egg' not in bdist.format_commands:
+    bdist.format_command['egg'] = ('bdist_egg', "Python .egg file")
+    bdist.format_commands.append('egg')
+
+del bdist, sys
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0ec79a7add2fcdde7d8e09945c3cf0048e748261
GIT binary patch
literal 936
zcmZSn%*&NH<x)&C0~CleFfceUFfbHvU|?WKVPHsMWJqCRNMUA3VPQyNWk_LTNMUD4
z;b2JNWJuv+Na1Ek;bBPOWk}&;Na1Hl5nxCWWJnQWND*d85n)IXWk?ZYNEc^_Vqi!S
zXGoD?$YEs2Wnze8VqgUEB^h#<8KRiMa#9RAEDX7<3{k8Mj49F#sZ0!6Yz*1#3`NTr
zQe?qgc7_yb1{;V(76*va%*eo)$G{NH#1PHQkRr(ttRct1z)-@<z`&50lbKjt!pXqE
zkd%^HToRv}o{q#TD#(TKN;7j(;!`V1N;p6&!MuXX5_XW+Q_E6w@(W6M7#J8*6N@Y3
zGxLf|5_59EDpS+b<1_Qp^1&)$65I?73{ZA_PG(XG8v_GFQGQ8cNh(-Rabj6&enCkw
z*m=buM}buor<UXwl$5Z59G+TSQX+t43fvlgB*Eh3qD+u6AQu;<re_wHq!yL%f}9UB
zGrl}C59EjvkZVc{a`F>X;#2aIi@|n5_$6E*#bCcCgWL%UB(PSHk23%N|Nmcu5#$<B
zFoFZm56lk&xvYd46ddX4#UM^VWl2VUo`PO#db&bdW=^UG69WT75J)d}X^=(W5Q~pb
z%*lz5F9D@Bkj<qfnK{LJ$@#gtiFqk{U^|0Aa$wtvD~n5nKnXInq_m(UKOdnI;v!Jk
zq~#aoCYHoQO(-tmV_;xF6$AS}v7jI|FGT~C(h)>)DFXw8enC-YSz<}5epzCXep-G`
zN@`KDes-aLcCnGUxnW_Jk$IV+g?VvKWqNtMNs5Vyfq{WRdY*oWenDn|E-1Vcb8>Xc
z6D>;vGxUq$4n<}{-KHNOpP83g5+AQuPzg>JHo5sJr8%i~ps*_zV_;wqViaQJXXIz(
SWENoLVG>~CXXIrRW&!{!4DK5M

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/alias.py b/venv/lib/python2.7/site-packages/setuptools/command/alias.py
new file mode 100644
index 00000000..4532b1cc
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/alias.py
@@ -0,0 +1,80 @@
+from distutils.errors import DistutilsOptionError
+
+from setuptools.extern.six.moves import map
+
+from setuptools.command.setopt import edit_config, option_base, config_file
+
+
+def shquote(arg):
+    """Quote an argument for later parsing by shlex.split()"""
+    for c in '"', "'", "\\", "#":
+        if c in arg:
+            return repr(arg)
+    if arg.split() != [arg]:
+        return repr(arg)
+    return arg
+
+
+class alias(option_base):
+    """Define a shortcut that invokes one or more commands"""
+
+    description = "define a shortcut to invoke one or more commands"
+    command_consumes_arguments = True
+
+    user_options = [
+        ('remove', 'r', 'remove (unset) the alias'),
+    ] + option_base.user_options
+
+    boolean_options = option_base.boolean_options + ['remove']
+
+    def initialize_options(self):
+        option_base.initialize_options(self)
+        self.args = None
+        self.remove = None
+
+    def finalize_options(self):
+        option_base.finalize_options(self)
+        if self.remove and len(self.args) != 1:
+            raise DistutilsOptionError(
+                "Must specify exactly one argument (the alias name) when "
+                "using --remove"
+            )
+
+    def run(self):
+        aliases = self.distribution.get_option_dict('aliases')
+
+        if not self.args:
+            print("Command Aliases")
+            print("---------------")
+            for alias in aliases:
+                print("setup.py alias", format_alias(alias, aliases))
+            return
+
+        elif len(self.args) == 1:
+            alias, = self.args
+            if self.remove:
+                command = None
+            elif alias in aliases:
+                print("setup.py alias", format_alias(alias, aliases))
+                return
+            else:
+                print("No alias definition found for %r" % alias)
+                return
+        else:
+            alias = self.args[0]
+            command = ' '.join(map(shquote, self.args[1:]))
+
+        edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run)
+
+
+def format_alias(name, aliases):
+    source, command = aliases[name]
+    if source == config_file('global'):
+        source = '--global-config '
+    elif source == config_file('user'):
+        source = '--user-config '
+    elif source == config_file('local'):
+        source = ''
+    else:
+        source = '--filename=%r' % source
+    return source + name + ' ' + command
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/alias.pyc b/venv/lib/python2.7/site-packages/setuptools/command/alias.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..89529f0af60e6958a5d18f5362e28ded2a2e3ad7
GIT binary patch
literal 3476
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
STns7@1egSvWSBX*#7qD`uqBuP

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py b/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py
new file mode 100644
index 00000000..9f8df917
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py
@@ -0,0 +1,502 @@
+"""setuptools.command.bdist_egg
+
+Build .egg distributions"""
+
+from distutils.errors import DistutilsSetupError
+from distutils.dir_util import remove_tree, mkpath
+from distutils import log
+from types import CodeType
+import sys
+import os
+import re
+import textwrap
+import marshal
+
+from setuptools.extern import six
+
+from pkg_resources import get_build_platform, Distribution, ensure_directory
+from pkg_resources import EntryPoint
+from setuptools.extension import Library
+from setuptools import Command
+
+try:
+    # Python 2.7 or >=3.2
+    from sysconfig import get_path, get_python_version
+
+    def _get_purelib():
+        return get_path("purelib")
+except ImportError:
+    from distutils.sysconfig import get_python_lib, get_python_version
+
+    def _get_purelib():
+        return get_python_lib(False)
+
+
+def strip_module(filename):
+    if '.' in filename:
+        filename = os.path.splitext(filename)[0]
+    if filename.endswith('module'):
+        filename = filename[:-6]
+    return filename
+
+
+def sorted_walk(dir):
+    """Do os.walk in a reproducible way,
+    independent of indeterministic filesystem readdir order
+    """
+    for base, dirs, files in os.walk(dir):
+        dirs.sort()
+        files.sort()
+        yield base, dirs, files
+
+
+def write_stub(resource, pyfile):
+    _stub_template = textwrap.dedent("""
+        def __bootstrap__():
+            global __bootstrap__, __loader__, __file__
+            import sys, pkg_resources, imp
+            __file__ = pkg_resources.resource_filename(__name__, %r)
+            __loader__ = None; del __bootstrap__, __loader__
+            imp.load_dynamic(__name__,__file__)
+        __bootstrap__()
+        """).lstrip()
+    with open(pyfile, 'w') as f:
+        f.write(_stub_template % resource)
+
+
+class bdist_egg(Command):
+    description = "create an \"egg\" distribution"
+
+    user_options = [
+        ('bdist-dir=', 'b',
+         "temporary directory for creating the distribution"),
+        ('plat-name=', 'p', "platform name to embed in generated filenames "
+                            "(default: %s)" % get_build_platform()),
+        ('exclude-source-files', None,
+         "remove all .py files from the generated egg"),
+        ('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)"),
+    ]
+
+    boolean_options = [
+        'keep-temp', 'skip-build', 'exclude-source-files'
+    ]
+
+    def initialize_options(self):
+        self.bdist_dir = None
+        self.plat_name = None
+        self.keep_temp = 0
+        self.dist_dir = None
+        self.skip_build = 0
+        self.egg_output = None
+        self.exclude_source_files = None
+
+    def finalize_options(self):
+        ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info")
+        self.egg_info = ei_cmd.egg_info
+
+        if self.bdist_dir is None:
+            bdist_base = self.get_finalized_command('bdist').bdist_base
+            self.bdist_dir = os.path.join(bdist_base, 'egg')
+
+        if self.plat_name is None:
+            self.plat_name = get_build_platform()
+
+        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
+
+        if self.egg_output is None:
+
+            # Compute filename of the output egg
+            basename = Distribution(
+                None, None, ei_cmd.egg_name, ei_cmd.egg_version,
+                get_python_version(),
+                self.distribution.has_ext_modules() and self.plat_name
+            ).egg_name()
+
+            self.egg_output = os.path.join(self.dist_dir, basename + '.egg')
+
+    def do_install_data(self):
+        # Hack for packages that install data to install's --install-lib
+        self.get_finalized_command('install').install_lib = self.bdist_dir
+
+        site_packages = os.path.normcase(os.path.realpath(_get_purelib()))
+        old, self.distribution.data_files = self.distribution.data_files, []
+
+        for item in old:
+            if isinstance(item, tuple) and len(item) == 2:
+                if os.path.isabs(item[0]):
+                    realpath = os.path.realpath(item[0])
+                    normalized = os.path.normcase(realpath)
+                    if normalized == site_packages or normalized.startswith(
+                        site_packages + os.sep
+                    ):
+                        item = realpath[len(site_packages) + 1:], item[1]
+                        # XXX else: raise ???
+            self.distribution.data_files.append(item)
+
+        try:
+            log.info("installing package data to %s", self.bdist_dir)
+            self.call_command('install_data', force=0, root=None)
+        finally:
+            self.distribution.data_files = old
+
+    def get_outputs(self):
+        return [self.egg_output]
+
+    def call_command(self, cmdname, **kw):
+        """Invoke reinitialized command `cmdname` with keyword args"""
+        for dirname in INSTALL_DIRECTORY_ATTRS:
+            kw.setdefault(dirname, self.bdist_dir)
+        kw.setdefault('skip_build', self.skip_build)
+        kw.setdefault('dry_run', self.dry_run)
+        cmd = self.reinitialize_command(cmdname, **kw)
+        self.run_command(cmdname)
+        return cmd
+
+    def run(self):
+        # Generate metadata first
+        self.run_command("egg_info")
+        # We run install_lib before install_data, because some data hacks
+        # pull their data path from the install_lib command.
+        log.info("installing library code to %s", self.bdist_dir)
+        instcmd = self.get_finalized_command('install')
+        old_root = instcmd.root
+        instcmd.root = None
+        if self.distribution.has_c_libraries() and not self.skip_build:
+            self.run_command('build_clib')
+        cmd = self.call_command('install_lib', warn_dir=0)
+        instcmd.root = old_root
+
+        all_outputs, ext_outputs = self.get_ext_outputs()
+        self.stubs = []
+        to_compile = []
+        for (p, ext_name) in enumerate(ext_outputs):
+            filename, ext = os.path.splitext(ext_name)
+            pyfile = os.path.join(self.bdist_dir, strip_module(filename) +
+                                  '.py')
+            self.stubs.append(pyfile)
+            log.info("creating stub loader for %s", ext_name)
+            if not self.dry_run:
+                write_stub(os.path.basename(ext_name), pyfile)
+            to_compile.append(pyfile)
+            ext_outputs[p] = ext_name.replace(os.sep, '/')
+
+        if to_compile:
+            cmd.byte_compile(to_compile)
+        if self.distribution.data_files:
+            self.do_install_data()
+
+        # Make the EGG-INFO directory
+        archive_root = self.bdist_dir
+        egg_info = os.path.join(archive_root, 'EGG-INFO')
+        self.mkpath(egg_info)
+        if self.distribution.scripts:
+            script_dir = os.path.join(egg_info, 'scripts')
+            log.info("installing scripts to %s", script_dir)
+            self.call_command('install_scripts', install_dir=script_dir,
+                              no_ep=1)
+
+        self.copy_metadata_to(egg_info)
+        native_libs = os.path.join(egg_info, "native_libs.txt")
+        if all_outputs:
+            log.info("writing %s", native_libs)
+            if not self.dry_run:
+                ensure_directory(native_libs)
+                libs_file = open(native_libs, 'wt')
+                libs_file.write('\n'.join(all_outputs))
+                libs_file.write('\n')
+                libs_file.close()
+        elif os.path.isfile(native_libs):
+            log.info("removing %s", native_libs)
+            if not self.dry_run:
+                os.unlink(native_libs)
+
+        write_safety_flag(
+            os.path.join(archive_root, 'EGG-INFO'), self.zip_safe()
+        )
+
+        if os.path.exists(os.path.join(self.egg_info, 'depends.txt')):
+            log.warn(
+                "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n"
+                "Use the install_requires/extras_require setup() args instead."
+            )
+
+        if self.exclude_source_files:
+            self.zap_pyfiles()
+
+        # Make the archive
+        make_zipfile(self.egg_output, archive_root, verbose=self.verbose,
+                     dry_run=self.dry_run, mode=self.gen_header())
+        if not self.keep_temp:
+            remove_tree(self.bdist_dir, dry_run=self.dry_run)
+
+        # Add to 'Distribution.dist_files' so that the "upload" command works
+        getattr(self.distribution, 'dist_files', []).append(
+            ('bdist_egg', get_python_version(), self.egg_output))
+
+    def zap_pyfiles(self):
+        log.info("Removing .py files from temporary directory")
+        for base, dirs, files in walk_egg(self.bdist_dir):
+            for name in files:
+                path = os.path.join(base, name)
+
+                if name.endswith('.py'):
+                    log.debug("Deleting %s", path)
+                    os.unlink(path)
+
+                if base.endswith('__pycache__'):
+                    path_old = path
+
+                    pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc'
+                    m = re.match(pattern, name)
+                    path_new = os.path.join(
+                        base, os.pardir, m.group('name') + '.pyc')
+                    log.info(
+                        "Renaming file from [%s] to [%s]"
+                        % (path_old, path_new))
+                    try:
+                        os.remove(path_new)
+                    except OSError:
+                        pass
+                    os.rename(path_old, path_new)
+
+    def zip_safe(self):
+        safe = getattr(self.distribution, 'zip_safe', None)
+        if safe is not None:
+            return safe
+        log.warn("zip_safe flag not set; analyzing archive contents...")
+        return analyze_egg(self.bdist_dir, self.stubs)
+
+    def gen_header(self):
+        epm = EntryPoint.parse_map(self.distribution.entry_points or '')
+        ep = epm.get('setuptools.installation', {}).get('eggsecutable')
+        if ep is None:
+            return 'w'  # not an eggsecutable, do it the usual way.
+
+        if not ep.attrs or ep.extras:
+            raise DistutilsSetupError(
+                "eggsecutable entry point (%r) cannot have 'extras' "
+                "or refer to a module" % (ep,)
+            )
+
+        pyver = sys.version[:3]
+        pkg = ep.module_name
+        full = '.'.join(ep.attrs)
+        base = ep.attrs[0]
+        basename = os.path.basename(self.egg_output)
+
+        header = (
+            "#!/bin/sh\n"
+            'if [ `basename $0` = "%(basename)s" ]\n'
+            'then exec python%(pyver)s -c "'
+            "import sys, os; sys.path.insert(0, os.path.abspath('$0')); "
+            "from %(pkg)s import %(base)s; sys.exit(%(full)s())"
+            '" "$@"\n'
+            'else\n'
+            '  echo $0 is not the correct name for this egg file.\n'
+            '  echo Please rename it back to %(basename)s and try again.\n'
+            '  exec false\n'
+            'fi\n'
+        ) % locals()
+
+        if not self.dry_run:
+            mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run)
+            f = open(self.egg_output, 'w')
+            f.write(header)
+            f.close()
+        return 'a'
+
+    def copy_metadata_to(self, target_dir):
+        "Copy metadata (egg info) to the target_dir"
+        # normalize the path (so that a forward-slash in egg_info will
+        # match using startswith below)
+        norm_egg_info = os.path.normpath(self.egg_info)
+        prefix = os.path.join(norm_egg_info, '')
+        for path in self.ei_cmd.filelist.files:
+            if path.startswith(prefix):
+                target = os.path.join(target_dir, path[len(prefix):])
+                ensure_directory(target)
+                self.copy_file(path, target)
+
+    def get_ext_outputs(self):
+        """Get a list of relative paths to C extensions in the output distro"""
+
+        all_outputs = []
+        ext_outputs = []
+
+        paths = {self.bdist_dir: ''}
+        for base, dirs, files in sorted_walk(self.bdist_dir):
+            for filename in files:
+                if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS:
+                    all_outputs.append(paths[base] + filename)
+            for filename in dirs:
+                paths[os.path.join(base, filename)] = (paths[base] +
+                                                       filename + '/')
+
+        if self.distribution.has_ext_modules():
+            build_cmd = self.get_finalized_command('build_ext')
+            for ext in build_cmd.extensions:
+                if isinstance(ext, Library):
+                    continue
+                fullname = build_cmd.get_ext_fullname(ext.name)
+                filename = build_cmd.get_ext_filename(fullname)
+                if not os.path.basename(filename).startswith('dl-'):
+                    if os.path.exists(os.path.join(self.bdist_dir, filename)):
+                        ext_outputs.append(filename)
+
+        return all_outputs, ext_outputs
+
+
+NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split())
+
+
+def walk_egg(egg_dir):
+    """Walk an unpacked egg's contents, skipping the metadata directory"""
+    walker = sorted_walk(egg_dir)
+    base, dirs, files = next(walker)
+    if 'EGG-INFO' in dirs:
+        dirs.remove('EGG-INFO')
+    yield base, dirs, files
+    for bdf in walker:
+        yield bdf
+
+
+def analyze_egg(egg_dir, stubs):
+    # check for existing flag in EGG-INFO
+    for flag, fn in safety_flags.items():
+        if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)):
+            return flag
+    if not can_scan():
+        return False
+    safe = True
+    for base, dirs, files in walk_egg(egg_dir):
+        for name in files:
+            if name.endswith('.py') or name.endswith('.pyw'):
+                continue
+            elif name.endswith('.pyc') or name.endswith('.pyo'):
+                # always scan, even if we already know we're not safe
+                safe = scan_module(egg_dir, base, name, stubs) and safe
+    return safe
+
+
+def write_safety_flag(egg_dir, safe):
+    # Write or remove zip safety flag file(s)
+    for flag, fn in safety_flags.items():
+        fn = os.path.join(egg_dir, fn)
+        if os.path.exists(fn):
+            if safe is None or bool(safe) != flag:
+                os.unlink(fn)
+        elif safe is not None and bool(safe) == flag:
+            f = open(fn, 'wt')
+            f.write('\n')
+            f.close()
+
+
+safety_flags = {
+    True: 'zip-safe',
+    False: 'not-zip-safe',
+}
+
+
+def scan_module(egg_dir, base, name, stubs):
+    """Check whether module possibly uses unsafe-for-zipfile stuff"""
+
+    filename = os.path.join(base, name)
+    if filename[:-1] in stubs:
+        return True  # Extension module
+    pkg = base[len(egg_dir) + 1:].replace(os.sep, '.')
+    module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0]
+    if six.PY2:
+        skip = 8  # skip magic & date
+    elif sys.version_info < (3, 7):
+        skip = 12  # skip magic & date & file size
+    else:
+        skip = 16  # skip magic & reserved? & date & file size
+    f = open(filename, 'rb')
+    f.read(skip)
+    code = marshal.load(f)
+    f.close()
+    safe = True
+    symbols = dict.fromkeys(iter_symbols(code))
+    for bad in ['__file__', '__path__']:
+        if bad in symbols:
+            log.warn("%s: module references %s", module, bad)
+            safe = False
+    if 'inspect' in symbols:
+        for bad in [
+            'getsource', 'getabsfile', 'getsourcefile', 'getfile'
+            'getsourcelines', 'findsource', 'getcomments', 'getframeinfo',
+            'getinnerframes', 'getouterframes', 'stack', 'trace'
+        ]:
+            if bad in symbols:
+                log.warn("%s: module MAY be using inspect.%s", module, bad)
+                safe = False
+    return safe
+
+
+def iter_symbols(code):
+    """Yield names and strings used by `code` and its nested code objects"""
+    for name in code.co_names:
+        yield name
+    for const in code.co_consts:
+        if isinstance(const, six.string_types):
+            yield const
+        elif isinstance(const, CodeType):
+            for name in iter_symbols(const):
+                yield name
+
+
+def can_scan():
+    if not sys.platform.startswith('java') and sys.platform != 'cli':
+        # CPython, PyPy, etc.
+        return True
+    log.warn("Unable to analyze compiled code on this platform.")
+    log.warn("Please ask the author to include a 'zip_safe'"
+             " setting (either True or False) in the package's setup.py")
+
+
+# Attribute names of options for commands that might need to be convinced to
+# install to the egg build directory
+
+INSTALL_DIRECTORY_ATTRS = [
+    'install_lib', 'install_dir', 'install_data', 'install_base'
+]
+
+
+def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True,
+                 mode='w'):
+    """Create a zip file from all the files under 'base_dir'.  The output
+    zip file will be named 'base_dir' + ".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.
+    """
+    import zipfile
+
+    mkpath(os.path.dirname(zip_filename), dry_run=dry_run)
+    log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir)
+
+    def visit(z, dirname, names):
+        for name in names:
+            path = os.path.normpath(os.path.join(dirname, name))
+            if os.path.isfile(path):
+                p = path[len(base_dir) + 1:]
+                if not dry_run:
+                    z.write(path, p)
+                log.debug("adding '%s'", p)
+
+    compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED
+    if not dry_run:
+        z = zipfile.ZipFile(zip_filename, mode, compression=compression)
+        for dirname, dirs, files in sorted_walk(base_dir):
+            visit(z, dirname, files)
+        z.close()
+    else:
+        for dirname, dirs, files in sorted_walk(base_dir):
+            visit(None, dirname, files)
+    return zip_filename
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc b/venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..05d595ffd631dac819cdba8ab6f8dea3a1333c87
GIT binary patch
literal 19784
zcmZSn%*&NH<x)&C0~D|_FfceUFfbH<Wn^GTVPJ@2U`SzPNMT~gVPwc<Vu)g5U<C1*
z8FH8za#<LnSQv6y8KPJrqAUzKYz(>V3{mV5J}W~G2SY9=Llh^3&&H6$#Sp~>Hj#}X
zhnpda8^-2gh~j~<c^RU3VQfBzC_XToogs&xAy<GQN&sRO2Sbh^L#_}*ln_I%Fhi6u
zL#_xzln6wQ6D%jn5G4xXb1~$IG31IfM2SQA+zdGq47rjFQIZUdmC9h_c^Gn}7;>c<
zqNEveWf-Dl7#LG{8Cn<^qGTDu^9&eRQso%3xfqHp85tSD0l>$QBhQelz!0SXSI-Ys
zpU21$ks<)*C^Do7f*DE-DMDa|GDC_mL#iZ08Y4rB2uP%vfgv(Vg&|dyAxn)RMU){+
zouQe5p_!2(N`oOq45T7TlOaVM%+O*;kpMHa88Vp|QY0Btbr{T2q!?0l8O);e7*eFc
zlKKoOGGK-QLy9bzVaSjo$B-h=kfOklqR5cW!VqP|kfH=asX7cP$_yzg3@t1SQN|1@
zYz)B~s-WmM0}-hur3EGV`8maU$@#gtiFqk{Nhz7dCGn~0>0De+rI|S?3VNyO=?Wmh
zqRgbylFa<P;>`d5|NqxuWME(@5oTauaLFt#DJ{v&DGmmi=2}#gU!=hVlH_J!U?@t>
z%`Z!hFDXh*En#C|V93obNG!>KXl7<$V93c&hj2I;7#N)MQ&K}J3sU_cLLm9#%nA(<
zT_VK5z>uC=5}yQeRD3~BVo6$lQEmwj)B!NZl?X5}Fr?-cmlmbQr(_nTCYR(FRYHv8
zVqjo!%_}LY49L&SD}jiyGcYjtWF{3Q!W4l7oFPF0@dU_SAbUa1hC8C5vLquvFTO0b
zs5mn}51zF^zIFx$E6A!6aK370WC#Wu<W~YRx}dZuH77F(Y<UpK?HZt5i6Dy07#JAz
z3yLz!5=&C`%My$9)ADmtQj3c9vkUdJi;c|94GXi3%*zZd%!_j>)63&cQcO$?3=9m?
z^YlaX3o;9IGxLf|5_58N%M&e212goCL2&|(VPqyWvi0GStyfS94$642S0Rp+0{H~w
zB?d;Y4@&r;Q2_OQPG(XNF9QPuPVbj6f>L=f*t33MBZ5G&Qvxc1+!Aw&QxX0Kvj))f
zLHrC14DtvMCxcQq2!s3&j#5_!aD3J<Fl4ha6sa<lFfe2>GGs9^)PVDH3KN55EdxUy
z1Bjo+%#gwi@_UgZh?~N~pa7Q()&P0muLNYcUM48^A^9Rdr8Fls^A{**v4AoU$m0Cs
z5)d1l^g!vbxF9F9B(<WX1jI?rODQhTgykiWNLpr2YF=V4Qm_tSh=P+-aY<2TL3}RQ
zZ_1$1<pOz_k%v)|k)M&55gf`OAA&F_85MgnFfdd&K?4^OvM#ZP3^B|MwTuk4OboTm
z3^h!kP;X{nV60(=vlv0bHOvfY%nV_Sg#rxWDX@H3oCGQ%@)h!n^~w`-vK2D(6cQDR
zQVWXmQ%aLFlX6lO$`dPfxD*r=6f*NtQVUY^Qd09u6!O!++>+Fy+|0bp;*!i{1yJx7
zR~DC~<|-7WCZ?oh7AfQxrKA>t_4<KJsUQ(h)PZ~hvI`t}#rZ`g8X%DpP%)O0Sp*hM
zN-RzVGg2~(ioqEIY&tj_fQf;OIZ(L`a&~G;Jjff`pojydF9sHQMlMD!#$-_11bGQm
zqJcAq6Uf`(43PrP^I1%wDz27^p@f;C2Hd!4W@6}<07oA)Llz4-wip=1ni&}w!&4X-
z0wYow7=pn;=vN%X$iM&&Q&60wq^2pv$0z0ImlT&2B^JcTYiL@*B|!?(bMliCb5Paj
zD8$F-<R_-27RASd*r2eDk4Mp#nOl%wRH9H^S*)W_kewc1lv<o$T9lkxtfP>bTY#c8
zJ|3c9!4_4e9!w8d9-Q&w<3SY2Qq>|&G(%txQm|F<%g;--R!B+3<7^bonYjgeAnoxf
zm3fJ|naLV(dth!uScVo@aC5)~PC2;n0T&;ja-_T{u>f59q@;opJ(!sT&a>dOnO~5a
z2Tq&iMVTe3kVFhh2QYtw)fZHPLI+$o#21&8CdHSe=7MVHRIr6<;KU3j1~Ns1iXE^g
zz)m!UCul}C4t_=<#u82j1_pRt2r7s`#S{a`ub`A&ycN`@U|@)11h<!&K#i^x7KRj7
zP-`lc8I;t;(wM=`FHVLOE`}6th7=wKagY$CImQNRKc{dqqzEviurs7HGeoh$T8r$U
z)*`4C$^mUHMsb4Lh#(OzSnH4*);i>YwGMefO+%0xK86%2a08GZ);1J?wG9Osf`T=a
zKwgyrRnkSNi6yBDiFpc2sp;uTs0}($@PNIqo03^%3y!#?Vna}#P6cI?#G*<Ccw0&#
zEx$-18Dv^!Ub;d_Mk=OJpy<~HWdw*(1;y433=AMaP>W3gB%x4}uaKIXl$ru6j?+`~
zQi~ExQd7VsEJ(UoK_ewKEwMDG#7aT6ShE;Zs-{*X=ai<T>O!)qE-29z7lVo>NDEUT
zF(*esub>iaMzKO#QGPDiaR|dx)6<JV@tmESTA&L`q+ow$7wa=HFo49s$_t89OH=Y;
zji^LWb5{Y>c2!6$$}i1JQAkWHNi9++R)mEpwlGjgEK1JEEK3F325LAXLN%pW7u1Y^
zwM#+4P*7T;kd~R3n4<t{*_NP&rb1?3F(`71voi~HLGmfZMxYqY&MZ(UN(BpmT##Cp
zT2xt*0b*)^qNgOaxFj<#T|Xr?sWd%3GcR2eT+@P@9H62bTx5fY6mV-L9-ORe7#QN2
zKpiCzgBg_2K@1j{2rEp44aQ&xF`#W*a63i=lwZIF2dI2Q%2S|94;1pCBmgcT!E&H5
z2NxFL;s_K@pay#h%)5|=KA4-Do*tiHT2fG2Qi7Bc;vp#kT=*7)+n8Xxi&Jw3NudMk
zv1I0DmSiU8WLBld=NEudQ*jh1{y;5h21ZUK2#z3>I`uCDICiqY&CX^<29{bzP-8Nl
z5mci>+MV%CAQ4b&lYt?dgP|x6%w+&|=9?KAvRFYarV=)WEOv%04p5Z~YLtSt#52QM
zs+^!$1nI3|DB%K?WT05*gvoM)j7ni+Xl7zytYKit;(@9D$xy-zVuMl;BSRJ+*iHNl
zB?3?*vIH5jgh1^4(_lAoGBmS+lr=Me+5iYQF)(BaGt@AH%2M%Wh|_pLmV=uEpyq`i
zICX$hKxSTAKDaglmsH@^RBC#95V$Z01stfK3h88kguvn&pyW~_3hlOlb6I9pYDzq`
z`vb1OQZwU|b5nvqMN|+dZv}zNJuY~K0BWg$n{`1TbHGU~D?c+Y$e4kFAqdo?1)E=-
zS`uHHmy(*6nU|UZi|QbAkQ$IL;GO`LZY7}h705@>?jyJp1#T{bG6B3J3+j<%Bo@b~
zR+K<n(8Ul>fjk>z2{PIqM1aO}z~+No3NjyD+k%OKta3p;Jy?jt0t8gE7K3Ud21YSP
z9wt!LE6v2u$j>Ce#LvvkD8$IdsK^Y?37~)lVNfYm9M1^L37|B{2r81A89}903Ainp
z#R_U>X0b42u`!gegA!dcxDg7;FIgN6S)2^%3=B-QOyH!*!4S{MP;nBJA6#M&f|DZ`
zC<&HugOYg>3u6fnh}#Tqwq`RifJ7kn@Pfosm>DFS8IeTUkVI=)U`}CWs9^#10Bczp
zYFI(JBb$k#_%4VI$t)nJ^D~HpOk!lLVPODS3U+l03xl{kC`Yg`NTz{1JcW#mg)EHF
zo+a2fSppzCL5=6aFoy6d1BMcCc1vLedyoO-4{&xB1~pJp*g>7q6b?{!ZDwQwx3_DM
zf&$X?=44=CfDBPU2M{trH3hg_&ji&Q#j*?x3^1v@bcKS%<m|-sRE3npl0=1)d<E5F
za0-U1hzALSGizFYQ8J{bQ<R@yq5;Z7kZfiLYF>bH0!#~NI02MjA^8kcm*nLa<tBqV
zN+3>AYGMwkBMk1T2Z4Iy;JN{15u^$Lb2E#<#^oiaf^9D;Eyzg)7Zo|srfg<$Vp1_!
zX>mznQ3<#Q4OUQ`3TX-_7J#~dL7>hWIJ1L`9neTka$-&ntmFU}5*nZc3eJcnyr4oo
zvm`Yh8Z5<NBlB}oAV!p=<_7tL{L96_zyR_UxJF0;=TR^*kQo(J&ZOkWgTpN+2OM+N
zAnz!E+Q3YrOp1(>OuUSWjAD#pj6#e;i~>yROyW$;jKYkvOyIl<N**8#&Z{6Ff^sPX
zLprDj4iblq=79@Ca5W7MGO)M7#6bETl>R^?UXa#B@f481LFt|W(#Hjj)PPD`Z;*H{
zXlOzaG&JE7D+ww#Km!qspo|FeFB3S^6|ysgLxfWp!FiDxEDRN50t>M~gcv~ea}9Xh
zqL-1OmIW-w1}Z5)`MQP$+8r*oU|?YI%qz>!PE{yMMKmW;6rh!uLPBzG3aHpmPymev
zDP*Tsmgg6xC?po87YBjHc){b2DMgj>MWuNf;L1oGWTankh@+2Byo+a$t8<8dP-MJg
zNJvmHBxj_SK%3u?tO_zEC;^myLHQHe6|npOuF{H1^I&{%HxnGsVB4WCECB^=b~#um
zC9??RXmCDB&K(?CAt;i8fnho*uEFgyCSFEyMqx%_Mj_Zxl^_EH11D&l8l>g~GptsE
zjCnAYfQJK9Ah8UMcm~j52dLS_2pYhufi=n?&8B!(aHNA<XUz-@MOk1jCj$?Z#lVmP
zu0vpDKNqN(l)?t;LpC!qLWaU>7#X0(aD!^T7$#6ss$~ULc%YUX4~S9A#!#^z)L^S&
z1yxBdu^Smc>ev}-IT%X#7_#^oKotrHNDd^<$xzD$6Bh(KiJ759h@plPq#%WZ0n|{d
z<pxXefSYgJAPJcFIT>m=;3-^$q1chJL=<M47+8*xp$1&lg1yCtWI_!GLzXyLtpunW
z4QdavGSsj$*c5JK2(MvdC~5=``AIU=uz_uaR*CEkSyBu|v%oc;G$;_j1~V{ZF*DTi
zfQ{p4$P#3z;Q@8bo0%ADdBJX%VW{B+8w1L|><n453`Igr(BKdR$))gs{87ut0F78)
zh8jMQ2-qSnh7>-A6n>Bps8=t@0IFJ{4w3`u2IXQD(}X~JYxzO#f};6MP&0)YYWP9o
zU^7J+itjR&$b*F#85m0xK&%uIkbJEGLyZ7KmLh0u0OS{Nx&T=L7lm<@z#&k0mnqK<
z=67X~IiQxtU6{3EU=e7e9%3yYLzW6yl#ziEq?>`EL=|QLQs99COATZNs7nC#pE{B{
z28JvR&~QaF6DVwpjF~|m)dY=OfE)-7AT5R>PiBxw+8~oa(N&@YjuTyQEJ=dddZ3{V
zkRlP#&<2R14^rLC#0(BB1BT+6%q50krOXJW&5Vp-^Nhd}?4ZGrbOwfIW>7Lqk!2_`
z2AKgeOcyj(4002=t04z!{(w6H=nb75$n20pa(+rGq@fc88l(mnl;93{d@`uz;tMJs
zLG6_C#G*V<M;6?4Dh4$p^a?7ArI7~=K*MATpz*xaBJgO6YB6{yLcbWK-__k+*VE6<
zA6!ZnCl_TFloS_Bpf<js!Vu?_fGTiU?G2Rym&Y(MQ1=^DljY^drxrjOb095wi6xn3
zsqs0PNyU046(!(t2GAH8XcR%U7+hADmlT64aIRudJqaFXfk=Y+kg;-z-U<c=hH%Fq
zKTkh*D+P5V8Fhv7%$yvBy!;Y{q*R5{;?xv{q)G+Eq?Cezo|z(7XmKid^abYPqSV6D
z%%ap{{nUz*qQv5OC?BFvLla!Lfrds(QWI13zyVd3T9lMuoC>L>Kvi~beo87hjzE1X
zNCPoQhk=1X!vxf4N&yj|xCx2?vB3R4P=hqc2gC*S03j_*P&k45V9B6hDoQNMOoh~`
z;F<y)@SxTMsD}n^L4aGGp!h8Yk8z~tmF9xSwh%qYATf{?jvzu3M1+F~P~{o~8q5lE
z2c;uWEnSpakdv648WaW+-~n|<D@#&A^=m<9PHIp9NLL()0M)5MIUq%#9#?XHL1lby
zYDprvU0jkM1WHmtp!wb)HIN!mI!MmRFNRFUW)_2n(ZJo{(!89^yzCNC4F^gDsqw{$
zX{jZZ@o71U>EPaFRb~N14AkmPt;j4cDF){ka0?fd=z~Bl6>!3<N-T(n3=2a#1-XgY
zsqs~r1t817&A^~SkXyLG{qnr{j8xD_eGoWeK*<dpq3Nk5i6tdP;J&d2$W@5e1Spjx
z=ca&Nm7kLm59(M1Wq?csB~wr<9TpiNK62!MY%Ix#2cjNG4=8{@YCx@#AW%L7H%U?}
zN`gSGQ*fsSI-Uoy2sBUtPFRqv2FmJSPa|a~aMXkH6*%32j9~y11KH9ACHA7yyoI2a
zOBJ|f&&w>#$PXTYl4KNM6lLUO5@O_JWMh<Mlwg!#<YE+H6kz0Jlwss$lx1RL6kz0G
z<Yne$6lLUP<Y5$L6krr$<YMAw6lDa-aWZl-@-vDt@`A-d`h=O78ReN(7}*%PSU4GZ
znI#y-7&#dwnMEO!exR5DrE+keL6?yM)U3{e_3RldBpFMXzy&yX7S$z|gAsWKu;Lr2
z)$J1d4%F5uVF5Lyv%oE9P?wvD0o3JY0S$VkK<c1cu;Cn_UNEQu#Kgb|(!&Yri-XF4
zP@TjGRt~OIi;O`MwQQiaRxLYdP%MiZ)Chr^&A|ZD%nBN7s9^-Nc^E+L7G6+S8#HFX
z&LG~*%uve-wv>?}g#*-Dso`WuV}eX~RSJT2@j=^DjNy5L3@j!5;I${bjG)?!ks$(P
zhX7O~sG==2W+*gf2rran0L_*KYk(S|e&EsXAkg{>P^pYQ_Ki7m53h_s*}^3?ClxeC
z4C=Up`0?=tmC1?88L9E{#h{s54f_BaP?oUM)7Fg91MzYb(=(IpqT}>pK_Uf}$>5w1
zQd0~naP<l*lZ!z!=s}=4XpoCQ*&Q+vAFWy(3#zO@G$b>Fk|Vh61?OVWEF);i38cFL
z>STZi0fNA#B&fFnE>^*#*+I3SObaUXiXdJ5+{BXP3~&)vkXQt(>e7qyOCjBPaIKXJ
zE>ir1!D~~%YKuUQOx555m7ta&0yMl41Zo8Yf&DNUBnBF+0J{$~?hp^^&4ZF`L1IZs
zYEd4z%Fabd=cSf|GdY+Tz?>e`#K6Gt36#yXK-rv;mr<UPmr<07AC#e)_!-%l*cd?>
zU7nGRk(rT?k(p7Dk(ZGLk}W~u3W`i{wgiu{K>9e~oS6b{M}bDwz!L`9oS<b8HH-|w
zps_3#21ssWEP-@t*udGB9n^M(&g%x%gB%4a<zZEc0;qBUw+)I@ORN<V^Ad9^t3W9S
zTHq=q=jWBA=9Lud>FH^J%ITn1P_%&D1s;F_57GoRf)WHM2}AU!A`%j4Ee&Ku7!<|e
z<O-_Qz%c|S1~QsJp~1t*zyNM{F))fU@-VW%`kA0)36BOvc<BggwlaabH3g#3F;GZk
zWPt-e6Flw*VuK6KS|-p4X9{Fuzzx)s3<eEDurcryM}lOs*cpoQ8A>=n<y;LDXtf$>
zHol1wH2Pk`$&kebD$o=loy;t5P)VD@4w?Xf7}CrLE@qiP<zNa2gJdlmsDGIS?o5K5
zDFABy*RnIDaDv7rn;96yYB|6uLWrSQma#+_rdk9n2v(iK1!fB|fST|nqF{~y$lahW
z8z-o^%!2hF8EZH}Jw?zOkUR!ZuP#^v)I#zr0j2n2P=SGHVd{aJ3yC>7;JG|-bq<;c
zOieB=NleN~4N?RpN>HN<SyUkvv`kE)0JKg_K|{4jQz1Dq57dUuNGwZLP=~Zi)fMuK
z6pB*QQj0)ETcScPc$G^gxMULowb#Lp@nB?NP*&7W%FNR*&fv;SQ;1ebfDP0us2C(D
z*eWQgYQRJ^i<J~&xk@rp^Au7mQj--RE3H&D3M$J|i!_TBbdwd7kXJ6`7h8jtFzA5_
zD80<Q;?$xN4Fes}S{JZLVp1`P)=*b5P}kJ7h7`uC8U@+un#G`H4xkkf5X&{82BlVH
zmT0JIq?P96XclW|YAPuxsW>QcrREf;aw#aJCTHX;s2C_@7K3vwX!18XzX-I*4l=6?
zo_oy5ELH$583YyodN54^IjM=opb;!keW8$9qL7rBoDB*$i1i>*&0>YbycC6!qDqCt
z^u)|OuwGCgq=A--aiwK)L0b2qCSsxnsHGMJss_Q0t%Ag&;?(%u!~#gO9h4ZrQ5X-7
zLda-rdTI%{)Bx8dptfZ(xF&!^W)LW{z%4(}3Lj8051pI=x9uQN3!b`!)Jcdc3Y2uf
zZCbElIr+(nImKXi1~Gxks&o(mZ+-`X238T34%oibf?RN4E42XZFmOzRB?_|B!9^A*
zE`nr1=78)1TLWz|g9><XIR+*MvM_65U|<ji6=onOF)&IqN`s0sCSgWqMrK9<W?n{4
z@F1EfGcz|A6DOk*n8ynlWCisnKp0%-fa+c3m33LLvJ5H+UOAM)2&z_UnHegQz@-GZ
zHI~KB;1U}MDyM2#z|);zokdpAb{J^Q5hG~qrGyjIcx+~5kO!43te^%Ss8z@anc(CG
zDFN}B7#It!7z(Wz!c&-FL$M&wIp-HtD!@8e3L2n<4w@m*1f^wAeke&S0(A*fGK+#1
zgT@rV1yc|_y@1;bpcw#Az6AH5APEXIlLwXq<(iz#;u1(RBoq|w!5{)u{ehD@xQ7Q)
zg*5#DsxJ^0gJ&Z^c7STac#!MBiKd_^H7&CO+^_=kAsWC*2TTlP`T_MwtU&3950npC
zL>WaH#TfY+LCej+Qw*T$9h51-X{4Qz0X(Y72qu{rGQq7AP_4tjU<OJR3qd1x5PmZw
zgG=lL@cKa(P>lr|3iSXrtX*Oq7(mT?aD56&9PFSP3$%(eixo6PRKf;c=jj9*kk4WV
zC7Bu)2FV&w>mD>f=EP9w#1LKq?kl*&YJ-fbVFslgu#yyJ2JsqZh7yS393b%;a8t;p
zu$LjcP=_HL<T`LA3mW&W1rKO(gX=m*(4cI^9B`k4hruPb58RdD1yz3~;L*n-X2!x7
zph_Cl>);28XMwBFS}w32L53PGkWUbP69V;KK+6GyK~;S-BSY~En9D?93`pI~09Fa<
zG?g)eDtdOX2*|@_AX^JxFoZ+8OQ045C|`gwZZW8t?w(qrkf;DkxuB(!MX8|rwk%Zv
zl+24kdBa&DwW1_7542pm7_{gIlvg0#bjXUAd~kLFk4^<;gIaW;vK=zMmReB)?z*Jp
z=pxM@f~Kbs`3gL$0xm#v^2<|;z~dNxjv=05uJNuBA+CPGp8kHpLEy0#kZZx!M35UO
zV}XW!!2NlI`+@>N65vcF03M?#0Z+n%3Sv-26$CD%P-HS83va=rH$mV`+W;DC0wr7U
zxJ6J0$iz;Nzd$1};81~->4+`|s73?laEPx#ixPT38bCQ8W;HmYf{B65t)&bM3~r#@
z3U&!I8zUQ&0JxW-1R5@2(gjWFGYT;BGlF^={EX6!DvVN0;KiNb#x8jM26#<W5NI_N
zc?-=T>uqta41;uzA)P;>mWDx`2TF9H0YixE3>X*~NMEo8F$t7<5UaNQ$XvFi0cuEs
z>jl_~PjFI=hb{<-j|VqTQc@vfQJML9;1wy5W)7$kR9c)`1Y3Lo9<EHv&(BFs%!7#q
zS%K1}2Z#U<CdPwUpjoh>i69oJD+%tl1%WE~AW$hC1d4ocyd#K#OpBl~U2v@c>R7Td
zvN1C-GBbjPqd+vMhs(|gVlgmsvhXu=a&k&=N^&xDa&ZQ7N^!Dts&n#ylaO8tX!T%m
zzJgv#Wlm-iXdz(=xZ(koZ=e=Ec;!keC_92X#GvjEBe<3Uuh{?%PJx$d)I!$FF@x(4
zTTrc$1zuAJ8)sqy3DvNGrXIo=D}+Ini%TpwsA8&N1ua|;LT+w=7WRaLmaHe{DU{}c
zRu-hDfLhk-#qf@?jshr+6@dE8paK=%E`hJsM43{6<e4B)$q8;*=7B~zXMqYTkT=0&
zB%ozUpg|On0BBSuwFs@40yj;QQU=EoyCBeneHy4F0=FBOKm(IJi~@{&ppG=C{SC^`
z@OHyn&;&kgZ$UEygG;OlcpelSbI`h)1y&=1M=?N?_{^ZmBhcg-FR0fXT*%81Ucv@y
zAruFJRvQJEaDdvJ6@3h#h9!6_h)Zk(xWU27P|F5t7*yneYEhTiG*HzJs<pYGV<pAa
z;3}I7G%^XYVJSmlH3&h~fQKWC55v@e=WdIt8A`xYub@Rm9H8{m%)*d=8`Q$6WdZ3e
ztY!!=Ol1fMFCYNLq8~~U09T}-2`SL<f?h#oIb!S%Dv}Rwv4T6wpurO86aZw8LS{*7
zZZT4&3##P6?N@LSm7JItU!0tn7X%uv2Pd$QqS91w90h^;<lwRjqySoafk!cePJ;>>
z&`1qf2WUhH+#O2G3t9w{0e5^5l_aR@9UKJ@Xe7N5l=MK`q!^ea8C4iL7&#eP7}-FT
zAfp^38>1YP8l;N@s`Ej?3ofV*fRf=(XtxBM3|C`GhBXYJq5{-KVMa=lkUmWzDBd9>
zJH>IJL|6kZg=&}>vY8o*c7WA$fVG2KZaWwXd0`qj8H#vOH86oiz<nZUw~7Unm_Wln
z;D#V*ZCVz1X#ry)FUTaw05qsf^b0BgRgj?mI2Sn41f2uL*m)2E@9=<=M-VunfTq>J
zkqoMYz~i`xi780W7!*#B1Oblw%OI1kfCx~}Yj8w+9RoOzGZcerW>B<?G72%uF$y!v
zfp;{4Gh0<=fi5WT6oabZy!;Yfm_RZp5%4lFFn}6{;KZ;9KDY;3(F<M;1d4NT9HcNZ
zDAYiz5>3#u!eGdR17ufJ3KN64JZR-319%7yyxasd@c~|LSQHH^QVQZgJqmGX&zT)m
ze1Rq?SQ#Y6LBn<6m4rndpkcmRc7{ATP)|6E8#G~_&A?E!05o(55@!P~#Q^mtctGhQ
z1-x<tG?vG~ki`os*FaSpWE}u#-3KG6y8<e|zzcyHOPIlHNx-WUON2q473k7TZiWgQ
z&?bo#UWRlg2A5bp&{B;W9?;4V(DpiJ#u5>REK$%JiyAi2nt*0z2F4OGkYR<)jD^gM
z;h?1#+~8_<9%DrmcxQzmXir6oFlZk|iYRFBM2a{=iUeq<M2ZwcIya^*nJ`<VK|R76
z9#BaSvn7+UFq0A7+2LXc)&P}4;9U&P8L7$H3gsE8B^jwj&>=sCg8bs*%%q%3(EN6>
zLTMf-?se1hi$L+7mYI{PP+U@)mImH63+dp1(hj7*1M2Q(f?D|Cal=edU6lz+HJPC9
z1-KwAN&*+Iu#G-Y4yXqa9}iv^pjvDNa|n1eGBqzbwHP$512!zLxF9vT1l+GkPc4Bg
znFqHaK@+S=kojLwiiAso91LF4oSs?&V#6hJGV@X)D<{)3^HQKDff90hY6)m98fc&%
zTy20f7A5AUf=3=e6>~ahrYSGAC=Dc94Bje~o?4P$S^^gWW&Glj#N=#n7p|lzF*&su
zv~>l^Z@!L^kR=45#!e>0TY9R+;PHJ#;Awy=8l)Nu+}XPbDnh`cD4=x;;2Cvre=!JT
zEx17w5NQ;&8q~T2g*|lS4?J=LE}_7M7HG>KxQUdTSX7*mm;)9BE#d$dU0_~HW-?@J
zCTRCbc4{SL_B*pAwJ5&0GB+tdrx-C~0j?x9Kp_t)@IWaH+_4M-)rH`R=%7s?cMF4@
z1u8c{ExjO6K?t@Bv>XLoLxSA|H6HAjq{Kn8n(h(<1H&{>4GHRGFffDWj9D0!8MVN3
z&iss=Ol;sHlb?}`k&RK5QJ9g3Q5ZbC%*@Ec$jK<i1mX)oCZ<634JZ)6?eI!a4Jrm6
z`UAD%xS>ny!Wav=7{V(e!4jZxA3yN^2k<-yWQwYpiJ{0DR1StQ7Ak|P$r>hx5?0V)
zVv#aKg$zRp8%Pp7W`tyDJVSV)GDD#<@}^SIwy?;|)SMLXz&B*%8nkgPFTEI43V>I+
zB!J>50X(RkSyHS3$~~!|Wt%Cf3i(M{smUe9evtK;p!}bl4<25IEE`D%tx?DWt*`)(
zM1YeiC}l!yh%c!uNG%Qm1xL^uQ0pBOI6?0~i3QX=0%xJ*{Ji3l!BJy^oVW{=3_wL1
z0~2U*0BG?52O~eDFe4~FL1iEVsI?BR5nVv(9lVtk-gV+BQiC>^QXownHE?wZnj~ih
zRdnDg2)qmcx?U2zqze>ke&D>4l~|St&Kk)%nc&fe&^*xG4`^5lI%f!4Obc391B;$K
zg%Z#-257?)XwRBnaT)^y19T1}u{ayNSShizBqJX@_mi0i-kPS6sGts;+EfRvRRYhi
zYoum^>k3d?7&K!9-uSKw8v+CM>Jrma)r&#uOAGW0Dj~zV;KB%$E?`c8j4FXkGH`T*
zW<3${3uX;uH~azv1H&;;B!k?{z^KFon#&9VEs6`u10_r^P^^NIFmyI99yH?xULpsc
zflCJUR6vCxDAGXwEB*r7C&vitDCIDK`cWl}p!}Kz-iQHh0WmXlfZDx`peg4pHc(rq
zhJm32JW0*i&cM*l2wHQI!phLb0P2O+urL(Gfa>`yc7{AQFoOfsA?sjdC_Vt@a)Jtu
z8t|r0P*aA9v6hpeLKoC50vQS_P~^e=IxdD<Zg6vj9n_$y;exeK3MVjxgC-^+t>rue
zLYhG<g%O(1f(M0z!6ia5sAJ&_+GCljkf>0VSpeSE2${YE?Q;b6^+9zrsIiffTBM*3
z3Qf>TBy~Lng^-L?1<1%Mc<(P<H+UglQYyH>N<q@1psk>!SCv_yq^F<|TAW&}08OwU
zOO&9iwv@m|1%OYzfHgKWGSd_i%MvqlKzT_Ml(a!QJoD1>qdWr?KsuEaK*xe)mQ*T$
z)IwuEH3e)IXsRy_yrnW9l-W`hpexQ5ic>+e|KNdRO+5t#&oqTRn1k~3b3jv%a7!V(
z_KOlTL9T|MLgHGHnhaj(p{Jk_lv+|+lvfPSub`n@(AYG{m5}g(hb(BSQ9%LRK=T7n
z-hr3Ez&E+7s}`$+i}A#i6j18}%rD7T$Sg?)rBzVc1*Kb1O<fEc=&fi3RU<C3m7rY$
z(B?N2v;@lnZ-}n}x7R_VNGvdMaFZW23cwC(XP2;oQ!;pFLtMU=6_nJAb3q9dw9<(M
zv_uKCE+~%y)SJuV0Ob?dtQ9*0Xcq#w2n4y#58UJguh>L#KBVuB=%s;nI77N>HK6PY
zZY+To3_=<#Q$e*1$eZ9rFI7RHSxs;?0}9h(NV5gBSSARxq7K|512<D)sS+Hd16@Rc
z-CLGfoLTY&R8E1~r3{RqeJw(aB8+T|!i?bIiRAp;f}+%7&@=_OaRzQ(K{EklMi&ug
zpiqE>4`>l-38-|7@(hS~adq=?3~_Y<x3WP3!6E)Zt}bAcqB0BIK+88lLvY}BBY3D5
zViQO|sQLh9Y*4rc{RYJZXr&}L{J<d!b6!vpNbVnq_yZz9dqsnOf>>Zj$$?m)bxhzu
z2S*6RG|)QJfvhH)85kI@gMuGCXu`q6B*Q4oB*ZDf$i^taD8nei$jbyG!Haak0Tv&h
zlAjzO4?figG%yb;P>S_ZL1zpVL+0#3eJO-YN@h_!NDb%=2?lV4fxA9%1>pDsCk3QN
z6sWR=^ckjs0uI#i2zmjkumnNl8}I{k^guI2MR|~31E{h>IX40_@(${ALDt-Yh91G&
zm64XBfD8anfdzr42fzsgAsYnhOMzWmTv?o)pO==I4n83WyaX1!>kXVjJwZG2OTYyj
z`1B>X*YptDKrO8x@akf4LIW=>1`U)4y#o2~HOOnA0t<YcOwc}%7-%3h2sES>1RCH7
z0=F|jzK0CyfLik4re+YRo)1a{=>SC~Bzb|_Z(!B{rYvyouz{@8umcr)#h{hkpm`}V
z(7HE99vEa2V3Glg2rw}-i81jq@iK}r@v?AoaB^|-iT!6#6lLb*<`m-OWoBdtEnQXN
M<l*EMV&P;20ROY}2><{9

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py b/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py
new file mode 100644
index 00000000..70730927
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py
@@ -0,0 +1,43 @@
+import distutils.command.bdist_rpm as orig
+
+
+class bdist_rpm(orig.bdist_rpm):
+    """
+    Override the default bdist_rpm behavior to do the following:
+
+    1. Run egg_info to ensure the name and version are properly calculated.
+    2. Always run 'install' using --single-version-externally-managed to
+       disable eggs in RPM distributions.
+    3. Replace dash with underscore in the version numbers for better RPM
+       compatibility.
+    """
+
+    def run(self):
+        # ensure distro name is up-to-date
+        self.run_command('egg_info')
+
+        orig.bdist_rpm.run(self)
+
+    def _make_spec_file(self):
+        version = self.distribution.get_version()
+        rpmversion = version.replace('-', '_')
+        spec = orig.bdist_rpm._make_spec_file(self)
+        line23 = '%define version ' + version
+        line24 = '%define version ' + rpmversion
+        spec = [
+            line.replace(
+                "Source0: %{name}-%{version}.tar",
+                "Source0: %{name}-%{unmangled_version}.tar"
+            ).replace(
+                "setup.py install ",
+                "setup.py install --single-version-externally-managed "
+            ).replace(
+                "%setup",
+                "%setup -n %{name}-%{unmangled_version}"
+            ).replace(line23, line24)
+            for line in spec
+        ]
+        insert_loc = spec.index(line24) + 1
+        unmangled_version = "%define unmangled_version " + version
+        spec.insert(insert_loc, unmangled_version)
+        return spec
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc b/venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b110298734a0b1be5a1acf72b7f2cb070b5bf030
GIT binary patch
literal 2130
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJBGcYiuFfgPrGUPBYWHB;iF)>6jGo&yvq%wop
zX^adh%nU6I49yG-kx@(_b-@}e3=9mJ|NsC0?^nXfz`&4{l3835UsR9_H=U7zfx!u6
zx&i|OLn;G96eGwEi1ro+s0APf3qw$_2FNYNX^adETnY*b3jSrOMMaq@sR|_-sR}8n
zX^EvdB?@pW6p~Ui63a64ixf)o6;krSiqi6Pa`MYF^U|%jz$O^#DFl_~DWs;S$7klH
z<%3kF<`tI~L5$2x%uQ8D%u7)yOD!tS%+FIuEJ{@<D9SHLEy}4>NKVX2F3m|SNlnoM
zn`NY@;FwdMSXr!4RGO!to|#u%l9-dDu25Q>nU}7hs|%uXQgxwb>84hcq!#5R=HyiB
z<|gJPrl+PTl;ndAQczGx$t+Gx%1H$|tXLs4Pa!D47bI3vl$lgol9``Z46)K!Pa!C^
zASW?7RUsv@I76X4vm`^IG%qE!s5m*lC>5j=6f{sP74k}RlTwR{71HvH6p~U)N>YnJ
z2E*)3&d)7KEXhpD%*iaNgqWWUiX9MUVqjo!2E~#h0|P@1149-#88kC8FqVMRK^8Me
z6vR(qU<lR#DfcVk0L3UYWWfocgqwkZp{O)3J~=-(H!&}z1e7}Ri!#%LKuN6x6uCvE
zc^V)K!BWMkIcXXoDKJr7#=yX!Ur>};mRORiUzS*;pO&8k@~VDzp?-F;k-52HVV043
znW2SwaZY7=dAv!AiHU)MfkAqneu#cSW`Qm=N_5K;ElUG4^ovtVN()Nz^K*)knNYXs
z!_$#oL1hrgq5L5KgBT1<yiDMb0i|eGSjZfNhfEeDC=1jwGSq;>CWR4{N1B-!YMB^H
zm>IHI7_wNQp;gNa$}%;K4C1vcU=|aDcr7bKIs-!uGlNU44MQy(Lk$}!bEU8_q_8qH
zGlAJ`3@Pj|HU~orCzM^o!cYTN6UW3*=*LjY3^FB)4J^pWkix|vUdzsq!VPkkcr6E5
zlAWQ3ouP&UWB_9gGefWj4+8^(UkNA%birhNu>b=DgKA1@T4r7<JRcOxGcYg&=a&{G
zry5u(s8)kAO0BMHH8i2s>XjrG6>DNwQ<|5Xn3tZDni7wqS`ZYvpa{_`s8oPPltQs7
zHc?`-QZXCI+29y1R)aGYbn}p0i|LX~kjIOqK<c4B#!#c60ZP^-pl||}Wv~nhPTJ|I
zB`{Bwu!E91ByR?R5;i1>gVIoZZen(7d~rc)a(r55PHG7#1!d-?q*j!G+?<(LoLW?(
z0ZLjyAQ`Yh(2y$O0vTG63*&+kBgh=E#+=N&R3l>q(*&G_K%!u65Od>m@{>zIL5<-r
za25j-1DVf21%xOl&c#64o{^tXh*5}<i;;_onahnyn30Q7fKdY+DxgS+j|Zi@_;|4Y
z;^TAkQ%ZAE<Kw|079XFIpBx_#&bUD!Q^8(C5CiE+kk`Ob2a0btPBtb^Hc0U(4XR)>
xi%UvNGINUcpaqd0ydVO53@QpvPT+)v@DrFdfF1)E_%@Jeumk5LP(2{T3;+QTHHH8H

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py b/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py
new file mode 100644
index 00000000..073de97b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py
@@ -0,0 +1,21 @@
+import distutils.command.bdist_wininst as orig
+
+
+class bdist_wininst(orig.bdist_wininst):
+    def reinitialize_command(self, command, reinit_subcommands=0):
+        """
+        Supplement reinitialize_command to work around
+        http://bugs.python.org/issue20819
+        """
+        cmd = self.distribution.reinitialize_command(
+            command, reinit_subcommands)
+        if command in ('install', 'install_lib'):
+            cmd.install_lib = None
+        return cmd
+
+    def run(self):
+        self._is_running = True
+        try:
+            orig.bdist_wininst.run(self)
+        finally:
+            self._is_running = False
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc b/venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a92cff995ced46424d31f9e8d3d68c59bc7ade3
GIT binary patch
literal 1407
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJBGcYiuFfgPrGUPBYWHB;iF)>6jGo&yvq%wop
zX^adh%nU6I49yG-kx@(_b-@}e3=9mJ|NsC0?^nXhz`&4{l3835U!IwlnO9r_w}FX)
zfx!u6gDe9BLn;G96eHB07Dfh;K};Z1qnH_jf;B*n$pkqp8N>pa4x*hwnhhBk7-|?8
zvcPVuVPvRbVrXV!sAXoT0Xr<4jiE@FA%%sZhM6IrnIVq>#0b`41!>J<U|`@<fP&!C
zf`XjX+|;}hg`(8Vyv&l!#GK5k)cEB5+}y;x6ory}h4TEOY=y+4{L;J>xVDUvk^(Dz
z{iM?LV!eXOl8pR3z5Jqd{mkOx(o`b@3qwn|$`W=^pyU;oB<AFla3k39Ihjcsps)yH
zWME(j0<rwS0a(HV3i-_9lA_F{(vr;lyb=)x1_o@7D*=UwUw&RHST{s7NT@h9Ck<>Z
z)DtB_a0B9tOOv3Y#U-G?OwLWw0EIA^D6V2)V9+lp$}CGPN!2e)EYeTQ&q+xwD%Q^~
z)Xy$9GB-CY%rY`BGqf--&Z$f<k2gs%F)=VOFi6kS5795kEYJnTbYf19Zh4|*X<&wa
zacW6vK}mjoPBAhQ>HvL|^r2T!83b}XIEuJHPGaR`<N?EEPzZrANDdtPdJGH<CEx@Q
z&&W_E!cfA*kj2c9#R5ta&5R6;;VBFZC9EJ`JR?Iy3Ijv121vi31{+8t$eNI%(o}GC
z#Ag=A7nSDaW#*-W!!y4qGd&1oJvexZO7luUwz?(e6sLmC2m%=a4lOV-&_Tw_z`!5?
zO4S@7H#2fFGBb)WL6QPUBtAYbF*h|nz62Da@$tF&DWy57@$ul04g%=~djdfWw0A(B
z07XwRh+t#n;f8oc9-1XeOEPnc^`PlT4<-Esf$|wR;(~Y>7#I*<0<#9#UnQWpuz`fW
N9VjIhgYvr&GXOPXUyJ|%

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_clib.py b/venv/lib/python2.7/site-packages/setuptools/command/build_clib.py
new file mode 100644
index 00000000..09caff6f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/build_clib.py
@@ -0,0 +1,98 @@
+import distutils.command.build_clib as orig
+from distutils.errors import DistutilsSetupError
+from distutils import log
+from setuptools.dep_util import newer_pairwise_group
+
+
+class build_clib(orig.build_clib):
+    """
+    Override the default build_clib behaviour to do the following:
+
+    1. Implement a rudimentary timestamp-based dependency system
+       so 'compile()' doesn't run every time.
+    2. Add more keys to the 'build_info' dictionary:
+        * obj_deps - specify dependencies for each object compiled.
+                     this should be a dictionary mapping a key
+                     with the source filename to a list of
+                     dependencies. Use an empty string for global
+                     dependencies.
+        * cflags   - specify a list of additional flags to pass to
+                     the compiler.
+    """
+
+    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)
+
+            # Make sure everything is the correct type.
+            # obj_deps should be a dictionary of keys as sources
+            # and a list/tuple of files that are its dependencies.
+            obj_deps = build_info.get('obj_deps', dict())
+            if not isinstance(obj_deps, dict):
+                raise DistutilsSetupError(
+                       "in 'libraries' option (library '%s'), "
+                       "'obj_deps' must be a dictionary of "
+                       "type 'source: list'" % lib_name)
+            dependencies = []
+
+            # Get the global dependencies that are specified by the '' key.
+            # These will go into every source's dependency list.
+            global_deps = obj_deps.get('', list())
+            if not isinstance(global_deps, (list, tuple)):
+                raise DistutilsSetupError(
+                       "in 'libraries' option (library '%s'), "
+                       "'obj_deps' must be a dictionary of "
+                       "type 'source: list'" % lib_name)
+
+            # Build the list to be used by newer_pairwise_group
+            # each source will be auto-added to its dependencies.
+            for source in sources:
+                src_deps = [source]
+                src_deps.extend(global_deps)
+                extra_deps = obj_deps.get(source, list())
+                if not isinstance(extra_deps, (list, tuple)):
+                    raise DistutilsSetupError(
+                           "in 'libraries' option (library '%s'), "
+                           "'obj_deps' must be a dictionary of "
+                           "type 'source: list'" % lib_name)
+                src_deps.extend(extra_deps)
+                dependencies.append(src_deps)
+
+            expected_objects = self.compiler.object_filenames(
+                    sources,
+                    output_dir=self.build_temp
+                    )
+
+            if newer_pairwise_group(dependencies, expected_objects) != ([], []):
+                # 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')
+                cflags = build_info.get('cflags')
+                objects = self.compiler.compile(
+                        sources,
+                        output_dir=self.build_temp,
+                        macros=macros,
+                        include_dirs=include_dirs,
+                        extra_postargs=cflags,
+                        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(
+                    expected_objects,
+                    lib_name,
+                    output_dir=self.build_clib,
+                    debug=self.debug
+                    )
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc b/venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f0d954588e00672d7da4dc16c30e2f5f536995f0
GIT binary patch
literal 3006
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_ext.py b/venv/lib/python2.7/site-packages/setuptools/command/build_ext.py
new file mode 100644
index 00000000..60a8a32f
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/build_ext.py
@@ -0,0 +1,321 @@
+import os
+import sys
+import itertools
+import imp
+from distutils.command.build_ext import build_ext as _du_build_ext
+from distutils.file_util import copy_file
+from distutils.ccompiler import new_compiler
+from distutils.sysconfig import customize_compiler, get_config_var
+from distutils.errors import DistutilsError
+from distutils import log
+
+from setuptools.extension import Library
+from setuptools.extern import six
+
+try:
+    # Attempt to use Cython for building extensions, if available
+    from Cython.Distutils.build_ext import build_ext as _build_ext
+    # Additionally, assert that the compiler module will load
+    # also. Ref #1229.
+    __import__('Cython.Compiler.Main')
+except ImportError:
+    _build_ext = _du_build_ext
+
+# make sure _config_vars is initialized
+get_config_var("LDSHARED")
+from distutils.sysconfig import _config_vars as _CONFIG_VARS
+
+
+def _customize_compiler_for_shlib(compiler):
+    if sys.platform == "darwin":
+        # building .dylib requires additional compiler flags on OSX; here we
+        # temporarily substitute the pyconfig.h variables so that distutils'
+        # 'customize_compiler' uses them before we build the shared libraries.
+        tmp = _CONFIG_VARS.copy()
+        try:
+            # XXX Help!  I don't have any idea whether these are right...
+            _CONFIG_VARS['LDSHARED'] = (
+                "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup")
+            _CONFIG_VARS['CCSHARED'] = " -dynamiclib"
+            _CONFIG_VARS['SO'] = ".dylib"
+            customize_compiler(compiler)
+        finally:
+            _CONFIG_VARS.clear()
+            _CONFIG_VARS.update(tmp)
+    else:
+        customize_compiler(compiler)
+
+
+have_rtld = False
+use_stubs = False
+libtype = 'shared'
+
+if sys.platform == "darwin":
+    use_stubs = True
+elif os.name != 'nt':
+    try:
+        import dl
+        use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW')
+    except ImportError:
+        pass
+
+if_dl = lambda s: s if have_rtld else ''
+
+
+def get_abi3_suffix():
+    """Return the file extension for an abi3-compliant Extension()"""
+    for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION):
+        if '.abi3' in suffix:  # Unix
+            return suffix
+        elif suffix == '.pyd':  # Windows
+            return suffix
+
+
+class build_ext(_build_ext):
+    def run(self):
+        """Build extensions in build directory, then copy if --inplace"""
+        old_inplace, self.inplace = self.inplace, 0
+        _build_ext.run(self)
+        self.inplace = old_inplace
+        if old_inplace:
+            self.copy_extensions_to_source()
+
+    def copy_extensions_to_source(self):
+        build_py = self.get_finalized_command('build_py')
+        for ext in self.extensions:
+            fullname = self.get_ext_fullname(ext.name)
+            filename = self.get_ext_filename(fullname)
+            modpath = fullname.split('.')
+            package = '.'.join(modpath[:-1])
+            package_dir = build_py.get_package_dir(package)
+            dest_filename = os.path.join(package_dir,
+                                         os.path.basename(filename))
+            src_filename = os.path.join(self.build_lib, filename)
+
+            # Always copy, even if source is older than destination, to ensure
+            # that the right extensions for the current Python/platform are
+            # used.
+            copy_file(
+                src_filename, dest_filename, verbose=self.verbose,
+                dry_run=self.dry_run
+            )
+            if ext._needs_stub:
+                self.write_stub(package_dir or os.curdir, ext, True)
+
+    def get_ext_filename(self, fullname):
+        filename = _build_ext.get_ext_filename(self, fullname)
+        if fullname in self.ext_map:
+            ext = self.ext_map[fullname]
+            use_abi3 = (
+                six.PY3
+                and getattr(ext, 'py_limited_api')
+                and get_abi3_suffix()
+            )
+            if use_abi3:
+                so_ext = get_config_var('EXT_SUFFIX')
+                filename = filename[:-len(so_ext)]
+                filename = filename + get_abi3_suffix()
+            if isinstance(ext, Library):
+                fn, ext = os.path.splitext(filename)
+                return self.shlib_compiler.library_filename(fn, libtype)
+            elif use_stubs and ext._links_to_dynamic:
+                d, fn = os.path.split(filename)
+                return os.path.join(d, 'dl-' + fn)
+        return filename
+
+    def initialize_options(self):
+        _build_ext.initialize_options(self)
+        self.shlib_compiler = None
+        self.shlibs = []
+        self.ext_map = {}
+
+    def finalize_options(self):
+        _build_ext.finalize_options(self)
+        self.extensions = self.extensions or []
+        self.check_extensions_list(self.extensions)
+        self.shlibs = [ext for ext in self.extensions
+                       if isinstance(ext, Library)]
+        if self.shlibs:
+            self.setup_shlib_compiler()
+        for ext in self.extensions:
+            ext._full_name = self.get_ext_fullname(ext.name)
+        for ext in self.extensions:
+            fullname = ext._full_name
+            self.ext_map[fullname] = ext
+
+            # distutils 3.1 will also ask for module names
+            # XXX what to do with conflicts?
+            self.ext_map[fullname.split('.')[-1]] = ext
+
+            ltd = self.shlibs and self.links_to_dynamic(ext) or False
+            ns = ltd and use_stubs and not isinstance(ext, Library)
+            ext._links_to_dynamic = ltd
+            ext._needs_stub = ns
+            filename = ext._file_name = self.get_ext_filename(fullname)
+            libdir = os.path.dirname(os.path.join(self.build_lib, filename))
+            if ltd and libdir not in ext.library_dirs:
+                ext.library_dirs.append(libdir)
+            if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs:
+                ext.runtime_library_dirs.append(os.curdir)
+
+    def setup_shlib_compiler(self):
+        compiler = self.shlib_compiler = new_compiler(
+            compiler=self.compiler, dry_run=self.dry_run, force=self.force
+        )
+        _customize_compiler_for_shlib(compiler)
+
+        if self.include_dirs is not None:
+            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:
+                compiler.define_macro(name, value)
+        if self.undef is not None:
+            for macro in self.undef:
+                compiler.undefine_macro(macro)
+        if self.libraries is not None:
+            compiler.set_libraries(self.libraries)
+        if self.library_dirs is not None:
+            compiler.set_library_dirs(self.library_dirs)
+        if self.rpath is not None:
+            compiler.set_runtime_library_dirs(self.rpath)
+        if self.link_objects is not None:
+            compiler.set_link_objects(self.link_objects)
+
+        # hack so distutils' build_extension() builds a library instead
+        compiler.link_shared_object = link_shared_object.__get__(compiler)
+
+    def get_export_symbols(self, ext):
+        if isinstance(ext, Library):
+            return ext.export_symbols
+        return _build_ext.get_export_symbols(self, ext)
+
+    def build_extension(self, ext):
+        ext._convert_pyx_sources_to_lang()
+        _compiler = self.compiler
+        try:
+            if isinstance(ext, Library):
+                self.compiler = self.shlib_compiler
+            _build_ext.build_extension(self, ext)
+            if ext._needs_stub:
+                cmd = self.get_finalized_command('build_py').build_lib
+                self.write_stub(cmd, ext)
+        finally:
+            self.compiler = _compiler
+
+    def links_to_dynamic(self, ext):
+        """Return true if 'ext' links to a dynamic lib in the same package"""
+        # XXX this should check to ensure the lib is actually being built
+        # XXX as dynamic, and not just using a locally-found version or a
+        # XXX static-compiled version
+        libnames = dict.fromkeys([lib._full_name for lib in self.shlibs])
+        pkg = '.'.join(ext._full_name.split('.')[:-1] + [''])
+        return any(pkg + libname in libnames for libname in ext.libraries)
+
+    def get_outputs(self):
+        return _build_ext.get_outputs(self) + self.__get_stubs_outputs()
+
+    def __get_stubs_outputs(self):
+        # assemble the base name for each extension that needs a stub
+        ns_ext_bases = (
+            os.path.join(self.build_lib, *ext._full_name.split('.'))
+            for ext in self.extensions
+            if ext._needs_stub
+        )
+        # pair each base with the extension
+        pairs = itertools.product(ns_ext_bases, self.__get_output_extensions())
+        return list(base + fnext for base, fnext in pairs)
+
+    def __get_output_extensions(self):
+        yield '.py'
+        yield '.pyc'
+        if self.get_finalized_command('build_py').optimize:
+            yield '.pyo'
+
+    def write_stub(self, output_dir, ext, compile=False):
+        log.info("writing stub loader for %s to %s", ext._full_name,
+                 output_dir)
+        stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) +
+                     '.py')
+        if compile and os.path.exists(stub_file):
+            raise DistutilsError(stub_file + " already exists! Please delete.")
+        if not self.dry_run:
+            f = open(stub_file, 'w')
+            f.write(
+                '\n'.join([
+                    "def __bootstrap__():",
+                    "   global __bootstrap__, __file__, __loader__",
+                    "   import sys, os, pkg_resources, imp" + if_dl(", dl"),
+                    "   __file__ = pkg_resources.resource_filename"
+                    "(__name__,%r)"
+                    % os.path.basename(ext._file_name),
+                    "   del __bootstrap__",
+                    "   if '__loader__' in globals():",
+                    "       del __loader__",
+                    if_dl("   old_flags = sys.getdlopenflags()"),
+                    "   old_dir = os.getcwd()",
+                    "   try:",
+                    "     os.chdir(os.path.dirname(__file__))",
+                    if_dl("     sys.setdlopenflags(dl.RTLD_NOW)"),
+                    "     imp.load_dynamic(__name__,__file__)",
+                    "   finally:",
+                    if_dl("     sys.setdlopenflags(old_flags)"),
+                    "     os.chdir(old_dir)",
+                    "__bootstrap__()",
+                    ""  # terminal \n
+                ])
+            )
+            f.close()
+        if compile:
+            from distutils.util import byte_compile
+
+            byte_compile([stub_file], optimize=0,
+                         force=True, dry_run=self.dry_run)
+            optimize = self.get_finalized_command('install_lib').optimize
+            if optimize > 0:
+                byte_compile([stub_file], optimize=optimize,
+                             force=True, dry_run=self.dry_run)
+            if os.path.exists(stub_file) and not self.dry_run:
+                os.unlink(stub_file)
+
+
+if use_stubs or os.name == 'nt':
+    # Build shared libraries
+    #
+    def link_shared_object(
+            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(
+            self.SHARED_LIBRARY, objects, output_libname,
+            output_dir, libraries, library_dirs, runtime_library_dirs,
+            export_symbols, debug, extra_preargs, extra_postargs,
+            build_temp, target_lang
+        )
+else:
+    # Build static libraries everywhere else
+    libtype = 'static'
+
+    def link_shared_object(
+            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):
+        # XXX we need to either disallow these attrs on Library instances,
+        # or warn/abort here if set, or something...
+        # libraries=None, library_dirs=None, runtime_library_dirs=None,
+        # export_symbols=None, extra_preargs=None, extra_postargs=None,
+        # build_temp=None
+
+        assert output_dir is None  # distutils build_ext doesn't pass this
+        output_dir, filename = os.path.split(output_libname)
+        basename, ext = os.path.splitext(filename)
+        if self.library_filename("x").startswith('lib'):
+            # strip 'lib' prefix; this is kludgy if some platform uses
+            # a different prefix
+            basename = basename[3:]
+
+        self.create_static_lib(
+            objects, basename, output_dir, debug, target_lang
+        )
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc b/venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4a1d013f603422721f17bee5511943a11ba47fa2
GIT binary patch
literal 13452
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
Va*ACLWnp9FWaMGw=VW7sumHA>4uSvx

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_py.py b/venv/lib/python2.7/site-packages/setuptools/command/build_py.py
new file mode 100644
index 00000000..b0314fd4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/build_py.py
@@ -0,0 +1,270 @@
+from glob import glob
+from distutils.util import convert_path
+import distutils.command.build_py as orig
+import os
+import fnmatch
+import textwrap
+import io
+import distutils.errors
+import itertools
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import map, filter, filterfalse
+
+try:
+    from setuptools.lib2to3_ex import Mixin2to3
+except ImportError:
+
+    class Mixin2to3:
+        def run_2to3(self, files, doctests=True):
+            "do nothing"
+
+
+class build_py(orig.build_py, Mixin2to3):
+    """Enhanced 'build_py' command that includes data files with packages
+
+    The data files are specified via a 'package_data' argument to 'setup()'.
+    See 'setuptools.dist.Distribution' for more details.
+
+    Also, this version of the 'build_py' command allows you to specify both
+    'py_modules' and 'packages' in the same setup operation.
+    """
+
+    def finalize_options(self):
+        orig.build_py.finalize_options(self)
+        self.package_data = self.distribution.package_data
+        self.exclude_package_data = (self.distribution.exclude_package_data or
+                                     {})
+        if 'data_files' in self.__dict__:
+            del self.__dict__['data_files']
+        self.__updated_files = []
+        self.__doctests_2to3 = []
+
+    def run(self):
+        """Build modules, packages, and copy data files to build directory"""
+        if not self.py_modules and not self.packages:
+            return
+
+        if self.py_modules:
+            self.build_modules()
+
+        if self.packages:
+            self.build_packages()
+            self.build_package_data()
+
+        self.run_2to3(self.__updated_files, False)
+        self.run_2to3(self.__updated_files, True)
+        self.run_2to3(self.__doctests_2to3, True)
+
+        # Only compile actual .py files, using our base class' idea of what our
+        # output files are.
+        self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0))
+
+    def __getattr__(self, attr):
+        "lazily compute data files"
+        if attr == 'data_files':
+            self.data_files = self._get_data_files()
+            return self.data_files
+        return orig.build_py.__getattr__(self, attr)
+
+    def build_module(self, module, module_file, package):
+        if six.PY2 and isinstance(package, six.string_types):
+            # avoid errors on Python 2 when unicode is passed (#190)
+            package = package.split('.')
+        outfile, copied = orig.build_py.build_module(self, module, module_file,
+                                                     package)
+        if copied:
+            self.__updated_files.append(outfile)
+        return outfile, copied
+
+    def _get_data_files(self):
+        """Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
+        self.analyze_manifest()
+        return list(map(self._get_pkg_data_files, self.packages or ()))
+
+    def _get_pkg_data_files(self, package):
+        # 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('.')))
+
+        # Strip directory from globbed filenames
+        filenames = [
+            os.path.relpath(file, src_dir)
+            for file in self.find_data_files(package, src_dir)
+        ]
+        return package, src_dir, build_dir, filenames
+
+    def find_data_files(self, package, src_dir):
+        """Return filenames for package's data files in 'src_dir'"""
+        patterns = self._get_platform_patterns(
+            self.package_data,
+            package,
+            src_dir,
+        )
+        globs_expanded = map(glob, patterns)
+        # flatten the expanded globs into an iterable of matches
+        globs_matches = itertools.chain.from_iterable(globs_expanded)
+        glob_files = filter(os.path.isfile, globs_matches)
+        files = itertools.chain(
+            self.manifest_files.get(package, []),
+            glob_files,
+        )
+        return self.exclude_data_files(package, src_dir, files)
+
+    def build_package_data(self):
+        """Copy data files into build directory"""
+        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))
+                srcfile = os.path.join(src_dir, filename)
+                outf, copied = self.copy_file(srcfile, target)
+                srcfile = os.path.abspath(srcfile)
+                if (copied and
+                        srcfile in self.distribution.convert_2to3_doctests):
+                    self.__doctests_2to3.append(outf)
+
+    def analyze_manifest(self):
+        self.manifest_files = mf = {}
+        if not self.distribution.include_package_data:
+            return
+        src_dirs = {}
+        for package in self.packages or ():
+            # Locate package source directory
+            src_dirs[assert_relative(self.get_package_dir(package))] = package
+
+        self.run_command('egg_info')
+        ei_cmd = self.get_finalized_command('egg_info')
+        for path in ei_cmd.filelist.files:
+            d, f = os.path.split(assert_relative(path))
+            prev = None
+            oldf = f
+            while d and d != prev and d not in src_dirs:
+                prev = d
+                d, df = os.path.split(d)
+                f = os.path.join(df, f)
+            if d in src_dirs:
+                if path.endswith('.py') and f == oldf:
+                    continue  # it's a module, not data
+                mf.setdefault(src_dirs[d], []).append(path)
+
+    def get_data_files(self):
+        pass  # Lazily compute data files in _get_data_files() function.
+
+    def check_package(self, package, package_dir):
+        """Check namespace packages' __init__ for declare_namespace"""
+        try:
+            return self.packages_checked[package]
+        except KeyError:
+            pass
+
+        init_py = orig.build_py.check_package(self, package, package_dir)
+        self.packages_checked[package] = init_py
+
+        if not init_py or not self.distribution.namespace_packages:
+            return init_py
+
+        for pkg in self.distribution.namespace_packages:
+            if pkg == package or pkg.startswith(package + '.'):
+                break
+        else:
+            return init_py
+
+        with io.open(init_py, 'rb') as f:
+            contents = f.read()
+        if b'declare_namespace' not in contents:
+            raise distutils.errors.DistutilsError(
+                "Namespace package problem: %s is a namespace package, but "
+                "its\n__init__.py does not call declare_namespace()! Please "
+                'fix it.\n(See the setuptools manual under '
+                '"Namespace Packages" for details.)\n"' % (package,)
+            )
+        return init_py
+
+    def initialize_options(self):
+        self.packages_checked = {}
+        orig.build_py.initialize_options(self)
+
+    def get_package_dir(self, package):
+        res = orig.build_py.get_package_dir(self, package)
+        if self.distribution.src_root is not None:
+            return os.path.join(self.distribution.src_root, res)
+        return res
+
+    def exclude_data_files(self, package, src_dir, files):
+        """Filter filenames for package's data files in 'src_dir'"""
+        files = list(files)
+        patterns = self._get_platform_patterns(
+            self.exclude_package_data,
+            package,
+            src_dir,
+        )
+        match_groups = (
+            fnmatch.filter(files, pattern)
+            for pattern in patterns
+        )
+        # flatten the groups of matches into an iterable of matches
+        matches = itertools.chain.from_iterable(match_groups)
+        bad = set(matches)
+        keepers = (
+            fn
+            for fn in files
+            if fn not in bad
+        )
+        # ditch dupes
+        return list(_unique_everseen(keepers))
+
+    @staticmethod
+    def _get_platform_patterns(spec, package, src_dir):
+        """
+        yield platform-specific path patterns (suitable for glob
+        or fn_match) from a glob-based spec (such as
+        self.package_data or self.exclude_package_data)
+        matching package in src_dir.
+        """
+        raw_patterns = itertools.chain(
+            spec.get('', []),
+            spec.get(package, []),
+        )
+        return (
+            # Each pattern has to be converted to a platform-specific path
+            os.path.join(src_dir, convert_path(pattern))
+            for pattern in raw_patterns
+        )
+
+
+# from Python docs
+def _unique_everseen(iterable, key=None):
+    "List unique elements, preserving order. Remember all elements ever seen."
+    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
+    # unique_everseen('ABBCcAD', str.lower) --> A B C D
+    seen = set()
+    seen_add = seen.add
+    if key is None:
+        for element in filterfalse(seen.__contains__, iterable):
+            seen_add(element)
+            yield element
+    else:
+        for element in iterable:
+            k = key(element)
+            if k not in seen:
+                seen_add(k)
+                yield element
+
+
+def assert_relative(path):
+    if not os.path.isabs(path):
+        return path
+    from distutils.errors import DistutilsSetupError
+
+    msg = textwrap.dedent("""
+        Error: setup script specifies an absolute path:
+
+            %s
+
+        setup() arguments must *always* be /-separated paths relative to the
+        setup.py directory, *never* absolute paths.
+        """).lstrip() % path
+    raise DistutilsSetupError(msg)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc b/venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..035e2a059ac8750680909722ab17413e3ed75b80
GIT binary patch
literal 11963
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
L#93u-@CX3_L^K<k

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/develop.py b/venv/lib/python2.7/site-packages/setuptools/command/develop.py
new file mode 100644
index 00000000..009e4f93
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/develop.py
@@ -0,0 +1,221 @@
+from distutils.util import convert_path
+from distutils import log
+from distutils.errors import DistutilsError, DistutilsOptionError
+import os
+import glob
+import io
+
+from setuptools.extern import six
+
+import pkg_resources
+from setuptools.command.easy_install import easy_install
+from setuptools import namespaces
+import setuptools
+
+__metaclass__ = type
+
+
+class develop(namespaces.DevelopInstaller, easy_install):
+    """Set up package for development"""
+
+    description = "install package in 'development mode'"
+
+    user_options = easy_install.user_options + [
+        ("uninstall", "u", "Uninstall this source package"),
+        ("egg-path=", None, "Set the path to be used in the .egg-link file"),
+    ]
+
+    boolean_options = easy_install.boolean_options + ['uninstall']
+
+    command_consumes_arguments = False  # override base
+
+    def run(self):
+        if self.uninstall:
+            self.multi_version = True
+            self.uninstall_link()
+            self.uninstall_namespaces()
+        else:
+            self.install_for_development()
+        self.warn_deprecated_options()
+
+    def initialize_options(self):
+        self.uninstall = None
+        self.egg_path = None
+        easy_install.initialize_options(self)
+        self.setup_path = None
+        self.always_copy_from = '.'  # always copy eggs installed in curdir
+
+    def finalize_options(self):
+        ei = self.get_finalized_command("egg_info")
+        if ei.broken_egg_info:
+            template = "Please rename %r to %r before using 'develop'"
+            args = ei.egg_info, ei.broken_egg_info
+            raise DistutilsError(template % args)
+        self.args = [ei.egg_name]
+
+        easy_install.finalize_options(self)
+        self.expand_basedirs()
+        self.expand_dirs()
+        # pick up setup-dir .egg files only: no .egg-info
+        self.package_index.scan(glob.glob('*.egg'))
+
+        egg_link_fn = ei.egg_name + '.egg-link'
+        self.egg_link = os.path.join(self.install_dir, egg_link_fn)
+        self.egg_base = ei.egg_base
+        if self.egg_path is None:
+            self.egg_path = os.path.abspath(ei.egg_base)
+
+        target = pkg_resources.normalize_path(self.egg_base)
+        egg_path = pkg_resources.normalize_path(
+            os.path.join(self.install_dir, self.egg_path))
+        if egg_path != target:
+            raise DistutilsOptionError(
+                "--egg-path must be a relative path from the install"
+                " directory to " + target
+            )
+
+        # Make a distribution for the package's source
+        self.dist = pkg_resources.Distribution(
+            target,
+            pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)),
+            project_name=ei.egg_name
+        )
+
+        self.setup_path = self._resolve_setup_path(
+            self.egg_base,
+            self.install_dir,
+            self.egg_path,
+        )
+
+    @staticmethod
+    def _resolve_setup_path(egg_base, install_dir, egg_path):
+        """
+        Generate a path from egg_base back to '.' where the
+        setup script resides and ensure that path points to the
+        setup path from $install_dir/$egg_path.
+        """
+        path_to_setup = egg_base.replace(os.sep, '/').rstrip('/')
+        if path_to_setup != os.curdir:
+            path_to_setup = '../' * (path_to_setup.count('/') + 1)
+        resolved = pkg_resources.normalize_path(
+            os.path.join(install_dir, egg_path, path_to_setup)
+        )
+        if resolved != pkg_resources.normalize_path(os.curdir):
+            raise DistutilsOptionError(
+                "Can't get a consistent path to setup script from"
+                " installation directory", resolved,
+                pkg_resources.normalize_path(os.curdir))
+        return path_to_setup
+
+    def install_for_development(self):
+        if six.PY3 and getattr(self.distribution, 'use_2to3', False):
+            # If we run 2to3 we can not do this inplace:
+
+            # Ensure metadata is up-to-date
+            self.reinitialize_command('build_py', inplace=0)
+            self.run_command('build_py')
+            bpy_cmd = self.get_finalized_command("build_py")
+            build_path = pkg_resources.normalize_path(bpy_cmd.build_lib)
+
+            # Build extensions
+            self.reinitialize_command('egg_info', egg_base=build_path)
+            self.run_command('egg_info')
+
+            self.reinitialize_command('build_ext', inplace=0)
+            self.run_command('build_ext')
+
+            # Fixup egg-link and easy-install.pth
+            ei_cmd = self.get_finalized_command("egg_info")
+            self.egg_path = build_path
+            self.dist.location = build_path
+            # XXX
+            self.dist._provider = pkg_resources.PathMetadata(
+                build_path, ei_cmd.egg_info)
+        else:
+            # Without 2to3 inplace works fine:
+            self.run_command('egg_info')
+
+            # Build extensions in-place
+            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
+
+        self.install_namespaces()
+
+        # create an .egg-link in the installation dir, pointing to our egg
+        log.info("Creating %s (link to %s)", self.egg_link, self.egg_base)
+        if not self.dry_run:
+            with open(self.egg_link, "w") as f:
+                f.write(self.egg_path + "\n" + self.setup_path)
+        # postprocess the installed distro, fixing up .pth, installing scripts,
+        # and handling requirements
+        self.process_distribution(None, self.dist, not self.no_deps)
+
+    def uninstall_link(self):
+        if os.path.exists(self.egg_link):
+            log.info("Removing %s (link to %s)", self.egg_link, self.egg_base)
+            egg_link_file = open(self.egg_link)
+            contents = [line.rstrip() for line in egg_link_file]
+            egg_link_file.close()
+            if contents not in ([self.egg_path],
+                                [self.egg_path, self.setup_path]):
+                log.warn("Link points to %s: uninstall aborted", contents)
+                return
+            if not self.dry_run:
+                os.unlink(self.egg_link)
+        if not self.dry_run:
+            self.update_pth(self.dist)  # remove any .pth link to us
+        if self.distribution.scripts:
+            # XXX should also check for entry point scripts!
+            log.warn("Note: you must uninstall or replace scripts manually!")
+
+    def install_egg_scripts(self, dist):
+        if dist is not self.dist:
+            # Installing a dependency, so fall back to normal behavior
+            return easy_install.install_egg_scripts(self, dist)
+
+        # create wrapper scripts in the script dir, pointing to dist.scripts
+
+        # new-style...
+        self.install_wrapper_scripts(dist)
+
+        # ...and old-style
+        for script_name in self.distribution.scripts or []:
+            script_path = os.path.abspath(convert_path(script_name))
+            script_name = os.path.basename(script_path)
+            with io.open(script_path) as strm:
+                script_text = strm.read()
+            self.install_script(dist, script_name, script_text, script_path)
+
+    def install_wrapper_scripts(self, dist):
+        dist = VersionlessRequirement(dist)
+        return easy_install.install_wrapper_scripts(self, dist)
+
+
+class VersionlessRequirement:
+    """
+    Adapt a pkg_resources.Distribution to simply return the project
+    name as the 'requirement' so that scripts will work across
+    multiple versions.
+
+    >>> from pkg_resources import Distribution
+    >>> dist = Distribution(project_name='foo', version='1.0')
+    >>> str(dist.as_requirement())
+    'foo==1.0'
+    >>> adapted_dist = VersionlessRequirement(dist)
+    >>> str(adapted_dist.as_requirement())
+    'foo'
+    """
+
+    def __init__(self, dist):
+        self.__dist = dist
+
+    def __getattr__(self, name):
+        return getattr(self.__dist, name)
+
+    def as_requirement(self):
+        return self.project_name
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/develop.pyc b/venv/lib/python2.7/site-packages/setuptools/command/develop.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9a7149a2f9af088fb5d91aabd63d0b1fac35d126
GIT binary patch
literal 8724
zcmZSn%*&NH<x)&C0~9bbFfceUFfbI~W?*1QVPHsMWXNG)$Yo@RVq{<h@tGKMm>6=I
z8KRgWd}f9m7KU6_hA38sTsDR%Hi#$-Lk>Gb6g$`i7KR)ShA0jgo0B1m6U=61$l+qh
z<z|TDhU?*Bh~fduu`%TEGUW0xMDao7*co#88FB>}q68p(77#y*pCMI{AxelLg@Ykg
zfFVnmA(f9Ijfo+Jlc9xyp_zdpGD?IYg^MADharU<E+op3!om=&!OOtFkoo`r|Nk0{
z3=9k<JPZsB$@zI@sYNC61&JjY5K&NQ<m9JoFoBftF)%Q=WEPi{mSpA>yA~DY7nO)0
z3;7q6Waj6ACHxTDi!&=A9FPsEiN%%inR&$}i8(nCQ7#4shP=ew)Z&7~<kaF4c2KCN
zmZj$87r>*0m4Si52^1yW3=9mZ44{}uVPJ@20>w=fGeas1Ll!GT3O_@NAVWG6gLo7x
zScsh=g^3}ZkwH9)ogtM29OmqxFo@y;1y>6LDA*wZ6~)7l$_ol7P@pk_f*cZBQT(8g
z1E~~XNZ|$R6=X=^12cpef`T=KK#r1QU|<MNEm0^fP$)=D&Q45ERY=P(Qb>V#A~!X!
zq*xUc)DTa@)nw)=s3WOS$jwhlRWIRWU|=ZCg9cCuC}K*BWf>S4LSbSGB^jB;3dQ-Q
zMaii!vx-5wQq$9QLGfl=tP6EeNd`zoNrpm6zCu!}LTPboib7_d0!Ua7q&g=vFIyok
zGbc3}WDf{~V%ZtwCr1Vbh8hNjECz-mO@<Oi5Idd;L}oFAk`*IJjs?uh;{pq_f;k{z
zHZUuNfgu<izkV8^7!Be8r5_ds28NKL($o@A(#tK)Danj4OD!tS%+D(UB`vtW<3TP1
zCoO~!QW6nIgl2qNeo;J9D3*Za$`gz7;!{!!ic*skOHxzf^TElo80?%9kQ<6qbJ8?G
z*&R$2moP9e=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-RHm25
zo1~bS7#J8Br03~}=oe%b=t84Qw>;6ZG%!QIIJKm-pd>#(rx=-;oS&PUn3tjtb*)}O
zWeF&A6_w^GfI=LUIT#o@895ob7<rkv7%}6-6qGZ-(Gt%HDk5qa7~+{2N|+h4SU^$G
z3@M&KqO72d0b;O$)CGexuOB!u>1lvs0~`o``FW|3XaU7dYI-_2*9U>}T8R)igfmMr
z6LT`FQegpD!Ub|D$a7$&B?1f#42e1AiIv6i$@vA9@o7c*x!^z!0?B~G7EBCS00)UO
zFfeF>91U_gBy@QhIU!*S3J5j^1_p3?pUVgi*eq~y-^|ER%g9i}$dJXzP~;3MMQWMA
zTnNbsDq(AxK_Oqm#8AV`AlA&t(8S1)#{gEu0xEMrfzQfN!p4xr4vQO5-rxY|4G@bH
z&f;Ro;s%wzSv(9W%nZ$pAjAl=oCQ=&i`TL+l<+cS@iAoagG|a2V5nhXXl4Sj;|0MM
z3W3>RGD{c~;n^GvMXzAGM4@V$A(>bh<jfK=hAeTAt}G#tZMCcn5D|2X7(g{jGZR=1
z8$%5nLk%lKHZwz!J!6RkLkcU1D-QQN$OuW05QrfKW<cBxaRJzrW+sLdHn4+0egKss
z@zP*-$bd<R9|XW`VTNXA5F=g|<fUM6y7eo8CDqKlw0v+m7m$;hSe&X*lnN>z6jX~8
zO7cNuQfgX$5va(^%u9zCv+Bj5#H|G?`@kh8h@lHAYKlR{ovtpZOazsn3c01lC7=>B
zQK2X`C$S{63|fwY5;(Z{gl2e!l+2>k<dXcNN|3cBJPZsB1x5K;smUerAm?a+YK9U}
z8ca_uiBHSS1LvlccxXvb!q33KkW`ePothU9%6=d}1xYY4Fa&{$VYpX8CV?|-Vo`cA
zBzuCg7tA<#<^-9RT2YXgmlB_pSe%-YSyWuY4XQ68VqiX~+=bRr@tJuksTE*@i<1-c
zz>M^q{G<|)<@v>6J}5B2jI8|3Jg{L<kH@EE7Qr0|3PCsrWOWdzQ4k~yD)B*?EHSAV
zY!KM;?DY7eR7mYr3@-HZ@{4l8;Q}sGf<Q$gI3PjojH1k>Qc#NmED(@blHr?Ll9-ZM
zk_dKGN@j6M3CI?(i8*Dd@!*0NVvZOC0|PkCfXgDVr&2S)t}IE-EyzhMNeu#3t6)!o
z0w3gw__VwdP>E2ISd^Yx0`>*C`~njLSBQa9kpZX>vjJ6EjQot8jBJcTjKYlkOuUR-
zj9g5TOuUTJj696|jM7X(jBJc@j696YjLeL@ENqO-jEao>%xsJxm<$SBP!<4TaIv=(
zUd@*<GGu|<Q_V~aS<ImN15^q!gNiqh6bm@tyMxNY8fI{73tUd6Ff)jY)G~w16mVGw
zQp>@R#R<yeHQ>Ur8C<5-vVe*$NO=fS!vZQ(Kt;(yh7vANIak91EiK`)&CIYum6;(}
z1LWl5tqcqdTnbR&o|>0hlvt9gkf;DkUJBsM35rTk5>!Y^OwLv)$yZR<Q&%X@NG(bQ
z<y*L3a6(ZiPA<wUC{ZX%EzV3yEmla(OHoM8D=r1AO)P<!S^!G<#UPVPGE&j>Bdk?H
z$`|@7AV+}Y^x*2jb+3LgDE#&G^fN(Ctzvgj-IJK7UZRkmTB4Asker`aoLO9wng_MH
zBwqo=nPC4x?MVdX3PkCn0m|p#mUB^RK~7?FYLE&j^MR}@PAveZ>7wEikY_>3JGrz7
zlzl-Vnw(#nR}!QRDsyx|1gM=Fqy}Pv^nwFD2vmOtse{Bo*&5t*19>jKBp;IBz?lk^
zr*q0uQ@~jTOblFp0p*n_P<{cG0SxSNjQosJjBJe3OcLN+!OSQDX#ju%08~DKbHV{e
z28I#_aE<?vp#)sLLb5>#3#cM0dI+kEK)nnmP%WJTO23St`YVeKlqW!KFHo%x?s9-K
z4kJSeEE{BTfzmpt1;GH$IIQ3*5L6w)4PXVS0Gr0jkiw2>0Xtlt9aQatEMR7+0Xs6D
z8_LMyVTk7i+sX$PVFooAAngQ@lmJ7XF4zlfP!mwC<6vlJggXaeoglcCQX&Lu2Nc<Y
zwTLi4xF9d5Fn~Dm;5G%w`(hB~;tW|5pe`s#ND^$R6etYA+NBwa7crK|fJG%iU9M&(
zhJGamNcoT@3l`@Fbymeey5$%^?F+{66b6RC2vGZqfgwvC)E)py@_-d9Fz_@(I^w|^
zpb8k$Mkp;#jW;UEHwGupq|(fsl=y;5a1P1L1Lu%TP+1D8Z9xef-0y;@ORXq@WKd95
z>|B(ZSORK8s1_?|fa(YZQ2U}-6P%&Ti$NKgOG6QqIY9jiaDzS|(im(}dTL2xNl6j7
z?gCX+@X8F7?%Wb{ic`TooTAjsJa|JJ)-nL)=c3X)SW6*D3S<L3n<6<jCo>6LPX+0N
zGCZhtl#`zfE**mOKzcxa04t9#D9SI(Oi3*Qw>qH3NPKZ-Nh&B{xIozj)UXHlT1r3}
zCn-O_q`0Igu>jUv2RHA*?GH%R4(TI+JM!Sx4y6Ac1PT&x^$c##fQkZe2?7q1l%mS`
zqEbj(BflUuuLKkn<wcn#sX-ts!QoL*l%JehTpW)QWT0%Cmk;XG6+;RoPzwlbWKuz8
zd~$9IxN8E5KTzQWF7i?{!7?BR4Tj!c5U7ir2MTC2P}*aZV-aTLW#nfRVisoPWfErO
zWd_ykJWOni63o0{F)l_<Mgc}1CN5@4MovaiMipjorx29VKp0$Z{RG83xZKKO0_O*C
zbz8KTp#(B00&ewZF@vSpz`3x59n1l%t7T+J2lrZBVuct$MHCZ57PyZR$HY+R!cfZ$
zs>idSeHDlyT+r@K78lqUZqSHJ8WTe{J44Ytu%$ep0<ne})JI`VVPFUbWmR5=;=SPF
zl@F{5Y&T=!UQoLMDt!|y0qf#`3KwX07i7p1Vkr6wGa8~b4?Hp#tN{uJzhY1#4@%9=
zFT;{ii&YpH7<@nj9f+D-wb)7lKCqyWn3P{slA2O%%D}+jmtT@<rBIn)3h4qM6y+Bw
zK&w`0tD#sSH!-g?F(;=|Q3KQl1=qMis-V~a)v>7+nZ+f=LEz*MN`OKBpxg*5X@UYl
zEDMlAQ0h<4$uCZYWMMIo7|2JU@r$4U5D#QjX&$KD0VnX%f|Nv1hAqhe=l38NkQz|l
zfV5<a!QlaE@PZoKpmqpIZ#-y>2b?E!GV@ZwMPhP(9;l^J400d?m>9VF8dPe}1LX@)
zLzjV3lu?qApHZHXi;;&>f>D5xg^`m{jFFR3n30Dm8Pque1q#U1;Pk%{)PjX1at4NM
zPKF|R&~OzbFVrxC5+OJNf)g?*RaMl16B;;k6xe}Mze{WuDCtAmrdb>eC7hu86VeX{
z_42{(T2N{SC%sxGh7xXuEFMt9xS5fmUl>+(@q+5UT2=-~T?I<je4xxz!vyLHgR%n)
z17o2*SQ<7k#t%vfpn@A*s)D;Ru!0#Bb<ju!4{5=~%Zm~V3Q~*Wp>p695EKV82b9ji
z=`TnN#03>G;Ft!rhQVD(P|#)OgOeXPEfl3Drht23FtZ_MYJh?loQA+@4BSD2$bd_E
zWInj01tr+xlA>H>iIUWc5^$md69bpBk{B2mHh@x=5GXhp`I!V*d6^{{B^ZUk5S*Go
z!2)XRf>V<WC_{k@L{J-x5hE#qN4NYmK<dGjWEf=hGAFgTI4HHSG_xobG~5f0&LGg}
zHF)F=5t!iM022cjCLm`W0)+`E;usit7{R^)4+I8rg2X}HV!Wfx5dVWmP+%h_wtnEj
z7|<v<XmlBrFcb(4I)jT%a1xCNr>yvRa2XdLpPQdjnv)tI53b+i<5TjJ<Kw}pD<!oU
z++)kk&jSZBxM@{doLU4M1A#P5K-nrOKR+imF%K@`3W``zD+=1eiU;+!N^?_-;}eV0
zOF@xV93%+JH=xm)AW%UBHoUkbu_QA&H?<@qKP3p%uK-u#L7);VC<&w-6q?`&MGylQ
zwV*-~l+ueq?q_3UV`5_h4FGU43ox-UadL99b87L6a2jw5aS8?HfM$C@xdMbiH57P$
z1yn(y&98uFKbS#PI*7pn>YIQVtf1KsPzowu$q4O}JEkNSfcmio$U{7O$iq0GBvG81
zTaZ(!P?TCyS_GMjfR31f`^un#N+Gcr)K^zfFGA!fb%o-5g_4ZK5_s)fo|%)QP@Z3u
zt&o^plwVv7)}9NRQYgqtRe;Va6zg$;#qI3uAj1PFZd1t2Eyyn_Q9yPgTsf%usbGsD
zrvY^-IJMfUr{(9X>%eTXRX5Z#P}hWOFD@z402!f|SR9Y!4-HL-5|CzFTaXsGjzm!K
zrKW(}y$ZGp*h?0$nGhpDegfHotPhWE>R^lDB_62M1DAN9c0vs!s7{QBwy8jg0XlmJ
zDhlGUyCfd$(7{)}K?@X6pDI578mK%2d6j_??sHJt4fZ*>3jrDR2M_i)Gr?!9Kw5%8
zih@c(!-!xmSUD)ggVN|A$nD?~F+LvJ%Z!h|iR4#M6v8mb8^xfK0n{WxOv-_zgCs$|
z1G7NB8w{QT^^s7s%pHWkAWf58P`L~0M+N1BSY;rh0z_1Td;==Z27yPw<?C^f(?NZ5
zHeNO+PG(MKh{M3`e2_;$1q661T@OSCft(KRtHZ@1ooP_qz=iZuLDTNV;3)#|U^%4Y
zp$rOuR8S=cs>Q(LhTyKeUTQ^2YEfPgDB*&~`AXzLj)Hgf^`P~k9`d|AxN;5h0T~Hu
z41!yWC6xt`Y1{bt+|-i9<ebFf;`n&*6rc-aqT3TPznxkX1WIk-0D$-x<S#I5z-mTt
mp<n}PSJ;8ldoidfAiyZVD8|SGf=mKTJd7Yd4-*@+%vJ!@DIb9V

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/dist_info.py b/venv/lib/python2.7/site-packages/setuptools/command/dist_info.py
new file mode 100644
index 00000000..c45258fa
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/dist_info.py
@@ -0,0 +1,36 @@
+"""
+Create a dist_info directory
+As defined in the wheel specification
+"""
+
+import os
+
+from distutils.core import Command
+from distutils import log
+
+
+class dist_info(Command):
+
+    description = 'create a .dist-info directory'
+
+    user_options = [
+        ('egg-base=', 'e', "directory containing .egg-info directories"
+                           " (default: top of the source tree)"),
+    ]
+
+    def initialize_options(self):
+        self.egg_base = None
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        egg_info = self.get_finalized_command('egg_info')
+        egg_info.egg_base = self.egg_base
+        egg_info.finalize_options()
+        egg_info.run()
+        dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info'
+        log.info("creating '{}'".format(os.path.abspath(dist_info_dir)))
+
+        bdist_wheel = self.get_finalized_command('bdist_wheel')
+        bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc b/venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2a314e1bb2faaf8bb4dcf48c6df6df7cc9e73a72
GIT binary patch
literal 2069
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJRFfcHrFfc?hFr+Xtq%bk$Ffv3jg4xUrIZO<>
z%nVV?42&Q-7KR)ahFn&LC{_l>6jp{*W`;CIh7>l276yi928PHeHjwsU4R(;JE({C|
zT+T(Qi6yBDi3%y1#U=5Xd1?6yDVas7$tC$km0XU+3Mr{+nR%%x3YmEdB^jv-<r%4|
zISR!EsmYmXnaPPInfZBKng9R)|L>>4$iTo*0y5Y+KQ}iqF9jk1@<UF3dI=}U3ot8C
zeCPynixC3@Ln;H<R}2hMObjXP4C#y@U!|~s+#bckkirUPutI$k#l{d6tib`&E6c#Z
zkPP#N9>^cMsQxGhS)Q7nuA7utoN8MFa%d_fOkqA%NY2kINzBa4%u83$1F1wYATzaC
zK_ewKEwMDG#7dzgzd#{B4ICQ9`K3k4sR|`Usi~UDAY(z8iGhK^8RRZrke3-4Y8V*e
z89~t(3=R=L4UmEo76t|ezx=$^5|9^C)6?TYZUZX-OBJW)q-lVX0hlN*V_;y=FDS|^
zODsv%FH0=aPs`6qNi8bY&o0!@E;ceZH!RFDGA}c<FfY!jOfQc&Nii`oFfcGk&(jal
zFUTy=&CDw<NzBR7El;#84b0FlPAw@dD9O*yDMn@{Ln2Ne6olZUpjS{?BE-PJkeQcR
zl9`y3S(O@}UjT~pVo{I>K^|dXgnJz1d9cSpeoJ9sfcY2f4Ul9I8v_Fa*h64qAblmk
zz`&4}nTO&h2{b=}yaB>sKlL+!V=@bz1)CWeY8gQho5jdb!w8Dr8b*dJCQue*1hJUm
zEEa|mR#28}W@O-2NMU9WuVrE=VPnW*XGmdT$l_oq;bh3-V#wlVs9|DgW`rWf8U_ZC
zMXVrxEi*$6GeZ^+$f7J3usS9NMsV<gg3}M4fIvwWoYLV5xR{H9fdP>ria`kyoKZl@
zT)nzhy@Z>AfguST-QbL^0a8%{ire(ml6YA7q{KrLMi46l149rf!Iprsbx~<v5GN?p
zgE%><c|o8!2B%(-Q%XRtOUp0HO)Mz^C6xSPuv9@}Nd~x-NK7gQvq8qCrl%W$T%iF9
zZg47r7z}a_NF1CP<5Mz=f<Qh3Cmt{{fGH@5hk=1X8kAx{Nr{1xpOJ@=i;;^_f>DWy
zpHTx8B;d#Z6(*ppZ5sp@0+-}eEOo#oIXDT#$LA&HrpCvYfPyGKJ~uz5GzY{5MR7`M
zadJ^6IOmpt++A9nS_I3<L7*ZV9I0S0fx{I+3}gs{QVqzp;AG6k#Kz3Y!pY3Z4Dm9^
z)$#Eu`N{F|L7*5Y;RBVnnZ+fgC7C(Jddc}ksX?HE2VU`j#lcB52xKtAi(u9O`V$;`
XHjwzT17(0>P?lh0;$aeC6krAbglq;c

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/easy_install.py b/venv/lib/python2.7/site-packages/setuptools/command/easy_install.py
new file mode 100644
index 00000000..06c98271
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/easy_install.py
@@ -0,0 +1,2342 @@
+#!/usr/bin/env python
+"""
+Easy Install
+------------
+
+A tool for doing automatic download/extract/build of distutils-based Python
+packages.  For detailed documentation, see the accompanying EasyInstall.txt
+file, or visit the `EasyInstall home page`__.
+
+__ https://setuptools.readthedocs.io/en/latest/easy_install.html
+
+"""
+
+from glob import glob
+from distutils.util import get_platform
+from distutils.util import convert_path, subst_vars
+from distutils.errors import (
+    DistutilsArgError, DistutilsOptionError,
+    DistutilsError, DistutilsPlatformError,
+)
+from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS
+from distutils import log, dir_util
+from distutils.command.build_scripts import first_line_re
+from distutils.spawn import find_executable
+import sys
+import os
+import zipimport
+import shutil
+import tempfile
+import zipfile
+import re
+import stat
+import random
+import textwrap
+import warnings
+import site
+import struct
+import contextlib
+import subprocess
+import shlex
+import io
+
+
+from sysconfig import get_config_vars, get_path
+
+from setuptools import SetuptoolsDeprecationWarning
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import configparser, map
+
+from setuptools import Command
+from setuptools.sandbox import run_setup
+from setuptools.py27compat import rmtree_safe
+from setuptools.command import setopt
+from setuptools.archive_util import unpack_archive
+from setuptools.package_index import (
+    PackageIndex, parse_requirement_arg, URL_SCHEME,
+)
+from setuptools.command import bdist_egg, egg_info
+from setuptools.wheel import Wheel
+from pkg_resources import (
+    yield_lines, normalize_path, resource_string, ensure_directory,
+    get_distribution, find_distributions, Environment, Requirement,
+    Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound,
+    VersionConflict, DEVELOP_DIST,
+)
+import pkg_resources.py31compat
+
+__metaclass__ = type
+
+# Turn on PEP440Warnings
+warnings.filterwarnings("default", category=pkg_resources.PEP440Warning)
+
+__all__ = [
+    'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg',
+    'main', 'get_exe_prefixes',
+]
+
+
+def is_64bit():
+    return struct.calcsize("P") == 8
+
+
+def samefile(p1, p2):
+    """
+    Determine if two paths reference the same file.
+
+    Augments os.path.samefile to work on Windows and
+    suppresses errors if the path doesn't exist.
+    """
+    both_exist = os.path.exists(p1) and os.path.exists(p2)
+    use_samefile = hasattr(os.path, 'samefile') and both_exist
+    if use_samefile:
+        return os.path.samefile(p1, p2)
+    norm_p1 = os.path.normpath(os.path.normcase(p1))
+    norm_p2 = os.path.normpath(os.path.normcase(p2))
+    return norm_p1 == norm_p2
+
+
+if six.PY2:
+
+    def _to_bytes(s):
+        return s
+
+    def isascii(s):
+        try:
+            six.text_type(s, 'ascii')
+            return True
+        except UnicodeError:
+            return False
+else:
+
+    def _to_bytes(s):
+        return s.encode('utf8')
+
+    def isascii(s):
+        try:
+            s.encode('ascii')
+            return True
+        except UnicodeError:
+            return False
+
+
+_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ')
+
+
+class easy_install(Command):
+    """Manage a download/build/install process"""
+    description = "Find/get/install Python packages"
+    command_consumes_arguments = True
+
+    user_options = [
+        ('prefix=', None, "installation prefix"),
+        ("zip-ok", "z", "install package as a zipfile"),
+        ("multi-version", "m", "make apps have to require() a version"),
+        ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"),
+        ("install-dir=", "d", "install package to DIR"),
+        ("script-dir=", "s", "install scripts to DIR"),
+        ("exclude-scripts", "x", "Don't install scripts"),
+        ("always-copy", "a", "Copy all needed packages to install dir"),
+        ("index-url=", "i", "base URL of Python Package Index"),
+        ("find-links=", "f", "additional URL(s) to search for packages"),
+        ("build-directory=", "b",
+         "download/extract/build in DIR; keep the results"),
+        ('optimize=', 'O',
+         "also compile with optimization: -O1 for \"python -O\", "
+         "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
+        ('record=', None,
+         "filename in which to record list of installed files"),
+        ('always-unzip', 'Z', "don't install as a zipfile, no matter what"),
+        ('site-dirs=', 'S', "list of directories where .pth files work"),
+        ('editable', 'e', "Install specified packages in editable form"),
+        ('no-deps', 'N', "don't install dependencies"),
+        ('allow-hosts=', 'H', "pattern(s) that hostnames must match"),
+        ('local-snapshots-ok', 'l',
+         "allow building eggs from local checkouts"),
+        ('version', None, "print version information and exit"),
+        ('no-find-links', None,
+         "Don't load find-links defined in packages being installed")
+    ]
+    boolean_options = [
+        'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy',
+        'editable',
+        'no-deps', 'local-snapshots-ok', 'version'
+    ]
+
+    if site.ENABLE_USER_SITE:
+        help_msg = "install in user site-package '%s'" % site.USER_SITE
+        user_options.append(('user', None, help_msg))
+        boolean_options.append('user')
+
+    negative_opt = {'always-unzip': 'zip-ok'}
+    create_index = PackageIndex
+
+    def initialize_options(self):
+        # the --user option seems to be an opt-in one,
+        # so the default should be False.
+        self.user = 0
+        self.zip_ok = self.local_snapshots_ok = None
+        self.install_dir = self.script_dir = self.exclude_scripts = None
+        self.index_url = None
+        self.find_links = None
+        self.build_directory = None
+        self.args = None
+        self.optimize = self.record = None
+        self.upgrade = self.always_copy = self.multi_version = None
+        self.editable = self.no_deps = self.allow_hosts = None
+        self.root = self.prefix = self.no_report = None
+        self.version = None
+        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_base = None
+        self.install_platbase = None
+        if site.ENABLE_USER_SITE:
+            self.install_userbase = site.USER_BASE
+            self.install_usersite = site.USER_SITE
+        else:
+            self.install_userbase = None
+            self.install_usersite = None
+        self.no_find_links = None
+
+        # Options not specifiable via command line
+        self.package_index = None
+        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"
+        # section, even if this is a "develop" or "install" command, or some
+        # other embedding.
+        self._dry_run = None
+        self.verbose = self.distribution.verbose
+        self.distribution._set_command_options(
+            self, self.distribution.get_option_dict('easy_install')
+        )
+
+    def delete_blockers(self, blockers):
+        extant_blockers = (
+            filename for filename in blockers
+            if os.path.exists(filename) or os.path.islink(filename)
+        )
+        list(map(self._delete_path, extant_blockers))
+
+    def _delete_path(self, path):
+        log.info("Deleting %s", path)
+        if self.dry_run:
+            return
+
+        is_tree = os.path.isdir(path) and not os.path.islink(path)
+        remover = rmtree if is_tree else os.unlink
+        remover(path)
+
+    @staticmethod
+    def _render_version():
+        """
+        Render the Setuptools version and installation details, then exit.
+        """
+        ver = sys.version[:3]
+        dist = get_distribution('setuptools')
+        tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})'
+        print(tmpl.format(**locals()))
+        raise SystemExit()
+
+    def finalize_options(self):
+        self.version and self._render_version()
+
+        py_version = sys.version.split()[0]
+        prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix')
+
+        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': py_version[0:3],
+            'py_version_nodot': py_version[0] + py_version[2],
+            'sys_prefix': prefix,
+            'prefix': prefix,
+            'sys_exec_prefix': exec_prefix,
+            'exec_prefix': exec_prefix,
+            # Only python 3.2+ has abiflags
+            'abiflags': getattr(sys, 'abiflags', ''),
+        }
+
+        if site.ENABLE_USER_SITE:
+            self.config_vars['userbase'] = self.install_userbase
+            self.config_vars['usersite'] = self.install_usersite
+
+        self._fix_install_dir_for_user_site()
+
+        self.expand_basedirs()
+        self.expand_dirs()
+
+        self._expand(
+            'install_dir', 'script_dir', 'build_directory',
+            'site_dirs',
+        )
+        # If a non-default installation directory was specified, default the
+        # script directory to match it.
+        if self.script_dir is None:
+            self.script_dir = self.install_dir
+
+        if self.no_find_links is None:
+            self.no_find_links = False
+
+        # Let install_dir get set by install_lib command, which in turn
+        # gets its info from the install command, and takes into account
+        # --prefix and --home and all that other crud.
+        self.set_undefined_options(
+            'install_lib', ('install_dir', 'install_dir')
+        )
+        # Likewise, set default script_dir from 'install_scripts.install_dir'
+        self.set_undefined_options(
+            'install_scripts', ('install_dir', 'script_dir')
+        )
+
+        if self.user and self.install_purelib:
+            self.install_dir = self.install_purelib
+            self.script_dir = self.install_scripts
+        # default --record from the install command
+        self.set_undefined_options('install', ('record', 'record'))
+        # Should this be moved to the if statement below? It's not used
+        # elsewhere
+        normpath = map(normalize_path, sys.path)
+        self.all_site_dirs = get_site_dirs()
+        if self.site_dirs is not None:
+            site_dirs = [
+                os.path.expanduser(s.strip()) for s in
+                self.site_dirs.split(',')
+            ]
+            for d in site_dirs:
+                if not os.path.isdir(d):
+                    log.warn("%s (in --site-dirs) does not exist", d)
+                elif normalize_path(d) not in normpath:
+                    raise DistutilsOptionError(
+                        d + " (in --site-dirs) is not on sys.path"
+                    )
+                else:
+                    self.all_site_dirs.append(normalize_path(d))
+        if not self.editable:
+            self.check_site_dir()
+        self.index_url = self.index_url or "https://pypi.org/simple/"
+        self.shadow_path = self.all_site_dirs[:]
+        for path_item in self.install_dir, normalize_path(self.script_dir):
+            if path_item not in self.shadow_path:
+                self.shadow_path.insert(0, path_item)
+
+        if self.allow_hosts is not None:
+            hosts = [s.strip() for s in self.allow_hosts.split(',')]
+        else:
+            hosts = ['*']
+        if self.package_index is None:
+            self.package_index = self.create_index(
+                self.index_url, search_path=self.shadow_path, hosts=hosts,
+            )
+        self.local_index = Environment(self.shadow_path + sys.path)
+
+        if self.find_links is not None:
+            if isinstance(self.find_links, six.string_types):
+                self.find_links = self.find_links.split()
+        else:
+            self.find_links = []
+        if self.local_snapshots_ok:
+            self.package_index.scan_egg_links(self.shadow_path + sys.path)
+        if not self.no_find_links:
+            self.package_index.add_find_links(self.find_links)
+        self.set_undefined_options('install_lib', ('optimize', 'optimize'))
+        if not isinstance(self.optimize, int):
+            try:
+                self.optimize = int(self.optimize)
+                if not (0 <= self.optimize <= 2):
+                    raise ValueError
+            except ValueError:
+                raise DistutilsOptionError("--optimize must be 0, 1, or 2")
+
+        if self.editable and not self.build_directory:
+            raise DistutilsArgError(
+                "Must specify a build directory (-b) when using --editable"
+            )
+        if not self.args:
+            raise DistutilsArgError(
+                "No urls, filenames, or requirements specified (see --help)")
+
+        self.outputs = []
+
+    def _fix_install_dir_for_user_site(self):
+        """
+        Fix the install_dir if "--user" was used.
+        """
+        if not self.user or not site.ENABLE_USER_SITE:
+            return
+
+        self.create_home_path()
+        if self.install_userbase is None:
+            msg = "User base directory is not specified"
+            raise DistutilsPlatformError(msg)
+        self.install_base = self.install_platbase = self.install_userbase
+        scheme_name = os.name.replace('posix', 'unix') + '_user'
+        self.select_scheme(scheme_name)
+
+    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."""
+        dirs = [
+            'install_purelib',
+            'install_platlib',
+            'install_lib',
+            'install_headers',
+            'install_scripts',
+            'install_data',
+        ]
+        self._expand_attrs(dirs)
+
+    def run(self):
+        if self.verbose != self.distribution.verbose:
+            log.set_verbosity(self.verbose)
+        try:
+            for spec in self.args:
+                self.easy_install(spec, not self.no_deps)
+            if self.record:
+                outputs = self.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:]
+                from distutils import file_util
+
+                self.execute(
+                    file_util.write_file, (self.record, outputs),
+                    "writing list of installed files to '%s'" %
+                    self.record
+                )
+            self.warn_deprecated_options()
+        finally:
+            log.set_verbosity(self.distribution.verbose)
+
+    def pseudo_tempname(self):
+        """Return a pseudo-tempname base in the install directory.
+        This code is intentionally naive; if a malicious party can write to
+        the target directory you're already in deep doodoo.
+        """
+        try:
+            pid = os.getpid()
+        except Exception:
+            pid = random.randint(0, sys.maxsize)
+        return os.path.join(self.install_dir, "test-easy-install-%s" % pid)
+
+    def warn_deprecated_options(self):
+        pass
+
+    def check_site_dir(self):
+        """Verify that self.install_dir is .pth-capable dir, if needed"""
+
+        instdir = normalize_path(self.install_dir)
+        pth_file = os.path.join(instdir, 'easy-install.pth')
+
+        # Is it a configured, PYTHONPATH, implicit, or explicit site dir?
+        is_site_dir = instdir in self.all_site_dirs
+
+        if not is_site_dir and not self.multi_version:
+            # No?  Then directly test whether it does .pth file processing
+            is_site_dir = self.check_pth_processing()
+        else:
+            # make sure we can write to target dir
+            testfile = self.pseudo_tempname() + '.write-test'
+            test_exists = os.path.exists(testfile)
+            try:
+                if test_exists:
+                    os.unlink(testfile)
+                open(testfile, 'w').close()
+                os.unlink(testfile)
+            except (OSError, IOError):
+                self.cant_write_to_target()
+
+        if not is_site_dir and not self.multi_version:
+            # Can't install non-multi to non-site dir
+            raise DistutilsError(self.no_default_version_msg())
+
+        if is_site_dir:
+            if self.pth_file is None:
+                self.pth_file = PthDistributions(pth_file, self.all_site_dirs)
+        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
+        self.install_dir = instdir
+
+    __cant_write_msg = textwrap.dedent("""
+        can't create or remove files in install directory
+
+        The following error occurred while trying to add or remove files in the
+        installation directory:
+
+            %s
+
+        The installation directory you specified (via --install-dir, --prefix, or
+        the distutils default setting) was:
+
+            %s
+        """).lstrip()
+
+    __not_exists_id = textwrap.dedent("""
+        This directory does not currently exist.  Please create it and try again, or
+        choose a different installation directory (using the -d or --install-dir
+        option).
+        """).lstrip()
+
+    __access_msg = textwrap.dedent("""
+        Perhaps your account does not have write access to this directory?  If the
+        installation directory is a system-owned directory, you may need to sign in
+        as the administrator or "root" account.  If you do not have administrative
+        access to this machine, you may wish to choose a different installation
+        directory, preferably one that is listed in your PYTHONPATH environment
+        variable.
+
+        For information on other options, you may wish to consult the
+        documentation at:
+
+          https://setuptools.readthedocs.io/en/latest/easy_install.html
+
+        Please make the appropriate changes for your system and try again.
+        """).lstrip()
+
+    def cant_write_to_target(self):
+        msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,)
+
+        if not os.path.exists(self.install_dir):
+            msg += '\n' + self.__not_exists_id
+        else:
+            msg += '\n' + self.__access_msg
+        raise DistutilsError(msg)
+
+    def check_pth_processing(self):
+        """Empirically verify whether .pth files are supported in inst. dir"""
+        instdir = self.install_dir
+        log.info("Checking .pth file support in %s", instdir)
+        pth_file = self.pseudo_tempname() + ".pth"
+        ok_file = pth_file + '.ok'
+        ok_exists = os.path.exists(ok_file)
+        tmpl = _one_liner("""
+            import os
+            f = open({ok_file!r}, 'w')
+            f.write('OK')
+            f.close()
+            """) + '\n'
+        try:
+            if ok_exists:
+                os.unlink(ok_file)
+            dirname = os.path.dirname(ok_file)
+            pkg_resources.py31compat.makedirs(dirname, exist_ok=True)
+            f = open(pth_file, 'w')
+        except (OSError, IOError):
+            self.cant_write_to_target()
+        else:
+            try:
+                f.write(tmpl.format(**locals()))
+                f.close()
+                f = None
+                executable = sys.executable
+                if os.name == 'nt':
+                    dirname, basename = os.path.split(executable)
+                    alt = os.path.join(dirname, 'pythonw.exe')
+                    use_alt = (
+                        basename.lower() == 'python.exe' and
+                        os.path.exists(alt)
+                    )
+                    if use_alt:
+                        # use pythonw.exe to avoid opening a console window
+                        executable = alt
+
+                from distutils.spawn import spawn
+
+                spawn([executable, '-E', '-c', 'pass'], 0)
+
+                if os.path.exists(ok_file):
+                    log.info(
+                        "TEST PASSED: %s appears to support .pth files",
+                        instdir
+                    )
+                    return True
+            finally:
+                if f:
+                    f.close()
+                if os.path.exists(ok_file):
+                    os.unlink(ok_file)
+                if os.path.exists(pth_file):
+                    os.unlink(pth_file)
+        if not self.multi_version:
+            log.warn("TEST FAILED: %s does NOT support .pth files", instdir)
+        return False
+
+    def install_egg_scripts(self, dist):
+        """Write all the scripts for `dist`, unless scripts are excluded"""
+        if not self.exclude_scripts and dist.metadata_isdir('scripts'):
+            for script_name in dist.metadata_listdir('scripts'):
+                if dist.metadata_isdir('scripts/' + script_name):
+                    # The "script" is a directory, likely a Python 3
+                    # __pycache__ directory, so skip it.
+                    continue
+                self.install_script(
+                    dist, script_name,
+                    dist.get_metadata('scripts/' + script_name)
+                )
+        self.install_wrapper_scripts(dist)
+
+    def add_output(self, path):
+        if os.path.isdir(path):
+            for base, dirs, files in os.walk(path):
+                for filename in files:
+                    self.outputs.append(os.path.join(base, filename))
+        else:
+            self.outputs.append(path)
+
+    def not_editable(self, spec):
+        if self.editable:
+            raise DistutilsArgError(
+                "Invalid argument %r: you can't use filenames or URLs "
+                "with --editable (except via the --find-links option)."
+                % (spec,)
+            )
+
+    def check_editable(self, spec):
+        if not self.editable:
+            return
+
+        if os.path.exists(os.path.join(self.build_directory, spec.key)):
+            raise DistutilsArgError(
+                "%r already exists in %s; can't do a checkout there" %
+                (spec.key, self.build_directory)
+            )
+
+    @contextlib.contextmanager
+    def _tmpdir(self):
+        tmpdir = tempfile.mkdtemp(prefix=u"easy_install-")
+        try:
+            # cast to str as workaround for #709 and #710 and #712
+            yield str(tmpdir)
+        finally:
+            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):
+                    # It's a url, download it to tmpdir and process
+                    self.not_editable(spec)
+                    dl = self.package_index.download(spec, tmpdir)
+                    return self.install_item(None, dl, tmpdir, deps, True)
+
+                elif os.path.exists(spec):
+                    # Existing file or directory, just process it directly
+                    self.not_editable(spec)
+                    return self.install_item(None, spec, tmpdir, deps, True)
+                else:
+                    spec = parse_requirement_arg(spec)
+
+            self.check_editable(spec)
+            dist = self.package_index.fetch_distribution(
+                spec, tmpdir, self.upgrade, self.editable,
+                not self.always_copy, self.local_index
+            )
+            if dist is None:
+                msg = "Could not find suitable distribution for %r" % spec
+                if self.always_copy:
+                    msg += " (--always-copy skips system and development eggs)"
+                raise DistutilsError(msg)
+            elif dist.precedence == DEVELOP_DIST:
+                # .egg-info dists don't need installing, just process deps
+                self.process_distribution(spec, dist, deps, "Using")
+                return dist
+            else:
+                return self.install_item(spec, dist.location, tmpdir, deps)
+
+    def install_item(self, spec, download, tmpdir, deps, install_needed=False):
+
+        # Installation is also needed if file in tmpdir or is not an egg
+        install_needed = install_needed or self.always_copy
+        install_needed = install_needed or os.path.dirname(download) == tmpdir
+        install_needed = install_needed or not download.endswith('.egg')
+        install_needed = install_needed or (
+            self.always_copy_from is not None and
+            os.path.dirname(normalize_path(download)) ==
+            normalize_path(self.always_copy_from)
+        )
+
+        if spec and not install_needed:
+            # at this point, we know it's a local .egg, we just don't know if
+            # it's already installed.
+            for dist in self.local_index[spec.project_name]:
+                if dist.location == download:
+                    break
+            else:
+                install_needed = True  # it's not in the local index
+
+        log.info("Processing %s", os.path.basename(download))
+
+        if install_needed:
+            dists = self.install_eggs(spec, download, tmpdir)
+            for dist in dists:
+                self.process_distribution(spec, dist, deps)
+        else:
+            dists = [self.egg_distribution(download)]
+            self.process_distribution(spec, dists[0], deps, "Using")
+
+        if spec is not None:
+            for dist in dists:
+                if dist in spec:
+                    return dist
+
+    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!
+        scheme = INSTALL_SCHEMES[name]
+        for key in SCHEME_KEYS:
+            attrname = 'install_' + key
+            if getattr(self, attrname) is None:
+                setattr(self, attrname, scheme[key])
+
+    def process_distribution(self, requirement, dist, deps=True, *info):
+        self.update_pth(dist)
+        self.package_index.add(dist)
+        if dist in self.local_index[dist.key]:
+            self.local_index.remove(dist)
+        self.local_index.add(dist)
+        self.install_egg_scripts(dist)
+        self.installed_projects[dist.key] = dist
+        log.info(self.installation_report(requirement, dist, *info))
+        if (dist.has_metadata('dependency_links.txt') and
+                not self.no_find_links):
+            self.package_index.add_find_links(
+                dist.get_metadata_lines('dependency_links.txt')
+            )
+        if not deps and not self.always_copy:
+            return
+        elif requirement is not None and dist.key != requirement.key:
+            log.warn("Skipping dependencies for %s", dist)
+            return  # XXX this is not the distribution we were looking for
+        elif requirement is None or dist not in requirement:
+            # if we wound up with a different version, resolve what we've got
+            distreq = dist.as_requirement()
+            requirement = Requirement(str(distreq))
+        log.info("Processing dependencies for %s", requirement)
+        try:
+            distros = WorkingSet([]).resolve(
+                [requirement], self.local_index, self.easy_install
+            )
+        except DistributionNotFound as e:
+            raise DistutilsError(str(e))
+        except VersionConflict as e:
+            raise DistutilsError(e.report())
+        if self.always_copy or self.always_copy_from:
+            # Force all the relevant distros to be copied or activated
+            for dist in distros:
+                if dist.key not in self.installed_projects:
+                    self.easy_install(dist.as_requirement())
+        log.info("Finished processing dependencies for %s", requirement)
+
+    def should_unzip(self, dist):
+        if self.zip_ok is not None:
+            return not self.zip_ok
+        if dist.has_metadata('not-zip-safe'):
+            return True
+        if not dist.has_metadata('zip-safe'):
+            return True
+        return False
+
+    def maybe_move(self, spec, dist_filename, setup_base):
+        dst = os.path.join(self.build_directory, spec.key)
+        if os.path.exists(dst):
+            msg = (
+                "%r already exists in %s; build directory %s will not be kept"
+            )
+            log.warn(msg, spec.key, self.build_directory, setup_base)
+            return setup_base
+        if os.path.isdir(dist_filename):
+            setup_base = dist_filename
+        else:
+            if os.path.dirname(dist_filename) == setup_base:
+                os.unlink(dist_filename)  # get it out of the tmp dir
+            contents = os.listdir(setup_base)
+            if len(contents) == 1:
+                dist_filename = os.path.join(setup_base, contents[0])
+                if os.path.isdir(dist_filename):
+                    # if the only thing there is a directory, move it instead
+                    setup_base = dist_filename
+        ensure_directory(dst)
+        shutil.move(setup_base, dst)
+        return dst
+
+    def install_wrapper_scripts(self, dist):
+        if self.exclude_scripts:
+            return
+        for args in ScriptWriter.best().get_args(dist):
+            self.write_script(*args)
+
+    def install_script(self, dist, script_name, script_text, dev_path=None):
+        """Generate a legacy script wrapper and install it"""
+        spec = str(dist.as_requirement())
+        is_script = is_python_script(script_text, script_name)
+
+        if is_script:
+            body = self._load_template(dev_path) % locals()
+            script_text = ScriptWriter.get_header(script_text) + body
+        self.write_script(script_name, _to_bytes(script_text), 'b')
+
+    @staticmethod
+    def _load_template(dev_path):
+        """
+        There are a couple of template scripts in the package. This
+        function loads one of them and prepares it for use.
+        """
+        # See https://github.com/pypa/setuptools/issues/134 for info
+        # on script file naming and downstream issues with SVR4
+        name = 'script.tmpl'
+        if dev_path:
+            name = name.replace('.tmpl', ' (dev).tmpl')
+
+        raw_bytes = resource_string('setuptools', name)
+        return raw_bytes.decode('utf-8')
+
+    def write_script(self, script_name, contents, mode="t", blockers=()):
+        """Write an executable file to the scripts directory"""
+        self.delete_blockers(  # clean up old .py/.pyw w/o a script
+            [os.path.join(self.script_dir, x) for x in blockers]
+        )
+        log.info("Installing %s script to %s", script_name, self.script_dir)
+        target = os.path.join(self.script_dir, script_name)
+        self.add_output(target)
+
+        if self.dry_run:
+            return
+
+        mask = current_umask()
+        ensure_directory(target)
+        if os.path.exists(target):
+            os.unlink(target)
+        with open(target, "w" + mode) as f:
+            f.write(contents)
+        chmod(target, 0o777 - mask)
+
+    def install_eggs(self, spec, dist_filename, tmpdir):
+        # .egg dirs or files are already built, so just return them
+        if dist_filename.lower().endswith('.egg'):
+            return [self.install_egg(dist_filename, tmpdir)]
+        elif dist_filename.lower().endswith('.exe'):
+            return [self.install_exe(dist_filename, tmpdir)]
+        elif dist_filename.lower().endswith('.whl'):
+            return [self.install_wheel(dist_filename, tmpdir)]
+
+        # Anything else, try to extract and build
+        setup_base = tmpdir
+        if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'):
+            unpack_archive(dist_filename, tmpdir, self.unpack_progress)
+        elif os.path.isdir(dist_filename):
+            setup_base = os.path.abspath(dist_filename)
+
+        if (setup_base.startswith(tmpdir)  # something we downloaded
+                and self.build_directory and spec is not None):
+            setup_base = self.maybe_move(spec, dist_filename, setup_base)
+
+        # Find the setup.py file
+        setup_script = os.path.join(setup_base, 'setup.py')
+
+        if not os.path.exists(setup_script):
+            setups = glob(os.path.join(setup_base, '*', 'setup.py'))
+            if not setups:
+                raise DistutilsError(
+                    "Couldn't find a setup script in %s" %
+                    os.path.abspath(dist_filename)
+                )
+            if len(setups) > 1:
+                raise DistutilsError(
+                    "Multiple setup scripts in %s" %
+                    os.path.abspath(dist_filename)
+                )
+            setup_script = setups[0]
+
+        # Now run it, and return the result
+        if self.editable:
+            log.info(self.report_editable(spec, setup_script))
+            return []
+        else:
+            return self.build_and_install(setup_script, setup_base)
+
+    def egg_distribution(self, egg_path):
+        if os.path.isdir(egg_path):
+            metadata = PathMetadata(egg_path, os.path.join(egg_path,
+                                                           'EGG-INFO'))
+        else:
+            metadata = EggMetadata(zipimport.zipimporter(egg_path))
+        return Distribution.from_filename(egg_path, metadata=metadata)
+
+    def install_egg(self, egg_path, tmpdir):
+        destination = os.path.join(
+            self.install_dir,
+            os.path.basename(egg_path),
+        )
+        destination = os.path.abspath(destination)
+        if not self.dry_run:
+            ensure_directory(destination)
+
+        dist = self.egg_distribution(egg_path)
+        if not samefile(egg_path, destination):
+            if os.path.isdir(destination) and not os.path.islink(destination):
+                dir_util.remove_tree(destination, dry_run=self.dry_run)
+            elif os.path.exists(destination):
+                self.execute(
+                    os.unlink,
+                    (destination,),
+                    "Removing " + destination,
+                )
+            try:
+                new_dist_is_zipped = False
+                if os.path.isdir(egg_path):
+                    if egg_path.startswith(tmpdir):
+                        f, m = shutil.move, "Moving"
+                    else:
+                        f, m = shutil.copytree, "Copying"
+                elif self.should_unzip(dist):
+                    self.mkpath(destination)
+                    f, m = self.unpack_and_compile, "Extracting"
+                else:
+                    new_dist_is_zipped = True
+                    if egg_path.startswith(tmpdir):
+                        f, m = shutil.move, "Moving"
+                    else:
+                        f, m = shutil.copy2, "Copying"
+                self.execute(
+                    f,
+                    (egg_path, destination),
+                    (m + " %s to %s") % (
+                        os.path.basename(egg_path),
+                        os.path.dirname(destination)
+                    ),
+                )
+                update_dist_caches(
+                    destination,
+                    fix_zipimporter_caches=new_dist_is_zipped,
+                )
+            except Exception:
+                update_dist_caches(destination, fix_zipimporter_caches=False)
+                raise
+
+        self.add_output(destination)
+        return self.egg_distribution(destination)
+
+    def install_exe(self, dist_filename, tmpdir):
+        # See if it's valid, get data
+        cfg = extract_wininst_cfg(dist_filename)
+        if cfg is None:
+            raise DistutilsError(
+                "%s is not a valid distutils Windows .exe" % dist_filename
+            )
+        # Create a dummy distribution object until we build the real distro
+        dist = Distribution(
+            None,
+            project_name=cfg.get('metadata', 'name'),
+            version=cfg.get('metadata', 'version'), platform=get_platform(),
+        )
+
+        # Convert the .exe to an unpacked egg
+        egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg')
+        dist.location = egg_path
+        egg_tmp = egg_path + '.tmp'
+        _egg_info = os.path.join(egg_tmp, 'EGG-INFO')
+        pkg_inf = os.path.join(_egg_info, 'PKG-INFO')
+        ensure_directory(pkg_inf)  # make sure EGG-INFO dir exists
+        dist._provider = PathMetadata(egg_tmp, _egg_info)  # XXX
+        self.exe_to_egg(dist_filename, egg_tmp)
+
+        # Write EGG-INFO/PKG-INFO
+        if not os.path.exists(pkg_inf):
+            f = open(pkg_inf, 'w')
+            f.write('Metadata-Version: 1.0\n')
+            for k, v in cfg.items('metadata'):
+                if k != 'target_version':
+                    f.write('%s: %s\n' % (k.replace('_', '-').title(), v))
+            f.close()
+        script_dir = os.path.join(_egg_info, 'scripts')
+        # delete entry-point scripts to avoid duping
+        self.delete_blockers([
+            os.path.join(script_dir, args[0])
+            for args in ScriptWriter.get_args(dist)
+        ])
+        # Build .egg file from tmpdir
+        bdist_egg.make_zipfile(
+            egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run,
+        )
+        # install the .egg
+        return self.install_egg(egg_path, tmpdir)
+
+    def exe_to_egg(self, dist_filename, egg_tmp):
+        """Extract a bdist_wininst to the directories an egg would use"""
+        # Check for .pth file and set up prefix translations
+        prefixes = get_exe_prefixes(dist_filename)
+        to_compile = []
+        native_libs = []
+        top_level = {}
+
+        def process(src, dst):
+            s = src.lower()
+            for old, new in prefixes:
+                if s.startswith(old):
+                    src = new + src[len(old):]
+                    parts = src.split('/')
+                    dst = os.path.join(egg_tmp, *parts)
+                    dl = dst.lower()
+                    if dl.endswith('.pyd') or dl.endswith('.dll'):
+                        parts[-1] = bdist_egg.strip_module(parts[-1])
+                        top_level[os.path.splitext(parts[0])[0]] = 1
+                        native_libs.append(src)
+                    elif dl.endswith('.py') and old != 'SCRIPTS/':
+                        top_level[os.path.splitext(parts[0])[0]] = 1
+                        to_compile.append(dst)
+                    return dst
+            if not src.endswith('.pth'):
+                log.warn("WARNING: can't process %s", src)
+            return None
+
+        # extract, tracking .pyd/.dll->native_libs and .py -> to_compile
+        unpack_archive(dist_filename, egg_tmp, process)
+        stubs = []
+        for res in native_libs:
+            if res.lower().endswith('.pyd'):  # create stubs for .pyd's
+                parts = res.split('/')
+                resource = parts[-1]
+                parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py'
+                pyfile = os.path.join(egg_tmp, *parts)
+                to_compile.append(pyfile)
+                stubs.append(pyfile)
+                bdist_egg.write_stub(resource, pyfile)
+        self.byte_compile(to_compile)  # compile .py's
+        bdist_egg.write_safety_flag(
+            os.path.join(egg_tmp, 'EGG-INFO'),
+            bdist_egg.analyze_egg(egg_tmp, stubs))  # write zip-safety flag
+
+        for name in 'top_level', 'native_libs':
+            if locals()[name]:
+                txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt')
+                if not os.path.exists(txt):
+                    f = open(txt, 'w')
+                    f.write('\n'.join(locals()[name]) + '\n')
+                    f.close()
+
+    def install_wheel(self, wheel_path, tmpdir):
+        wheel = Wheel(wheel_path)
+        assert wheel.is_compatible()
+        destination = os.path.join(self.install_dir, wheel.egg_name())
+        destination = os.path.abspath(destination)
+        if not self.dry_run:
+            ensure_directory(destination)
+        if os.path.isdir(destination) and not os.path.islink(destination):
+            dir_util.remove_tree(destination, dry_run=self.dry_run)
+        elif os.path.exists(destination):
+            self.execute(
+                os.unlink,
+                (destination,),
+                "Removing " + destination,
+            )
+        try:
+            self.execute(
+                wheel.install_as_egg,
+                (destination,),
+                ("Installing %s to %s") % (
+                    os.path.basename(wheel_path),
+                    os.path.dirname(destination)
+                ),
+            )
+        finally:
+            update_dist_caches(destination, fix_zipimporter_caches=False)
+        self.add_output(destination)
+        return self.egg_distribution(destination)
+
+    __mv_warning = textwrap.dedent("""
+        Because this distribution was installed --multi-version, before you can
+        import modules from this package in an application, you will need to
+        'import pkg_resources' and then use a 'require()' call similar to one of
+        these examples, in order to select the desired version:
+
+            pkg_resources.require("%(name)s")  # latest installed version
+            pkg_resources.require("%(name)s==%(version)s")  # this exact version
+            pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
+        """).lstrip()
+
+    __id_warning = textwrap.dedent("""
+        Note also that the installation directory must be on sys.path at runtime for
+        this to work.  (e.g. by being the application's script directory, by being on
+        PYTHONPATH, or by being added to sys.path by your code.)
+        """)
+
+    def installation_report(self, req, dist, what="Installed"):
+        """Helpful installation message for display to package users"""
+        msg = "\n%(what)s %(eggloc)s%(extras)s"
+        if self.multi_version and not self.no_report:
+            msg += '\n' + self.__mv_warning
+            if self.install_dir not in map(normalize_path, sys.path):
+                msg += '\n' + self.__id_warning
+
+        eggloc = dist.location
+        name = dist.project_name
+        version = dist.version
+        extras = ''  # TODO: self.report_extras(req, dist)
+        return msg % locals()
+
+    __editable_msg = textwrap.dedent("""
+        Extracted editable version of %(spec)s to %(dirname)s
+
+        If it uses setuptools in its setup script, you can activate it in
+        "development" mode by going to that directory and running::
+
+            %(python)s setup.py develop
+
+        See the setuptools documentation for the "develop" command for more info.
+        """).lstrip()
+
+    def report_editable(self, spec, setup_script):
+        dirname = os.path.dirname(setup_script)
+        python = sys.executable
+        return '\n' + self.__editable_msg % locals()
+
+    def run_setup(self, setup_script, setup_base, args):
+        sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg)
+        sys.modules.setdefault('distutils.command.egg_info', egg_info)
+
+        args = list(args)
+        if self.verbose > 2:
+            v = 'v' * (self.verbose - 1)
+            args.insert(0, '-' + v)
+        elif self.verbose < 2:
+            args.insert(0, '-q')
+        if self.dry_run:
+            args.insert(0, '-n')
+        log.info(
+            "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args)
+        )
+        try:
+            run_setup(setup_script, args)
+        except SystemExit as v:
+            raise DistutilsError("Setup script exited with %s" % (v.args[0],))
+
+    def build_and_install(self, setup_script, setup_base):
+        args = ['bdist_egg', '--dist-dir']
+
+        dist_dir = tempfile.mkdtemp(
+            prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script)
+        )
+        try:
+            self._set_fetcher_options(os.path.dirname(setup_script))
+            args.append(dist_dir)
+
+            self.run_setup(setup_script, setup_base, args)
+            all_eggs = Environment([dist_dir])
+            eggs = []
+            for key in all_eggs:
+                for dist in all_eggs[key]:
+                    eggs.append(self.install_egg(dist.location, setup_base))
+            if not eggs and not self.dry_run:
+                log.warn("No eggs found in %s (setup script problem?)",
+                         dist_dir)
+            return eggs
+        finally:
+            rmtree(dist_dir)
+            log.set_verbosity(self.verbose)  # restore our log verbosity
+
+    def _set_fetcher_options(self, base):
+        """
+        When easy_install is about to run bdist_egg on a source dist, that
+        source dist might have 'setup_requires' directives, requiring
+        additional fetching. Ensure the fetcher options given to easy_install
+        are available to that command as well.
+        """
+        # find the fetch options from easy_install and write them out
+        # to the setup.cfg file.
+        ei_opts = self.distribution.get_option_dict('easy_install').copy()
+        fetch_directives = (
+            'find_links', 'site_dirs', 'index_url', 'optimize',
+            'site_dirs', 'allow_hosts',
+        )
+        fetch_options = {}
+        for key, val in ei_opts.items():
+            if key not in fetch_directives:
+                continue
+            fetch_options[key.replace('_', '-')] = val[1]
+        # create a settings dictionary suitable for `edit_config`
+        settings = dict(easy_install=fetch_options)
+        cfg_filename = os.path.join(base, 'setup.cfg')
+        setopt.edit_config(cfg_filename, settings)
+
+    def update_pth(self, dist):
+        if self.pth_file is None:
+            return
+
+        for d in self.pth_file[dist.key]:  # drop old entries
+            if self.multi_version or d.location != dist.location:
+                log.info("Removing %s from easy-install.pth file", d)
+                self.pth_file.remove(d)
+                if d.location in self.shadow_path:
+                    self.shadow_path.remove(d.location)
+
+        if not self.multi_version:
+            if dist.location in self.pth_file.paths:
+                log.info(
+                    "%s is already the active version in easy-install.pth",
+                    dist,
+                )
+            else:
+                log.info("Adding %s to easy-install.pth file", dist)
+                self.pth_file.add(dist)  # add new entry
+                if dist.location not in self.shadow_path:
+                    self.shadow_path.append(dist.location)
+
+        if not self.dry_run:
+
+            self.pth_file.save()
+
+            if dist.key == 'setuptools':
+                # Ensure that setuptools itself never becomes unavailable!
+                # XXX should this check for latest version?
+                filename = os.path.join(self.install_dir, 'setuptools.pth')
+                if os.path.islink(filename):
+                    os.unlink(filename)
+                f = open(filename, 'wt')
+                f.write(self.pth_file.make_relative(dist.location) + '\n')
+                f.close()
+
+    def unpack_progress(self, src, dst):
+        # Progress filter for unpacking
+        log.debug("Unpacking %s to %s", src, dst)
+        return dst  # only unpack-and-compile skips files for dry run
+
+    def unpack_and_compile(self, egg_path, destination):
+        to_compile = []
+        to_chmod = []
+
+        def pf(src, dst):
+            if dst.endswith('.py') and not src.startswith('EGG-INFO/'):
+                to_compile.append(dst)
+            elif dst.endswith('.dll') or dst.endswith('.so'):
+                to_chmod.append(dst)
+            self.unpack_progress(src, dst)
+            return not self.dry_run and dst or None
+
+        unpack_archive(egg_path, destination, pf)
+        self.byte_compile(to_compile)
+        if not self.dry_run:
+            for f in to_chmod:
+                mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755
+                chmod(f, mode)
+
+    def byte_compile(self, to_compile):
+        if sys.dont_write_bytecode:
+            return
+
+        from distutils.util import byte_compile
+
+        try:
+            # try to make the byte compile messages quieter
+            log.set_verbosity(self.verbose - 1)
+
+            byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run)
+            if self.optimize:
+                byte_compile(
+                    to_compile, optimize=self.optimize, force=1,
+                    dry_run=self.dry_run,
+                )
+        finally:
+            log.set_verbosity(self.verbose)  # restore original verbosity
+
+    __no_default_msg = textwrap.dedent("""
+        bad install directory or PYTHONPATH
+
+        You are attempting to install a package to a directory that is not
+        on PYTHONPATH and which Python does not read ".pth" files from.  The
+        installation directory you specified (via --install-dir, --prefix, or
+        the distutils default setting) was:
+
+            %s
+
+        and your PYTHONPATH environment variable currently contains:
+
+            %r
+
+        Here are some of your options for correcting the problem:
+
+        * You can choose a different installation directory, i.e., one that is
+          on PYTHONPATH or supports .pth files
+
+        * You can add the installation directory to the PYTHONPATH environment
+          variable.  (It must then also be on PYTHONPATH whenever you run
+          Python and want to use the package(s) you are installing.)
+
+        * You can set up the installation directory to support ".pth" files by
+          using one of the approaches described here:
+
+          https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations
+
+
+        Please make the appropriate changes for your system and try again.""").lstrip()
+
+    def no_default_version_msg(self):
+        template = self.__no_default_msg
+        return template % (self.install_dir, os.environ.get('PYTHONPATH', ''))
+
+    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:
+            return
+        home = convert_path(os.path.expanduser("~"))
+        for name, path in six.iteritems(self.config_vars):
+            if path.startswith(home) and not os.path.isdir(path):
+                self.debug_print("os.makedirs('%s', 0o700)" % path)
+                os.makedirs(path, 0o700)
+
+    INSTALL_SCHEMES = dict(
+        posix=dict(
+            install_dir='$base/lib/python$py_version_short/site-packages',
+            script_dir='$base/bin',
+        ),
+    )
+
+    DEFAULT_SCHEME = dict(
+        install_dir='$base/Lib/site-packages',
+        script_dir='$base/Scripts',
+    )
+
+    def _expand(self, *attrs):
+        config_vars = self.get_finalized_command('install').config_vars
+
+        if self.prefix:
+            # Set default install_dir/scripts from --prefix
+            config_vars = config_vars.copy()
+            config_vars['base'] = self.prefix
+            scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME)
+            for attr, val in scheme.items():
+                if getattr(self, attr, None) is None:
+                    setattr(self, attr, val)
+
+        from distutils.util import subst_vars
+
+        for attr in attrs:
+            val = getattr(self, attr)
+            if val is not None:
+                val = subst_vars(val, config_vars)
+                if os.name == 'posix':
+                    val = os.path.expanduser(val)
+                setattr(self, attr, val)
+
+
+def _pythonpath():
+    items = os.environ.get('PYTHONPATH', '').split(os.pathsep)
+    return filter(None, items)
+
+
+def get_site_dirs():
+    """
+    Return a list of 'site' dirs
+    """
+
+    sitedirs = []
+
+    # start with PYTHONPATH
+    sitedirs.extend(_pythonpath())
+
+    prefixes = [sys.prefix]
+    if sys.exec_prefix != sys.prefix:
+        prefixes.append(sys.exec_prefix)
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos'):
+                sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
+            elif os.sep == '/':
+                sitedirs.extend([
+                    os.path.join(
+                        prefix,
+                        "lib",
+                        "python" + sys.version[:3],
+                        "site-packages",
+                    ),
+                    os.path.join(prefix, "lib", "site-python"),
+                ])
+            else:
+                sitedirs.extend([
+                    prefix,
+                    os.path.join(prefix, "lib", "site-packages"),
+                ])
+            if sys.platform == 'darwin':
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        home_sp = os.path.join(
+                            home,
+                            'Library',
+                            'Python',
+                            sys.version[:3],
+                            'site-packages',
+                        )
+                        sitedirs.append(home_sp)
+    lib_paths = get_path('purelib'), get_path('platlib')
+    for site_lib in lib_paths:
+        if site_lib not in sitedirs:
+            sitedirs.append(site_lib)
+
+    if site.ENABLE_USER_SITE:
+        sitedirs.append(site.USER_SITE)
+
+    try:
+        sitedirs.extend(site.getsitepackages())
+    except AttributeError:
+        pass
+
+    sitedirs = list(map(normalize_path, sitedirs))
+
+    return sitedirs
+
+
+def expand_paths(inputs):
+    """Yield sys.path directories that might contain "old-style" packages"""
+
+    seen = {}
+
+    for dirname in inputs:
+        dirname = normalize_path(dirname)
+        if dirname in seen:
+            continue
+
+        seen[dirname] = 1
+        if not os.path.isdir(dirname):
+            continue
+
+        files = os.listdir(dirname)
+        yield dirname, files
+
+        for name in files:
+            if not name.endswith('.pth'):
+                # We only care about the .pth files
+                continue
+            if name in ('easy-install.pth', 'setuptools.pth'):
+                # Ignore .pth files that we control
+                continue
+
+            # Read the .pth file
+            f = open(os.path.join(dirname, name))
+            lines = list(yield_lines(f))
+            f.close()
+
+            # Yield existing non-dupe, non-import directory lines from it
+            for line in lines:
+                if not line.startswith("import"):
+                    line = normalize_path(line.rstrip())
+                    if line not in seen:
+                        seen[line] = 1
+                        if not os.path.isdir(line):
+                            continue
+                        yield line, os.listdir(line)
+
+
+def extract_wininst_cfg(dist_filename):
+    """Extract configuration data from a bdist_wininst .exe
+
+    Returns a configparser.RawConfigParser, or None
+    """
+    f = open(dist_filename, 'rb')
+    try:
+        endrec = zipfile._EndRecData(f)
+        if endrec is None:
+            return None
+
+        prepended = (endrec[9] - endrec[5]) - endrec[6]
+        if prepended < 12:  # no wininst data here
+            return None
+        f.seek(prepended - 12)
+
+        tag, cfglen, bmlen = struct.unpack("<iii", f.read(12))
+        if tag not in (0x1234567A, 0x1234567B):
+            return None  # not a valid tag
+
+        f.seek(prepended - (12 + cfglen))
+        init = {'version': '', 'target_version': ''}
+        cfg = configparser.RawConfigParser(init)
+        try:
+            part = f.read(cfglen)
+            # Read up to the first null byte.
+            config = part.split(b'\0', 1)[0]
+            # Now the config is in bytes, but for RawConfigParser, it should
+            #  be text, so decode it.
+            config = config.decode(sys.getfilesystemencoding())
+            cfg.readfp(six.StringIO(config))
+        except configparser.Error:
+            return None
+        if not cfg.has_section('metadata') or not cfg.has_section('Setup'):
+            return None
+        return cfg
+
+    finally:
+        f.close()
+
+
+def get_exe_prefixes(exe_filename):
+    """Get exe->egg path translations for a given .exe file"""
+
+    prefixes = [
+        ('PURELIB/', ''),
+        ('PLATLIB/pywin32_system32', ''),
+        ('PLATLIB/', ''),
+        ('SCRIPTS/', 'EGG-INFO/scripts/'),
+        ('DATA/lib/site-packages', ''),
+    ]
+    z = zipfile.ZipFile(exe_filename)
+    try:
+        for info in z.infolist():
+            name = info.filename
+            parts = name.split('/')
+            if len(parts) == 3 and parts[2] == 'PKG-INFO':
+                if parts[1].endswith('.egg-info'):
+                    prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/'))
+                    break
+            if len(parts) != 2 or not name.endswith('.pth'):
+                continue
+            if name.endswith('-nspkg.pth'):
+                continue
+            if parts[0].upper() in ('PURELIB', 'PLATLIB'):
+                contents = z.read(name)
+                if six.PY3:
+                    contents = contents.decode()
+                for pth in yield_lines(contents):
+                    pth = pth.strip().replace('\\', '/')
+                    if not pth.startswith('import'):
+                        prefixes.append((('%s/%s/' % (parts[0], pth)), ''))
+    finally:
+        z.close()
+    prefixes = [(x.lower(), y) for x, y in prefixes]
+    prefixes.sort()
+    prefixes.reverse()
+    return prefixes
+
+
+class PthDistributions(Environment):
+    """A .pth file with Distribution paths in it"""
+
+    dirty = False
+
+    def __init__(self, filename, sitedirs=()):
+        self.filename = filename
+        self.sitedirs = list(map(normalize_path, sitedirs))
+        self.basedir = normalize_path(os.path.dirname(self.filename))
+        self._load()
+        Environment.__init__(self, [], None, None)
+        for path in yield_lines(self.paths):
+            list(map(self.add, find_distributions(path, True)))
+
+    def _load(self):
+        self.paths = []
+        saw_import = False
+        seen = dict.fromkeys(self.sitedirs)
+        if os.path.isfile(self.filename):
+            f = open(self.filename, 'rt')
+            for line in f:
+                if line.startswith('import'):
+                    saw_import = True
+                    continue
+                path = line.rstrip()
+                self.paths.append(path)
+                if not path.strip() or path.strip().startswith('#'):
+                    continue
+                # skip non-existent paths, in case somebody deleted a package
+                # manually, and duplicate paths as well
+                path = self.paths[-1] = normalize_path(
+                    os.path.join(self.basedir, path)
+                )
+                if not os.path.exists(path) or path in seen:
+                    self.paths.pop()  # skip it
+                    self.dirty = True  # we cleaned up, so we're dirty now :)
+                    continue
+                seen[path] = 1
+            f.close()
+
+        if self.paths and not saw_import:
+            self.dirty = True  # ensure anything we touch has import wrappers
+        while self.paths and not self.paths[-1].strip():
+            self.paths.pop()
+
+    def save(self):
+        """Write changed .pth file back to disk"""
+        if not self.dirty:
+            return
+
+        rel_paths = list(map(self.make_relative, self.paths))
+        if rel_paths:
+            log.debug("Saving %s", self.filename)
+            lines = self._wrap_lines(rel_paths)
+            data = '\n'.join(lines) + '\n'
+
+            if os.path.islink(self.filename):
+                os.unlink(self.filename)
+            with open(self.filename, 'wt') as f:
+                f.write(data)
+
+        elif os.path.exists(self.filename):
+            log.debug("Deleting empty %s", self.filename)
+            os.unlink(self.filename)
+
+        self.dirty = False
+
+    @staticmethod
+    def _wrap_lines(lines):
+        return lines
+
+    def add(self, dist):
+        """Add `dist` to the distribution map"""
+        new_path = (
+            dist.location not in self.paths and (
+                dist.location not in self.sitedirs or
+                # account for '.' being in PYTHONPATH
+                dist.location == os.getcwd()
+            )
+        )
+        if new_path:
+            self.paths.append(dist.location)
+            self.dirty = True
+        Environment.add(self, dist)
+
+    def remove(self, dist):
+        """Remove `dist` from the distribution map"""
+        while dist.location in self.paths:
+            self.paths.remove(dist.location)
+            self.dirty = True
+        Environment.remove(self, dist)
+
+    def make_relative(self, path):
+        npath, last = os.path.split(normalize_path(path))
+        baselen = len(self.basedir)
+        parts = [last]
+        sep = os.altsep == '/' and '/' or os.sep
+        while len(npath) >= baselen:
+            if npath == self.basedir:
+                parts.append(os.curdir)
+                parts.reverse()
+                return sep.join(parts)
+            npath, last = os.path.split(npath)
+            parts.append(last)
+        else:
+            return path
+
+
+class RewritePthDistributions(PthDistributions):
+    @classmethod
+    def _wrap_lines(cls, lines):
+        yield cls.prelude
+        for line in lines:
+            yield line
+        yield cls.postlude
+
+    prelude = _one_liner("""
+        import sys
+        sys.__plen = len(sys.path)
+        """)
+    postlude = _one_liner("""
+        import sys
+        new = sys.path[sys.__plen:]
+        del sys.path[sys.__plen:]
+        p = getattr(sys, '__egginsert', 0)
+        sys.path[p:p] = new
+        sys.__egginsert = p + len(new)
+        """)
+
+
+if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite':
+    PthDistributions = RewritePthDistributions
+
+
+def _first_line_re():
+    """
+    Return a regular expression based on first_line_re suitable for matching
+    strings.
+    """
+    if isinstance(first_line_re.pattern, str):
+        return first_line_re
+
+    # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern.
+    return re.compile(first_line_re.pattern.decode())
+
+
+def auto_chmod(func, arg, exc):
+    if func in [os.unlink, os.remove] and os.name == 'nt':
+        chmod(arg, stat.S_IWRITE)
+        return func(arg)
+    et, ev, _ = sys.exc_info()
+    six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg))))
+
+
+def update_dist_caches(dist_path, fix_zipimporter_caches):
+    """
+    Fix any globally cached `dist_path` related data
+
+    `dist_path` should be a path of a newly installed egg distribution (zipped
+    or unzipped).
+
+    sys.path_importer_cache contains finder objects that have been cached when
+    importing data from the original distribution. Any such finders need to be
+    cleared since the replacement distribution might be packaged differently,
+    e.g. a zipped egg distribution might get replaced with an unzipped egg
+    folder or vice versa. Having the old finders cached may then cause Python
+    to attempt loading modules from the replacement distribution using an
+    incorrect loader.
+
+    zipimport.zipimporter objects are Python loaders charged with importing
+    data packaged inside zip archives. If stale loaders referencing the
+    original distribution, are left behind, they can fail to load modules from
+    the replacement distribution. E.g. if an old zipimport.zipimporter instance
+    is used to load data from a new zipped egg archive, it may cause the
+    operation to attempt to locate the requested data in the wrong location -
+    one indicated by the original distribution's zip archive directory
+    information. Such an operation may then fail outright, e.g. report having
+    read a 'bad local file header', or even worse, it may fail silently &
+    return invalid data.
+
+    zipimport._zip_directory_cache contains cached zip archive directory
+    information for all existing zipimport.zipimporter instances and all such
+    instances connected to the same archive share the same cached directory
+    information.
+
+    If asked, and the underlying Python implementation allows it, we can fix
+    all existing zipimport.zipimporter instances instead of having to track
+    them down and remove them one by one, by updating their shared cached zip
+    archive directory information. This, of course, assumes that the
+    replacement distribution is packaged as a zipped egg.
+
+    If not asked to fix existing zipimport.zipimporter instances, we still do
+    our best to clear any remaining zipimport.zipimporter related cached data
+    that might somehow later get used when attempting to load data from the new
+    distribution and thus cause such load operations to fail. Note that when
+    tracking down such remaining stale data, we can not catch every conceivable
+    usage from here, and we clear only those that we know of and have found to
+    cause problems if left alive. Any remaining caches should be updated by
+    whomever is in charge of maintaining them, i.e. they should be ready to
+    handle us replacing their zip archives with new distributions at runtime.
+
+    """
+    # There are several other known sources of stale zipimport.zipimporter
+    # instances that we do not clear here, but might if ever given a reason to
+    # do so:
+    # * Global setuptools pkg_resources.working_set (a.k.a. 'master working
+    # set') may contain distributions which may in turn contain their
+    #   zipimport.zipimporter loaders.
+    # * Several zipimport.zipimporter loaders held by local variables further
+    #   up the function call stack when running the setuptools installation.
+    # * Already loaded modules may have their __loader__ attribute set to the
+    #   exact loader instance used when importing them. Python 3.4 docs state
+    #   that this information is intended mostly for introspection and so is
+    #   not expected to cause us problems.
+    normalized_path = normalize_path(dist_path)
+    _uncache(normalized_path, sys.path_importer_cache)
+    if fix_zipimporter_caches:
+        _replace_zip_directory_cache_data(normalized_path)
+    else:
+        # Here, even though we do not want to fix existing and now stale
+        # zipimporter cache information, we still want to remove it. Related to
+        # Python's zip archive directory information cache, we clear each of
+        # its stale entries in two phases:
+        #   1. Clear the entry so attempting to access zip archive information
+        #      via any existing stale zipimport.zipimporter instances fails.
+        #   2. Remove the entry from the cache so any newly constructed
+        #      zipimport.zipimporter instances do not end up using old stale
+        #      zip archive directory information.
+        # This whole stale data removal step does not seem strictly necessary,
+        # but has been left in because it was done before we started replacing
+        # the zip archive directory information cache content if possible, and
+        # there are no relevant unit tests that we can depend on to tell us if
+        # this is really needed.
+        _remove_and_clear_zip_directory_cache_data(normalized_path)
+
+
+def _collect_zipimporter_cache_entries(normalized_path, cache):
+    """
+    Return zipimporter cache entry keys related to a given normalized path.
+
+    Alternative path spellings (e.g. those using different character case or
+    those using alternative path separators) related to the same path are
+    included. Any sub-path entries are included as well, i.e. those
+    corresponding to zip archives embedded in other zip archives.
+
+    """
+    result = []
+    prefix_len = len(normalized_path)
+    for p in cache:
+        np = normalize_path(p)
+        if (np.startswith(normalized_path) and
+                np[prefix_len:prefix_len + 1] in (os.sep, '')):
+            result.append(p)
+    return result
+
+
+def _update_zipimporter_cache(normalized_path, cache, updater=None):
+    """
+    Update zipimporter cache data for a given normalized path.
+
+    Any sub-path entries are processed as well, i.e. those corresponding to zip
+    archives embedded in other zip archives.
+
+    Given updater is a callable taking a cache entry key and the original entry
+    (after already removing the entry from the cache), and expected to update
+    the entry and possibly return a new one to be inserted in its place.
+    Returning None indicates that the entry should not be replaced with a new
+    one. If no updater is given, the cache entries are simply removed without
+    any additional processing, the same as if the updater simply returned None.
+
+    """
+    for p in _collect_zipimporter_cache_entries(normalized_path, cache):
+        # N.B. pypy's custom zipimport._zip_directory_cache implementation does
+        # not support the complete dict interface:
+        # * Does not support item assignment, thus not allowing this function
+        #    to be used only for removing existing cache entries.
+        #  * Does not support the dict.pop() method, forcing us to use the
+        #    get/del patterns instead. For more detailed information see the
+        #    following links:
+        #      https://github.com/pypa/setuptools/issues/202#issuecomment-202913420
+        #      http://bit.ly/2h9itJX
+        old_entry = cache[p]
+        del cache[p]
+        new_entry = updater and updater(p, old_entry)
+        if new_entry is not None:
+            cache[p] = new_entry
+
+
+def _uncache(normalized_path, cache):
+    _update_zipimporter_cache(normalized_path, cache)
+
+
+def _remove_and_clear_zip_directory_cache_data(normalized_path):
+    def clear_and_remove_cached_zip_archive_directory_data(path, old_entry):
+        old_entry.clear()
+
+    _update_zipimporter_cache(
+        normalized_path, zipimport._zip_directory_cache,
+        updater=clear_and_remove_cached_zip_archive_directory_data)
+
+
+# PyPy Python implementation does not allow directly writing to the
+# zipimport._zip_directory_cache and so prevents us from attempting to correct
+# its content. The best we can do there is clear the problematic cache content
+# and have PyPy repopulate it as needed. The downside is that if there are any
+# stale zipimport.zipimporter instances laying around, attempting to use them
+# will fail due to not having its zip archive directory information available
+# instead of being automatically corrected to use the new correct zip archive
+# directory information.
+if '__pypy__' in sys.builtin_module_names:
+    _replace_zip_directory_cache_data = \
+        _remove_and_clear_zip_directory_cache_data
+else:
+
+    def _replace_zip_directory_cache_data(normalized_path):
+        def replace_cached_zip_archive_directory_data(path, old_entry):
+            # N.B. In theory, we could load the zip directory information just
+            # once for all updated path spellings, and then copy it locally and
+            # update its contained path strings to contain the correct
+            # spelling, but that seems like a way too invasive move (this cache
+            # structure is not officially documented anywhere and could in
+            # theory change with new Python releases) for no significant
+            # benefit.
+            old_entry.clear()
+            zipimport.zipimporter(path)
+            old_entry.update(zipimport._zip_directory_cache[path])
+            return old_entry
+
+        _update_zipimporter_cache(
+            normalized_path, zipimport._zip_directory_cache,
+            updater=replace_cached_zip_archive_directory_data)
+
+
+def is_python(text, filename='<string>'):
+    "Is this string a valid Python script?"
+    try:
+        compile(text, filename, 'exec')
+    except (SyntaxError, TypeError):
+        return False
+    else:
+        return True
+
+
+def is_sh(executable):
+    """Determine if the specified executable is a .sh (contains a #! line)"""
+    try:
+        with io.open(executable, encoding='latin-1') as fp:
+            magic = fp.read(2)
+    except (OSError, IOError):
+        return executable
+    return magic == '#!'
+
+
+def nt_quote_arg(arg):
+    """Quote a command line argument according to Windows parsing rules"""
+    return subprocess.list2cmdline([arg])
+
+
+def is_python_script(script_text, filename):
+    """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc.
+    """
+    if filename.endswith('.py') or filename.endswith('.pyw'):
+        return True  # extension says it's Python
+    if is_python(script_text, filename):
+        return True  # it's syntactically valid Python
+    if script_text.startswith('#!'):
+        # It begins with a '#!' line, so check if 'python' is in it somewhere
+        return 'python' in script_text.splitlines()[0].lower()
+
+    return False  # Not any Python I can recognize
+
+
+try:
+    from os import chmod as _chmod
+except ImportError:
+    # Jython compatibility
+    def _chmod(*args):
+        pass
+
+
+def chmod(path, mode):
+    log.debug("changing mode of %s to %o", path, mode)
+    try:
+        _chmod(path, mode)
+    except os.error as e:
+        log.debug("chmod failed: %s", e)
+
+
+class CommandSpec(list):
+    """
+    A command spec for a #! header, specified as a list of arguments akin to
+    those passed to Popen.
+    """
+
+    options = []
+    split_args = dict()
+
+    @classmethod
+    def best(cls):
+        """
+        Choose the best CommandSpec class based on environmental conditions.
+        """
+        return cls
+
+    @classmethod
+    def _sys_executable(cls):
+        _default = os.path.normpath(sys.executable)
+        return os.environ.get('__PYVENV_LAUNCHER__', _default)
+
+    @classmethod
+    def from_param(cls, param):
+        """
+        Construct a CommandSpec from a parameter to build_scripts, which may
+        be None.
+        """
+        if isinstance(param, cls):
+            return param
+        if isinstance(param, list):
+            return cls(param)
+        if param is None:
+            return cls.from_environment()
+        # otherwise, assume it's a string.
+        return cls.from_string(param)
+
+    @classmethod
+    def from_environment(cls):
+        return cls([cls._sys_executable()])
+
+    @classmethod
+    def from_string(cls, string):
+        """
+        Construct a command spec from a simple string representing a command
+        line parseable by shlex.split.
+        """
+        items = shlex.split(string, **cls.split_args)
+        return cls(items)
+
+    def install_options(self, script_text):
+        self.options = shlex.split(self._extract_options(script_text))
+        cmdline = subprocess.list2cmdline(self)
+        if not isascii(cmdline):
+            self.options[:0] = ['-x']
+
+    @staticmethod
+    def _extract_options(orig_script):
+        """
+        Extract any options from the first line of the script.
+        """
+        first = (orig_script + '\n').splitlines()[0]
+        match = _first_line_re().match(first)
+        options = match.group(1) or '' if match else ''
+        return options.strip()
+
+    def as_header(self):
+        return self._render(self + list(self.options))
+
+    @staticmethod
+    def _strip_quotes(item):
+        _QUOTES = '"\''
+        for q in _QUOTES:
+            if item.startswith(q) and item.endswith(q):
+                return item[1:-1]
+        return item
+
+    @staticmethod
+    def _render(items):
+        cmdline = subprocess.list2cmdline(
+            CommandSpec._strip_quotes(item.strip()) for item in items)
+        return '#!' + cmdline + '\n'
+
+
+# For pbr compat; will be removed in a future version.
+sys_executable = CommandSpec._sys_executable()
+
+
+class WindowsCommandSpec(CommandSpec):
+    split_args = dict(posix=False)
+
+
+class ScriptWriter:
+    """
+    Encapsulates behavior around writing entry point scripts for console and
+    gui apps.
+    """
+
+    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
+
+        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()
+
+    command_spec_class = CommandSpec
+
+    @classmethod
+    def get_script_args(cls, dist, executable=None, wininst=False):
+        # for backward compatibility
+        warnings.warn("Use get_args", EasyInstallDeprecationWarning)
+        writer = (WindowsScriptWriter if wininst else ScriptWriter).best()
+        header = cls.get_script_header("", executable, wininst)
+        return writer.get_args(dist, header)
+
+    @classmethod
+    def get_script_header(cls, script_text, executable=None, wininst=False):
+        # for backward compatibility
+        warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2)
+        if wininst:
+            executable = "python.exe"
+        return cls.get_header(script_text, executable)
+
+    @classmethod
+    def get_args(cls, dist, header=None):
+        """
+        Yield write_script() argument tuples for a distribution's
+        console_scripts and gui_scripts entry points.
+        """
+        if header is None:
+            header = cls.get_header()
+        spec = str(dist.as_requirement())
+        for type_ in 'console', 'gui':
+            group = type_ + '_scripts'
+            for name, ep in dist.get_entry_map(group).items():
+                cls._ensure_safe_name(name)
+                script_text = cls.template % locals()
+                args = cls._get_script_args(type_, name, header, script_text)
+                for res in args:
+                    yield res
+
+    @staticmethod
+    def _ensure_safe_name(name):
+        """
+        Prevent paths in *_scripts entry point names.
+        """
+        has_path_sep = re.search(r'[\\/]', name)
+        if has_path_sep:
+            raise ValueError("Path separators not allowed in script names")
+
+    @classmethod
+    def get_writer(cls, force_windows):
+        # for backward compatibility
+        warnings.warn("Use best", EasyInstallDeprecationWarning)
+        return WindowsScriptWriter.best() if force_windows else cls.best()
+
+    @classmethod
+    def best(cls):
+        """
+        Select the best ScriptWriter for this environment.
+        """
+        if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'):
+            return WindowsScriptWriter.best()
+        else:
+            return cls
+
+    @classmethod
+    def _get_script_args(cls, type_, name, header, script_text):
+        # Simply write the stub with no extension.
+        yield (name, header + script_text)
+
+    @classmethod
+    def get_header(cls, script_text="", executable=None):
+        """Create a #! line, getting options (if any) from script_text"""
+        cmd = cls.command_spec_class.best().from_param(executable)
+        cmd.install_options(script_text)
+        return cmd.as_header()
+
+
+class WindowsScriptWriter(ScriptWriter):
+    command_spec_class = WindowsCommandSpec
+
+    @classmethod
+    def get_writer(cls):
+        # for backward compatibility
+        warnings.warn("Use best", EasyInstallDeprecationWarning)
+        return cls.best()
+
+    @classmethod
+    def best(cls):
+        """
+        Select the best ScriptWriter suitable for Windows
+        """
+        writer_lookup = dict(
+            executable=WindowsExecutableLauncherWriter,
+            natural=cls,
+        )
+        # for compatibility, use the executable launcher by default
+        launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable')
+        return writer_lookup[launcher]
+
+    @classmethod
+    def _get_script_args(cls, type_, name, header, script_text):
+        "For Windows, add a .py extension"
+        ext = dict(console='.pya', gui='.pyw')[type_]
+        if ext not in os.environ['PATHEXT'].lower().split(';'):
+            msg = (
+                "{ext} not listed in PATHEXT; scripts will not be "
+                "recognized as executables."
+            ).format(**locals())
+            warnings.warn(msg, UserWarning)
+        old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe']
+        old.remove(ext)
+        header = cls._adjust_header(type_, header)
+        blockers = [name + x for x in old]
+        yield name + ext, header + script_text, 't', blockers
+
+    @classmethod
+    def _adjust_header(cls, type_, orig_header):
+        """
+        Make sure 'pythonw' is used for gui and and 'python' is used for
+        console (regardless of what sys.executable is).
+        """
+        pattern = 'pythonw.exe'
+        repl = 'python.exe'
+        if type_ == 'gui':
+            pattern, repl = repl, pattern
+        pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE)
+        new_header = pattern_ob.sub(string=orig_header, repl=repl)
+        return new_header if cls._use_header(new_header) else orig_header
+
+    @staticmethod
+    def _use_header(new_header):
+        """
+        Should _adjust_header use the replaced header?
+
+        On non-windows systems, always use. On
+        Windows systems, only use the replaced header if it resolves
+        to an executable on the system.
+        """
+        clean_header = new_header[2:-1].strip('"')
+        return sys.platform != 'win32' or find_executable(clean_header)
+
+
+class WindowsExecutableLauncherWriter(WindowsScriptWriter):
+    @classmethod
+    def _get_script_args(cls, type_, name, header, script_text):
+        """
+        For Windows, add a .py extension and an .exe launcher
+        """
+        if type_ == 'gui':
+            launcher_type = 'gui'
+            ext = '-script.pyw'
+            old = ['.pyw']
+        else:
+            launcher_type = 'cli'
+            ext = '-script.py'
+            old = ['.py', '.pyc', '.pyo']
+        hdr = cls._adjust_header(type_, header)
+        blockers = [name + x for x in old]
+        yield (name + ext, hdr + script_text, 't', blockers)
+        yield (
+            name + '.exe', get_win_launcher(launcher_type),
+            'b'  # write in binary mode
+        )
+        if not is_64bit():
+            # install a manifest for the launcher to prevent Windows
+            # from detecting it as an installer (which it will for
+            #  launchers like easy_install.exe). Consider only
+            #  adding a manifest for launchers detected as installers.
+            #  See Distribute #143 for details.
+            m_name = name + '.exe.manifest'
+            yield (m_name, load_launcher_manifest(name), 't')
+
+
+# for backward-compatibility
+get_script_args = ScriptWriter.get_script_args
+get_script_header = ScriptWriter.get_script_header
+
+
+def get_win_launcher(type):
+    """
+    Load the Windows launcher (executable) suitable for launching a script.
+
+    `type` should be either 'cli' or 'gui'
+
+    Returns the executable as a byte string.
+    """
+    launcher_fn = '%s.exe' % type
+    if is_64bit():
+        launcher_fn = launcher_fn.replace(".", "-64.")
+    else:
+        launcher_fn = launcher_fn.replace(".", "-32.")
+    return resource_string('setuptools', launcher_fn)
+
+
+def load_launcher_manifest(name):
+    manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml')
+    if six.PY2:
+        return manifest % vars()
+    else:
+        return manifest.decode('utf-8') % vars()
+
+
+def rmtree(path, ignore_errors=False, onerror=auto_chmod):
+    return shutil.rmtree(path, ignore_errors, onerror)
+
+
+def current_umask():
+    tmp = os.umask(0o022)
+    os.umask(tmp)
+    return tmp
+
+
+def bootstrap():
+    # This function is called when setuptools*.egg is run using /bin/sh
+    import setuptools
+
+    argv0 = os.path.dirname(setuptools.__path__[0])
+    sys.argv[0] = argv0
+    sys.argv.append(argv0)
+    main()
+
+
+def main(argv=None, **kw):
+    from setuptools import setup
+    from setuptools.dist import Distribution
+
+    class DistributionWithoutHelpCommands(Distribution):
+        common_usage = ""
+
+        def _show_help(self, *args, **kw):
+            with _patch_usage():
+                Distribution._show_help(self, *args, **kw)
+
+    if argv is None:
+        argv = sys.argv[1:]
+
+    with _patch_usage():
+        setup(
+            script_args=['-q', 'easy_install', '-v'] + argv,
+            script_name=sys.argv[0] or 'easy_install',
+            distclass=DistributionWithoutHelpCommands,
+            **kw
+        )
+
+
+@contextlib.contextmanager
+def _patch_usage():
+    import distutils.core
+    USAGE = textwrap.dedent("""
+        usage: %(script)s [options] requirement_or_url ...
+           or: %(script)s --help
+        """).lstrip()
+
+    def gen_usage(script_name):
+        return USAGE % dict(
+            script=os.path.basename(script_name),
+        )
+
+    saved = distutils.core.gen_usage
+    distutils.core.gen_usage = gen_usage
+    try:
+        yield
+    finally:
+        distutils.core.gen_usage = saved
+
+class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning):
+    """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning."""
+    
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc b/venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8145c042bef644e276820a347b5460073a1849ef
GIT binary patch
literal 87905
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
ZPRvnEffJ-lfRlrtg_Dhwi$`2Y1OTloS6Ki6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/egg_info.py b/venv/lib/python2.7/site-packages/setuptools/command/egg_info.py
new file mode 100644
index 00000000..5d8f451e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/egg_info.py
@@ -0,0 +1,717 @@
+"""setuptools.command.egg_info
+
+Create a distribution's .egg-info directory and contents"""
+
+from distutils.filelist import FileList as _FileList
+from distutils.errors import DistutilsInternalError
+from distutils.util import convert_path
+from distutils import log
+import distutils.errors
+import distutils.filelist
+import os
+import re
+import sys
+import io
+import warnings
+import time
+import collections
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import map
+
+from setuptools import Command
+from setuptools.command.sdist import sdist
+from setuptools.command.sdist import walk_revctrl
+from setuptools.command.setopt import edit_config
+from setuptools.command import bdist_egg
+from pkg_resources import (
+    parse_requirements, safe_name, parse_version,
+    safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
+import setuptools.unicode_utils as unicode_utils
+from setuptools.glob import glob
+
+from setuptools.extern import packaging
+from setuptools import SetuptoolsDeprecationWarning
+
+def translate_pattern(glob):
+    """
+    Translate a file path glob like '*.txt' in to a regular expression.
+    This differs from fnmatch.translate which allows wildcards to match
+    directory separators. It also knows about '**/' which matches any number of
+    directories.
+    """
+    pat = ''
+
+    # This will split on '/' within [character classes]. This is deliberate.
+    chunks = glob.split(os.path.sep)
+
+    sep = re.escape(os.sep)
+    valid_char = '[^%s]' % (sep,)
+
+    for c, chunk in enumerate(chunks):
+        last_chunk = c == len(chunks) - 1
+
+        # Chunks that are a literal ** are globstars. They match anything.
+        if chunk == '**':
+            if last_chunk:
+                # Match anything if this is the last component
+                pat += '.*'
+            else:
+                # Match '(name/)*'
+                pat += '(?:%s+%s)*' % (valid_char, sep)
+            continue  # Break here as the whole path component has been handled
+
+        # Find any special characters in the remainder
+        i = 0
+        chunk_len = len(chunk)
+        while i < chunk_len:
+            char = chunk[i]
+            if char == '*':
+                # Match any number of name characters
+                pat += valid_char + '*'
+            elif char == '?':
+                # Match a name character
+                pat += valid_char
+            elif char == '[':
+                # Character class
+                inner_i = i + 1
+                # Skip initial !/] chars
+                if inner_i < chunk_len and chunk[inner_i] == '!':
+                    inner_i = inner_i + 1
+                if inner_i < chunk_len and chunk[inner_i] == ']':
+                    inner_i = inner_i + 1
+
+                # Loop till the closing ] is found
+                while inner_i < chunk_len and chunk[inner_i] != ']':
+                    inner_i = inner_i + 1
+
+                if inner_i >= chunk_len:
+                    # Got to the end of the string without finding a closing ]
+                    # Do not treat this as a matching group, but as a literal [
+                    pat += re.escape(char)
+                else:
+                    # Grab the insides of the [brackets]
+                    inner = chunk[i + 1:inner_i]
+                    char_class = ''
+
+                    # Class negation
+                    if inner[0] == '!':
+                        char_class = '^'
+                        inner = inner[1:]
+
+                    char_class += re.escape(inner)
+                    pat += '[%s]' % (char_class,)
+
+                    # Skip to the end ]
+                    i = inner_i
+            else:
+                pat += re.escape(char)
+            i += 1
+
+        # Join each chunk with the dir separator
+        if not last_chunk:
+            pat += sep
+
+    pat += r'\Z'
+    return re.compile(pat, flags=re.MULTILINE|re.DOTALL)
+
+
+class InfoCommon:
+    tag_build = None
+    tag_date = None
+
+    @property
+    def name(self):
+        return safe_name(self.distribution.get_name())
+
+    def tagged_version(self):
+        version = self.distribution.get_version()
+        # egg_info may be called more than once for a distribution,
+        # in which case the version string already contains all tags.
+        if self.vtags and version.endswith(self.vtags):
+            return safe_version(version)
+        return safe_version(version + self.vtags)
+
+    def tags(self):
+        version = ''
+        if self.tag_build:
+            version += self.tag_build
+        if self.tag_date:
+            version += time.strftime("-%Y%m%d")
+        return version
+    vtags = property(tags)
+
+
+class egg_info(InfoCommon, Command):
+    description = "create a distribution's .egg-info directory"
+
+    user_options = [
+        ('egg-base=', 'e', "directory containing .egg-info directories"
+                           " (default: top of the source tree)"),
+        ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"),
+        ('tag-build=', 'b', "Specify explicit tag to add to version number"),
+        ('no-date', 'D', "Don't include date stamp [default]"),
+    ]
+
+    boolean_options = ['tag-date']
+    negative_opt = {
+        'no-date': 'tag-date',
+    }
+
+    def initialize_options(self):
+        self.egg_base = None
+        self.egg_name = None
+        self.egg_info = None
+        self.egg_version = None
+        self.broken_egg_info = False
+
+    ####################################
+    # allow the 'tag_svn_revision' to be detected and
+    # set, supporting sdists built on older Setuptools.
+    @property
+    def tag_svn_revision(self):
+        pass
+
+    @tag_svn_revision.setter
+    def tag_svn_revision(self, value):
+        pass
+    ####################################
+
+    def save_version_info(self, filename):
+        """
+        Materialize the value of date into the
+        build tag. Install build keys in a deterministic order
+        to avoid arbitrary reordering on subsequent builds.
+        """
+        egg_info = collections.OrderedDict()
+        # follow the order these keys would have been added
+        # when PYTHONHASHSEED=0
+        egg_info['tag_build'] = self.tags()
+        egg_info['tag_date'] = 0
+        edit_config(filename, dict(egg_info=egg_info))
+
+    def finalize_options(self):
+        # Note: we need to capture the current value returned
+        # by `self.tagged_version()`, so we can later update
+        # `self.distribution.metadata.version` without
+        # repercussions.
+        self.egg_name = self.name
+        self.egg_version = self.tagged_version()
+        parsed_version = parse_version(self.egg_version)
+
+        try:
+            is_version = isinstance(parsed_version, packaging.version.Version)
+            spec = (
+                "%s==%s" if is_version else "%s===%s"
+            )
+            list(
+                parse_requirements(spec % (self.egg_name, self.egg_version))
+            )
+        except ValueError:
+            raise distutils.errors.DistutilsOptionError(
+                "Invalid distribution name or version syntax: %s-%s" %
+                (self.egg_name, self.egg_version)
+            )
+
+        if self.egg_base is None:
+            dirs = self.distribution.package_dir
+            self.egg_base = (dirs or {}).get('', os.curdir)
+
+        self.ensure_dirname('egg_base')
+        self.egg_info = to_filename(self.egg_name) + '.egg-info'
+        if self.egg_base != os.curdir:
+            self.egg_info = os.path.join(self.egg_base, self.egg_info)
+        if '-' in self.egg_name:
+            self.check_broken_egg_info()
+
+        # Set package version for the benefit of dumber commands
+        # (e.g. sdist, bdist_wininst, etc.)
+        #
+        self.distribution.metadata.version = self.egg_version
+
+        # If we bootstrapped around the lack of a PKG-INFO, as might be the
+        # case in a fresh checkout, make sure that any special tags get added
+        # to the version info
+        #
+        pd = self.distribution._patched_dist
+        if pd is not None and pd.key == self.egg_name.lower():
+            pd._version = self.egg_version
+            pd._parsed_version = parse_version(self.egg_version)
+            self.distribution._patched_dist = None
+
+    def write_or_delete_file(self, what, filename, data, force=False):
+        """Write `data` to `filename` or delete if empty
+
+        If `data` is non-empty, this routine is the same as ``write_file()``.
+        If `data` is empty but not ``None``, this is the same as calling
+        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
+        unless `filename` exists, in which case a warning is issued about the
+        orphaned file (if `force` is false), or deleted (if `force` is true).
+        """
+        if data:
+            self.write_file(what, filename, data)
+        elif os.path.exists(filename):
+            if data is None and not force:
+                log.warn(
+                    "%s not set in setup(), but %s exists", what, filename
+                )
+                return
+            else:
+                self.delete_file(filename)
+
+    def write_file(self, what, filename, data):
+        """Write `data` to `filename` (if not a dry run) after announcing it
+
+        `what` is used in a log message to identify what is being written
+        to the file.
+        """
+        log.info("writing %s to %s", what, filename)
+        if six.PY3:
+            data = data.encode("utf-8")
+        if not self.dry_run:
+            f = open(filename, 'wb')
+            f.write(data)
+            f.close()
+
+    def delete_file(self, filename):
+        """Delete `filename` (if not a dry run) after announcing it"""
+        log.info("deleting %s", filename)
+        if not self.dry_run:
+            os.unlink(filename)
+
+    def run(self):
+        self.mkpath(self.egg_info)
+        os.utime(self.egg_info, None)
+        installer = self.distribution.fetch_build_egg
+        for ep in iter_entry_points('egg_info.writers'):
+            ep.require(installer=installer)
+            writer = ep.resolve()
+            writer(self, ep.name, os.path.join(self.egg_info, ep.name))
+
+        # Get rid of native_libs.txt if it was put there by older bdist_egg
+        nl = os.path.join(self.egg_info, "native_libs.txt")
+        if os.path.exists(nl):
+            self.delete_file(nl)
+
+        self.find_sources()
+
+    def find_sources(self):
+        """Generate SOURCES.txt manifest file"""
+        manifest_filename = os.path.join(self.egg_info, "SOURCES.txt")
+        mm = manifest_maker(self.distribution)
+        mm.manifest = manifest_filename
+        mm.run()
+        self.filelist = mm.filelist
+
+    def check_broken_egg_info(self):
+        bei = self.egg_name + '.egg-info'
+        if self.egg_base != os.curdir:
+            bei = os.path.join(self.egg_base, bei)
+        if os.path.exists(bei):
+            log.warn(
+                "-" * 78 + '\n'
+                "Note: Your current .egg-info directory has a '-' in its name;"
+                '\nthis will not work correctly with "setup.py develop".\n\n'
+                'Please rename %s to %s to correct this problem.\n' + '-' * 78,
+                bei, self.egg_info
+            )
+            self.broken_egg_info = self.egg_info
+            self.egg_info = bei  # make it work for now
+
+
+class FileList(_FileList):
+    # Implementations of the various MANIFEST.in commands
+
+    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):
+                    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):
+                    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.global_include(pattern):
+                    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.global_exclude(pattern):
+                    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.recursive_include(dir, pattern):
+                    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.recursive_exclude(dir, pattern):
+                    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.graft(dir_pattern):
+                log.warn("warning: no directories found matching '%s'",
+                         dir_pattern)
+
+        elif action == 'prune':
+            self.debug_print("prune " + dir_pattern)
+            if not self.prune(dir_pattern):
+                log.warn(("no previously-included directories found "
+                          "matching '%s'"), dir_pattern)
+
+        else:
+            raise DistutilsInternalError(
+                "this cannot happen: invalid action '%s'" % action)
+
+    def _remove_files(self, predicate):
+        """
+        Remove all files from the file list that match the predicate.
+        Return True if any matching files were removed
+        """
+        found = False
+        for i in range(len(self.files) - 1, -1, -1):
+            if predicate(self.files[i]):
+                self.debug_print(" removing " + self.files[i])
+                del self.files[i]
+                found = True
+        return found
+
+    def include(self, pattern):
+        """Include files that match 'pattern'."""
+        found = [f for f in glob(pattern) if not os.path.isdir(f)]
+        self.extend(found)
+        return bool(found)
+
+    def exclude(self, pattern):
+        """Exclude files that match 'pattern'."""
+        match = translate_pattern(pattern)
+        return self._remove_files(match.match)
+
+    def recursive_include(self, dir, pattern):
+        """
+        Include all files anywhere in 'dir/' that match the pattern.
+        """
+        full_pattern = os.path.join(dir, '**', pattern)
+        found = [f for f in glob(full_pattern, recursive=True)
+                 if not os.path.isdir(f)]
+        self.extend(found)
+        return bool(found)
+
+    def recursive_exclude(self, dir, pattern):
+        """
+        Exclude any file anywhere in 'dir/' that match the pattern.
+        """
+        match = translate_pattern(os.path.join(dir, '**', pattern))
+        return self._remove_files(match.match)
+
+    def graft(self, dir):
+        """Include all files from 'dir/'."""
+        found = [
+            item
+            for match_dir in glob(dir)
+            for item in distutils.filelist.findall(match_dir)
+        ]
+        self.extend(found)
+        return bool(found)
+
+    def prune(self, dir):
+        """Filter out files from 'dir/'."""
+        match = translate_pattern(os.path.join(dir, '**'))
+        return self._remove_files(match.match)
+
+    def global_include(self, pattern):
+        """
+        Include all files anywhere in the current directory that match the
+        pattern. This is very inefficient on large file trees.
+        """
+        if self.allfiles is None:
+            self.findall()
+        match = translate_pattern(os.path.join('**', pattern))
+        found = [f for f in self.allfiles if match.match(f)]
+        self.extend(found)
+        return bool(found)
+
+    def global_exclude(self, pattern):
+        """
+        Exclude all files anywhere that match the pattern.
+        """
+        match = translate_pattern(os.path.join('**', pattern))
+        return self._remove_files(match.match)
+
+    def append(self, item):
+        if item.endswith('\r'):  # Fix older sdists built on Windows
+            item = item[:-1]
+        path = convert_path(item)
+
+        if self._safe_path(path):
+            self.files.append(path)
+
+    def extend(self, paths):
+        self.files.extend(filter(self._safe_path, paths))
+
+    def _repair(self):
+        """
+        Replace self.files with only safe paths
+
+        Because some owners of FileList manipulate the underlying
+        ``files`` attribute directly, this method must be called to
+        repair those paths.
+        """
+        self.files = list(filter(self._safe_path, self.files))
+
+    def _safe_path(self, path):
+        enc_warn = "'%s' not %s encodable -- skipping"
+
+        # To avoid accidental trans-codings errors, first to unicode
+        u_path = unicode_utils.filesys_decode(path)
+        if u_path is None:
+            log.warn("'%s' in unexpected encoding -- skipping" % path)
+            return False
+
+        # Must ensure utf-8 encodability
+        utf8_path = unicode_utils.try_encode(u_path, "utf-8")
+        if utf8_path is None:
+            log.warn(enc_warn, path, 'utf-8')
+            return False
+
+        try:
+            # accept is either way checks out
+            if os.path.exists(u_path) or os.path.exists(utf8_path):
+                return True
+        # this will catch any encode errors decoding u_path
+        except UnicodeEncodeError:
+            log.warn(enc_warn, path, sys.getfilesystemencoding())
+
+
+class manifest_maker(sdist):
+    template = "MANIFEST.in"
+
+    def initialize_options(self):
+        self.use_defaults = 1
+        self.prune = 1
+        self.manifest_only = 1
+        self.force_manifest = 1
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        self.filelist = FileList()
+        if not os.path.exists(self.manifest):
+            self.write_manifest()  # it must exist so it'll get in the list
+        self.add_defaults()
+        if os.path.exists(self.template):
+            self.read_template()
+        self.prune_file_list()
+        self.filelist.sort()
+        self.filelist.remove_duplicates()
+        self.write_manifest()
+
+    def _manifest_normalize(self, path):
+        path = unicode_utils.filesys_decode(path)
+        return path.replace(os.sep, '/')
+
+    def write_manifest(self):
+        """
+        Write the file list in 'self.filelist' to the manifest file
+        named by 'self.manifest'.
+        """
+        self.filelist._repair()
+
+        # Now _repairs should encodability, but not unicode
+        files = [self._manifest_normalize(f) for f in self.filelist.files]
+        msg = "writing manifest file '%s'" % self.manifest
+        self.execute(write_file, (self.manifest, files), msg)
+
+    def warn(self, msg):
+        if not self._should_suppress_warning(msg):
+            sdist.warn(self, msg)
+
+    @staticmethod
+    def _should_suppress_warning(msg):
+        """
+        suppress missing-file warnings from sdist
+        """
+        return re.match(r"standard file .*not found", msg)
+
+    def add_defaults(self):
+        sdist.add_defaults(self)
+        self.check_license()
+        self.filelist.append(self.template)
+        self.filelist.append(self.manifest)
+        rcfiles = list(walk_revctrl())
+        if rcfiles:
+            self.filelist.extend(rcfiles)
+        elif os.path.exists(self.manifest):
+            self.read_manifest()
+
+        if os.path.exists("setup.py"):
+            # setup.py should be included by default, even if it's not
+            # the script called to create the sdist
+            self.filelist.append("setup.py")
+
+        ei_cmd = self.get_finalized_command('egg_info')
+        self.filelist.graft(ei_cmd.egg_info)
+
+    def prune_file_list(self):
+        build = self.get_finalized_command('build')
+        base_dir = self.distribution.get_fullname()
+        self.filelist.prune(build.build_base)
+        self.filelist.prune(base_dir)
+        sep = re.escape(os.sep)
+        self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep,
+                                      is_regex=1)
+
+
+def write_file(filename, contents):
+    """Create a file with the specified name and write 'contents' (a
+    sequence of strings without line terminators) to it.
+    """
+    contents = "\n".join(contents)
+
+    # assuming the contents has been vetted for utf-8 encoding
+    contents = contents.encode("utf-8")
+
+    with open(filename, "wb") as f:  # always write POSIX-style manifest
+        f.write(contents)
+
+
+def write_pkg_info(cmd, basename, filename):
+    log.info("writing %s", filename)
+    if not cmd.dry_run:
+        metadata = cmd.distribution.metadata
+        metadata.version, oldver = cmd.egg_version, metadata.version
+        metadata.name, oldname = cmd.egg_name, metadata.name
+
+        try:
+            # write unescaped data to PKG-INFO, so older pkg_resources
+            # can still parse it
+            metadata.write_pkg_info(cmd.egg_info)
+        finally:
+            metadata.name, metadata.version = oldname, oldver
+
+        safe = getattr(cmd.distribution, 'zip_safe', None)
+
+        bdist_egg.write_safety_flag(cmd.egg_info, safe)
+
+
+def warn_depends_obsolete(cmd, basename, filename):
+    if os.path.exists(filename):
+        log.warn(
+            "WARNING: 'depends.txt' is not used by setuptools 0.6!\n"
+            "Use the install_requires/extras_require setup() args instead."
+        )
+
+
+def _write_requirements(stream, reqs):
+    lines = yield_lines(reqs or ())
+    append_cr = lambda line: line + '\n'
+    lines = map(append_cr, lines)
+    stream.writelines(lines)
+
+
+def write_requirements(cmd, basename, filename):
+    dist = cmd.distribution
+    data = six.StringIO()
+    _write_requirements(data, dist.install_requires)
+    extras_require = dist.extras_require or {}
+    for extra in sorted(extras_require):
+        data.write('\n[{extra}]\n'.format(**vars()))
+        _write_requirements(data, extras_require[extra])
+    cmd.write_or_delete_file("requirements", filename, data.getvalue())
+
+
+def write_setup_requirements(cmd, basename, filename):
+    data = io.StringIO()
+    _write_requirements(data, cmd.distribution.setup_requires)
+    cmd.write_or_delete_file("setup-requirements", filename, data.getvalue())
+
+
+def write_toplevel_names(cmd, basename, filename):
+    pkgs = dict.fromkeys(
+        [
+            k.split('.', 1)[0]
+            for k in cmd.distribution.iter_distribution_names()
+        ]
+    )
+    cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n')
+
+
+def overwrite_arg(cmd, basename, filename):
+    write_arg(cmd, basename, filename, True)
+
+
+def write_arg(cmd, basename, filename, force=False):
+    argname = os.path.splitext(basename)[0]
+    value = getattr(cmd.distribution, argname, None)
+    if value is not None:
+        value = '\n'.join(value) + '\n'
+    cmd.write_or_delete_file(argname, filename, value, force)
+
+
+def write_entries(cmd, basename, filename):
+    ep = cmd.distribution.entry_points
+
+    if isinstance(ep, six.string_types) or ep is None:
+        data = ep
+    elif ep is not None:
+        data = []
+        for section, contents in sorted(ep.items()):
+            if not isinstance(contents, six.string_types):
+                contents = EntryPoint.parse_group(section, contents)
+                contents = '\n'.join(sorted(map(str, contents.values())))
+            data.append('[%s]\n%s\n\n' % (section, contents))
+        data = ''.join(data)
+
+    cmd.write_or_delete_file('entry points', filename, data, True)
+
+
+def get_pkg_info_revision():
+    """
+    Get a -r### off of PKG-INFO Version in case this is an sdist of
+    a subversion revision.
+    """
+    warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning)
+    if os.path.exists('PKG-INFO'):
+        with io.open('PKG-INFO') as f:
+            for line in f:
+                match = re.match(r"Version:.*-r(\d+)\s*$", line)
+                if match:
+                    return int(match.group(1))
+    return 0
+
+
+class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning):
+    """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning."""
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc b/venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c03502f4b613f0631f639a750d247eca0063d311
GIT binary patch
literal 29768
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install.py b/venv/lib/python2.7/site-packages/setuptools/command/install.py
new file mode 100644
index 00000000..31a5ddb5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/install.py
@@ -0,0 +1,125 @@
+from distutils.errors import DistutilsArgError
+import inspect
+import glob
+import warnings
+import platform
+import distutils.command.install as orig
+
+import setuptools
+
+# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for
+# now. See https://github.com/pypa/setuptools/issues/199/
+_install = orig.install
+
+
+class install(orig.install):
+    """Use easy_install to install the package, w/dependencies"""
+
+    user_options = orig.install.user_options + [
+        ('old-and-unmanageable', None, "Try not to use this!"),
+        ('single-version-externally-managed', None,
+         "used by system package builders to create 'flat' eggs"),
+    ]
+    boolean_options = orig.install.boolean_options + [
+        'old-and-unmanageable', 'single-version-externally-managed',
+    ]
+    new_commands = [
+        ('install_egg_info', lambda self: True),
+        ('install_scripts', lambda self: True),
+    ]
+    _nc = dict(new_commands)
+
+    def initialize_options(self):
+        orig.install.initialize_options(self)
+        self.old_and_unmanageable = None
+        self.single_version_externally_managed = None
+
+    def finalize_options(self):
+        orig.install.finalize_options(self)
+        if self.root:
+            self.single_version_externally_managed = True
+        elif self.single_version_externally_managed:
+            if not self.root and not self.record:
+                raise DistutilsArgError(
+                    "You must specify --record or --root when building system"
+                    " packages"
+                )
+
+    def handle_extra_path(self):
+        if self.root or self.single_version_externally_managed:
+            # explicit backward-compatibility mode, allow extra_path to work
+            return orig.install.handle_extra_path(self)
+
+        # Ignore extra_path when installing an egg (or being run by another
+        # command without --root or --single-version-externally-managed
+        self.path_file = None
+        self.extra_dirs = ''
+
+    def run(self):
+        # Explicit request for old-style install?  Just do it
+        if self.old_and_unmanageable or self.single_version_externally_managed:
+            return orig.install.run(self)
+
+        if not self._called_from_setup(inspect.currentframe()):
+            # Run in backward-compatibility mode to support bdist_* commands.
+            orig.install.run(self)
+        else:
+            self.do_egg_install()
+
+    @staticmethod
+    def _called_from_setup(run_frame):
+        """
+        Attempt to detect whether run() was called from setup() or by another
+        command.  If called by setup(), the parent caller will be the
+        'run_command' method in 'distutils.dist', and *its* caller will be
+        the 'run_commands' method.  If called any other way, the
+        immediate caller *might* be 'run_command', but it won't have been
+        called by 'run_commands'. Return True in that case or if a call stack
+        is unavailable. Return False otherwise.
+        """
+        if run_frame is None:
+            msg = "Call stack not available. bdist_* commands may fail."
+            warnings.warn(msg)
+            if platform.python_implementation() == 'IronPython':
+                msg = "For best results, pass -X:Frames to enable call stack."
+                warnings.warn(msg)
+            return True
+        res = inspect.getouterframes(run_frame)[2]
+        caller, = res[:1]
+        info = inspect.getframeinfo(caller)
+        caller_module = caller.f_globals.get('__name__', '')
+        return (
+            caller_module == 'distutils.dist'
+            and info.function == 'run_commands'
+        )
+
+    def do_egg_install(self):
+
+        easy_install = self.distribution.get_command_class('easy_install')
+
+        cmd = easy_install(
+            self.distribution, args="x", root=self.root, record=self.record,
+        )
+        cmd.ensure_finalized()  # finalize before bdist_egg munges install cmd
+        cmd.always_copy_from = '.'  # make sure local-dir eggs get installed
+
+        # pick up setup-dir .egg files only: no .egg-info
+        cmd.package_index.scan(glob.glob('*.egg'))
+
+        self.run_command('bdist_egg')
+        args = [self.distribution.get_command_obj('bdist_egg').egg_output]
+
+        if setuptools.bootstrap_install_from:
+            # Bootstrap self-installation of setuptools
+            args.insert(0, setuptools.bootstrap_install_from)
+
+        cmd.args = args
+        cmd.run()
+        setuptools.bootstrap_install_from = None
+
+
+# XXX Python 3.1 doesn't see _nc if this is inside the class
+install.sub_commands = (
+    [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] +
+    install.new_commands
+)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f86a09498b539844972079b97448700513317a68
GIT binary patch
literal 5493
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py b/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py
new file mode 100644
index 00000000..edc4718b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py
@@ -0,0 +1,62 @@
+from distutils import log, dir_util
+import os
+
+from setuptools import Command
+from setuptools import namespaces
+from setuptools.archive_util import unpack_archive
+import pkg_resources
+
+
+class install_egg_info(namespaces.Installer, Command):
+    """Install an .egg-info directory for the package"""
+
+    description = "Install an .egg-info directory for the package"
+
+    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'))
+        ei_cmd = self.get_finalized_command("egg_info")
+        basename = pkg_resources.Distribution(
+            None, None, ei_cmd.egg_name, ei_cmd.egg_version
+        ).egg_name() + '.egg-info'
+        self.source = ei_cmd.egg_info
+        self.target = os.path.join(self.install_dir, basename)
+        self.outputs = []
+
+    def run(self):
+        self.run_command('egg_info')
+        if os.path.isdir(self.target) and not os.path.islink(self.target):
+            dir_util.remove_tree(self.target, dry_run=self.dry_run)
+        elif os.path.exists(self.target):
+            self.execute(os.unlink, (self.target,), "Removing " + self.target)
+        if not self.dry_run:
+            pkg_resources.ensure_directory(self.target)
+        self.execute(
+            self.copytree, (), "Copying %s to %s" % (self.source, self.target)
+        )
+        self.install_namespaces()
+
+    def get_outputs(self):
+        return self.outputs
+
+    def copytree(self):
+        # Copy the .egg-info tree to site-packages
+        def skimmer(src, dst):
+            # filter out source-control directories; note that 'src' is always
+            # a '/'-separated path, regardless of platform.  'dst' is a
+            # platform-specific path.
+            for skip in '.svn/', 'CVS/':
+                if src.startswith(skip) or '/' + skip in src:
+                    return None
+            self.outputs.append(dst)
+            log.debug("Copying %s to %s", src, dst)
+            return dst
+
+        unpack_archive(self.source, self.target, skimmer)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5d9451fb67bfe08f290f5ef8b2d5526c995673d3
GIT binary patch
literal 3617
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
TP(cq)U1E$pOahD`$ioZ(Fx*rF

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_lib.py b/venv/lib/python2.7/site-packages/setuptools/command/install_lib.py
new file mode 100644
index 00000000..2b31c3e3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/install_lib.py
@@ -0,0 +1,121 @@
+import os
+import imp
+from itertools import product, starmap
+import distutils.command.install_lib as orig
+
+
+class install_lib(orig.install_lib):
+    """Don't add compiled flags to filenames of non-Python files"""
+
+    def run(self):
+        self.build()
+        outfiles = self.install()
+        if outfiles is not None:
+            # always compile, in case we have any extension stubs to deal with
+            self.byte_compile(outfiles)
+
+    def get_exclusions(self):
+        """
+        Return a collections.Sized collections.Container of paths to be
+        excluded for single_version_externally_managed installations.
+        """
+        all_packages = (
+            pkg
+            for ns_pkg in self._get_SVEM_NSPs()
+            for pkg in self._all_packages(ns_pkg)
+        )
+
+        excl_specs = product(all_packages, self._gen_exclusion_paths())
+        return set(starmap(self._exclude_pkg_path, excl_specs))
+
+    def _exclude_pkg_path(self, pkg, exclusion_path):
+        """
+        Given a package name and exclusion path within that package,
+        compute the full exclusion path.
+        """
+        parts = pkg.split('.') + [exclusion_path]
+        return os.path.join(self.install_dir, *parts)
+
+    @staticmethod
+    def _all_packages(pkg_name):
+        """
+        >>> list(install_lib._all_packages('foo.bar.baz'))
+        ['foo.bar.baz', 'foo.bar', 'foo']
+        """
+        while pkg_name:
+            yield pkg_name
+            pkg_name, sep, child = pkg_name.rpartition('.')
+
+    def _get_SVEM_NSPs(self):
+        """
+        Get namespace packages (list) but only for
+        single_version_externally_managed installations and empty otherwise.
+        """
+        # TODO: is it necessary to short-circuit here? i.e. what's the cost
+        # if get_finalized_command is called even when namespace_packages is
+        # False?
+        if not self.distribution.namespace_packages:
+            return []
+
+        install_cmd = self.get_finalized_command('install')
+        svem = install_cmd.single_version_externally_managed
+
+        return self.distribution.namespace_packages if svem else []
+
+    @staticmethod
+    def _gen_exclusion_paths():
+        """
+        Generate file paths to be excluded for namespace packages (bytecode
+        cache files).
+        """
+        # always exclude the package module itself
+        yield '__init__.py'
+
+        yield '__init__.pyc'
+        yield '__init__.pyo'
+
+        if not hasattr(imp, 'get_tag'):
+            return
+
+        base = os.path.join('__pycache__', '__init__.' + imp.get_tag())
+        yield base + '.pyc'
+        yield base + '.pyo'
+        yield base + '.opt-1.pyc'
+        yield base + '.opt-2.pyc'
+
+    def copy_tree(
+            self, infile, outfile,
+            preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1
+    ):
+        assert preserve_mode and preserve_times and not preserve_symlinks
+        exclude = self.get_exclusions()
+
+        if not exclude:
+            return orig.install_lib.copy_tree(self, infile, outfile)
+
+        # Exclude namespace package __init__.py* files from the output
+
+        from setuptools.archive_util import unpack_directory
+        from distutils import log
+
+        outfiles = []
+
+        def pf(src, dst):
+            if dst in exclude:
+                log.warn("Skipping installation of %s (namespace package)",
+                         dst)
+                return False
+
+            log.info("copying %s -> %s", src, os.path.dirname(dst))
+            outfiles.append(dst)
+            return dst
+
+        unpack_directory(infile, outfile, pf)
+        return outfiles
+
+    def get_outputs(self):
+        outputs = orig.install_lib.get_outputs(self)
+        exclude = self.get_exclusions()
+        if exclude:
+            return [f for f in outputs if f not in exclude]
+        return outputs
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..54906a17a7cc337fced5e48fb2cc40abc3f78f1c
GIT binary patch
literal 5518
zcmZSn%*&NH<x)&C0~9bbFfceUFfbIyGB7ZtFfgPrGUPBYM8VmN3{i|=aVCZwCWc&Q
zhA3u+To#5X76wMBYF36UHij&AhA0k(6lR804iGzyks*bJp@o5=nSmiPiXCKXum&pw
z14HKj|NsB{X)rM`FqE(}FfbGp<)@S;mw?&DC5c73i3KIxAa!}gC5bsX@j01EaHoRw
zJAs^<$H2gl$^dm(6cfnw76y>RQkXz?MzMe#0uo_mNM(aLgpmQ{4py)N4zM^Ih~3P{
z5XH%m!VX3pV3L!eg@qxCiy?&zq#%l$At+b_<fdXv1_lO~{5<s%g~XH;h2;F)g3O%M
z6os^$#Pni?l6-}<%$(G`#N5<kh5R&yy!<@ffXb4L{5-IDaWW$V0|Ut4AnXkCh8Y6`
zLk$B%7C4j`K`cg4c-1m8)PRFLo0Fl)2&{q`B+|^tz?cV)mtYN$S$-NUpil&bN>XWN
zP6{{-Ga=zt0+RB}&r2=gVPIfLsw_#3hdLJ$^dRZt)SR>u4h9B>{L&JT%ZoKYNdin1
zS1>Rz=ob`amL-;?>X#)J>8IuAq@)%V>t`40XBQipn;RBp8JU+ET9_B-RHm25o1~bS
z7#J8Br03~}=oe%b=tAA0Tb^iH8knJ9oLW*^P?DdYQ;f_^&d<$F%uCUSDh5TiUO{CE
zC`lHT=5c|-2;@EnMlMDkMjj?`2!bR*t_RV@?hFhJ?F<Z{)W*or#=y`43r&}1Muu8O
zh7xd4f<&1>A=}KvP|L(n!pu;@0#?e(P{YK~%*4>l$Pf$;m*VLR3=CWfP!N<_Qd*R!
zkf@NHpOcfCT#}ieSF9JDS(OTkdxVH{eqKppW?pI$DAo%SOESP|At@DZPHIJRPH74#
zq2w1S6ldn8=cLA$r4|)u=I6zyR+OX`<t66iRL18f<|U@5rYJx|BN1XB+!VO)K|VJI
zg^e~O{lqGQybAIp12mbq#Bzf?TEoN;##kuEP{<6*z_3IEN;)OH3=9nMp!`*kn4F!M
zo?5H{GPMMhH1!Nh*cccX@`~dNveUtFQIMSuPH;h>3_I}YqnML{fx#v{H7~WIpvX=f
z6cV5W!N$nUr~z_$2_MLF>8U00!C|hx@qWPp#X+EyT_OSz2L*a^PANF}!O;cwWN~Uq
z5IATAL8_op1`2|BkQ#9Cfc+27P{<)y0!pVK_3_08smahx1TqP%d|-1DC?r4u0dgML
z!^I%q6@xPs8xNxZizs6<DB?lk2cp5nk`5?YF@lPv6h=_is9|DAXJinsWd>!ZEGC95
zW^kFr!cfD^&;!po<;Xe5J+mwolyRV`O950UDkSEmD8L<}018!w^30Nq%shpXjKmTJ
zs9GIFg3r$_C@o1<D9K1wNGr|BLDQ@US6BiHZ9Q=HQUWRsiwklxOTcM4zZhH)g6sk_
zvhp+YP^y=d%p!0p3XZEFP_6){9=J2Xkq<VsAhD<f8o8jvG@$Vs1d2s@Si)yu6=Osx
z96%Lju^s~hLxnmhriwH{WEi-D0oU)%j0`c%47CiPVxyJ`R6K;IFfjy!(|9qcZiR=e
zot>RRPG)h52DD59m(Zx?hI(3lzFtydkzP__mAa-TTx&FngpLA?s}5nR$HG+xi83%S
z_<>6pa9%0`1$8E<^aHyHTtyXRr^ka55j3k7fTJWiBQqxjTpodmfsGPSDWDFD5>OGu
zz{bhQiii|Yu?o&wHlVBpuA{OT8HxoM(is?nLG?bk2?MFJY8XKotd<E>H5FNaVlIn;
zA&ZeA7^D_bNp+%RwbT-D_9`w&OiqPmqGAONP_$_(B$bvZ<mcs7Dx~EX!2_JcDhQHs
za|=o;74l0mQj5wni&GJqF9=k2fb$TzWK78{E-A`PDg{Mfi4dqB0kwxfZi|Oz@Zu6s
ze1l4*w9LH398h%%YMX!>0ws!|03=jFf>Q-J!=hy6<lGc+9xpCS%>}0iFfp)+0#yDQ
zg8T$Z9Sj^ij4Vw2jGRoM49Wm1v_N48;uL3s8sCfzVT>uDIy;4#A&jwv0aV_muz(sU
z#Yzk*tPH^=;KDbHg&~Cv)KD#9WXNI#wQIyd4I6M<GKGUd9GufrIAIJf7=s(c02!kJ
zY7-V`qo$&~)S|?aRB%%jTsA`+F_1zR)_4JBLG*+MYFsAgry!a;$%)CJ5<4>|wOA98
zPKvof^=f=(US>&ryk0?NF~|||2!1lUKt8xV3rZ&?iRpgesE&^>s05oH9}jK>z_k~H
z0#dJ_G8x9mF9wCUUVcG|t|3?)&NTvYA?*ZEb0#CPII*Op2wbjY<`x8jniD}13=9lG
zk{|+<qah^|$cCiE;#6>|0uuw9wD=hq7#u-K3)HG%U}t4wWn^XIXJlcLXXFIKOi%&?
zr7MPHkViQg7#Ki)09EtF6F}t<GeeOuLk$a<WM$wfmSiYlU}$0l7dhaLNGG^KUF^sJ
zPj@xo7AC0C%*+s+!pM-q#E`?vkjutU%g(?E;xjYkuruUxFmy69Fs3swbTWaO=k1IP
z?Mw`5%%GlF8v{cv2SW`zsHIxN#8AV*(9F!h*a513KvlONxPJ%<aRCMfhSEGxsS%%&
zS(KVwl3!E_kpcN3CqF$IRIY+BNT)C;ECN9OVg$AAv)LGm6c{>S&6pZSP&Q&LVPpsf
zi7|m(Uc&(D3S_Z>G7(6g5$2REHjwK;-K`o>^9E#_U$H&|14D3jW<fz_UOGw>9n|Vq
zEmqLL$Qzo)ARi>>7gU0@s1_^e+9{|OYk(pHTu_xK7UhBKF}K8=;#9CuW?ou8A_;;s
zKuTs2$YgMvJh7l4H7^BR34jx9aZxguPAM({7m8pF;I>OjYLG4{{eoJ01D{yIZLxy1
zbWjw5ibMuR9!5?^c5q_lWz^sVbz?!|j>W~PMWC9)wWuh+C<v6Y!NHPWl$jm`is%xM
zQc#G-mlUO@mVh!VqGzd>Sd^TRS(X}KT9TO)1Zu^Cm4j*|kVr8&M8K9oDi2UaotX#f
z`GUg@+6xAEjS7lVi&KlrQsZ;;Q&Pb#LbymtW^QV638(=E7b>pI&B@HmE(S+tPHI^y
z#P%Ri{~jFp;K&Iw1w{xvRtC280F7jXfuaKx#tbZyj66(ijAASTi~>w-Orl%@khTk`
zyZ~Wv+r=9cOW>wR789t9fHqecK+TnA255h?$Q{(CsbOSriIrfeWd?N-YM2<Z*%^wo
zLF_mthC*$IU~skq6;F^Mj35h8$bjP)R7rq}{QT0Ag3^*=a1sDFE+A0`$~!PAP;i1<
z{%Mdf9{5%{Xl$wk6sTMvw=fDZ@-VV7Dl>wsTW~8j9^8hFj|Vq%<3Wk5G$%Da9-RE*
z<5TjJ<Ku%sDIDx=a3dewrYbH;EXhpHO)bgDPYD8<9R$iOL7*BS2o#Y)Ad3-!0A>wr
z@&d&rD6Wb@EkHI#HYQGXPCiZ!elAV{esNJ5NG1g3-XJYdssi~rvm~_$JU|5Qt3$ft
zvY=K`W^oBP`|3eQi}aBCBH)mNih~OXa8d#X0D>6Mpa93aO>TZlX-=vgD9M96-#m;w
JjAD#J%m91QO3(lR

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py b/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py
new file mode 100644
index 00000000..16234273
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py
@@ -0,0 +1,65 @@
+from distutils import log
+import distutils.command.install_scripts as orig
+import os
+import sys
+
+from pkg_resources import Distribution, PathMetadata, ensure_directory
+
+
+class install_scripts(orig.install_scripts):
+    """Do normal script install, plus any egg_info wrapper scripts"""
+
+    def initialize_options(self):
+        orig.install_scripts.initialize_options(self)
+        self.no_ep = False
+
+    def run(self):
+        import setuptools.command.easy_install as ei
+
+        self.run_command("egg_info")
+        if self.distribution.scripts:
+            orig.install_scripts.run(self)  # run first to set up self.outfiles
+        else:
+            self.outfiles = []
+        if self.no_ep:
+            # don't install entry point scripts into .egg file!
+            return
+
+        ei_cmd = self.get_finalized_command("egg_info")
+        dist = Distribution(
+            ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info),
+            ei_cmd.egg_name, ei_cmd.egg_version,
+        )
+        bs_cmd = self.get_finalized_command('build_scripts')
+        exec_param = getattr(bs_cmd, 'executable', None)
+        bw_cmd = self.get_finalized_command("bdist_wininst")
+        is_wininst = getattr(bw_cmd, '_is_running', False)
+        writer = ei.ScriptWriter
+        if is_wininst:
+            exec_param = "python.exe"
+            writer = ei.WindowsScriptWriter
+        if exec_param == sys.executable:
+            # In case the path to the Python executable contains a space, wrap
+            # it so it's not split up.
+            exec_param = [exec_param]
+        # resolve the writer to the environment
+        writer = writer.best()
+        cmd = writer.command_spec_class.best().from_param(exec_param)
+        for args in writer.get_args(dist, cmd.as_header()):
+            self.write_script(*args)
+
+    def write_script(self, script_name, contents, mode="t", *ignored):
+        """Write an executable file to the scripts directory"""
+        from setuptools.command.easy_install import chmod, current_umask
+
+        log.info("Installing %s script to %s", script_name, self.install_dir)
+        target = os.path.join(self.install_dir, script_name)
+        self.outfiles.append(target)
+
+        mask = current_umask()
+        if not self.dry_run:
+            ensure_directory(target)
+            f = open(target, "w" + mode)
+            f.write(contents)
+            f.close()
+            chmod(target, 0o777 - mask)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc b/venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7b8d654c206bd642e8f62dace3d61d1983ab2bb0
GIT binary patch
literal 3161
zcmZSn%*&NH<x)&C0~9bbFfceUFfbGsGcYiuFfgPrGUPBY<T5fuF)}cM_)H8rObl7f
z3|TA;QLJDUObj_}3{h+_HakNUJDAPPki)@{%gGSM$&ky%5XHri%gqqQ&A^z#!jQ@e
z(x1l2kiyE)!obkXzz`Y5!jQtm5Ujz*z`&6C|NsC08jK7K3?(4<<m9LOX@D3dJPZsB
zE}6w8MVU#ZC7JnoV1a<dk__L}lEjq6lEe}L1_p-IyyDWL)cBOlqSWM){G!Sdevp}Y
z#U+V3Iq}8GMVSR9#c&TZF)%PVfjq1O(#ZhwX9@#D6cfnjEes4%%phlh7%U7a%nT_k
z3@wZxj|T;7u!3}1gItuake6SSo0y{jF<c=NVwa9WK~8D0LSkN}LTY+?d}dx+zCw9X
zVnIP_5maSyGRTu44047u$Us?;uNfG!7#Xsd7-|?8ni&}wOPE2dcotBw27|-J4{Uo0
z3j+f~eo<z65QtGC1omcTNoHbBW>so@egP<mic3K5bW6-BP6e~_^5atrz-EAT7pLZ=
zX@KG$Ocd8JFfiyB6lInrmZa*JB^K$Y<>#cN78UDf7wTsh8=0FM7G@clml;}^7w1%_
zm&co=n3xzC7#O7I>4)eSWESW`y{=oHXjvMVp<kR@Qd&@wpPy5V%uLSD%}vZp(T6IA
z#fe@)We_O(L9tv6@(}~003$erxEUB2K;8g{P#PmRS*9?6QYIvvY8gQRlm(6}P=M7i
zfYMhMD?^bTLkSy07CS>02S^1-E{~HTodLv&=LC^iTnt4a;D7~b;s(WbGb2MS6GI6P
zLk$x{7B52yACv*&@-s9ufw=-;QjnpUg`t)iY!Ejnfq?X~Fq8-})UbdOO9}%+Gc!Xi
zD@*|^C_Zc1zzWzHQrH+uM8FEz8EP0AvP2nbIT&i#8HzqLq_Bf^F*0O{fdumy7;0D<
zO2iqmBp9-p7>f89Ygif589{15QXC9flAv4!($2w<B?aYXNrQBOoW#jcq03Oi!H^}x
zP{Yhn!^w~(3sT?A#NZMu%uve(cAp$W4HrWX0|R5BH)D7T14FO|2Ll6xA2>IbfS9mU
zT*Ax1z>rj$nUeyGx)Lr>?x{#kE-gt+%1MPNNXaZNi7(I014VNQHv<Dhd}eWcQE6UY
zW?p(RNJBwoNk)F2UTQ_EhCC?Qg9t>5(Ss%vz0}0w%6O0=i8(nX><kPHPziAEN09_s
zQdF83kE{UX3V3+|(hbR^#X+D11<5#|vZbgr5A4VM(vq~yoYdkVkcUe|85kJSQ%mC0
zGV{QhDg|bA5Gd1vHGl#oDX};;2$Y3`K;D82=OyN*f;|pWQ<hp(3@WlfPDoEJNh~QT
z0_Q-#{Jhj4kRaGQ!QkR4yeP9IwWvgxfq@}BGcP5-yck6s<lf@S;vi5)0h^JOT3iCo
z{!ov{7Z;=^$0z3`78iqKCaowxH@+aTC@~l8Hjs}Ji_(irI2jli5{u(AQWH~Bi@^4m
zgKUPzss<=HgFtFZKz>WjECJ=t)Xezg+!V02pr8edB^86kK%P&nNKJ-X1yY?<4wuO+
zh9?G)4A`b3Z~+f959B6rIRqvKzAysCz5u9DHUgE9j6zJjj696OOq`6IOe{?NjLeJ@
zj6zKOj6#ec%*n{c$i~RS$j{8f#KS1TD9=~|P9w>nk_;3wAle;d+9pud$_OfHAXRHE
zD?=_5LoFM)pw9x=Gc}Ch9LWkQ92k*Huq;+kNzu&2P|FTh!O4)t1u8N?C0h*}C{KgR
z00xFEZieD@;4+LIROB$0@PbsOuz<3^I7mAuxD)^vZD75e3|agj?Vy6Ch8<Kf*KjaM
zG&3<U<}rW@s$dOJ8Z9;iB}q^kQAo^F0L3*V!z+ODj6zAiLP<s{tZq|)SHR#BL<5wD
zz*SIkMs9uzxQIwDEh<XQD~T`7O)SnXmSSLF@Pt&InR)37s>M)~K<26zgF~}C^FJd4
zgP#T{R)Y8$7#M;;4hjOrPY@`Mz{wI+(Soxbw9Ejt1i&dczZfiEkXVudW@P1O<^_p?
zN*+*x1Xav=Dc}MorKl2APz8Z98dzn1L24e@?ch`kW+mt37pH1~A{LTGK$!(nw8Vq+
zJ*fOh&d)1J%`1Ueo134K3N}46Jukl~H3i{xa2_g2EJ{x;0ow)&4X}3yRn@G@z`$S(
zO242GV_*_v5@VEL6aeK0MlMESMqWlPMsVv5T*SnK10g;hT>Qkx=jNxB=A_2QgZ&>L
zpOT*(9}lkUgFtyK2xK%k&m)L|&;6kM$_er>C??q$*_b$4IF&WPWiCh<RQQ#aWabn@
z5}qO`Q)d>JfQ8^y7c2!r5=L<lINgE_hSWZ0pcD+M^}xBIAUi$2D784hv?w{X7+k?X
m>J(5aL<9_&HQ=EGj$|81wAz8nIdFw8z$nDX!^p!V!wdj#!}#+6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml b/venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml
new file mode 100644
index 00000000..5972a96d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml	
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+    <assemblyIdentity version="1.0.0.0"
+                      processorArchitecture="X86"
+                      name="%(name)s"
+                      type="win32"/>
+    <!-- Identify the application security requirements. -->
+    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+        <security>
+            <requestedPrivileges>
+                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
+            </requestedPrivileges>
+        </security>
+    </trustInfo>
+</assembly>
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/py36compat.py b/venv/lib/python2.7/site-packages/setuptools/command/py36compat.py
new file mode 100644
index 00000000..61063e75
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/py36compat.py
@@ -0,0 +1,136 @@
+import os
+from glob import glob
+from distutils.util import convert_path
+from distutils.command import sdist
+
+from setuptools.extern.six.moves import filter
+
+
+class sdist_add_defaults:
+    """
+    Mix-in providing forward-compatibility for functionality as found in
+    distutils on Python 3.7.
+
+    Do not edit the code in this class except to update functionality
+    as implemented in distutils. Instead, override in the subclass.
+    """
+
+    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_add_defaults._cs_path_exists(__file__)
+        True
+        >>> sdist_add_defaults._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())
+
+
+if hasattr(sdist.sdist, '_add_defaults_standards'):
+    # disable the functionality already available upstream
+    class sdist_add_defaults:
+        pass
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc b/venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2d6a9ae8ea8326db31ba94b352be53f741eff3b2
GIT binary patch
literal 6198
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
FCIC(u-I4$R

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/register.py b/venv/lib/python2.7/site-packages/setuptools/command/register.py
new file mode 100644
index 00000000..98bc0156
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/register.py
@@ -0,0 +1,18 @@
+from distutils import log
+import distutils.command.register as orig
+
+
+class register(orig.register):
+    __doc__ = orig.register.__doc__
+
+    def run(self):
+        try:
+            # Make sure that we are using valid current name/version info
+            self.run_command('egg_info')
+            orig.register.run(self)
+        finally:
+            self.announce(
+                "WARNING: Registering is deprecated, use twine to "
+                "upload instead (https://pypi.org/p/twine/)",
+                log.WARN
+            )
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/register.pyc b/venv/lib/python2.7/site-packages/setuptools/command/register.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..977797550fd780b00b396ba83059fa6d403c94fd
GIT binary patch
literal 1080
zcmZSn%*&NH<x)&C0~9bbFfceUFfbI`GcYiuFfgPrGUPBY<T5fuF)}cM_)H8rObl7f
z3|TA;QLGFp%nYflAa)ufLkbH+3j;$l14CpK3quMML$C%b0|P_m|NsC0YcMh}FqDAI
z&dE>rE8$>ZU?@sW&nzxUErQz&QsM-%S(br;A(a7SVJh4v7LZ$77(iAA1%pjX2B`;O
zHU<U;XOKP{1_p*IMTQy%hAgnVn;97xOBfllz=qT?Fo5{sDGXo*U<a14GGwtaG&3<U
zMx-z>1Z#lY2XS0#dU||jURr)}Gy?-exMPr?r=Po(LJ-u+nR)37nZ*hzsRc!;$%!SY
zDLM+J#i<G<<(YY@3MKgpr3E?pi75)1dBr8Ei75&i86_nJ#a8<I1(gMvdih1^`UU!6
zwfdSG?4WSr1_eiHUVL(XZf;^;N(l=C14DjMW_l3Fd*DzjD$N52T4G*aeraBEY7i*4
z!0JGb1BVBgSDc!YrU8-z6UC(r3=H}OMVV!ZC8_#liADNp`8g@6MaBBrh5FgWM&{;*
zg;_@CWrh~!#W|Jf<?$vdCME_31_tSQ`XTxSnFYEaFC^yV=$0p1mIh|%7pIn#7L?@Y
z=M*C|q0ZKa#i(9EWe_OlL9txS19A-`GZQbP2ooD4Gm{1=y1;&kkIzfYO^uH);bLH5
zh>y?BPbtkwjgJok`5xkPP~gPJr{pKc$Ab+7dkR4ep!Yx#1M*@q$gymUJWy|Og7Qpe
zaY<=OW==6Aj--%<^q@hd2MekakQbqXU_XO>kMJUxHE{j}$CC{tX6!(I2K!flQHU7;
DC%_4v

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/rotate.py b/venv/lib/python2.7/site-packages/setuptools/command/rotate.py
new file mode 100644
index 00000000..b89353f5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/rotate.py
@@ -0,0 +1,66 @@
+from distutils.util import convert_path
+from distutils import log
+from distutils.errors import DistutilsOptionError
+import os
+import shutil
+
+from setuptools.extern import six
+
+from setuptools import Command
+
+
+class rotate(Command):
+    """Delete older distributions"""
+
+    description = "delete older distributions, keeping N newest files"
+    user_options = [
+        ('match=', 'm', "patterns to match (required)"),
+        ('dist-dir=', 'd', "directory where the distributions are"),
+        ('keep=', 'k', "number of matching distributions to keep"),
+    ]
+
+    boolean_options = []
+
+    def initialize_options(self):
+        self.match = None
+        self.dist_dir = None
+        self.keep = None
+
+    def finalize_options(self):
+        if self.match is None:
+            raise DistutilsOptionError(
+                "Must specify one or more (comma-separated) match patterns "
+                "(e.g. '.zip' or '.egg')"
+            )
+        if self.keep is None:
+            raise DistutilsOptionError("Must specify number of files to keep")
+        try:
+            self.keep = int(self.keep)
+        except ValueError:
+            raise DistutilsOptionError("--keep must be an integer")
+        if isinstance(self.match, six.string_types):
+            self.match = [
+                convert_path(p.strip()) for p in self.match.split(',')
+            ]
+        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
+
+    def run(self):
+        self.run_command("egg_info")
+        from glob import glob
+
+        for pattern in self.match:
+            pattern = self.distribution.get_name() + '*' + pattern
+            files = glob(os.path.join(self.dist_dir, pattern))
+            files = [(os.path.getmtime(f), f) for f in files]
+            files.sort()
+            files.reverse()
+
+            log.info("%d file(s) matching %s", len(files), pattern)
+            files = files[self.keep:]
+            for (t, f) in files:
+                log.info("Deleting %s", f)
+                if not self.dry_run:
+                    if os.path.isdir(f):
+                        shutil.rmtree(f)
+                    else:
+                        os.unlink(f)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc b/venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..34d53affc3f931f7b6ba274ee4d53c575a2804ac
GIT binary patch
literal 3306
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/saveopts.py b/venv/lib/python2.7/site-packages/setuptools/command/saveopts.py
new file mode 100644
index 00000000..611cec55
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/saveopts.py
@@ -0,0 +1,22 @@
+from setuptools.command.setopt import edit_config, option_base
+
+
+class saveopts(option_base):
+    """Save command-line options to a file"""
+
+    description = "save supplied options to setup.cfg or other config file"
+
+    def run(self):
+        dist = self.distribution
+        settings = {}
+
+        for cmd in dist.command_options:
+
+            if cmd == 'saveopts':
+                continue  # don't save our own options!
+
+            for opt, (src, val) in dist.get_option_dict(cmd).items():
+                if src == "command line":
+                    settings.setdefault(cmd, {})[opt] = val
+
+        edit_config(self.filename, settings, self.dry_run)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc b/venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6de1ad27c54c13ce9f0598505718c27d09453aeb
GIT binary patch
literal 1291
zcmZSn%*&NH<x)&C0~9bbFfceUFfbGwFfcHrFfgPrGUPBY<T5fuF*4*bF+?#jFs3ju
zq%tw2F*2kuGqf-;G&3+nMlmy_urLH`ure?(Wd8sE|Gx$k0|P?|Hv<DhYD#8Fd~$wX
zT4p+!pI=atnV%P*lvtcv!U3`<u`D&eprjb?0!9V~1}Bh&EJ!y4$l??Rki{vC3?O@$
zK$b?aFa!l_fE-(_%)r19oLH8sker{Jo0ylPo0FNBssOR3SfM0eAyFYMGbgp!9AqX)
zU2$naK~83B3bLBw)RNKyz2vlXh5RCg{F02+A_a(>!FrQHZenL(U|?flU~mSRvw(qt
zp@xAWi-Dn*ks*_Tp_YlEqJ*J_ks*tb!6i16p_ZAUh8Yxi*-Q*Yh75(040#L;6@Fk9
zOdzRdMuseAP}sS|nlr>OG1RhvNmhnhHijBjh7=|SkWP1o8a9R+CWb5)ke*BihGr&)
z8WskdLU)EjcZTpnNrvzeR<J|B%0Mn+XJ}?-U`%0PfCP_U5GW>!c^DWNpy8tc3Lgzn
z(3gNjQ!<N7iZYW*L9tT8k5Cp54MDJ2dTI%jAD@z$Tv7s#=aSUi;u0=UXrz{;q^2d7
z=9C11QV}>>K|!9En44Mx3bvG@%J`zvJPi=Lgaxc4Ck@O1*$!4;oLW+nnU`K%0*ce*
z+!QdKUr++3i;I%MbXj7K2FM05QC!Nvz@T4Hlv$QolB!>pSfrnppOcbWRIHy}sGnVI
zWNvO)m}O*MW@uqvoKu-z9&eIjVq#!mV33}tAEIB7S)iMlS6q^qlcQUnXjvMVp$|?2
zCHeU|#mG!(sOc9&)2UuTCD<)RrFonnp9p~*#K_6W#w5VR!^p;@!N|j?$OO&_V2{Pe
zgMuMG9vo8f@wxdar8%kb@!)WYk59=@j*kcDi<H#j<f2S)<_HpGU|<0I5kU-`Z@~!&
z9BH7`&&J5c#Kz>O0TL*Y1O)&n=YT^^4;oZ@#i=Fv1(3851j;#J6A)ejvj)yT;8?MN
P#Dg8kdBva{BE}2=@{2@N

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/sdist.py b/venv/lib/python2.7/site-packages/setuptools/command/sdist.py
new file mode 100644
index 00000000..dc253981
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/sdist.py
@@ -0,0 +1,221 @@
+from distutils import log
+import distutils.command.sdist as orig
+import os
+import sys
+import io
+import contextlib
+
+from setuptools.extern import six
+
+from .py36compat import sdist_add_defaults
+
+import pkg_resources
+
+_default_revctrl = list
+
+
+def walk_revctrl(dirname=''):
+    """Find all files under revision control"""
+    for ep in pkg_resources.iter_entry_points('setuptools.file_finders'):
+        for item in ep.load()(dirname):
+            yield item
+
+
+class sdist(sdist_add_defaults, orig.sdist):
+    """Smart sdist that finds anything supported by revision control"""
+
+    user_options = [
+        ('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]"),
+    ]
+
+    negative_opt = {}
+
+    README_EXTENSIONS = ['', '.rst', '.txt', '.md']
+    READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS)
+
+    def run(self):
+        self.run_command('egg_info')
+        ei_cmd = self.get_finalized_command('egg_info')
+        self.filelist = ei_cmd.filelist
+        self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt'))
+        self.check_readme()
+
+        # Run sub commands
+        for cmd_name in self.get_sub_commands():
+            self.run_command(cmd_name)
+
+        self.make_distribution()
+
+        dist_files = getattr(self.distribution, 'dist_files', [])
+        for file in self.archive_files:
+            data = ('sdist', '', file)
+            if data not in dist_files:
+                dist_files.append(data)
+
+    def initialize_options(self):
+        orig.sdist.initialize_options(self)
+
+        self._default_to_gztar()
+
+    def _default_to_gztar(self):
+        # only needed on Python prior to 3.6.
+        if sys.version_info >= (3, 6, 0, 'beta', 1):
+            return
+        self.formats = ['gztar']
+
+    def make_distribution(self):
+        """
+        Workaround for #516
+        """
+        with self._remove_os_link():
+            orig.sdist.make_distribution(self)
+
+    @staticmethod
+    @contextlib.contextmanager
+    def _remove_os_link():
+        """
+        In a context, remove and restore os.link if it exists
+        """
+
+        class NoValue:
+            pass
+
+        orig_val = getattr(os, 'link', NoValue)
+        try:
+            del os.link
+        except Exception:
+            pass
+        try:
+            yield
+        finally:
+            if orig_val is not NoValue:
+                setattr(os, 'link', orig_val)
+
+    def __read_template_hack(self):
+        # This grody hack closes the template file (MANIFEST.in) if an
+        #  exception occurs during read_template.
+        # Doing so prevents an error when easy_install attempts to delete the
+        #  file.
+        try:
+            orig.sdist.read_template(self)
+        except Exception:
+            _, _, tb = sys.exc_info()
+            tb.tb_next.tb_frame.f_locals['template'].close()
+            raise
+
+    # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle
+    #  has been fixed, so only override the method if we're using an earlier
+    #  Python.
+    has_leaky_handle = (
+        sys.version_info < (2, 7, 2)
+        or (3, 0) <= sys.version_info < (3, 1, 4)
+        or (3, 2) <= sys.version_info < (3, 2, 1)
+    )
+    if has_leaky_handle:
+        read_template = __read_template_hack
+
+    def _add_defaults_python(self):
+        """getting python files"""
+        if self.distribution.has_pure_modules():
+            build_py = self.get_finalized_command('build_py')
+            self.filelist.extend(build_py.get_source_files())
+            # This functionality is incompatible with include_package_data, and
+            # will in fact create an infinite recursion if include_package_data
+            # is True.  Use of include_package_data will imply that
+            # distutils-style automatic handling of package_data is disabled
+            if not self.distribution.include_package_data:
+                for _, src_dir, _, filenames in build_py.data_files:
+                    self.filelist.extend([os.path.join(src_dir, filename)
+                                          for filename in filenames])
+
+    def _add_defaults_data_files(self):
+        try:
+            if six.PY2:
+                sdist_add_defaults._add_defaults_data_files(self)
+            else:
+                super()._add_defaults_data_files()
+        except TypeError:
+            log.warn("data_files contains unexpected objects")
+
+    def check_readme(self):
+        for f in self.READMES:
+            if os.path.exists(f):
+                return
+        else:
+            self.warn(
+                "standard file not found: should have one of " +
+                ', '.join(self.READMES)
+            )
+
+    def make_release_tree(self, base_dir, files):
+        orig.sdist.make_release_tree(self, base_dir, files)
+
+        # Save any egg_info command line options used to create this sdist
+        dest = os.path.join(base_dir, 'setup.cfg')
+        if hasattr(os, 'link') and os.path.exists(dest):
+            # unlink and re-copy, since it might be hard-linked, and
+            # we don't want to change the source version
+            os.unlink(dest)
+            self.copy_file('setup.cfg', dest)
+
+        self.get_finalized_command('egg_info').save_version_info(dest)
+
+    def _manifest_is_not_generated(self):
+        # check for special comment used in 2.7.1 and higher
+        if not os.path.isfile(self.manifest):
+            return False
+
+        with io.open(self.manifest, 'rb') as fp:
+            first_line = fp.readline()
+        return (first_line !=
+                '# file GENERATED by distutils, do NOT edit\n'.encode())
+
+    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)
+        manifest = open(self.manifest, 'rb')
+        for line in manifest:
+            # The manifest must contain UTF-8. See #303.
+            if six.PY3:
+                try:
+                    line = line.decode('UTF-8')
+                except UnicodeDecodeError:
+                    log.warn("%r not UTF-8 decodable -- skipping" % line)
+                    continue
+            # ignore comments and blank lines
+            line = line.strip()
+            if line.startswith('#') or not line:
+                continue
+            self.filelist.append(line)
+        manifest.close()
+
+    def check_license(self):
+        """Checks if license_file' is configured and adds it to
+        'self.filelist' if the value contains a valid path.
+        """
+
+        opts = self.distribution.get_option_dict('metadata')
+
+        # ignore the source of the value
+        _, license_file = opts.get('license_file', (None, None))
+
+        if license_file is None:
+            log.debug("'license_file' option was not specified")
+            return
+
+        if not os.path.exists(license_file):
+            log.warn("warning: Failed to find the configured license file '%s'",
+                    license_file)
+            return
+
+        self.filelist.append(license_file)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc b/venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..59d7ae1cc3c4544d0c15af1607d511da6e85fb15
GIT binary patch
literal 9475
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
RV8|rEB*4VO#Kz3S4giNLwYdNQ

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/setopt.py b/venv/lib/python2.7/site-packages/setuptools/command/setopt.py
new file mode 100644
index 00000000..7e57cc02
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/setopt.py
@@ -0,0 +1,149 @@
+from distutils.util import convert_path
+from distutils import log
+from distutils.errors import DistutilsOptionError
+import distutils
+import os
+
+from setuptools.extern.six.moves import configparser
+
+from setuptools import Command
+
+__all__ = ['config_file', 'edit_config', 'option_base', 'setopt']
+
+
+def config_file(kind="local"):
+    """Get the filename of the distutils, local, global, or per-user config
+
+    `kind` must be one of "local", "global", or "user"
+    """
+    if kind == 'local':
+        return 'setup.cfg'
+    if kind == 'global':
+        return os.path.join(
+            os.path.dirname(distutils.__file__), 'distutils.cfg'
+        )
+    if kind == 'user':
+        dot = os.name == 'posix' and '.' or ''
+        return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot))
+    raise ValueError(
+        "config_file() type must be 'local', 'global', or 'user'", kind
+    )
+
+
+def edit_config(filename, settings, dry_run=False):
+    """Edit a configuration file to include `settings`
+
+    `settings` is a dictionary of dictionaries or ``None`` values, keyed by
+    command/section name.  A ``None`` value means to delete the entire section,
+    while a dictionary lists settings to be changed or deleted in that section.
+    A setting of ``None`` means to delete that setting.
+    """
+    log.debug("Reading configuration from %s", filename)
+    opts = configparser.RawConfigParser()
+    opts.read([filename])
+    for section, options in settings.items():
+        if options is None:
+            log.info("Deleting section [%s] from %s", section, filename)
+            opts.remove_section(section)
+        else:
+            if not opts.has_section(section):
+                log.debug("Adding new section [%s] to %s", section, filename)
+                opts.add_section(section)
+            for option, value in options.items():
+                if value is None:
+                    log.debug(
+                        "Deleting %s.%s from %s",
+                        section, option, filename
+                    )
+                    opts.remove_option(section, option)
+                    if not opts.options(section):
+                        log.info("Deleting empty [%s] section from %s",
+                                 section, filename)
+                        opts.remove_section(section)
+                else:
+                    log.debug(
+                        "Setting %s.%s to %r in %s",
+                        section, option, value, filename
+                    )
+                    opts.set(section, option, value)
+
+    log.info("Writing %s", filename)
+    if not dry_run:
+        with open(filename, 'w') as f:
+            opts.write(f)
+
+
+class option_base(Command):
+    """Abstract base class for commands that mess with config files"""
+
+    user_options = [
+        ('global-config', 'g',
+         "save options to the site-wide distutils.cfg file"),
+        ('user-config', 'u',
+         "save options to the current user's pydistutils.cfg file"),
+        ('filename=', 'f',
+         "configuration file to use (default=setup.cfg)"),
+    ]
+
+    boolean_options = [
+        'global-config', 'user-config',
+    ]
+
+    def initialize_options(self):
+        self.global_config = None
+        self.user_config = None
+        self.filename = None
+
+    def finalize_options(self):
+        filenames = []
+        if self.global_config:
+            filenames.append(config_file('global'))
+        if self.user_config:
+            filenames.append(config_file('user'))
+        if self.filename is not None:
+            filenames.append(self.filename)
+        if not filenames:
+            filenames.append(config_file('local'))
+        if len(filenames) > 1:
+            raise DistutilsOptionError(
+                "Must specify only one configuration file option",
+                filenames
+            )
+        self.filename, = filenames
+
+
+class setopt(option_base):
+    """Save command-line options to a file"""
+
+    description = "set an option in setup.cfg or another config file"
+
+    user_options = [
+        ('command=', 'c', 'command to set an option for'),
+        ('option=', 'o', 'option to set'),
+        ('set-value=', 's', 'value of the option'),
+        ('remove', 'r', 'remove (unset) the value'),
+    ] + option_base.user_options
+
+    boolean_options = option_base.boolean_options + ['remove']
+
+    def initialize_options(self):
+        option_base.initialize_options(self)
+        self.command = None
+        self.option = None
+        self.set_value = None
+        self.remove = None
+
+    def finalize_options(self):
+        option_base.finalize_options(self)
+        if self.command is None or self.option is None:
+            raise DistutilsOptionError("Must specify --command *and* --option")
+        if self.set_value is None and not self.remove:
+            raise DistutilsOptionError("Must specify --set-value or --remove")
+
+    def run(self):
+        edit_config(
+            self.filename, {
+                self.command: {self.option.replace('-', '_'): self.set_value}
+            },
+            self.dry_run
+        )
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc b/venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ff739d25a5b1d0ceb8a018fb3ecf82d88aee50d2
GIT binary patch
literal 6590
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
LnMasMTTC4Qf2~V^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/test.py b/venv/lib/python2.7/site-packages/setuptools/command/test.py
new file mode 100644
index 00000000..973e4eb2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/test.py
@@ -0,0 +1,271 @@
+import os
+import operator
+import sys
+import contextlib
+import itertools
+import unittest
+from distutils.errors import DistutilsError, DistutilsOptionError
+from distutils import log
+from unittest import TestLoader
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import map, filter
+
+from pkg_resources import (resource_listdir, resource_exists, normalize_path,
+                           working_set, _namespace_packages, evaluate_marker,
+                           add_activation_listener, require, EntryPoint)
+from setuptools import Command
+from .build_py import _unique_everseen
+
+__metaclass__ = type
+
+
+class ScanningLoader(TestLoader):
+
+    def __init__(self):
+        TestLoader.__init__(self)
+        self._visited = set()
+
+    def loadTestsFromModule(self, module, pattern=None):
+        """Return a suite of all tests cases contained in the given module
+
+        If the module is a package, load tests from all the modules in it.
+        If the module has an ``additional_tests`` function, call it and add
+        the return value to the tests.
+        """
+        if module in self._visited:
+            return None
+        self._visited.add(module)
+
+        tests = []
+        tests.append(TestLoader.loadTestsFromModule(self, module))
+
+        if hasattr(module, "additional_tests"):
+            tests.append(module.additional_tests())
+
+        if hasattr(module, '__path__'):
+            for file in resource_listdir(module.__name__, ''):
+                if file.endswith('.py') and file != '__init__.py':
+                    submodule = module.__name__ + '.' + file[:-3]
+                else:
+                    if resource_exists(module.__name__, file + '/__init__.py'):
+                        submodule = module.__name__ + '.' + file
+                    else:
+                        continue
+                tests.append(self.loadTestsFromName(submodule))
+
+        if len(tests) != 1:
+            return self.suiteClass(tests)
+        else:
+            return tests[0]  # don't create a nested suite for only one return
+
+
+# adapted from jaraco.classes.properties:NonDataProperty
+class NonDataProperty:
+    def __init__(self, fget):
+        self.fget = fget
+
+    def __get__(self, obj, objtype=None):
+        if obj is None:
+            return self
+        return self.fget(obj)
+
+
+class test(Command):
+    """Command to run unit tests after in-place build"""
+
+    description = "run unit tests after in-place build"
+
+    user_options = [
+        ('test-module=', 'm', "Run 'test_suite' in specified module"),
+        ('test-suite=', 's',
+         "Run single test, case or suite (e.g. 'module.test_suite')"),
+        ('test-runner=', 'r', "Test runner to use"),
+    ]
+
+    def initialize_options(self):
+        self.test_suite = None
+        self.test_module = None
+        self.test_loader = None
+        self.test_runner = None
+
+    def finalize_options(self):
+
+        if self.test_suite and self.test_module:
+            msg = "You may specify a module or a suite, but not both"
+            raise DistutilsOptionError(msg)
+
+        if self.test_suite is None:
+            if self.test_module is None:
+                self.test_suite = self.distribution.test_suite
+            else:
+                self.test_suite = self.test_module + ".test_suite"
+
+        if self.test_loader is None:
+            self.test_loader = getattr(self.distribution, 'test_loader', None)
+        if self.test_loader is None:
+            self.test_loader = "setuptools.command.test:ScanningLoader"
+        if self.test_runner is None:
+            self.test_runner = getattr(self.distribution, 'test_runner', None)
+
+    @NonDataProperty
+    def test_args(self):
+        return list(self._test_args())
+
+    def _test_args(self):
+        if not self.test_suite and sys.version_info >= (2, 7):
+            yield 'discover'
+        if self.verbose:
+            yield '--verbose'
+        if self.test_suite:
+            yield self.test_suite
+
+    def with_project_on_sys_path(self, func):
+        """
+        Backward compatibility for project_on_sys_path context.
+        """
+        with self.project_on_sys_path():
+            func()
+
+    @contextlib.contextmanager
+    def project_on_sys_path(self, include_dists=[]):
+        with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False)
+
+        if with_2to3:
+            # If we run 2to3 we can not do this inplace:
+
+            # Ensure metadata is up-to-date
+            self.reinitialize_command('build_py', inplace=0)
+            self.run_command('build_py')
+            bpy_cmd = self.get_finalized_command("build_py")
+            build_path = normalize_path(bpy_cmd.build_lib)
+
+            # Build extensions
+            self.reinitialize_command('egg_info', egg_base=build_path)
+            self.run_command('egg_info')
+
+            self.reinitialize_command('build_ext', inplace=0)
+            self.run_command('build_ext')
+        else:
+            # Without 2to3 inplace works fine:
+            self.run_command('egg_info')
+
+            # Build extensions in-place
+            self.reinitialize_command('build_ext', inplace=1)
+            self.run_command('build_ext')
+
+        ei_cmd = self.get_finalized_command("egg_info")
+
+        old_path = sys.path[:]
+        old_modules = sys.modules.copy()
+
+        try:
+            project_path = normalize_path(ei_cmd.egg_base)
+            sys.path.insert(0, project_path)
+            working_set.__init__()
+            add_activation_listener(lambda dist: dist.activate())
+            require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version))
+            with self.paths_on_pythonpath([project_path]):
+                yield
+        finally:
+            sys.path[:] = old_path
+            sys.modules.clear()
+            sys.modules.update(old_modules)
+            working_set.__init__()
+
+    @staticmethod
+    @contextlib.contextmanager
+    def paths_on_pythonpath(paths):
+        """
+        Add the indicated paths to the head of the PYTHONPATH environment
+        variable so that subprocesses will also see the packages at
+        these paths.
+
+        Do this in a context that restores the value on exit.
+        """
+        nothing = object()
+        orig_pythonpath = os.environ.get('PYTHONPATH', nothing)
+        current_pythonpath = os.environ.get('PYTHONPATH', '')
+        try:
+            prefix = os.pathsep.join(_unique_everseen(paths))
+            to_join = filter(None, [prefix, current_pythonpath])
+            new_path = os.pathsep.join(to_join)
+            if new_path:
+                os.environ['PYTHONPATH'] = new_path
+            yield
+        finally:
+            if orig_pythonpath is nothing:
+                os.environ.pop('PYTHONPATH', None)
+            else:
+                os.environ['PYTHONPATH'] = orig_pythonpath
+
+    @staticmethod
+    def install_dists(dist):
+        """
+        Install the requirements indicated by self.distribution and
+        return an iterable of the dists that were built.
+        """
+        ir_d = dist.fetch_build_eggs(dist.install_requires)
+        tr_d = dist.fetch_build_eggs(dist.tests_require or [])
+        er_d = dist.fetch_build_eggs(
+            v for k, v in dist.extras_require.items()
+            if k.startswith(':') and evaluate_marker(k[1:])
+        )
+        return itertools.chain(ir_d, tr_d, er_d)
+
+    def run(self):
+        installed_dists = self.install_dists(self.distribution)
+
+        cmd = ' '.join(self._argv)
+        if self.dry_run:
+            self.announce('skipping "%s" (dry run)' % cmd)
+            return
+
+        self.announce('running "%s"' % cmd)
+
+        paths = map(operator.attrgetter('location'), installed_dists)
+        with self.paths_on_pythonpath(paths):
+            with self.project_on_sys_path():
+                self.run_tests()
+
+    def run_tests(self):
+        # Purge modules under test from sys.modules. The test loader will
+        # re-import them from the build location. Required when 2to3 is used
+        # with namespace packages.
+        if six.PY3 and getattr(self.distribution, 'use_2to3', False):
+            module = self.test_suite.split('.')[0]
+            if module in _namespace_packages:
+                del_modules = []
+                if module in sys.modules:
+                    del_modules.append(module)
+                module += '.'
+                for name in sys.modules:
+                    if name.startswith(module):
+                        del_modules.append(name)
+                list(map(sys.modules.__delitem__, del_modules))
+
+        test = unittest.main(
+            None, None, self._argv,
+            testLoader=self._resolve_as_ep(self.test_loader),
+            testRunner=self._resolve_as_ep(self.test_runner),
+            exit=False,
+        )
+        if not test.result.wasSuccessful():
+            msg = 'Test failed: %s' % test.result
+            self.announce(msg, log.ERROR)
+            raise DistutilsError(msg)
+
+    @property
+    def _argv(self):
+        return ['unittest'] + self.test_args
+
+    @staticmethod
+    def _resolve_as_ep(val):
+        """
+        Load the indicated attribute value, called, as a as if it were
+        specified as an entry point.
+        """
+        if val is None:
+            return
+        parsed = EntryPoint.parse("x=" + val)
+        return parsed.resolve()()
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/test.pyc b/venv/lib/python2.7/site-packages/setuptools/command/test.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c8f2e421c633b01beedb11adf60d1d3f009b1287
GIT binary patch
literal 11758
zcmZSn%*&NH<x)&C0~9bbFfceUFfbJRGBPlvFfgPrGUPBYM8VmN3{i|QaVCZ+CK#KU
zA&MEsW?_h8fw5T`qFBLfCWag~hFo@rD0YTi4u&WW21bzS%nUi447pqkQCtu{3quYo
zLoPQ%6gPy=%8<jukju*u#S7uHG34+u<nl8_@iXKKFhmJJMA;c~1Q~LL7@~w2a)lY9
zgc)*07@|ZNazz=UL>Y3$7^1`&a>W^<#2IoW7@{N?awQp}BpGt07^0*g`Z*YKq#1H$
z7@}kt7*jYIQn(m$WEpbh7^37D7*pjLq7)cXxEWHp8PXUTQg|3z7#Nxv7$Tz-8B%x|
zQUn=N_~1fH3@Q8!sWM=N0&r1fP$&j#2r)1)Wd8sE|G%FG69WT72_FLkgG**{Noh%D
zPO)oIQGQX02(plWK}lwQ9#}$y5u^bWH#zy~5Dpgu14Bq^afwfUVoGWeL=2>$II{v`
zJcyH<SWv>oz`&4}nNyNlq`?U?MSy{Up(wRDzqBYhH9jY^xFjXBsDvL`FtsAHxTF~D
zzP$XR+{B#Bs?_*`#FC5>ZUzR1^8BLg%)IpY;?$B7VFm_<_`Jm2)Z&7~WRRNV?8Nlc
zVz6<kWr;bZi6yD=xrs&DsYNB?3=9m3DJk)Z$t9U(i6F0mZBNZhEh=FLTVGh3S(I7=
z@|bI0Nl|4$er8??#A6_N=ltB<#JrSDP*6ZbK|YBu&C4t-O^r`2OD!r+P0a(lIygBo
zFE2AM9TGP1v<(V%Cs5j!Wnf@PWq_vS76x!KW&%Z03nM7$1_f(?0xub469|L!Im7go
zFfe2>GSo0IG&3?VmN0>mLJb2$JUH<OgWct)!NS165Ck%!gaZ^n@tJv<CGqhkAQ4cg
zfd$Jli!)17Q@}b(KpKiubJ8?Gxe!bg7cwv~=ob`$f+|(NEU`#GEk7qEwWwG>yHG#7
z*vQ=6urSNWyv)$Tyf~*ay*%C|#l*zGz`!6qPd`MzAhSR>Gq1QLF(*g2Jkhc=FhjpM
zwWPG5BtJi=7@3(22~_=()Z!Aog32IJgi3<E3UUzxBQIkz$kCuA#LB?H01gCmMh1o&
zMo<W3F)(DaF%$`daz}6t149-ALlzTA4iq%$3=Fl*3^mLQS<DP2EDTw!ARRS~49!fC
zkYfWWOab$Y(xK{V7#XtIK_Ln<Adi8e1fqxuq^XF9v0^eq2?t197AHdrGf2=SwuYgW
zg`tLpA&ZM4g#~1C(IF5wg_R+jnE}LRWB{pVV-T-lVMt+TP!O+WWysTIDB*@01QO<8
z5N~E;DC&d?r9f1JRWdUacEVi8z>vkmP{Rtc1?0fOPKI!hBY8pc&5R5woM1b(89_n8
z2NeviVFr~alEEq548a;aprB=EWMBwNEh#O^Q%F=OF3l`SRme|MNX*Gm0L4PFLULkp
zYOz9ceqKppW?pKFLS~*qNk*zddS+Q_o<eSZN@-3i7ncGQc&33RA;Joo#R`cE1&QEX
zsH2dRpO^wQGp#5;7h*+5D%6Z(kinTHdN_>ANGw)J%u`56NK8q|1m)JmoOrPN5)u^B
zO7oIILOKe`AZKTmC?w{kC?uw&z|8_VxCr7$P%)6IP?8UJC)fmpl_j7ojBWum(|`(`
z`1le~jwl8tLcM~@Vo>=L56w<`1(hYB+^LuO_y7O@#h{?oN0I}V6PY00ej1?CEl3np
z_<@qOUw&RHI4>rqq<~Au#Dap<yc9@=1!VwGxPgk+Vz;9FTwid2gG;E4#Nxz~lA<6`
zNfrbulAtaH6@c;aU`}dYN^yB+Nk$MTkCzBCFfgDP=9icYu{tL;4_wfJqu)6vvA9?R
zl*xj`K#l~lAQ1|-wji;jB(*571e628;Rh}*(lT>WOE^L4sWb_q7+h|Ei2*7+<QNzj
zKt*e@3Mkmw`59Rl1(?_vC7Jjc#hCaRB^jj|C78q*MVOcwWtoH+d71n)Kz<5R0C^fz
z?8nDLd=eiIE{KApLFFjORIslQ!~ppZRDpxyz8I8>*qAt3!1bJ8ex6HWNn$`zenDzc
zNhR5}4XBoZVQ@jq%K$5A<H5}@SnUEz^pGTwo>~H~>%qw;NQZ%eVZg%(lz$vSsS@NB
z21xY*%Do^i*jJzgQUh*6W^*tU34m$^aNWTODtwz68DPEyX@DdEu)jcNfV~OMx%o+1
z;H&|nD+^Kw+Sg#W#K)(nmc+-qfIJV%!3>N%j4X^uNjyjkl$=2U1o4+XN_>I+FhB`g
z8`kItCu~MeW^nQXl{N6x49ckBw$mZxwiBrR&j@b$i!-E1Fr-K_q%(tBP$}G?#xJPl
z4{k0;u`#5wGo<i>1e+N_jekg+If@h1UIsP5xIoS8EFOk*28I*?h89Lp9UH~Vkje)Y
zPZ5Ob1!?C8iKhrbMWO^4QiMV5C_#o45imoDAyt?mMHIvasTTpO7lUy{8G?c}q(IT6
z2WrzmT0o!*s;D$ip)@bE1X^b%rj?`?DP-p97UU!*rz#|sX6B?6D}!39M5qH*N1y=I
z%>~yVw&1EN7hEz1mF6j^gXH4DrN26;9xg6OP0mcqOih7R&Y+qOq(&F42BN*V*b<b2
zO7j$oGxO4OQo-&7)xpK73i(CQri4bSUb>!wI>cH%kP%R8G{IFQNI<u!G%qi;2x4ea
zF{oGrRd)&yVNghv7N=sienBZTg#nad<H7kC)a(WK|3D0I`xnFj_xxa)7?f(ji5*<o
zf$WAj2HcSVb0O|T@IlpOY7v4DaTB<e49@-_M?gxsfypZ+pwI%f=QAPQqI_^CtvC#n
zoIrIx10yFGf`boKhJmsaxZt}BD$c=;<RW!YAZ9T#6sdzc9kq-MB}~xLuZfW%4;;i<
z;36MXL}o!1r!X*pxZz+f3#hRT3T_65Lbw7Z262cG)Ch3L8>D9nxFyZNki`OOH>WT#
zG&6%tiD!jb23NTr)QScf0+(V3_1-~-+(a@2tR89zJIIg}28Lj83&yY5kb!|AGQU(I
zH?dLylB_Eg5~0Z&luV&*ULA#`(h`Nd{1Szv{E`fC%MK~E2AP2ZR1HMH`z?CV&I(wW
z6>1+Z$Q)Fdf+8Tu1e8ZiK?JCxgrq)DZcNE6E-A`PDg`xM!N!A2?ex?VaGMUS9~58U
zR0ghOa*NXkJhg$^$7z{)C}}MQ6e^(di-Adqk&Tg`iJy_5QHV*HiJwuLk)M%=k)IKq
z`as?X`3Ri)Kn9gSQWhh$hXu=|AT{6uA2b*M&Zyvqetcq4dhsC2c%Zf}xX1vxD<2dF
zAcr$B!TkzqB7o|vVlQ}3<0(>PC}9NkN<ke$R)!))PzDHNgk}(Ch9V<Sf`<z*Fci6g
zaz+*d16T}^tTREDWx^Z%DVfE|`Jf>OkgIfc%TkMy@{3c!jWL8u$T$EfJ%ZCyab<A{
zC?SHhW#;F_XXd5lgVP{PHz>lu$#0;OU636pctIHCUIs=<Mh-?!Fir*q0|<jkc5uQ1
zHP1mEUhtq;KMw;VsE^OUz!;vw$PgHj0&38K)E9d)FfhQohfayf+2x5vDGJH?xdn+O
znMs*BnI)A9Y57G81x5K;smUer`FZihmBrv;CvaalwF0TD>IY7j;Nd4M>cP<f4oGma
z2K814Iz&q(KqF_FB^mKp+*=I_X;3}Ez{1N24q;HL0);R*Ij>-3V1SG|<x7KW3I@=a
zN(v)rSf!bnp_YlEhKZqQDLCD-GNdqpk~nxQgb_Rv!3GinjaPtTi5<$RWd;wWFoOn1
zni;`kC=8%6niN)s6gJQRN;4x|H+aAUY!oYK1SN$Tlx2|Q*+Gpp#ynlH1K1c+u&C!?
zz)%l$4Onq4D?<qvLl!rKTrC@z#lw)r3o4~**%_)z!7gQG$l?RpQ_BHXz|D}w4{}Bg
z2WS|Gu|$9&OAw@iu|x<o4g(sZ1r5&$gT`KJSQ)ZJK;t%9q6}$F3}Udb5M!v}U`Piy
zHTxmM&tZ(=DGUsO5g@V#;u3BK4Up4#7_!76=5v7tfwCkRY9QW5*c<^aEVvmM82rFP
z0j0&M@kS;2#$XP(@fcrF3C{1CdEgc$cyIzNo0^^uDGfjs7>JXUSPbdhL-eIqlz@jb
z;6)v%qzDG38c?qp6q4ZF2P@D)vS4$eL#?Th+yY8rph|GS^8(11HaUs8NhyhT%Rs&W
z4Hp!H`b?_DwzjIp8lVx#Adqvx<z_&nagY_LKDPvo6M(XXTVhUeDtNHGC>5zK25ldJ
z8;?b$dGRnlXygafH-lBADKMEJP(A|>qCmnqCo?Gs)OiIL8=&zgaCAYMsKsEx<otrl
zAa9U6K+es~D^4vc2?9j|WWWN{We)<4>w|+I6qBH_A+Uo$9B9c8DYp_!GKxW^TtQ_?
zMt&aHHjv+vb5awFz{66d1u2Ooso+6-NMQytJu@#kr!*xs9u$$qV5ftIn;;1dR68XV
zRK_Rgrhuz)h^N3NgIt@M36=qcetu30xMT&p48(!?5mes8N+^)Vflezypzd@ND2-Tv
z5($$W6B~;#BQGOABR{h+BQKLMqX086n8nY;#mLXZ%*f9u%*e&a%P7St%m@<WWfXuk
zhd`kN3I=eQdIA)M;7kK*eS=#FS<IluIH>kw0+p$dW&=bp1v~;>%gj&}2X0P)hqFP0
z)8JVENcma94k~wRSU}^x=@9j-2*r?5<61U`8a9TaZV(AEKZTLOCXWH66IAvvgG%xm
zMsPcS8(1?FsDMsk1Sx1{VqnbU1*t%2jYwf;2nIJZieDqwuZ}4x;NjNHyp+u3#FEq$
z1yE!bgSvL0k=cyY#1zn&Gl(4!8RFsZ7vLD;p^%zamRXdamkS!3gbpt&lqD8rCMM;i
zDinhTa1%=uic6CUit>|Fi$R0b<(WA-3W+(z`3l9UsbCwSgU`hZi6!vbz9b{HI2Gao
zJ;cbh3&_As@F;X5tcF)8$w(|wC`v6Z$uCMR1{(+&KF-fmNUcB~tOh4=gxiBaMTVaS
zC?|sRPJR-o5m5qadE^&^b1~F&;1VT0wFE2%4wTdaaL&%k&&&$~4cG>O5(%W+0BTVd
z<QHgwk`8$I6|4cQH7~y;BQq}@JOY?sl$j1H+hN%l)J04#Eh<XQD?t_pnOjhlnwD7s
zHlZXx9%LuDq{vGx2j|BD&u*Z;#RgDz1NSeuI2lD5MH!hHB^X5+L46GYMouOkMlnd6
z8&p7pFt`~Q4{vjWsv~fvTFVG-5kNW}Obi7opwS&rW?_Pgr!azsWI*bfL0!{k1_qaA
zh)!mP5>|#RHc+Ryh6$9TnnCFt6r06u$m!e@GRFl@C`GB@`9o0Z1tlt2!cVGH0L`rF
zfeK7m_YX8(0Z*OKX^O-=h0K!FB5+#IhfJz~w15&}Vu?a|Y7t}v2&oYYu8l!S1QZCx
zpg;rFQZ)<=u?7q=OboS*pkf3xr3LQFH#0I6F@y3nXz-JfK_0@dVPXhlEMx|?${>@D
z;Bg`=aBUBrCguW}T#{H+0-0C<mC)enNpRxUGXQJI29sq2oqUQp85kIB(o^$ND+-G2
zE`uBn3L7>CPDV%`0`)@EQcIFE;vscYYI=Gxcn&BN5|Q!HNGvV^)pelWUNKAvJh7Wv
zQBstM5CYYgnI);Ykcto#ec%aBa8^yuNX*Ow7mY!Fpu!&Hkj$d^6mVuQfiY5x;!_4X
z)WCj)1pqkBodSg%DBc;^gcv0l*%)P*!HEsz2T%}$bKD}VIW7fUmqGFrBCoM96gh!2
z9k_o`18oF@8mu6dtf1-zCRoD8P{PiT#Q|zvH#35AU^5eVCYJ$J71c0<8sYs)4B-9%
z7pO_x&kx~ngE&YH=s-w=7!*f-;N+=L44yp6&MYX%%u82LQY}_e&`2q&1dTgF1}8y-
zeK09-xtNom3|=V!o;VF^g*5_$azQZ)G8r^TQ3ftfQ;I6%i%Rpr+7k2f@=NoQQ-eTC
zz#^cznZ%O(B5<_<8t?&C0jWhnpz;pf#sD{^K#fLlqJyLx@MIil?hqO|sVUHA7bw#w
z=cWXKMj-|~^?)2xRGN1Klx9HdM;I7|n1mQP83h?xm;{+57zIGH_@FKUsQv*ZDsbv?
zg?B284r1w479E5pmn>NKF@>2y5>%oyf|3Vl+W#P^I0tn;89^PiEKcxRfK*WXB#R52
zY#159<1CDz!p*#vk)gr>s?a4?6`Z1&L0vvjgNu=&s1l|ToWK|hD;Wwa8Ny3=7)p4d
zy0Z8{N}$UJ3J-!t9ZUEbvIIcmlaOKQEFn;$1*K?Vu<J!YX*Gov%!Y`Ff<@RMJ!fX<
z$^kKG->%q^F@+t}_stSx5UYh~lK}M_OC%Yxq#*rFX%N4ekpVJJ3(7zmp!T$1kUJ=C
zf+|f&uMQN>pp*nzfdWo-AZ`$N;2m59ftoYLpu`0pdQVHt%t=kLQcx|{kO7$l%IQG?
zAQq@j2?F(ef&xKY@Msb!Sr-@NWR?Vhx|`rGOHepS7BsmQR1RX<f(Vd0a1%d1J|#5=
zR8m5xsX?<GAoqY>lAD;B2X5~Kb%3%JsQVHRS|F5DmKvW}9G_YM9xVlru!7rGMXAN5
zIVIpyt30tdxHK8m7)&e83F-pb396*Q1+Z&Skbh7RsMQW07zTG?f>c2^fE=BYnggBe
zg><Yy{iGlRkO9`9kzBAg5HT>L{6W183=GdfISQP;S>zbS7<oWrt&9SUT#N#Y{EQ-u
z@=R=?aaTqmMouPvMqWl?NH+tN(?DSW&SjvmOko5KGJsMg1A}-lcx=iqXd1|qAf-X}
za2BYz0b2(q2FT-}B*4VTz)%eG19Wf|!~~TxU@w8<s0O?)5Hu+u0O~UZLpvl)pqwTS
zs&&BiMiw)uMra1j41jbOmm;^^Kp6wvY(sQWK*cg>d_GkH+~x;OY~|#nrsybuR-%B2
z%ru2eNK*{nc!NwZfac9Wit-dv^Gb>;6$(Hr#}KPb{J@^6u!WTB;6(+Xj0aAo1&Kw)
zso)9(n&iO|1nwo2CFX$BJ6Oqpw-SP8FfcH%fno+!;4rX(CYOa7!7V|=#2%y@ZyN-f
zgCTmZ5n=`?Q-X>F=!9dC5h(S8%N=s(8zJU`+N)r5L6v)Ik!_GM$Y4+x30&|&L={T%
z6-tX!H9%Payc`5PR}PMr`1q9k<oI}SF_w~AoLrO%o^b<@q?Z<_7R5tn;DSH{1VJ{S
z5(G4z4bE5KaqJ*BP?^KUz`y`nQk7a!l9QPPZcIYCxrup+>8VAKRshJg#U+U)naR1S
zB^miCLEr`gxZyDYWHhK;05>QKpvyhLWhOXoz_}Jd3{d_BWlt|q2!mY0#>mFR#>~vf
zz{t$V$;`>dDa_Bp$-&9a#>lVB%qS|!&&SEnDb3FUQp=zLTD21ds=k7{L0$z7gas`H
zu^K=GsKf#{)j=&(@RC)%RM48$VsH^31S-qGZ78^O5UALIEUE%^s}buD^-?Q9>zN<}
ze4yNjA*ENGS)rGkUzS=7Zoz?j<ly?IAUhpgHG$Ty7K4{yffrhV$MGP;aG+!y1d7EV
zUXZIn1#l2Jvx5=<!lEEhPbA0#qy*$Ra6MR3S&$00B|bhkwIneav??n;J_wXlgTP4&
z6t<9{0@X}l*1*IvI0f23GP@lp<cpOU7#MgM5m1a#fKh-+fKiOeff>YNV;0jC<^llz
CyuYvj

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload.py b/venv/lib/python2.7/site-packages/setuptools/command/upload.py
new file mode 100644
index 00000000..6db8888b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/upload.py
@@ -0,0 +1,196 @@
+import io
+import os
+import hashlib
+import getpass
+
+from base64 import standard_b64encode
+
+from distutils import log
+from distutils.command import upload as orig
+from distutils.spawn import spawn
+
+from distutils.errors import DistutilsError
+
+from setuptools.extern.six.moves.urllib.request import urlopen, Request
+from setuptools.extern.six.moves.urllib.error import HTTPError
+from setuptools.extern.six.moves.urllib.parse import urlparse
+
+
+class upload(orig.upload):
+    """
+    Override default upload behavior to obtain password
+    in a variety of different ways.
+    """
+    def run(self):
+        try:
+            orig.upload.run(self)
+        finally:
+            self.announce(
+                "WARNING: Uploading via this command is deprecated, use twine "
+                "to upload instead (https://pypi.org/p/twine/)",
+                log.WARN
+            )
+
+    def finalize_options(self):
+        orig.upload.finalize_options(self)
+        self.username = (
+            self.username or
+            getpass.getuser()
+        )
+        # Attempt to obtain password. Short circuit evaluation at the first
+        # sign of success.
+        self.password = (
+            self.password or
+            self._load_password_from_keyring() or
+            self._prompt_for_password()
+        )
+
+    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
+        with open(filename, 'rb') as f:
+            content = f.read()
+
+        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,
+            'md5_digest': hashlib.md5(content).hexdigest(),
+
+            # additional meta-data
+            'metadata_version': str(meta.get_metadata_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(),
+            }
+
+        data['comment'] = ''
+
+        if self.sign:
+            data['gpg_signature'] = (os.path.basename(filename) + ".asc",
+                                     open(filename+".asc", "rb").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 = getattr(self, '_read_pypi_response',
+                               lambda x: None)(result)
+                if text is not None:
+                    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)
+
+    def _load_password_from_keyring(self):
+        """
+        Attempt to load password from keyring. Suppress Exceptions.
+        """
+        try:
+            keyring = __import__('keyring')
+            return keyring.get_password(self.repository, self.username)
+        except Exception:
+            pass
+
+    def _prompt_for_password(self):
+        """
+        Prompt for a password on the tty. Suppress Exceptions.
+        """
+        try:
+            return getpass.getpass()
+        except (Exception, KeyboardInterrupt):
+            pass
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload.pyc b/venv/lib/python2.7/site-packages/setuptools/command/upload.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e299375434d7ef48f6c79fc9677c0920da4be530
GIT binary patch
literal 6906
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
M0!#u-Vj!9s0KU#uo&W#<

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py b/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py
new file mode 100644
index 00000000..07aa564a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py
@@ -0,0 +1,206 @@
+# -*- coding: utf-8 -*-
+"""upload_docs
+
+Implements a Distutils 'upload_docs' subcommand (upload documentation to
+PyPI's pythonhosted.org).
+"""
+
+from base64 import standard_b64encode
+from distutils import log
+from distutils.errors import DistutilsOptionError
+import os
+import socket
+import zipfile
+import tempfile
+import shutil
+import itertools
+import functools
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import http_client, urllib
+
+from pkg_resources import iter_entry_points
+from .upload import upload
+
+
+def _encode(s):
+    errors = 'surrogateescape' if six.PY3 else 'strict'
+    return s.encode('utf-8', errors)
+
+
+class upload_docs(upload):
+    # override the default repository as upload_docs isn't
+    # supported by Warehouse (and won't be).
+    DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/'
+
+    description = 'Upload documentation to PyPI'
+
+    user_options = [
+        ('repository=', 'r',
+         "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY),
+        ('show-response', None,
+         'display full response text from server'),
+        ('upload-dir=', None, 'directory to upload'),
+    ]
+    boolean_options = upload.boolean_options
+
+    def has_sphinx(self):
+        if self.upload_dir is None:
+            for ep in iter_entry_points('distutils.commands', 'build_sphinx'):
+                return True
+
+    sub_commands = [('build_sphinx', has_sphinx)]
+
+    def initialize_options(self):
+        upload.initialize_options(self)
+        self.upload_dir = None
+        self.target_dir = None
+
+    def finalize_options(self):
+        upload.finalize_options(self)
+        if self.upload_dir is None:
+            if self.has_sphinx():
+                build_sphinx = self.get_finalized_command('build_sphinx')
+                self.target_dir = build_sphinx.builder_target_dir
+            else:
+                build = self.get_finalized_command('build')
+                self.target_dir = os.path.join(build.build_base, 'docs')
+        else:
+            self.ensure_dirname('upload_dir')
+            self.target_dir = self.upload_dir
+        if 'pypi.python.org' in self.repository:
+            log.warn("Upload_docs command is deprecated. Use RTD instead.")
+        self.announce('Using upload directory %s' % self.target_dir)
+
+    def create_zipfile(self, filename):
+        zip_file = zipfile.ZipFile(filename, "w")
+        try:
+            self.mkpath(self.target_dir)  # just in case
+            for root, dirs, files in os.walk(self.target_dir):
+                if root == self.target_dir and not files:
+                    tmpl = "no files found in upload directory '%s'"
+                    raise DistutilsOptionError(tmpl % self.target_dir)
+                for name in files:
+                    full = os.path.join(root, name)
+                    relative = root[len(self.target_dir):].lstrip(os.path.sep)
+                    dest = os.path.join(relative, name)
+                    zip_file.write(full, dest)
+        finally:
+            zip_file.close()
+
+    def run(self):
+        # Run sub commands
+        for cmd_name in self.get_sub_commands():
+            self.run_command(cmd_name)
+
+        tmp_dir = tempfile.mkdtemp()
+        name = self.distribution.metadata.get_name()
+        zip_file = os.path.join(tmp_dir, "%s.zip" % name)
+        try:
+            self.create_zipfile(zip_file)
+            self.upload_file(zip_file)
+        finally:
+            shutil.rmtree(tmp_dir)
+
+    @staticmethod
+    def _build_part(item, sep_boundary):
+        key, values = item
+        title = '\nContent-Disposition: form-data; name="%s"' % key
+        # handle multiple entries for the same name
+        if not isinstance(values, list):
+            values = [values]
+        for value in values:
+            if isinstance(value, tuple):
+                title += '; filename="%s"' % value[0]
+                value = value[1]
+            else:
+                value = _encode(value)
+            yield sep_boundary
+            yield _encode(title)
+            yield b"\n\n"
+            yield value
+            if value and value[-1:] == b'\r':
+                yield b'\n'  # write an extra newline (lurve Macs)
+
+    @classmethod
+    def _build_multipart(cls, data):
+        """
+        Build up the MIME payload for the POST data
+        """
+        boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+        sep_boundary = b'\n--' + boundary
+        end_boundary = sep_boundary + b'--'
+        end_items = end_boundary, b"\n",
+        builder = functools.partial(
+            cls._build_part,
+            sep_boundary=sep_boundary,
+        )
+        part_groups = map(builder, data.items())
+        parts = itertools.chain.from_iterable(part_groups)
+        body_items = itertools.chain(parts, end_items)
+        content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii')
+        return b''.join(body_items), content_type
+
+    def upload_file(self, filename):
+        with open(filename, 'rb') as f:
+            content = f.read()
+        meta = self.distribution.metadata
+        data = {
+            ':action': 'doc_upload',
+            'name': meta.get_name(),
+            'content': (os.path.basename(filename), content),
+        }
+        # set up the authentication
+        credentials = _encode(self.username + ':' + self.password)
+        credentials = standard_b64encode(credentials)
+        if six.PY3:
+            credentials = credentials.decode('ascii')
+        auth = "Basic " + credentials
+
+        body, ct = self._build_multipart(data)
+
+        msg = "Submitting documentation to %s" % (self.repository)
+        self.announce(msg, log.INFO)
+
+        # build the Request
+        # We can't use urllib2 since we need to send the Basic
+        # auth right with the first request
+        schema, netloc, url, params, query, fragments = \
+            urllib.parse.urlparse(self.repository)
+        assert not params and not query and not fragments
+        if schema == 'http':
+            conn = http_client.HTTPConnection(netloc)
+        elif schema == 'https':
+            conn = http_client.HTTPSConnection(netloc)
+        else:
+            raise AssertionError("unsupported schema " + schema)
+
+        data = ''
+        try:
+            conn.connect()
+            conn.putrequest("POST", url)
+            content_type = ct
+            conn.putheader('Content-type', content_type)
+            conn.putheader('Content-length', str(len(body)))
+            conn.putheader('Authorization', auth)
+            conn.endheaders()
+            conn.send(body)
+        except socket.error as e:
+            self.announce(str(e), log.ERROR)
+            return
+
+        r = conn.getresponse()
+        if r.status == 200:
+            msg = 'Server response (%s): %s' % (r.status, r.reason)
+            self.announce(msg, log.INFO)
+        elif r.status == 301:
+            location = r.getheader('Location')
+            if location is None:
+                location = 'https://pythonhosted.org/%s/' % meta.get_name()
+            msg = 'Upload successful. Visit %s' % location
+            self.announce(msg, log.INFO)
+        else:
+            msg = 'Upload failed (%s): %s' % (r.status, r.reason)
+            self.announce(msg, log.ERROR)
+        if self.show_response:
+            print('-' * 75, r.read(), '-' * 75)
diff --git a/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc b/venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..171fe23d3dcd16ded4e97a10141a3428fd0efc16
GIT binary patch
literal 8436
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/config.py b/venv/lib/python2.7/site-packages/setuptools/config.py
new file mode 100644
index 00000000..b6626043
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/config.py
@@ -0,0 +1,656 @@
+from __future__ import absolute_import, unicode_literals
+import io
+import os
+import sys
+
+import warnings
+import functools
+from collections import defaultdict
+from functools import partial
+from functools import wraps
+from importlib import import_module
+
+from distutils.errors import DistutilsOptionError, DistutilsFileError
+from setuptools.extern.packaging.version import LegacyVersion, parse
+from setuptools.extern.six import string_types, PY3
+
+
+__metaclass__ = type
+
+
+def read_configuration(
+        filepath, find_others=False, ignore_option_errors=False):
+    """Read given configuration file and returns options from it as a dict.
+
+    :param str|unicode filepath: Path to configuration file
+        to get options from.
+
+    :param bool find_others: Whether to search for other configuration files
+        which could be on in various places.
+
+    :param bool ignore_option_errors: Whether to silently ignore
+        options, values of which could not be resolved (e.g. due to exceptions
+        in directives such as file:, attr:, etc.).
+        If False exceptions are propagated as expected.
+
+    :rtype: dict
+    """
+    from setuptools.dist import Distribution, _Distribution
+
+    filepath = os.path.abspath(filepath)
+
+    if not os.path.isfile(filepath):
+        raise DistutilsFileError(
+            'Configuration file %s does not exist.' % filepath)
+
+    current_directory = os.getcwd()
+    os.chdir(os.path.dirname(filepath))
+
+    try:
+        dist = Distribution()
+
+        filenames = dist.find_config_files() if find_others else []
+        if filepath not in filenames:
+            filenames.append(filepath)
+
+        _Distribution.parse_config_files(dist, filenames=filenames)
+
+        handlers = parse_configuration(
+            dist, dist.command_options,
+            ignore_option_errors=ignore_option_errors)
+
+    finally:
+        os.chdir(current_directory)
+
+    return configuration_to_dict(handlers)
+
+
+def _get_option(target_obj, key):
+    """
+    Given a target object and option key, get that option from
+    the target object, either through a get_{key} method or
+    from an attribute directly.
+    """
+    getter_name = 'get_{key}'.format(**locals())
+    by_attribute = functools.partial(getattr, target_obj, key)
+    getter = getattr(target_obj, getter_name, by_attribute)
+    return getter()
+
+
+def configuration_to_dict(handlers):
+    """Returns configuration data gathered by given handlers as a dict.
+
+    :param list[ConfigHandler] handlers: Handlers list,
+        usually from parse_configuration()
+
+    :rtype: dict
+    """
+    config_dict = defaultdict(dict)
+
+    for handler in handlers:
+        for option in handler.set_options:
+            value = _get_option(handler.target_obj, option)
+            config_dict[handler.section_prefix][option] = value
+
+    return config_dict
+
+
+def parse_configuration(
+        distribution, command_options, ignore_option_errors=False):
+    """Performs additional parsing of configuration options
+    for a distribution.
+
+    Returns a list of used option handlers.
+
+    :param Distribution distribution:
+    :param dict command_options:
+    :param bool ignore_option_errors: Whether to silently ignore
+        options, values of which could not be resolved (e.g. due to exceptions
+        in directives such as file:, attr:, etc.).
+        If False exceptions are propagated as expected.
+    :rtype: list
+    """
+    options = ConfigOptionsHandler(
+        distribution, command_options, ignore_option_errors)
+    options.parse()
+
+    meta = ConfigMetadataHandler(
+        distribution.metadata, command_options, ignore_option_errors,
+        distribution.package_dir)
+    meta.parse()
+
+    return meta, options
+
+
+class ConfigHandler:
+    """Handles metadata supplied in configuration files."""
+
+    section_prefix = None
+    """Prefix for config sections handled by this handler.
+    Must be provided by class heirs.
+
+    """
+
+    aliases = {}
+    """Options aliases.
+    For compatibility with various packages. E.g.: d2to1 and pbr.
+    Note: `-` in keys is replaced with `_` by config parser.
+
+    """
+
+    def __init__(self, target_obj, options, ignore_option_errors=False):
+        sections = {}
+
+        section_prefix = self.section_prefix
+        for section_name, section_options in options.items():
+            if not section_name.startswith(section_prefix):
+                continue
+
+            section_name = section_name.replace(section_prefix, '').strip('.')
+            sections[section_name] = section_options
+
+        self.ignore_option_errors = ignore_option_errors
+        self.target_obj = target_obj
+        self.sections = sections
+        self.set_options = []
+
+    @property
+    def parsers(self):
+        """Metadata item name to parser function mapping."""
+        raise NotImplementedError(
+            '%s must provide .parsers property' % self.__class__.__name__)
+
+    def __setitem__(self, option_name, value):
+        unknown = tuple()
+        target_obj = self.target_obj
+
+        # Translate alias into real name.
+        option_name = self.aliases.get(option_name, option_name)
+
+        current_value = getattr(target_obj, option_name, unknown)
+
+        if current_value is unknown:
+            raise KeyError(option_name)
+
+        if current_value:
+            # Already inhabited. Skipping.
+            return
+
+        skip_option = False
+        parser = self.parsers.get(option_name)
+        if parser:
+            try:
+                value = parser(value)
+
+            except Exception:
+                skip_option = True
+                if not self.ignore_option_errors:
+                    raise
+
+        if skip_option:
+            return
+
+        setter = getattr(target_obj, 'set_%s' % option_name, None)
+        if setter is None:
+            setattr(target_obj, option_name, value)
+        else:
+            setter(value)
+
+        self.set_options.append(option_name)
+
+    @classmethod
+    def _parse_list(cls, value, separator=','):
+        """Represents value as a list.
+
+        Value is split either by separator (defaults to comma) or by lines.
+
+        :param value:
+        :param separator: List items separator character.
+        :rtype: list
+        """
+        if isinstance(value, list):  # _get_parser_compound case
+            return value
+
+        if '\n' in value:
+            value = value.splitlines()
+        else:
+            value = value.split(separator)
+
+        return [chunk.strip() for chunk in value if chunk.strip()]
+
+    @classmethod
+    def _parse_dict(cls, value):
+        """Represents value as a dict.
+
+        :param value:
+        :rtype: dict
+        """
+        separator = '='
+        result = {}
+        for line in cls._parse_list(value):
+            key, sep, val = line.partition(separator)
+            if sep != separator:
+                raise DistutilsOptionError(
+                    'Unable to parse option value to dict: %s' % value)
+            result[key.strip()] = val.strip()
+
+        return result
+
+    @classmethod
+    def _parse_bool(cls, value):
+        """Represents value as boolean.
+
+        :param value:
+        :rtype: bool
+        """
+        value = value.lower()
+        return value in ('1', 'true', 'yes')
+
+    @classmethod
+    def _exclude_files_parser(cls, key):
+        """Returns a parser function to make sure field inputs
+        are not files.
+
+        Parses a value after getting the key so error messages are
+        more informative.
+
+        :param key:
+        :rtype: callable
+        """
+        def parser(value):
+            exclude_directive = 'file:'
+            if value.startswith(exclude_directive):
+                raise ValueError(
+                    'Only strings are accepted for the {0} field, '
+                    'files are not accepted'.format(key))
+            return value
+        return parser
+
+    @classmethod
+    def _parse_file(cls, value):
+        """Represents value as a string, allowing including text
+        from nearest files using `file:` directive.
+
+        Directive is sandboxed and won't reach anything outside
+        directory with setup.py.
+
+        Examples:
+            file: README.rst, CHANGELOG.md, src/file.txt
+
+        :param str value:
+        :rtype: str
+        """
+        include_directive = 'file:'
+
+        if not isinstance(value, string_types):
+            return value
+
+        if not value.startswith(include_directive):
+            return value
+
+        spec = value[len(include_directive):]
+        filepaths = (os.path.abspath(path.strip()) for path in spec.split(','))
+        return '\n'.join(
+            cls._read_file(path)
+            for path in filepaths
+            if (cls._assert_local(path) or True)
+            and os.path.isfile(path)
+        )
+
+    @staticmethod
+    def _assert_local(filepath):
+        if not filepath.startswith(os.getcwd()):
+            raise DistutilsOptionError(
+                '`file:` directive can not access %s' % filepath)
+
+    @staticmethod
+    def _read_file(filepath):
+        with io.open(filepath, encoding='utf-8') as f:
+            return f.read()
+
+    @classmethod
+    def _parse_attr(cls, value, package_dir=None):
+        """Represents value as a module attribute.
+
+        Examples:
+            attr: package.attr
+            attr: package.module.attr
+
+        :param str value:
+        :rtype: str
+        """
+        attr_directive = 'attr:'
+        if not value.startswith(attr_directive):
+            return value
+
+        attrs_path = value.replace(attr_directive, '').strip().split('.')
+        attr_name = attrs_path.pop()
+
+        module_name = '.'.join(attrs_path)
+        module_name = module_name or '__init__'
+
+        parent_path = os.getcwd()
+        if package_dir:
+            if attrs_path[0] in package_dir:
+                # A custom path was specified for the module we want to import
+                custom_path = package_dir[attrs_path[0]]
+                parts = custom_path.rsplit('/', 1)
+                if len(parts) > 1:
+                    parent_path = os.path.join(os.getcwd(), parts[0])
+                    module_name = parts[1]
+                else:
+                    module_name = custom_path
+            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:]
+
+        return value
+
+    @classmethod
+    def _get_parser_compound(cls, *parse_methods):
+        """Returns parser function to represents value as a list.
+
+        Parses a value applying given methods one after another.
+
+        :param parse_methods:
+        :rtype: callable
+        """
+        def parse(value):
+            parsed = value
+
+            for method in parse_methods:
+                parsed = method(parsed)
+
+            return parsed
+
+        return parse
+
+    @classmethod
+    def _parse_section_to_dict(cls, section_options, values_parser=None):
+        """Parses section options into a dictionary.
+
+        Optionally applies a given parser to values.
+
+        :param dict section_options:
+        :param callable values_parser:
+        :rtype: dict
+        """
+        value = {}
+        values_parser = values_parser or (lambda val: val)
+        for key, (_, val) in section_options.items():
+            value[key] = values_parser(val)
+        return value
+
+    def parse_section(self, section_options):
+        """Parses configuration file section.
+
+        :param dict section_options:
+        """
+        for (name, (_, value)) in section_options.items():
+            try:
+                self[name] = value
+
+            except KeyError:
+                pass  # Keep silent for a new option may appear anytime.
+
+    def parse(self):
+        """Parses configuration file items from one
+        or more related sections.
+
+        """
+        for section_name, section_options in self.sections.items():
+
+            method_postfix = ''
+            if section_name:  # [section.option] variant
+                method_postfix = '_%s' % section_name
+
+            section_parser_method = getattr(
+                self,
+                # Dots in section names are translated into dunderscores.
+                ('parse_section%s' % method_postfix).replace('.', '__'),
+                None)
+
+            if section_parser_method is None:
+                raise DistutilsOptionError(
+                    'Unsupported distribution option section: [%s.%s]' % (
+                        self.section_prefix, section_name))
+
+            section_parser_method(section_options)
+
+    def _deprecated_config_handler(self, func, msg, warning_class):
+        """ this function will wrap around parameters that are deprecated
+
+        :param msg: deprecation message
+        :param warning_class: class of warning exception to be raised
+        :param func: function to be wrapped around
+        """
+        @wraps(func)
+        def config_handler(*args, **kwargs):
+            warnings.warn(msg, warning_class)
+            return func(*args, **kwargs)
+
+        return config_handler
+
+
+class ConfigMetadataHandler(ConfigHandler):
+
+    section_prefix = 'metadata'
+
+    aliases = {
+        'home_page': 'url',
+        'summary': 'description',
+        'classifier': 'classifiers',
+        'platform': 'platforms',
+    }
+
+    strict_mode = False
+    """We need to keep it loose, to be partially compatible with
+    `pbr` and `d2to1` packages which also uses `metadata` section.
+
+    """
+
+    def __init__(self, target_obj, options, ignore_option_errors=False,
+                 package_dir=None):
+        super(ConfigMetadataHandler, self).__init__(target_obj, options,
+                                                    ignore_option_errors)
+        self.package_dir = package_dir
+
+    @property
+    def parsers(self):
+        """Metadata item name to parser function mapping."""
+        parse_list = self._parse_list
+        parse_file = self._parse_file
+        parse_dict = self._parse_dict
+        exclude_files_parser = self._exclude_files_parser
+
+        return {
+            'platforms': parse_list,
+            'keywords': parse_list,
+            'provides': parse_list,
+            'requires': self._deprecated_config_handler(
+                parse_list,
+                "The requires parameter is deprecated, please use "
+                "install_requires for runtime dependencies.",
+                DeprecationWarning),
+            'obsoletes': parse_list,
+            'classifiers': self._get_parser_compound(parse_file, parse_list),
+            'license': exclude_files_parser('license'),
+            'description': parse_file,
+            'long_description': parse_file,
+            'version': self._parse_version,
+            'project_urls': parse_dict,
+        }
+
+    def _parse_version(self, value):
+        """Parses `version` option value.
+
+        :param value:
+        :rtype: str
+
+        """
+        version = self._parse_file(value)
+
+        if version != value:
+            version = version.strip()
+            # Be strict about versions loaded from file because it's easy to
+            # accidentally include newlines and other unintended content
+            if isinstance(parse(version), LegacyVersion):
+                tmpl = (
+                    'Version loaded from {value} does not '
+                    'comply with PEP 440: {version}'
+                )
+                raise DistutilsOptionError(tmpl.format(**locals()))
+
+            return version
+
+        version = self._parse_attr(value, self.package_dir)
+
+        if callable(version):
+            version = version()
+
+        if not isinstance(version, string_types):
+            if hasattr(version, '__iter__'):
+                version = '.'.join(map(str, version))
+            else:
+                version = '%s' % version
+
+        return version
+
+
+class ConfigOptionsHandler(ConfigHandler):
+
+    section_prefix = 'options'
+
+    @property
+    def parsers(self):
+        """Metadata item name to parser function mapping."""
+        parse_list = self._parse_list
+        parse_list_semicolon = partial(self._parse_list, separator=';')
+        parse_bool = self._parse_bool
+        parse_dict = self._parse_dict
+
+        return {
+            'zip_safe': parse_bool,
+            'use_2to3': parse_bool,
+            'include_package_data': parse_bool,
+            'package_dir': parse_dict,
+            'use_2to3_fixers': parse_list,
+            'use_2to3_exclude_fixers': parse_list,
+            'convert_2to3_doctests': parse_list,
+            'scripts': parse_list,
+            'eager_resources': parse_list,
+            'dependency_links': parse_list,
+            'namespace_packages': parse_list,
+            'install_requires': parse_list_semicolon,
+            'setup_requires': parse_list_semicolon,
+            'tests_require': parse_list_semicolon,
+            'packages': self._parse_packages,
+            'entry_points': self._parse_file,
+            'py_modules': parse_list,
+        }
+
+    def _parse_packages(self, value):
+        """Parses `packages` option value.
+
+        :param value:
+        :rtype: list
+        """
+        find_directives = ['find:', 'find_namespace:']
+        trimmed_value = value.strip()
+
+        if trimmed_value not in find_directives:
+            return self._parse_list(value)
+
+        findns = trimmed_value == find_directives[1]
+        if findns and not PY3:
+            raise DistutilsOptionError(
+                'find_namespace: directive is unsupported on Python < 3.3')
+
+        # Read function arguments from a dedicated section.
+        find_kwargs = self.parse_section_packages__find(
+            self.sections.get('packages.find', {}))
+
+        if findns:
+            from setuptools import find_namespace_packages as find_packages
+        else:
+            from setuptools import find_packages
+
+        return find_packages(**find_kwargs)
+
+    def parse_section_packages__find(self, section_options):
+        """Parses `packages.find` configuration file section.
+
+        To be used in conjunction with _parse_packages().
+
+        :param dict section_options:
+        """
+        section_data = self._parse_section_to_dict(
+            section_options, self._parse_list)
+
+        valid_keys = ['where', 'include', 'exclude']
+
+        find_kwargs = dict(
+            [(k, v) for k, v in section_data.items() if k in valid_keys and v])
+
+        where = find_kwargs.get('where')
+        if where is not None:
+            find_kwargs['where'] = where[0]  # cast list to single val
+
+        return find_kwargs
+
+    def parse_section_entry_points(self, section_options):
+        """Parses `entry_points` configuration file section.
+
+        :param dict section_options:
+        """
+        parsed = self._parse_section_to_dict(section_options, self._parse_list)
+        self['entry_points'] = parsed
+
+    def _parse_package_data(self, section_options):
+        parsed = self._parse_section_to_dict(section_options, self._parse_list)
+
+        root = parsed.get('*')
+        if root:
+            parsed[''] = root
+            del parsed['*']
+
+        return parsed
+
+    def parse_section_package_data(self, section_options):
+        """Parses `package_data` configuration file section.
+
+        :param dict section_options:
+        """
+        self['package_data'] = self._parse_package_data(section_options)
+
+    def parse_section_exclude_package_data(self, section_options):
+        """Parses `exclude_package_data` configuration file section.
+
+        :param dict section_options:
+        """
+        self['exclude_package_data'] = self._parse_package_data(
+            section_options)
+
+    def parse_section_extras_require(self, section_options):
+        """Parses `extras_require` configuration file section.
+
+        :param dict section_options:
+        """
+        parse_list = partial(self._parse_list, separator=';')
+        self['extras_require'] = self._parse_section_to_dict(
+            section_options, parse_list)
+
+    def parse_section_data_files(self, section_options):
+        """Parses `data_files` configuration file section.
+
+        :param dict section_options:
+        """
+        parsed = self._parse_section_to_dict(section_options, self._parse_list)
+        self['data_files'] = [(k, v) for k, v in parsed.items()]
diff --git a/venv/lib/python2.7/site-packages/setuptools/config.pyc b/venv/lib/python2.7/site-packages/setuptools/config.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e6016b674c761f2aa85391bb4590e60df1772ada
GIT binary patch
literal 22827
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/dep_util.py b/venv/lib/python2.7/site-packages/setuptools/dep_util.py
new file mode 100644
index 00000000..2931c13e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/dep_util.py
@@ -0,0 +1,23 @@
+from distutils.dep_util import newer_group
+
+# yes, this is was almost entirely copy-pasted from
+# 'newer_pairwise()', this is just another convenience
+# function.
+def newer_pairwise_group(sources_groups, targets):
+    """Walk both arguments in parallel, testing if each source group is newer
+    than its corresponding target. Returns a pair of lists (sources_groups,
+    targets) where sources is newer than target, according to the semantics
+    of 'newer_group()'.
+    """
+    if len(sources_groups) != len(targets):
+        raise ValueError("'sources_group' and 'targets' must be the same length")
+
+    # build a pair of lists (sources_groups, targets) where source is newer
+    n_sources = []
+    n_targets = []
+    for i in range(len(sources_groups)):
+        if newer_group(sources_groups[i], targets[i]):
+            n_sources.append(sources_groups[i])
+            n_targets.append(targets[i])
+
+    return n_sources, n_targets
diff --git a/venv/lib/python2.7/site-packages/setuptools/dep_util.pyc b/venv/lib/python2.7/site-packages/setuptools/dep_util.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1f8659730dff00e2451e2fd012842b890e0763ef
GIT binary patch
literal 1073
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI$GB7ZtFfgPrGUPBY<T5fuF)}cwFfp_+Fhnsi
zq%boCYp^gdFl7G!|Np-RBLf3N2{!`+LtbimYEgW8QGRJbGRP!W1_lNYb_SU^4Wx>J
zp@xB>nUSG{fuV*G#K>l5C{kxAVFcOK%*fEh$dJdtkj}tR%LFEw87jgUN|?av!5W(x
z8C+tW7;0G<N|-@r)vz!~)-W=FsAeXHA~%K_CWb5)m`pPx17i&{SOBVqk%6($jiJzu
zA-sl(p@x|ujfo*x1LW4?-wX^4;fXof3Q74T848I->7}`;c_qaPnRyBYiA9MyIjK21
z3MHw<C7F5Y3YlpNsfo!M3dQ-QMaiiOU@t3V7At^5fJ;F^L7^lgF;5}0q*x(2zo;m+
zxFA0-1*EYgu_!&YL{A|owWPEtuUH{bp&&7{NFhH>At$rAq*y@%Vq!5Q6pM8rW`Q*o
zYbumyq!y(@EiH!I2eAucvW`Mxa&mqV#IAgWl8jV^;?&&4ypqi1Vz62HX$tCKS3+#i
z&{Wq0ix-<RFfgd2*siXSn3tlU4l%e`T_Lx$xI`f-6=G;&ZmL2~YF>Ith6X5#OPCoL
z7;;kcO1Kyp7{U^BN>g2nit>v}KypQidFiP^pcGcZ#=yXkSWu9fmjcnn2TB>>FogNI
zgdLPlARaE^1SP6?sH31fsB=m{sV-9kWGa{_&ShX=&@U*;EK4j&)h|md(of6JNl7g#
z*3T}~&n`AHH#aQIGBPhSv@kEusZ1}AH%T!uF)%PNNYB#`(J#m>(9O&%E=kPE(JfE3
zEDg-iFHS8fEhx#)&nZS`rlc0cmzHGa=oM6!h=5!NPV%5QEYB=Xg@h@{lf^<Hm$6AO
z@-wqBvN1|BiZco_N-+6pfWoN+B$<*~TmmwwSPy0<IEaEk0SNXHf*1h5aWF72*yQG?
Ql;)(`fkL_%lt%<u0h%o$qW}N^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/depends.py b/venv/lib/python2.7/site-packages/setuptools/depends.py
new file mode 100644
index 00000000..45e7052d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/depends.py
@@ -0,0 +1,186 @@
+import sys
+import imp
+import marshal
+from distutils.version import StrictVersion
+from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
+
+from .py33compat import Bytecode
+
+
+__all__ = [
+    'Require', 'find_module', 'get_module_constant', 'extract_constant'
+]
+
+
+class Require:
+    """A prerequisite to building or installing a distribution"""
+
+    def __init__(self, name, requested_version, module, homepage='',
+            attribute=None, format=None):
+
+        if format is None and requested_version is not None:
+            format = StrictVersion
+
+        if format is not None:
+            requested_version = format(requested_version)
+            if attribute is None:
+                attribute = '__version__'
+
+        self.__dict__.update(locals())
+        del self.self
+
+    def full_name(self):
+        """Return full package/distribution name, w/version"""
+        if self.requested_version is not None:
+            return '%s-%s' % (self.name, self.requested_version)
+        return self.name
+
+    def version_ok(self, version):
+        """Is 'version' sufficiently up-to-date?"""
+        return self.attribute is None or self.format is None or \
+            str(version) != "unknown" and version >= self.requested_version
+
+    def get_version(self, paths=None, default="unknown"):
+        """Get version number of installed module, 'None', or 'default'
+
+        Search 'paths' for module.  If not found, return 'None'.  If found,
+        return the extracted version attribute, or 'default' if no version
+        attribute was specified, or the value cannot be determined without
+        importing the module.  The version is formatted according to the
+        requirement's version format (if any), unless it is 'None' or the
+        supplied 'default'.
+        """
+
+        if self.attribute is None:
+            try:
+                f, p, i = find_module(self.module, paths)
+                if f:
+                    f.close()
+                return default
+            except ImportError:
+                return None
+
+        v = get_module_constant(self.module, self.attribute, default, paths)
+
+        if v is not None and v is not default and self.format is not None:
+            return self.format(v)
+
+        return v
+
+    def is_present(self, paths=None):
+        """Return true if dependency is present on 'paths'"""
+        return self.get_version(paths) is not None
+
+    def is_current(self, paths=None):
+        """Return true if dependency is present and up-to-date on 'paths'"""
+        version = self.get_version(paths)
+        if version is None:
+            return False
+        return self.version_ok(version)
+
+
+def find_module(module, paths=None):
+    """Just like 'imp.find_module()', but with package support"""
+
+    parts = module.split('.')
+
+    while parts:
+        part = parts.pop(0)
+        f, path, (suffix, mode, kind) = info = imp.find_module(part, paths)
+
+        if kind == PKG_DIRECTORY:
+            parts = parts or ['__init__']
+            paths = [path]
+
+        elif parts:
+            raise ImportError("Can't find %r in %s" % (parts, module))
+
+    return info
+
+
+def get_module_constant(module, symbol, default=-1, paths=None):
+    """Find 'module' by searching 'paths', and extract 'symbol'
+
+    Return 'None' if 'module' does not exist on 'paths', or it does not define
+    'symbol'.  If the module defines 'symbol' as a constant, return the
+    constant.  Otherwise, return 'default'."""
+
+    try:
+        f, path, (suffix, mode, kind) = find_module(module, paths)
+    except ImportError:
+        # Module doesn't exist
+        return None
+
+    try:
+        if kind == PY_COMPILED:
+            f.read(8)  # skip magic & date
+            code = marshal.load(f)
+        elif kind == PY_FROZEN:
+            code = imp.get_frozen_object(module)
+        elif kind == PY_SOURCE:
+            code = compile(f.read(), path, 'exec')
+        else:
+            # Not something we can parse; we'll have to import it.  :(
+            if module not in sys.modules:
+                imp.load_module(module, f, path, (suffix, mode, kind))
+            return getattr(sys.modules[module], symbol, None)
+
+    finally:
+        if f:
+            f.close()
+
+    return extract_constant(code, symbol, default)
+
+
+def extract_constant(code, symbol, default=-1):
+    """Extract the constant value of 'symbol' from 'code'
+
+    If the name 'symbol' is bound to a constant value by the Python code
+    object 'code', return that value.  If 'symbol' is bound to an expression,
+    return 'default'.  Otherwise, return 'None'.
+
+    Return value is based on the first assignment to 'symbol'.  'symbol' must
+    be a global, or at least a non-"fast" local in the code block.  That is,
+    only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
+    must be present in 'code.co_names'.
+    """
+    if symbol not in code.co_names:
+        # name's not there, can't possibly be an assignment
+        return None
+
+    name_idx = list(code.co_names).index(symbol)
+
+    STORE_NAME = 90
+    STORE_GLOBAL = 97
+    LOAD_CONST = 100
+
+    const = default
+
+    for byte_code in Bytecode(code):
+        op = byte_code.opcode
+        arg = byte_code.arg
+
+        if op == LOAD_CONST:
+            const = code.co_consts[arg]
+        elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL):
+            return const
+        else:
+            const = default
+
+
+def _update_globals():
+    """
+    Patch the globals to remove the objects not available on some platforms.
+
+    XXX it'd be better to test assertions about bytecode instead.
+    """
+
+    if not sys.platform.startswith('java') and sys.platform != 'cli':
+        return
+    incompatible = 'extract_constant', 'get_module_constant'
+    for name in incompatible:
+        del globals()[name]
+        __all__.remove(name)
+
+
+_update_globals()
diff --git a/venv/lib/python2.7/site-packages/setuptools/depends.pyc b/venv/lib/python2.7/site-packages/setuptools/depends.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..67276127a123ce4c8ce7fbf83d2cb908da7b264e
GIT binary patch
literal 7131
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/dist.py b/venv/lib/python2.7/site-packages/setuptools/dist.py
new file mode 100644
index 00000000..9a165de0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/dist.py
@@ -0,0 +1,1278 @@
+# -*- coding: utf-8 -*-
+__all__ = ['Distribution']
+
+import io
+import sys
+import re
+import os
+import warnings
+import numbers
+import distutils.log
+import distutils.core
+import distutils.cmd
+import distutils.dist
+from distutils.util import strtobool
+from distutils.debug import DEBUG
+from distutils.fancy_getopt import translate_longopt
+import itertools
+
+from collections import defaultdict
+from email import message_from_file
+
+from distutils.errors import (
+    DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError,
+)
+from distutils.util import rfc822_escape
+from distutils.version import StrictVersion
+
+from setuptools.extern import six
+from setuptools.extern import packaging
+from setuptools.extern.six.moves import map, filter, filterfalse
+
+from . import SetuptoolsDeprecationWarning
+
+from setuptools.depends import Require
+from setuptools import windows_support
+from setuptools.monkey import get_unpatched
+from setuptools.config import parse_configuration
+import pkg_resources
+
+__import__('setuptools.extern.packaging.specifiers')
+__import__('setuptools.extern.packaging.version')
+
+
+def _get_unpatched(cls):
+    warnings.warn("Do not call this function", DistDeprecationWarning)
+    return get_unpatched(cls)
+
+
+def get_metadata_version(self):
+    mv = getattr(self, 'metadata_version', None)
+
+    if mv is None:
+        if self.long_description_content_type or self.provides_extras:
+            mv = StrictVersion('2.1')
+        elif (self.maintainer is not None or
+              self.maintainer_email is not None or
+              getattr(self, 'python_requires', None) is not None):
+            mv = StrictVersion('1.2')
+        elif (self.provides or self.requires or self.obsoletes or
+                self.classifiers or self.download_url):
+            mv = StrictVersion('1.1')
+        else:
+            mv = StrictVersion('1.0')
+
+        self.metadata_version = mv
+
+    return mv
+
+
+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
+
+    self.metadata_version = StrictVersion(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 self.metadata_version == StrictVersion('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
+
+
+# Based on Python 3.5 version
+def write_pkg_file(self, file):
+    """Write the PKG-INFO format data to a file object.
+    """
+    version = self.get_metadata_version()
+
+    if six.PY2:
+        def write_field(key, value):
+            file.write("%s: %s\n" % (key, self._encode_field(value)))
+    else:
+        def write_field(key, value):
+            file.write("%s: %s\n" % (key, value))
+
+    write_field('Metadata-Version', str(version))
+    write_field('Name', self.get_name())
+    write_field('Version', self.get_version())
+    write_field('Summary', self.get_description())
+    write_field('Home-page', self.get_url())
+
+    if version < StrictVersion('1.2'):
+        write_field('Author', self.get_contact())
+        write_field('Author-email', self.get_contact_email())
+    else:
+        optional_fields = (
+            ('Author', 'author'),
+            ('Author-email', 'author_email'),
+            ('Maintainer', 'maintainer'),
+            ('Maintainer-email', 'maintainer_email'),
+        )
+
+        for field, attr in optional_fields:
+            attr_val = getattr(self, attr)
+
+            if attr_val is not None:
+                write_field(field, attr_val)
+
+    write_field('License', self.get_license())
+    if self.download_url:
+        write_field('Download-URL', self.download_url)
+    for project_url in self.project_urls.items():
+        write_field('Project-URL',  '%s, %s' % project_url)
+
+    long_desc = rfc822_escape(self.get_long_description())
+    write_field('Description', long_desc)
+
+    keywords = ','.join(self.get_keywords())
+    if keywords:
+        write_field('Keywords', keywords)
+
+    if version >= StrictVersion('1.2'):
+        for platform in self.get_platforms():
+            write_field('Platform', platform)
+    else:
+        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())
+
+    # Setuptools specific for PEP 345
+    if hasattr(self, 'python_requires'):
+        write_field('Requires-Python', self.python_requires)
+
+    # PEP 566
+    if self.long_description_content_type:
+        write_field(
+            'Description-Content-Type',
+            self.long_description_content_type
+        )
+    if self.provides_extras:
+        for extra in self.provides_extras:
+            write_field('Provides-Extra', extra)
+
+
+sequence = tuple, list
+
+
+def check_importable(dist, attr, value):
+    try:
+        ep = pkg_resources.EntryPoint.parse('x=' + value)
+        assert not ep.extras
+    except (TypeError, ValueError, AttributeError, AssertionError):
+        raise DistutilsSetupError(
+            "%r must be importable 'module:attrs' string (got %r)"
+            % (attr, value)
+        )
+
+
+def assert_string_list(dist, attr, value):
+    """Verify that value is a string list or None"""
+    try:
+        assert ''.join(value) != value
+    except (TypeError, ValueError, AttributeError, AssertionError):
+        raise DistutilsSetupError(
+            "%r must be a list of strings (got %r)" % (attr, value)
+        )
+
+
+def check_nsp(dist, attr, value):
+    """Verify that namespace packages are valid"""
+    ns_packages = value
+    assert_string_list(dist, attr, ns_packages)
+    for nsp in ns_packages:
+        if not dist.has_contents_for(nsp):
+            raise DistutilsSetupError(
+                "Distribution contains no modules or packages for " +
+                "namespace package %r" % nsp
+            )
+        parent, sep, child = nsp.rpartition('.')
+        if parent and parent not in ns_packages:
+            distutils.log.warn(
+                "WARNING: %r is declared as a package namespace, but %r"
+                " is not: please correct this in setup.py", nsp, parent
+            )
+
+
+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):
+        raise DistutilsSetupError(
+            "'extras_require' must be a dictionary whose values are "
+            "strings or lists of strings containing valid project/version "
+            "requirement specifiers."
+        )
+
+
+def _check_extra(extra, reqs):
+    name, sep, marker = extra.partition(':')
+    if marker and pkg_resources.invalid_marker(marker):
+        raise DistutilsSetupError("Invalid environment marker: " + marker)
+    list(pkg_resources.parse_requirements(reqs))
+
+
+def assert_bool(dist, attr, value):
+    """Verify that value is True, False, 0, or 1"""
+    if bool(value) != value:
+        tmpl = "{attr!r} must be a boolean value (got {value!r})"
+        raise DistutilsSetupError(tmpl.format(attr=attr, value=value))
+
+
+def check_requirements(dist, attr, value):
+    """Verify that install_requires is a valid requirements list"""
+    try:
+        list(pkg_resources.parse_requirements(value))
+        if isinstance(value, (dict, set)):
+            raise TypeError("Unordered types are not allowed")
+    except (TypeError, ValueError) as error:
+        tmpl = (
+            "{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))
+
+
+def check_specifier(dist, attr, value):
+    """Verify that value is a valid version specifier"""
+    try:
+        packaging.specifiers.SpecifierSet(value)
+    except packaging.specifiers.InvalidSpecifier as error:
+        tmpl = (
+            "{attr!r} must be a string "
+            "containing valid version specifiers; {error}"
+        )
+        raise DistutilsSetupError(tmpl.format(attr=attr, error=error))
+
+
+def check_entry_points(dist, attr, value):
+    """Verify that entry_points map is parseable"""
+    try:
+        pkg_resources.EntryPoint.parse_map(value)
+    except ValueError as e:
+        raise DistutilsSetupError(e)
+
+
+def check_test_suite(dist, attr, value):
+    if not isinstance(value, six.string_types):
+        raise DistutilsSetupError("test_suite must be a string")
+
+
+def check_package_data(dist, attr, value):
+    """Verify that value is a dictionary of package names to glob lists"""
+    if isinstance(value, dict):
+        for k, v in value.items():
+            if not isinstance(k, str):
+                break
+            try:
+                iter(v)
+            except TypeError:
+                break
+        else:
+            return
+    raise DistutilsSetupError(
+        attr + " must be a dictionary mapping package names to lists of "
+        "wildcard patterns"
+    )
+
+
+def check_packages(dist, attr, value):
+    for pkgname in value:
+        if not re.match(r'\w+(\.\w+)*', pkgname):
+            distutils.log.warn(
+                "WARNING: %r not a valid package name; please use only "
+                ".-separated package names in setup.py", pkgname
+            )
+
+
+_Distribution = get_unpatched(distutils.core.Distribution)
+
+
+class Distribution(_Distribution):
+    """Distribution with support for features, tests, and package data
+
+    This is an enhanced version of 'distutils.dist.Distribution' that
+    effectively adds the following new optional keyword arguments to 'setup()':
+
+     'install_requires' -- a string or sequence of strings specifying project
+        versions that the distribution requires when installed, in the format
+        used by 'pkg_resources.require()'.  They will be installed
+        automatically when the package is installed.  If you wish to use
+        packages that are not available in PyPI, or want to give your users an
+        alternate download location, you can add a 'find_links' option to the
+        '[easy_install]' section of your project's 'setup.cfg' file, and then
+        setuptools will scan the listed web pages for links that satisfy the
+        requirements.
+
+     'extras_require' -- a dictionary mapping names of optional "extras" to the
+        additional requirement(s) that using those extras incurs. For example,
+        this::
+
+            extras_require = dict(reST = ["docutils>=0.3", "reSTedit"])
+
+        indicates that the distribution can optionally provide an extra
+        capability called "reST", but it can only be used if docutils and
+        reSTedit are installed.  If the user installs your package using
+        EasyInstall and requests one of your extras, the corresponding
+        additional requirements will be installed if needed.
+
+     'features' **deprecated** -- a dictionary mapping option names to
+        'setuptools.Feature'
+        objects.  Features are a portion of the distribution that can be
+        included or excluded based on user options, inter-feature dependencies,
+        and availability on the current system.  Excluded features are omitted
+        from all setup commands, including source and binary distributions, so
+        you can create multiple distributions from the same source tree.
+        Feature names should be valid Python identifiers, except that they may
+        contain the '-' (minus) sign.  Features can be included or excluded
+        via the command line options '--with-X' and '--without-X', where 'X' is
+        the name of the feature.  Whether a feature is included by default, and
+        whether you are allowed to control this from the command line, is
+        determined by the Feature object.  See the 'Feature' class for more
+        information.
+
+     'test_suite' -- the name of a test suite to run for the 'test' command.
+        If the user runs 'python setup.py test', the package will be installed,
+        and the named test suite will be run.  The format is the same as
+        would be used on a 'unittest.py' command line.  That is, it is the
+        dotted name of an object to import and call to generate a test suite.
+
+     'package_data' -- a dictionary mapping package names to lists of filenames
+        or globs to use to find data files contained in the named packages.
+        If the dictionary has filenames or globs listed under '""' (the empty
+        string), those names will be searched for in every package, in addition
+        to any names for the specific package.  Data files found using these
+        names/globs will be installed along with the package, in the same
+        location as the package.  Note that globs are allowed to reference
+        the contents of non-package subdirectories, as long as you use '/' as
+        a path separator.  (Globs are automatically converted to
+        platform-specific paths at runtime.)
+
+    In addition to these new keywords, this class also has several new methods
+    for manipulating the distribution's contents.  For example, the 'include()'
+    and 'exclude()' methods can be thought of as in-place add and subtract
+    commands that add or remove packages, modules, extensions, and so on from
+    the distribution.  They are used by the feature subsystem to configure the
+    distribution for the included and excluded features.
+    """
+
+    _DISTUTILS_UNSUPPORTED_METADATA = {
+        'long_description_content_type': None,
+        'project_urls': dict,
+        'provides_extras': set,
+    }
+
+    _patched_dist = None
+
+    def patch_missing_pkg_info(self, attrs):
+        # Fake up a replacement for the data that would normally come from
+        # PKG-INFO, but which might not yet be built if this is a fresh
+        # checkout.
+        #
+        if not attrs or 'name' not in attrs or 'version' not in attrs:
+            return
+        key = pkg_resources.safe_name(str(attrs['name'])).lower()
+        dist = pkg_resources.working_set.by_key.get(key)
+        if dist is not None and not dist.has_metadata('PKG-INFO'):
+            dist._version = pkg_resources.safe_version(str(attrs['version']))
+            self._patched_dist = dist
+
+    def __init__(self, attrs=None):
+        have_package_data = hasattr(self, "package_data")
+        if not have_package_data:
+            self.package_data = {}
+        attrs = attrs or {}
+        if 'features' in attrs or 'require_features' in attrs:
+            Feature.warn_deprecated()
+        self.require_features = []
+        self.features = {}
+        self.dist_files = []
+        # Filter-out setuptools' specific options.
+        self.src_root = attrs.pop("src_root", None)
+        self.patch_missing_pkg_info(attrs)
+        self.dependency_links = attrs.pop('dependency_links', [])
+        self.setup_requires = attrs.pop('setup_requires', [])
+        for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
+            vars(self).setdefault(ep.name, None)
+        _Distribution.__init__(self, {
+            k: v for k, v in attrs.items()
+            if k not in self._DISTUTILS_UNSUPPORTED_METADATA
+        })
+
+        # Fill-in missing metadata fields not supported by distutils.
+        # Note some fields may have been set by other tools (e.g. pbr)
+        # above; they are taken preferrentially to setup() arguments
+        for option, default in self._DISTUTILS_UNSUPPORTED_METADATA.items():
+            for source in self.metadata.__dict__, attrs:
+                if option in source:
+                    value = source[option]
+                    break
+            else:
+                value = default() if default else None
+            setattr(self.metadata, option, value)
+
+        if isinstance(self.metadata.version, numbers.Number):
+            # Some people apparently take "version number" too literally :)
+            self.metadata.version = str(self.metadata.version)
+
+        if self.metadata.version is not None:
+            try:
+                ver = packaging.version.Version(self.metadata.version)
+                normalized_version = str(ver)
+                if self.metadata.version != normalized_version:
+                    warnings.warn(
+                        "Normalizing '%s' to '%s'" % (
+                            self.metadata.version,
+                            normalized_version,
+                        )
+                    )
+                    self.metadata.version = normalized_version
+            except (packaging.version.InvalidVersion, TypeError):
+                warnings.warn(
+                    "The version specified (%r) is an invalid version, this "
+                    "may not work as expected with newer versions of "
+                    "setuptools, pip, and PyPI. Please see PEP 440 for more "
+                    "details." % self.metadata.version
+                )
+        self._finalize_requires()
+
+    def _finalize_requires(self):
+        """
+        Set `metadata.python_requires` and fix environment markers
+        in `install_requires` and `extras_require`.
+        """
+        if getattr(self, 'python_requires', None):
+            self.metadata.python_requires = self.python_requires
+
+        if getattr(self, 'extras_require', None):
+            for extra in self.extras_require.keys():
+                # Since this gets called multiple times at points where the
+                # keys have become 'converted' extras, ensure that we are only
+                # truly adding extras we haven't seen before here.
+                extra = extra.split(':')[0]
+                if extra:
+                    self.metadata.provides_extras.add(extra)
+
+        self._convert_extras_requirements()
+        self._move_install_requirements_markers()
+
+    def _convert_extras_requirements(self):
+        """
+        Convert requirements in `extras_require` of the form
+        `"extra": ["barbazquux; {marker}"]` to
+        `"extra:{marker}": ["barbazquux"]`.
+        """
+        spec_ext_reqs = getattr(self, 'extras_require', None) or {}
+        self._tmp_extras_require = defaultdict(list)
+        for section, v in spec_ext_reqs.items():
+            # Do not strip empty sections.
+            self._tmp_extras_require[section]
+            for r in pkg_resources.parse_requirements(v):
+                suffix = self._suffix_for(r)
+                self._tmp_extras_require[section + suffix].append(r)
+
+    @staticmethod
+    def _suffix_for(req):
+        """
+        For a requirement, return the 'extras_require' suffix for
+        that requirement.
+        """
+        return ':' + str(req.marker) if req.marker else ''
+
+    def _move_install_requirements_markers(self):
+        """
+        Move requirements in `install_requires` that are using environment
+        markers `extras_require`.
+        """
+
+        # divide the install_requires into two sets, simple ones still
+        # handled by install_requires and more complex ones handled
+        # by extras_require.
+
+        def is_simple_req(req):
+            return not req.marker
+
+        spec_inst_reqs = getattr(self, 'install_requires', None) or ()
+        inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs))
+        simple_reqs = filter(is_simple_req, inst_reqs)
+        complex_reqs = filterfalse(is_simple_req, inst_reqs)
+        self.install_requires = list(map(str, simple_reqs))
+
+        for r in complex_reqs:
+            self._tmp_extras_require[':' + str(r.marker)].append(r)
+        self.extras_require = dict(
+            (k, [str(r) for r in map(self._clean_req, v)])
+            for k, v in self._tmp_extras_require.items()
+        )
+
+    def _clean_req(self, req):
+        """
+        Given a Requirement, remove environment markers and return it.
+        """
+        req.marker = None
+        return req
+
+    def _parse_config_files(self, filenames=None):
+        """
+        Adapted from distutils.dist.Distribution.parse_config_files,
+        this method provides the same functionality in subtly-improved
+        ways.
+        """
+        from setuptools.extern.six.moves.configparser import ConfigParser
+
+        # Ignore install directory options if we have a venv
+        if six.PY3 and 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:
+            with io.open(filename, encoding='utf-8') as reader:
+                if DEBUG:
+                    self.announce("  reading {filename}".format(**locals()))
+                (parser.read_file if six.PY3 else parser.readfp)(reader)
+            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 = self._try_str(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)
+
+    @staticmethod
+    def _try_str(val):
+        """
+        On Python 2, much of distutils relies on string values being of
+        type 'str' (bytes) and not unicode text. If the value can be safely
+        encoded to bytes using the default encoding, prefer that.
+
+        Why the default encoding? Because that value can be implicitly
+        decoded back to text if needed.
+
+        Ref #1653
+        """
+        if six.PY3:
+            return val
+        try:
+            return val.encode()
+        except UnicodeEncodeError:
+            pass
+        return val
+
+    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').
+
+        (Adopted from distutils.dist.Distribution._set_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, six.string_types)
+                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 parse_config_files(self, filenames=None, ignore_option_errors=False):
+        """Parses configuration files from various levels
+        and loads configuration.
+
+        """
+        self._parse_config_files(filenames=filenames)
+
+        parse_configuration(self, self.command_options,
+                            ignore_option_errors=ignore_option_errors)
+        self._finalize_requires()
+
+    def parse_command_line(self):
+        """Process features after parsing command line options"""
+        result = _Distribution.parse_command_line(self)
+        if self.features:
+            self._finalize_features()
+        return result
+
+    def _feature_attrname(self, name):
+        """Convert feature name to corresponding option attribute name"""
+        return 'with_' + name.replace('-', '_')
+
+    def fetch_build_eggs(self, requires):
+        """Resolve pre-setup requirements"""
+        resolved_dists = pkg_resources.working_set.resolve(
+            pkg_resources.parse_requirements(requires),
+            installer=self.fetch_build_egg,
+            replace_conflicting=True,
+        )
+        for dist in resolved_dists:
+            pkg_resources.working_set.add(dist, replace=True)
+        return resolved_dists
+
+    def finalize_options(self):
+        _Distribution.finalize_options(self)
+        if self.features:
+            self._set_global_opts_from_features()
+
+        for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
+            value = getattr(self, ep.name, None)
+            if value is not None:
+                ep.require(installer=self.fetch_build_egg)
+                ep.load()(self, ep.name, value)
+        if getattr(self, 'convert_2to3_doctests', None):
+            # XXX may convert to set here when we can rely on set being builtin
+            self.convert_2to3_doctests = [
+                os.path.abspath(p)
+                for p in self.convert_2to3_doctests
+            ]
+        else:
+            self.convert_2to3_doctests = []
+
+    def get_egg_cache_dir(self):
+        egg_cache_dir = os.path.join(os.curdir, '.eggs')
+        if not os.path.exists(egg_cache_dir):
+            os.mkdir(egg_cache_dir)
+            windows_support.hide_file(egg_cache_dir)
+            readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt')
+            with open(readme_txt_filename, 'w') as f:
+                f.write('This directory contains eggs that were downloaded '
+                        'by setuptools to build, test, and run plug-ins.\n\n')
+                f.write('This directory caches those eggs to prevent '
+                        'repeated downloads.\n\n')
+                f.write('However, it is safe to delete this directory.\n\n')
+
+        return egg_cache_dir
+
+    def fetch_build_egg(self, req):
+        """Fetch an egg needed for building"""
+        from setuptools.command.easy_install import easy_install
+        dist = self.__class__({'script_args': ['easy_install']})
+        opts = dist.get_option_dict('easy_install')
+        opts.clear()
+        opts.update(
+            (k, v)
+            for k, v in self.get_option_dict('easy_install').items()
+            if k in (
+                # don't use any other settings
+                'find_links', 'site_dirs', 'index_url',
+                'optimize', 'site_dirs', 'allow_hosts',
+            ))
+        if self.dependency_links:
+            links = self.dependency_links[:]
+            if 'find_links' in opts:
+                links = opts['find_links'][1] + links
+            opts['find_links'] = ('setup', links)
+        install_dir = self.get_egg_cache_dir()
+        cmd = easy_install(
+            dist, args=["x"], install_dir=install_dir,
+            exclude_scripts=True,
+            always_copy=False, build_directory=None, editable=False,
+            upgrade=False, multi_version=True, no_report=True, user=False
+        )
+        cmd.ensure_finalized()
+        return cmd.easy_install(req)
+
+    def _set_global_opts_from_features(self):
+        """Add --with-X/--without-X options based on optional features"""
+
+        go = []
+        no = self.negative_opt.copy()
+
+        for name, feature in self.features.items():
+            self._set_feature(name, None)
+            feature.validate(self)
+
+            if feature.optional:
+                descr = feature.description
+                incdef = ' (default)'
+                excdef = ''
+                if not feature.include_by_default():
+                    excdef, incdef = incdef, excdef
+
+                new = (
+                    ('with-' + name, None, 'include ' + descr + incdef),
+                    ('without-' + name, None, 'exclude ' + descr + excdef),
+                )
+                go.extend(new)
+                no['without-' + name] = 'with-' + name
+
+        self.global_options = self.feature_options = go + self.global_options
+        self.negative_opt = self.feature_negopt = no
+
+    def _finalize_features(self):
+        """Add/remove features and resolve dependencies between them"""
+
+        # First, flag all the enabled items (and thus their dependencies)
+        for name, feature in self.features.items():
+            enabled = self.feature_is_included(name)
+            if enabled or (enabled is None and feature.include_by_default()):
+                feature.include_in(self)
+                self._set_feature(name, 1)
+
+        # Then disable the rest, so that off-by-default features don't
+        # get flagged as errors when they're required by an enabled feature
+        for name, feature in self.features.items():
+            if not self.feature_is_included(name):
+                feature.exclude_from(self)
+                self._set_feature(name, 0)
+
+    def get_command_class(self, command):
+        """Pluggable version of get_command_class()"""
+        if command in self.cmdclass:
+            return self.cmdclass[command]
+
+        eps = pkg_resources.iter_entry_points('distutils.commands', command)
+        for ep in eps:
+            ep.require(installer=self.fetch_build_egg)
+            self.cmdclass[command] = cmdclass = ep.load()
+            return cmdclass
+        else:
+            return _Distribution.get_command_class(self, command)
+
+    def print_commands(self):
+        for ep in pkg_resources.iter_entry_points('distutils.commands'):
+            if ep.name not in self.cmdclass:
+                # don't require extras as the commands won't be invoked
+                cmdclass = ep.resolve()
+                self.cmdclass[ep.name] = cmdclass
+        return _Distribution.print_commands(self)
+
+    def get_command_list(self):
+        for ep in pkg_resources.iter_entry_points('distutils.commands'):
+            if ep.name not in self.cmdclass:
+                # don't require extras as the commands won't be invoked
+                cmdclass = ep.resolve()
+                self.cmdclass[ep.name] = cmdclass
+        return _Distribution.get_command_list(self)
+
+    def _set_feature(self, name, status):
+        """Set feature's inclusion status"""
+        setattr(self, self._feature_attrname(name), status)
+
+    def feature_is_included(self, name):
+        """Return 1 if feature is included, 0 if excluded, 'None' if unknown"""
+        return getattr(self, self._feature_attrname(name))
+
+    def include_feature(self, name):
+        """Request inclusion of feature named 'name'"""
+
+        if self.feature_is_included(name) == 0:
+            descr = self.features[name].description
+            raise DistutilsOptionError(
+                descr + " is required, but was excluded or is not available"
+            )
+        self.features[name].include_in(self)
+        self._set_feature(name, 1)
+
+    def include(self, **attrs):
+        """Add items to distribution that are named in keyword arguments
+
+        For example, 'dist.include(py_modules=["x"])' would add 'x' to
+        the distribution's 'py_modules' attribute, if it was not already
+        there.
+
+        Currently, this method only supports inclusion for attributes that are
+        lists or tuples.  If you need to add support for adding to other
+        attributes in this or a subclass, you can add an '_include_X' method,
+        where 'X' is the name of the attribute.  The method will be called with
+        the value passed to 'include()'.  So, 'dist.include(foo={"bar":"baz"})'
+        will try to call 'dist._include_foo({"bar":"baz"})', which can then
+        handle whatever special inclusion logic is needed.
+        """
+        for k, v in attrs.items():
+            include = getattr(self, '_include_' + k, None)
+            if include:
+                include(v)
+            else:
+                self._include_misc(k, v)
+
+    def exclude_package(self, package):
+        """Remove packages, modules, and extensions in named package"""
+
+        pfx = package + '.'
+        if self.packages:
+            self.packages = [
+                p for p in self.packages
+                if p != package and not p.startswith(pfx)
+            ]
+
+        if self.py_modules:
+            self.py_modules = [
+                p for p in self.py_modules
+                if p != package and not p.startswith(pfx)
+            ]
+
+        if self.ext_modules:
+            self.ext_modules = [
+                p for p in self.ext_modules
+                if p.name != package and not p.name.startswith(pfx)
+            ]
+
+    def has_contents_for(self, package):
+        """Return true if 'exclude_package(package)' would do something"""
+
+        pfx = package + '.'
+
+        for p in self.iter_distribution_names():
+            if p == package or p.startswith(pfx):
+                return True
+
+    def _exclude_misc(self, name, value):
+        """Handle 'exclude()' for list/tuple attrs without a special handler"""
+        if not isinstance(value, sequence):
+            raise DistutilsSetupError(
+                "%s: setting must be a list or tuple (%r)" % (name, value)
+            )
+        try:
+            old = getattr(self, name)
+        except AttributeError:
+            raise DistutilsSetupError(
+                "%s: No such distribution setting" % name
+            )
+        if old is not None and not isinstance(old, sequence):
+            raise DistutilsSetupError(
+                name + ": this setting cannot be changed via include/exclude"
+            )
+        elif old:
+            setattr(self, name, [item for item in old if item not in value])
+
+    def _include_misc(self, name, value):
+        """Handle 'include()' for list/tuple attrs without a special handler"""
+
+        if not isinstance(value, sequence):
+            raise DistutilsSetupError(
+                "%s: setting must be a list (%r)" % (name, value)
+            )
+        try:
+            old = getattr(self, name)
+        except AttributeError:
+            raise DistutilsSetupError(
+                "%s: No such distribution setting" % name
+            )
+        if old is None:
+            setattr(self, name, value)
+        elif not isinstance(old, sequence):
+            raise DistutilsSetupError(
+                name + ": this setting cannot be changed via include/exclude"
+            )
+        else:
+            new = [item for item in value if item not in old]
+            setattr(self, name, old + new)
+
+    def exclude(self, **attrs):
+        """Remove items from distribution that are named in keyword arguments
+
+        For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from
+        the distribution's 'py_modules' attribute.  Excluding packages uses
+        the 'exclude_package()' method, so all of the package's contained
+        packages, modules, and extensions are also excluded.
+
+        Currently, this method only supports exclusion from attributes that are
+        lists or tuples.  If you need to add support for excluding from other
+        attributes in this or a subclass, you can add an '_exclude_X' method,
+        where 'X' is the name of the attribute.  The method will be called with
+        the value passed to 'exclude()'.  So, 'dist.exclude(foo={"bar":"baz"})'
+        will try to call 'dist._exclude_foo({"bar":"baz"})', which can then
+        handle whatever special exclusion logic is needed.
+        """
+        for k, v in attrs.items():
+            exclude = getattr(self, '_exclude_' + k, None)
+            if exclude:
+                exclude(v)
+            else:
+                self._exclude_misc(k, v)
+
+    def _exclude_packages(self, packages):
+        if not isinstance(packages, sequence):
+            raise DistutilsSetupError(
+                "packages: setting must be a list or tuple (%r)" % (packages,)
+            )
+        list(map(self.exclude_package, packages))
+
+    def _parse_command_opts(self, parser, args):
+        # Remove --with-X/--without-X options when processing command args
+        self.global_options = self.__class__.global_options
+        self.negative_opt = self.__class__.negative_opt
+
+        # First, expand any aliases
+        command = args[0]
+        aliases = self.get_option_dict('aliases')
+        while command in aliases:
+            src, alias = aliases[command]
+            del aliases[command]  # ensure each alias can expand only once!
+            import shlex
+            args[:1] = shlex.split(alias, True)
+            command = args[0]
+
+        nargs = _Distribution._parse_command_opts(self, parser, args)
+
+        # Handle commands that want to consume all remaining arguments
+        cmd_class = self.get_command_class(command)
+        if getattr(cmd_class, 'command_consumes_arguments', None):
+            self.get_option_dict(command)['args'] = ("command line", nargs)
+            if nargs is not None:
+                return []
+
+        return nargs
+
+    def get_cmdline_options(self):
+        """Return a '{cmd: {opt:val}}' map of all command-line options
+
+        Option names are all long, but do not include the leading '--', and
+        contain dashes rather than underscores.  If the option doesn't take
+        an argument (e.g. '--quiet'), the 'val' is 'None'.
+
+        Note that options provided by config files are intentionally excluded.
+        """
+
+        d = {}
+
+        for cmd, opts in self.command_options.items():
+
+            for opt, (src, val) in opts.items():
+
+                if src != "command line":
+                    continue
+
+                opt = opt.replace('_', '-')
+
+                if val == 0:
+                    cmdobj = self.get_command_obj(cmd)
+                    neg_opt = self.negative_opt.copy()
+                    neg_opt.update(getattr(cmdobj, 'negative_opt', {}))
+                    for neg, pos in neg_opt.items():
+                        if pos == opt:
+                            opt = neg
+                            val = None
+                            break
+                    else:
+                        raise AssertionError("Shouldn't be able to get here")
+
+                elif val == 1:
+                    val = None
+
+                d.setdefault(cmd, {})[opt] = val
+
+        return d
+
+    def iter_distribution_names(self):
+        """Yield all packages, modules, and extension names in distribution"""
+
+        for pkg in self.packages or ():
+            yield pkg
+
+        for module in self.py_modules or ():
+            yield module
+
+        for ext in self.ext_modules or ():
+            if isinstance(ext, tuple):
+                name, buildinfo = ext
+            else:
+                name = ext.name
+            if name.endswith('module'):
+                name = name[:-6]
+            yield 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.
+        """
+        import sys
+
+        if six.PY2 or self.help_commands:
+            return _Distribution.handle_display_options(self, option_order)
+
+        # Stdout may be StringIO (e.g. in tests)
+        if not isinstance(sys.stdout, io.TextIOWrapper):
+            return _Distribution.handle_display_options(self, option_order)
+
+        # Don't wrap stdout if utf-8 is already the encoding. Provides
+        #  workaround for #334.
+        if sys.stdout.encoding.lower() in ('utf-8', 'utf8'):
+            return _Distribution.handle_display_options(self, option_order)
+
+        # Print metadata in UTF-8 no matter the platform
+        encoding = sys.stdout.encoding
+        errors = sys.stdout.errors
+        newline = sys.platform != 'win32' and '\n' or None
+        line_buffering = sys.stdout.line_buffering
+
+        sys.stdout = io.TextIOWrapper(
+            sys.stdout.detach(), 'utf-8', errors, newline, line_buffering)
+        try:
+            return _Distribution.handle_display_options(self, option_order)
+        finally:
+            sys.stdout = io.TextIOWrapper(
+                sys.stdout.detach(), encoding, errors, newline, line_buffering)
+
+
+class Feature:
+    """
+    **deprecated** -- The `Feature` facility was never completely implemented
+    or supported, `has reported issues
+    <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in
+    a future version.
+
+    A subset of the distribution that can be excluded if unneeded/wanted
+
+    Features are created using these keyword arguments:
+
+      'description' -- a short, human readable description of the feature, to
+         be used in error messages, and option help messages.
+
+      'standard' -- if true, the feature is included by default if it is
+         available on the current system.  Otherwise, the feature is only
+         included if requested via a command line '--with-X' option, or if
+         another included feature requires it.  The default setting is 'False'.
+
+      'available' -- if true, the feature is available for installation on the
+         current system.  The default setting is 'True'.
+
+      'optional' -- if true, the feature's inclusion can be controlled from the
+         command line, using the '--with-X' or '--without-X' options.  If
+         false, the feature's inclusion status is determined automatically,
+         based on 'availabile', 'standard', and whether any other feature
+         requires it.  The default setting is 'True'.
+
+      'require_features' -- a string or sequence of strings naming features
+         that should also be included if this feature is included.  Defaults to
+         empty list.  May also contain 'Require' objects that should be
+         added/removed from the distribution.
+
+      'remove' -- a string or list of strings naming packages to be removed
+         from the distribution if this feature is *not* included.  If the
+         feature *is* included, this argument is ignored.  This argument exists
+         to support removing features that "crosscut" a distribution, such as
+         defining a 'tests' feature that removes all the 'tests' subpackages
+         provided by other features.  The default for this argument is an empty
+         list.  (Note: the named package(s) or modules must exist in the base
+         distribution when the 'setup()' function is initially called.)
+
+      other keywords -- any other keyword arguments are saved, and passed to
+         the distribution's 'include()' and 'exclude()' methods when the
+         feature is included or excluded, respectively.  So, for example, you
+         could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
+         added or removed from the distribution as appropriate.
+
+    A feature must include at least one 'requires', 'remove', or other
+    keyword argument.  Otherwise, it can't affect the distribution in any way.
+    Note also that you can subclass 'Feature' to create your own specialized
+    feature types that modify the distribution in other ways when included or
+    excluded.  See the docstrings for the various methods here for more detail.
+    Aside from the methods, the only feature attributes that distributions look
+    at are 'description' and 'optional'.
+    """
+
+    @staticmethod
+    def warn_deprecated():
+        msg = (
+            "Features are deprecated and will be removed in a future "
+            "version. See https://github.com/pypa/setuptools/issues/65."
+        )
+        warnings.warn(msg, DistDeprecationWarning, stacklevel=3)
+
+    def __init__(
+            self, description, standard=False, available=True,
+            optional=True, require_features=(), remove=(), **extras):
+        self.warn_deprecated()
+
+        self.description = description
+        self.standard = standard
+        self.available = available
+        self.optional = optional
+        if isinstance(require_features, (str, Require)):
+            require_features = require_features,
+
+        self.require_features = [
+            r for r in require_features if isinstance(r, str)
+        ]
+        er = [r for r in require_features if not isinstance(r, str)]
+        if er:
+            extras['require_features'] = er
+
+        if isinstance(remove, str):
+            remove = remove,
+        self.remove = remove
+        self.extras = extras
+
+        if not remove and not require_features and not extras:
+            raise DistutilsSetupError(
+                "Feature %s: must define 'require_features', 'remove', or "
+                "at least one of 'packages', 'py_modules', etc."
+            )
+
+    def include_by_default(self):
+        """Should this feature be included by default?"""
+        return self.available and self.standard
+
+    def include_in(self, dist):
+        """Ensure feature and its requirements are included in distribution
+
+        You may override this in a subclass to perform additional operations on
+        the distribution.  Note that this method may be called more than once
+        per feature, and so should be idempotent.
+
+        """
+
+        if not self.available:
+            raise DistutilsPlatformError(
+                self.description + " is required, "
+                "but is not available on this platform"
+            )
+
+        dist.include(**self.extras)
+
+        for f in self.require_features:
+            dist.include_feature(f)
+
+    def exclude_from(self, dist):
+        """Ensure feature is excluded from distribution
+
+        You may override this in a subclass to perform additional operations on
+        the distribution.  This method will be called at most once per
+        feature, and only after all included features have been asked to
+        include themselves.
+        """
+
+        dist.exclude(**self.extras)
+
+        if self.remove:
+            for item in self.remove:
+                dist.exclude_package(item)
+
+    def validate(self, dist):
+        """Verify that feature makes sense in context of distribution
+
+        This method is called by the distribution just before it parses its
+        command line.  It checks to ensure that the 'remove' attribute, if any,
+        contains only valid package/module names that are present in the base
+        distribution when 'setup()' is called.  You may override it in a
+        subclass to perform any other required validation of the feature
+        against a target distribution.
+        """
+
+        for item in self.remove:
+            if not dist.has_contents_for(item):
+                raise DistutilsSetupError(
+                    "%s wants to be able to remove %s, but the distribution"
+                    " doesn't contain any packages or modules under %s"
+                    % (self.description, item, item)
+                )
+
+
+class DistDeprecationWarning(SetuptoolsDeprecationWarning):
+    """Class for warning about deprecations in dist in
+    setuptools. Not ignored by default, unlike DeprecationWarning."""
diff --git a/venv/lib/python2.7/site-packages/setuptools/dist.pyc b/venv/lib/python2.7/site-packages/setuptools/dist.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4d298d37e847f2db8cf82664d193e5818d430a21
GIT binary patch
literal 51496
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%0AxfeI#2fG|J`7!VUw
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
WaB^_6atd*B3NefQX8=JF;aLD@^Y3i{

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/extension.py b/venv/lib/python2.7/site-packages/setuptools/extension.py
new file mode 100644
index 00000000..29468894
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/extension.py
@@ -0,0 +1,57 @@
+import re
+import functools
+import distutils.core
+import distutils.errors
+import distutils.extension
+
+from setuptools.extern.six.moves import map
+
+from .monkey import get_unpatched
+
+
+def _have_cython():
+    """
+    Return True if Cython can be imported.
+    """
+    cython_impl = 'Cython.Distutils.build_ext'
+    try:
+        # from (cython_impl) import build_ext
+        __import__(cython_impl, fromlist=['build_ext']).build_ext
+        return True
+    except Exception:
+        pass
+    return False
+
+
+# for compatibility
+have_pyrex = _have_cython
+
+_Extension = get_unpatched(distutils.core.Extension)
+
+
+class Extension(_Extension):
+    """Extension that uses '.c' files in place of '.pyx' files"""
+
+    def __init__(self, name, sources, *args, **kw):
+        # The *args is needed for compatibility as calls may use positional
+        # arguments. py_limited_api may be set only via keyword.
+        self.py_limited_api = kw.pop("py_limited_api", False)
+        _Extension.__init__(self, name, sources, *args, **kw)
+
+    def _convert_pyx_sources_to_lang(self):
+        """
+        Replace sources with .pyx extensions to sources with the target
+        language extension. This mechanism allows language authors to supply
+        pre-converted sources but to prefer the .pyx sources.
+        """
+        if _have_cython():
+            # the build has Cython, so allow it to compile the .pyx files
+            return
+        lang = self.language or ''
+        target_ext = '.cpp' if lang.lower() == 'c++' else '.c'
+        sub = functools.partial(re.sub, '.pyx$', target_ext)
+        self.sources = list(map(sub, self.sources))
+
+
+class Library(Extension):
+    """Just like a regular Extension, but built as a library instead"""
diff --git a/venv/lib/python2.7/site-packages/setuptools/extension.pyc b/venv/lib/python2.7/site-packages/setuptools/extension.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2cccdf2a2588e4acc2a26fda55cb2a7dc955c761
GIT binary patch
literal 2742
zcmZSn%*&NH<x)&C0~9bbFfceUFfbIaWnf@PVPHsMWXNG)h=Q{j8KM|r;!F%t%rG_!
z5}OsqW@5-;W5{J^h+=18Okrk7VPVMOV94cUh~i{mOkrhcVPJ^jVo2p;h~j2Q<zz@@
zX2{}U$l_&aW@L!sV@P3RNabTlV`NBS2dQjkV2F(3Wk}&*NaY2Ka>7OVL9Pte;9_84
z$o&8R|9?LXMg|6k5|CGN6ALmy9Eb=n0|P^PYDs))UO{3>az<(j*xMj^Rt5$JXOOpT
zK;C9#sAXWNlw&AiV5nhWNMT|~VP;5YWN2n&%wl9<EMZ~@4$l*0U@2i{$mU`wGG}09
zWXxk^h$vxU2-aW$nPR}ez`&)Tpr8<xT2fk+rw~$9nyQeQrr=yzl98XMkeryOkd&&B
znOl%wRFaya2Uc1v1#$yefu2idaY<=OW=^qQQfX#RN_=WXNeKr714CL-er`@?aY+d$
z0|NtGN(1Ej5|H=f;~{3o#|MFYUjlLr$ZoKD*NWuSf|AVqyb_Rlx5S*{R7kLJGcYhD
zgDnPW&(Q!S1u#*Z$H2g#Ur>};mRORiUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQWL{=y
zVP2e5nO+`ml44?FU|?X7o~Iw8Uyxa#o0(T!l9-dDTb^iH8knJ9oLW*^P?DdYQ;f_^
zttd&&E6&W%(<`Vf;bCB4h|fqYOO1y(3B)hv138I>jggs2jFE$pmyv}L>LaK|a6E$4
zfa1~#6axwj3=F9Z(8L<W1WF;G<i-q&O%Q{HAt+b_6h_773=9meFc&D4WF(d-loqEJ
zE2!%wt1F~s=A;%YWacRp<Rm7iD&(grsOuF}RzM|^K?Z;VlZ}Ca!5?I;5d#B54GTjS
zIOCKsGBh)RQcye-C^crWfY>#R3^hy)HOwGoeasAuDGUt38cYlf41OgbUlvrx=Vaz)
zmZYY{Cl+KvVisgeL4H9HI|Bnl5Gb-BaSeAgIBCSkXXa&=#K%LlfFiy)H75<60`d}b
zQ%gXai}Op1l2ePpf{8`x#U&tnv&+G84JHO4!h=A*RtAL~$juDQqKwI)NCa^}7@R2!
zLD`vsp_zf9h!+%-!8HsFS&R$?lAzeEWn`#fWXNIyNvAL~WHT`onShF#JZ6RzR)$(w
z(3h|>WU+w?l^Q07W@d(3W`+`Wh7t~NOfWEHae|_%nGqC2@tj~gG{7Nt2bPl|xfzlS
zpy8-co>`Ki07?%E@FZNUP?E2JB43h`s!)<xl%84w&gLL<auV~>OB2&m5!&<=LNYRo
z6>?LPGZOPMi*pqcb8_;_ixuE16H7}n@{1s*mlhP{RKg7_C`#2$&d)1L1r;T5tCLDg
zKrSgLN=-{GQUJLD>`ti5ASDjSDSjoOY*P$MV#(Ut#h@V9OD-rV2Bi$W<YG|b25D3Q
zm##sapojn!L@;-Oi;|rD^3)=5hD<BXO9p3eaB?e1EGo%N%mJseqEv8sTwIz2PJN(4
zEC^(CkRSsC1Gvx(;s+THasbG1a1w_E8>sXP0u_$nBnl=5Af1-TfC?sPK*twUR>VWY
zGQK1~9^_(8P#Wd|`H78_iG`7$QI1i95t180Ar>DG%7*drV2{Pe=jNxB=A_2Qg99o)
zJ|#anJ|3JEg5*E}0x|~dQ!p_A-VNenU|;|hqQ#)Hjg66wiIWZNR-eqIqQs&~%n}!r
zkC98<pkQ$AQf$k>z~EI{T%wSZnVqVTs8E!eUYe6wqyR6zbQC~|6;zv*C?pmuBr4=U
ztWW?|9;t~b;9@#R9#r^&92BHDI08tCfq}sS6z8C<!p5i}0CJ!th!6)QWKeLVz^n1(
z{GwEF4uK1mfYifzdZ|T4`9;Mg!l32{To=4lDUk+Q1g|{xKoUiHdc~O)db#;!sm0)|
zR04{r-2A-k)XE@G5emtzpm+pVrv;TosTJVN2XYKJeuF>_q9Bk*z{w0j3_yYdS7J7h
fY+(m-ez6z>0|O5u6fy}g2{3c=voQ%Vi%9?gbz7r@

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/extern/__init__.py b/venv/lib/python2.7/site-packages/setuptools/extern/__init__.py
new file mode 100644
index 00000000..cb2fa329
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/extern/__init__.py
@@ -0,0 +1,73 @@
+import sys
+
+
+class VendorImporter:
+    """
+    A PEP 302 meta path importer for finding optionally-vendored
+    or otherwise naturally-installed packages from root_name.
+    """
+
+    def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
+        self.root_name = root_name
+        self.vendored_names = set(vendored_names)
+        self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor')
+
+    @property
+    def search_path(self):
+        """
+        Search first the vendor package then as a natural package.
+        """
+        yield self.vendor_pkg + '.'
+        yield ''
+
+    def find_module(self, fullname, path=None):
+        """
+        Return self when fullname starts with root_name and the
+        target module is one vendored through this importer.
+        """
+        root, base, target = fullname.partition(self.root_name + '.')
+        if root:
+            return
+        if not any(map(target.startswith, self.vendored_names)):
+            return
+        return self
+
+    def load_module(self, fullname):
+        """
+        Iterate over the search path to locate and load fullname.
+        """
+        root, base, target = fullname.partition(self.root_name + '.')
+        for prefix in self.search_path:
+            try:
+                extant = prefix + target
+                __import__(extant)
+                mod = sys.modules[extant]
+                sys.modules[fullname] = mod
+                # mysterious hack:
+                # Remove the reference to the extant package/module
+                # on later Python versions to cause relative imports
+                # in the vendor package to resolve the same modules
+                # as those going through this importer.
+                if sys.version_info >= (3, ):
+                    del sys.modules[extant]
+                return mod
+            except ImportError:
+                pass
+        else:
+            raise ImportError(
+                "The '{target}' package is required; "
+                "normally this is bundled with this package so if you get "
+                "this warning, consult the packager of your "
+                "distribution.".format(**locals())
+            )
+
+    def install(self):
+        """
+        Install this importer into sys.meta_path if not already present.
+        """
+        if self not in sys.meta_path:
+            sys.meta_path.append(self)
+
+
+names = 'six', 'packaging', 'pyparsing',
+VendorImporter(__name__, names, 'setuptools._vendor').install()
diff --git a/venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc b/venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fd312f869f91f8f34ceb473cee50de98338350a1
GIT binary patch
literal 3302
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/glibc.py b/venv/lib/python2.7/site-packages/setuptools/glibc.py
new file mode 100644
index 00000000..a134591c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/glibc.py
@@ -0,0 +1,86 @@
+# This file originally from pip:
+# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py
+from __future__ import absolute_import
+
+import ctypes
+import re
+import warnings
+
+
+def glibc_version_string():
+    "Returns glibc version string, or None if not using glibc."
+
+    # 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)
+
+
+# platform.libc_ver regularly returns completely nonsensical glibc
+# versions. E.g. on my computer, platform says:
+#
+#   ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
+#   ('glibc', '2.7')
+#   ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
+#   ('glibc', '2.9')
+#
+# But the truth is:
+#
+#   ~$ ldd --version
+#   ldd (Debian GLIBC 2.22-11) 2.22
+#
+# This is unfortunate, because it means that the linehaul data on libc
+# versions that was generated by pip 8.1.2 and earlier is useless and
+# misleading. Solution: instead of using platform, use our code that actually
+# works.
+def libc_ver():
+    """Try to determine the glibc version
+
+    Returns a tuple of strings (lib, version) which default to empty strings
+    in case the lookup fails.
+    """
+    glibc_version = glibc_version_string()
+    if glibc_version is None:
+        return ("", "")
+    else:
+        return ("glibc", glibc_version)
diff --git a/venv/lib/python2.7/site-packages/setuptools/glibc.pyc b/venv/lib/python2.7/site-packages/setuptools/glibc.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c85baa6840f3cc3b6c78a5baaa245a91f066956f
GIT binary patch
literal 2230
zcmZSn%*&NH<x)&C0~9bZFfcecFfbIyFfcHrFfgPrGUPBY<T5fuF)}cM_)H8rObk&>
zU^ym+9A<_nW*D1=A&P||g_)s+fgy^OA%z9ZU}H#O1vA(gQrN%@4u%vahF}eL1_p*q
zkgXbw3=9k<{0s~XiAlxzIi)43@tL^=`9&puU{^6SFfgz(FfcfST$K${%D|At2r{FY
zk)f7>p^}%OhJhiAnW2`EAv{lrfu)3nA)AY#$bf;7kr8B5L<s{!7Ar#yBSSnJh-_wH
zsAXa(VP~jeVkqHYXl7z4P6x5GI6=Mz8Op?v#{d!u)&N;vY{|gD5R_U{T9j9;ke-v7
zl&nyeT2!2wpQlh<Qk0pOuA`7&q~MpIm#UDNrjVCkqEK3#nU@Yxs#gMXdtz~NW~QG8
z7s&N&3=9m(C6xuK#U(5tZ@KvRfEgeIN<<hK7}E1f<I_`1;z2gWLv1SIV_;x#EGa3<
zOe!r&buB8&FDl^x85EzKkysR8Py!0gqSRuLxg{WLGK(|wic1pnl2c2-ekds_0a=`q
znw+1K3ieisAOizKK~a8kYH@LVUSe))aY15oY7oe|CEN@Q3{acni%W_$z|jOEinACP
z81xH@GRqQ6QuWIci}cg-b5c@^iuJP#^|OnO%*_o8vy9Bk3@yxyb1Kuz<4sabObiSR
z4AS%TL-Y$W3v|KG%E{3!PqZuz%+N1REh#N1$<NOzMrMLTS+AfH5+29_0dh`eUOLE&
z#h}1qVCQFKX5?k$WoBjOVdP}uXB1*e2Kg8iwjdguY*Ii04@owRpw!aL#8Au3P{Yhn
zY`{>$1WG(9OdxTw5*AQ;U@T!}2rgj*Dac|6rRZixhGs@k+R0{O$WLZKNU?y#K~hW%
z*{lq~8lcegD^_7(V9>A+u*pr#$}h5uHqf<<)z*yB0}Ey5A%u!;85kH`D+*GROHxxH
z=>?v&$}>wc6pR#-^K%RG^HTFliWR`7>E(h9&{0UwFR@ZkEe5A9umpq!lGFetj1o{r
zE=q-nCYB^;fRjskVo_dZUOFV@fjHoF6;zs6l9`(t4v_?FaZAi8hNPU#yb`cTdQpC9
zfd(j4gLpxq2}+PfsfDGPMX4$A5Ep>Nb2IZYb4zpM!OkoJ<?P&nOFhD%9FmcmoE;BN
zP_WDdik@PS`x)4U7}*#(8Mzr*7^NALK|uyeG9XWalZ__GqYMm?0;2|8=4Ep*6iI^8
zOmGP^sEDXx040lNW`<yJG3EyeA&}ugAY+2WKxKyvC_R8o4w3|Mr9cEIum&z<L>U+u
zG7`&D<3Z^wu_QAoClwM#CJYP=#h?Vlz{ttS!^px2E`vew2nro=sHh`Cg#nalQkWSa
zp_0PF5DdvjX-o{kDWEU`<%i<Q3=9k*MU@IA`3fniC8<TZnR%%SB^jxxDV~c<K|w(Q
zR?a3Wl#~|aq$=d6K?~Vp1&y4{Bpq1(&{QbT$V|>qNJ&jgEX^qanVp(jP*Mp~4K^$@
zPa!$67-CmWetvdofkIkhW=^plShfUIph40$sD$y;0QoRT4iq^c0>XvIBsh9YK(U6B
zmIf{gL6HP<Hz-y6z+;UK9BWJ(oS;bJVqjp1k54NtDJ@Ekj}HR*Hwf%WP|+U*${j&q
w|AEqHkSxgKilCGVQa7;vvdPU)Da}c>1LYZTP8DF{VdP=tVdj+L6yTHq00@U1umAu6

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/glob.py b/venv/lib/python2.7/site-packages/setuptools/glob.py
new file mode 100644
index 00000000..9d7cbc5d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/glob.py
@@ -0,0 +1,174 @@
+"""
+Filename globbing utility. Mostly a copy of `glob` from Python 3.5.
+
+Changes include:
+ * `yield from` and PEP3102 `*` removed.
+ * Hidden files are not ignored.
+"""
+
+import os
+import re
+import fnmatch
+
+__all__ = ["glob", "iglob", "escape"]
+
+
+def glob(pathname, recursive=False):
+    """Return a list of paths matching a pathname pattern.
+
+    The pattern may contain simple shell-style wildcards a la
+    fnmatch. However, unlike fnmatch, filenames starting with a
+    dot are special cases that are not matched by '*' and '?'
+    patterns.
+
+    If recursive is true, the pattern '**' will match any files and
+    zero or more directories and subdirectories.
+    """
+    return list(iglob(pathname, recursive=recursive))
+
+
+def iglob(pathname, recursive=False):
+    """Return an iterator which yields the paths matching a pathname pattern.
+
+    The pattern may contain simple shell-style wildcards a la
+    fnmatch. However, unlike fnmatch, filenames starting with a
+    dot are special cases that are not matched by '*' and '?'
+    patterns.
+
+    If recursive is true, the pattern '**' will match any files and
+    zero or more directories and subdirectories.
+    """
+    it = _iglob(pathname, recursive)
+    if recursive and _isrecursive(pathname):
+        s = next(it)  # skip empty string
+        assert not s
+    return it
+
+
+def _iglob(pathname, recursive):
+    dirname, basename = os.path.split(pathname)
+    if not has_magic(pathname):
+        if basename:
+            if os.path.lexists(pathname):
+                yield pathname
+        else:
+            # Patterns ending with a slash should match only directories
+            if os.path.isdir(dirname):
+                yield pathname
+        return
+    if not dirname:
+        if recursive and _isrecursive(basename):
+            for x in glob2(dirname, basename):
+                yield x
+        else:
+            for x in glob1(dirname, basename):
+                yield x
+        return
+    # `os.path.split()` returns the argument itself as a dirname if it is a
+    # drive or UNC path.  Prevent an infinite recursion if a drive or UNC path
+    # contains magic characters (i.e. r'\\?\C:').
+    if dirname != pathname and has_magic(dirname):
+        dirs = _iglob(dirname, recursive)
+    else:
+        dirs = [dirname]
+    if has_magic(basename):
+        if recursive and _isrecursive(basename):
+            glob_in_dir = glob2
+        else:
+            glob_in_dir = glob1
+    else:
+        glob_in_dir = glob0
+    for dirname in dirs:
+        for name in glob_in_dir(dirname, basename):
+            yield os.path.join(dirname, name)
+
+
+# These 2 helper functions non-recursively glob inside a literal directory.
+# They return a list of basenames. `glob1` accepts a pattern while `glob0`
+# takes a literal basename (so it only has to check for its existence).
+
+
+def glob1(dirname, pattern):
+    if not dirname:
+        if isinstance(pattern, bytes):
+            dirname = os.curdir.encode('ASCII')
+        else:
+            dirname = os.curdir
+    try:
+        names = os.listdir(dirname)
+    except OSError:
+        return []
+    return fnmatch.filter(names, pattern)
+
+
+def glob0(dirname, basename):
+    if not basename:
+        # `os.path.split()` returns an empty basename for paths ending with a
+        # directory separator.  'q*x/' should match only directories.
+        if os.path.isdir(dirname):
+            return [basename]
+    else:
+        if os.path.lexists(os.path.join(dirname, basename)):
+            return [basename]
+    return []
+
+
+# This helper function recursively yields relative pathnames inside a literal
+# directory.
+
+
+def glob2(dirname, pattern):
+    assert _isrecursive(pattern)
+    yield pattern[:0]
+    for x in _rlistdir(dirname):
+        yield x
+
+
+# Recursively yields relative pathnames inside a literal directory.
+def _rlistdir(dirname):
+    if not dirname:
+        if isinstance(dirname, bytes):
+            dirname = os.curdir.encode('ASCII')
+        else:
+            dirname = os.curdir
+    try:
+        names = os.listdir(dirname)
+    except os.error:
+        return
+    for x in names:
+        yield x
+        path = os.path.join(dirname, x) if dirname else x
+        for y in _rlistdir(path):
+            yield os.path.join(x, y)
+
+
+magic_check = re.compile('([*?[])')
+magic_check_bytes = re.compile(b'([*?[])')
+
+
+def has_magic(s):
+    if isinstance(s, bytes):
+        match = magic_check_bytes.search(s)
+    else:
+        match = magic_check.search(s)
+    return match is not None
+
+
+def _isrecursive(pattern):
+    if isinstance(pattern, bytes):
+        return pattern == b'**'
+    else:
+        return pattern == '**'
+
+
+def escape(pathname):
+    """Escape all special characters.
+    """
+    # Escaping is done by wrapping any of "*?[" between square brackets.
+    # Metacharacters do not work in the drive part and shouldn't be escaped.
+    drive, pathname = os.path.splitdrive(pathname)
+    if isinstance(pathname, bytes):
+        pathname = magic_check_bytes.sub(br'[\1]', pathname)
+    else:
+        pathname = magic_check.sub(r'[\1]', pathname)
+    return drive + pathname
diff --git a/venv/lib/python2.7/site-packages/setuptools/glob.pyc b/venv/lib/python2.7/site-packages/setuptools/glob.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4194b88fd66014ecc721d5fb02a13158d45ec459
GIT binary patch
literal 5311
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
GWCs9Cw#Rb-

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/gui-32.exe b/venv/lib/python2.7/site-packages/setuptools/gui-32.exe
new file mode 100644
index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94
GIT binary patch
literal 65536
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/gui-64.exe b/venv/lib/python2.7/site-packages/setuptools/gui-64.exe
new file mode 100644
index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae
GIT binary patch
literal 75264
zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~P<Y833=9l>^1JvLws4+R+`;H`Rxu<avsj^^
zC_lX@F;^iuF)uH_L?J0vp{O)ZAu~_G#XndfH$Np+kC&HA1!}T#+>+Vp_NPw3u*1)d
zCsM%t(<iL#Po20`5OX5g{?v)eT)z{}U^@OpE|~T_!3n0LPo&wOIuVqaoB=WeYAi#5
zD+5DH8w-Qv#_m9v*arq>25u%!28L@43=BCC(KFf%3=9HbwgV%G0<oDG7+4vYKs-3j
zP{0TYBnAeMOan|4R4?2R1Rt&fYz~VcBZCH*1tk&~892D0Y)YsP3=9(>PQ_}9UP)?2
z2?GPepDR!&g8UAOY$VkR3=9c+MJb6Ti3|)oG#MBeJ}@vaXfZG_+(J^sz`)?Zz~G<<
zQO5AZl!1Xkfsuhh43v1lAqQ9Nz`$@ouK=PD?8gK~1_mAm1_mh%b;KkyxVfVY>W6?w
zXN(GmM`w<TfJbMEiiAgJjf#R}h-0W@m`C#)1)uJR9?d8J8z1oO{<8}dd7svKe81T1
z!pZ2-TlwE3`NWF=9tH;EZ^mzZlHVU=Q1a-FVD#z!(E7hFm0!LA<XT7mZ9F;+KVwQ+
z{vUg--tbeYRH5}-orp{Ku}v`^-KV?%y~yHWVDMnRul?;9bBxFT!>^f)zd7=6W6|;W
zf7IjuVNdI~9nSx2cC>!06GGBt3en`zoulI6(Osev;L%;95^;=K>6kMkgGYCaii2nO
zF^}dW3XXA(v5ql^&%gl4zY^gdjc*cI7#KXdS@#GrGI$st@#t((2>^@S^yogwzm3zQ
z`&Y}!65$CR{|_|$)GuW@=I}qJi=*Xa={t|!78OuY;nUlr;=shf;M41(;^5I6qGI6D
zecGebMMdF-zaRrcLyd|71Apr}1~AhhhQDPo0|Ns-&F3MSg#;NGAc5}DTchIeX`Khy
zg6|hS{-5ypf6{~bM1y5aDTl}ZlMR+JC87{n>k~!X#~2wPf~BvK+yrtZGXsN9_i2yg
zE-DJ3IC*iOmw^EsojX|=85mylaDf~)Ma6-cf#J0fl0-2`qWiMr4v;dB?h_u}KVIzS
z28G*kkM15wfEk~8!2xn{_Z*c5PyjX_0flTlEW|<KjXQmLbl-${)u;QFNB8gE01j{h
z^Z0-A#dl5y2IK!8-JcyhYZ>_War<<Ca5aA7(JApFRgi(9^+1Uzzq|_r1OGm6Mvwo8
zUj%>!OF!^$)Asm(*rDZZNwfq1zOyeZz~UvWuB}f>JRKVTf)e8K*Eby+{wkG<Iea_L
zSjuO7z_s-W|C9p`MsHoZA6)$3`oBcTr~5c4eV%)9h7*)JzZ?Gt8M(-zL(k*?vDdRu
zl&pj)ImX7|_}`VmGuf5F<Nq<wPLpFGO=|r6xL<4(0J~Xm0?fS&zyhTo8mt-kTiyTv
z{|`>IXz3YC8un;@qtSY@RH&P`Ns*DE^<)W$@umNwW_K7Ec7XDyNAnR4SkQx$JShAH
zK<WJf0|SHc0Z@qE^yu|bDRAj^&oI8!xkm+5*n?7D0EmbH5eYA@aWF9ShBJEf^7j1y
z|Npp)N<jvweIWYoHYmNvs04sgU4c($jEV<Hg9E78umBMTuEr-_jSqNqUp7A3S)-x>
zN^&4~{TE$*8x#Vi8ZUmaf>N94>U$u{BjH663&>#}-E&lafHFwq5s*vc4|lt$BzScD
zs01{h`rpYqRe_P=zi9kzP}=hWSw98r?*F1LFk=@(jMae|D~-e07O+MP>%f6^=FAyT
zcp;_Na8OwYDG6UfQtEDycRaiQdM3a4w9do&u1EJLkM9?Kx=;J`1~S%4d3D>If++m7
z&h!64kM9><m@oQRpRIZ3nS9El`|=BUc96eC&)j8T@a;b8(S5?F`@st#epsIO?EVWe
z_WMPj-pv2C20q;^_dJu&di07;z01Jh$$aL;Q$A2A*xZ9y<MID6IM28+zx1%aTXO*|
z9eH*i0T+X@jxpdo=@1<580H8{5D`ouV_0|d!V5qHP-)iv$put~`6T}YmuZeW7#JBC
zj8Fa-{dE)OMo_tA0JhYl*M&zPl$;DatPhq+@XIqaSm>1qfOQ^YU;vd^)`!Yp9|Om5
z^U42UoyM0wt@G$+wYm!m2p<&#k52dh-K@rU85la<*<W1W!NAacqxr}GQl%H?K?PT@
zi;96qujubPAmttjFPxYd7<!$VU;bnS2~1HjU}Ru`xU&0%N9P(9P;2Og?0N<UkK_{`
zy?b~-^4+Ijcy}O_d;CA;@&AyA_4Q(Y{%uSx2TC|>xJp=TcuQX%V`A{=?E#zV(JNYi
z2V^v;b@f7p50rdMR6V*`Bf&0#D(YnHW(~N*z|iT)!M}~w>kb1$ha(Tj|0*DJj6lWf
z&tL!lgG3BGx-C4qZ+LW{e^K@ml;K}^v>qr`c<~Yx5xt_fKzXbCxJR!?!izXY28Lc&
zrkA`RKXz_W31DJi=q^!F@#$Qm;sJ`K&Nbk=$F*0-d>01;1A}9)D<h~nJ_ss;yU&8s
zl+us?|C|3YdUmp?c=pz)aMUSyG#}>pf6k+u`vu#N|NlLjk8^-TJeuDzdUU$~D18Qw
z$QQ4^|Njq8<RAr}*7rejwTk@mEugA{!Lys^-izbk|Nr;+e;7$Y&GY6O6$J*5Zirhw
zj<bVQmuPu*U-9TZ`(oEp28I`mP=DS6MTAF!PxsLmWef}qJ3!(4TFkZkC{%IfA5h?&
zc;Wc_|9_uusE4~D9`@*lL@=oO0VP)t<1;ThLA6xl5m0(|jCYKSk47#4J-S6RWf&Q{
zdE;dm863f7<jWsm3yyen1_*d`dT{u3I!O3*dME^kg*%3LG{3R%=>BPZyZdwZVGrxm
z{8JBDA1+mYF+q)i;W)Ul3o0QLAjO>VCF7GXmZ>r@G@tnYQk0Q_0i@+JOiL_IEyYkR
zj~GD3X^Kk03s7R7@XcMqfxmSss1)oz|Kgc414HwV|0P<@KmL`ddL&=)=sx9f@F%NJ
zFY9qlMuz4`@*dfjB0QNzPI&b4s&X+hycYE6<(1(AwSO-9^s+9}WMuf}WKmzL3Nl3s
zWQr&#OLQOfIQWCL`Juc=_Q?oOW}XAz94#73lwPb;#pS~zDhv$G=l)xNF4Y1hUSDBQ
z4)yIm11{)8R5Cz<38D-P-5)%<uXmq*!63rGFaadE85AU-W|)OzOne+TUOakPJ6RbS
z4m$*cO4V-G7;8p`-69O2%vH+11Jt#8&1!v^-{-JL@(FOt?qs#JW@LE5qQ=1B(aFlI
z&By@CH7dOU93I`LJ7r}+lFwDak{`4nlI%OA7#J8{R~Vo4=oOV_Wn}Q^6k+seK4jq0
ze2~MV`88t+r$;yIAuUFR*H1xy=oJ-WWn^&e^<ehwKH<|VnxVnS;Msiu8cd$uEQdfr
z<<l*~=-K@1e+jo|^RIs;tiG+6O4*Jx{rms_zvur0AmcroUow{NF+Kn)a6z60)zvTB
zH5nKhY*j#ApAyy=g6g0`m)8yC(&i%?FAu6QFr0ye1*k35%bUZ($lzgpv&hP$m-PcX
zh<&46&!hXY$Bxyjz(C7G`=ZD9R~`p{F@qDtOZ#3QL4g-G+6)Z*yRs$tUvqi%dK>%~
z4ZZ>@u8$~0ABLLW{8PlE`&KP~^Fe_Ze8{T34E~F%B2=F_19G=VujoT&koBjE%sqNp
zQ^8I-QLfFut5Aa9L;Dnxd%nL!cg%WC28P#M9?b_0{)=9|40Z>oRRS`%`KL%NKmV>G
z39vibAPRdyPFMw32nmno6cq<Z<NC#7El{Z407bmCrHhI~iRcRkWd=|}DB*tbO^Jb_
z+egKrlf$F?Ff8a{)j5<-OM{hP9^D5$n}2W=1@mva<hhd(3OxDOU-WGL;ZP*!@%?7=
zL-rCjAMJx4odO=rCw#k4cs4(<_dNKLt<)02VfQ@vlDR}MEiG-r1dmQZP^$9$f3oz8
zZ|i{)t`0$u{|7z)pD6uym|xz30i-A`ZGvaxPX-wVhGGMd`p!TOkIp~=kLH689-V<V
zJURm(c>X`>(HZ!{qciY>M`z%V(i^X*q=DPF9{h&|J@^j?a)1bk7XHJ5H$XhFCjP^L
zFF>3RAmT^qg%1rpDhw|}{{R0E^*WeB_}{1drZ4w_5)}{aQ{N7;muPe`wH)YR5#(=q
z3@Ud1AM*TvqJ;h1A@<T|uX#MX4<GjEWD)deKE&bC&E(nqf}=>ybLanmU{L47e8Q*u
zf@kxm|Gvf-J$Eud!m`n~^<v3M&*lRh{4L!K3=B}?LA8em#Q2JqCmkw+C8bbqrpLh-
z0$^1oNl>9Mh>Bn+*Bzn40V-qyQDF$>s=|$shl&V86bL}L{H->iYzp!Z^C=JGOP<X?
z1d3e09b_-z^7wzSL(ud8iPs-Jn_nmtNg_v3XP|^f^FalWMDcUa<^v!WM-eATN%KJt
zkd6Z!p3N^9i`c=j{`xa0#LhtTn`^g(NB1qC?vswqkAFCRV_@;=zE~pc*zLgKn;gLM
z{e}<oMUUhYKFSw8lMj1!iwJmhI}3DsaCk6#b9{4T<}cyl-{#2N{NRJf3{XHDpYrTJ
z2~OQFXEHM|fb*ztx1)te_bJcri!VC=|NjrJ++ZC5NIeE>LwCBUX!vycs3`b?+M0(v
znos?I!K4Aslop4<?Og$%P8Su4P*C*;>i9c`do;f>0M)!JK=o7i8kHHKw9)<3r~8xf
zCExC!-KRQ3R0=$-f0c0gSbr+z_pv@y!oL&LE`GU(k%0lk{pe$Ts+7mWa*E0X1_p-G
zN3XeH?2>Cf)~_H^3qVrGAyOcA$!;I(M-ZtEAgMJFDG<A40mOIR_br4=xIyj8|A#%S
z50!sxu(m4I@v;6?qUhQDgPFg{8q^xx32IXKbRP%#)wBED3t>$L2IET}z157bIY4Te
z9XrH4Kt0Y+9^LmX#7j~^U9?*oAVt=PN?1Xo5aM0THu@#JHZdifHhQI;9^Ic`vv~Ao
zgZi2l!lmautY4Mr`&j=fQT6FQ>!W?%$Fc|PQ~tJ9;4p()eg4G^u&Ey1e?d0?Dq(i)
z5cjbDR1)Z6{k_P?$NE)?qEGiZr~#lbC@X}!`|OKoux20YM<oFs+V?yx=cs_fqRbD}
z+W-x3ocizCeddL!1_Q%ueXv;`+V?@Kzy@i6RY4tc_60xOEEdNO5f$SDFDEiEFm#`K
z&C>0oQsC3wq5>MP0fi2SkM*H4P!NIq#|w)$kcc?Q5<ZX!*ajBIj!*`W>%c-_r-9A(
zu>Mu5`XWvil*Uq26c~1c#t0EDrcQ|$MKYka(rY2>Q>E8mn94FR>{Mc4VCdxNJ_zc*
zRCqKWF#t8?Ktnh2aj~HG9H`aB0UDwb0Hw|VPf$Dh7o^$m(ftwB90WPvqx+!8_Zyzw
z2Ysb)`zqh?_<qBq`>?O{B~VY*!K2eh#llzl0$B982S_wT#Q>BwG(5qgKHaB%r4M*?
zhNvibbYFLDe!%R}eeT6AaBDFJ)Eg~P$?#}C5&-T<fy-4Gfhb=+ta&pT7#T_hJq{ie
zNc(>9|Nl~^&xbt@o)mbw5T&j^<|x77(Rzu$wTXd&;f1Lws0HIJ;L$zd04TF{3VU>S
zfX3oII=wkOx_Mc-L3Q!P60z=v6QITtYYitOLn+4#PGgWhW{+;xWDZ6K4@+l`5@~Qj
z(g9Y+8wyg!`Qnu(NSQMSNa`Ed1g28aX0RHjW6lzcuQ@*R=QDlguV+NAL&5d1L$htU
zB&Zvbe6v)*qnkCFi;;nUJ4;0K1CG~WpdN#Q@ue4P-~kL56@}&<Jd6wsjCEq55hw+4
z1Frk@3v)9D2AA#|uLV518$d&6F8teNA{?6^b2QYbSTL0Ecyzm{7&I>cIr*<6xDs~&
zx1TygR3K#&D3TOFEye_o)=Q<TFPNlZX$z68Ag%Kk;!@z|`0G%Q){`aIKyeO^cmvRI
z9XN^f`luMV8Xq|BqGIv?|Nr{qE-D^QpeUHf#lX;<qhi6>eWQX4H1c3@jFI6rxG!g5
zeDX!T87RqmG#^O-ISm%^P#O{cpf*6MhxSFE?o*z-VO1iiqLJ@nbm|h}^!R_!>QHGo
zsG9X_IZ)!|@%<pEt5o{Xt5<|Gt?|)+{<OwlKlsZpdUP{-b&GI%SRX1q3T|OEzu@rP
z1*?0@1U;HR{P$tL<Y|1!v-NPv!Ph(<#s?02NFVTMzVZKX%cT<amTx7>9tU3uv|K8Y
zZuwRs4rTMVd@JFG2(z?&EA0SjI|Hk;x^KSlw`5@GKK(+$9Mt6EUHg}T;e~-A1H;b$
zpk&#6L?PPa{{tlT9=*I1&oVIl7yWz^(jb%c=oQUB3(|bzzvw%tAWQe@{};fu7bq`-
z)0IN^%@^DM|Nq~8`oHM;lMD=J&Yal^>dC$=QUGxv>@;~0+r#=)u`aj(0OfrJkM3Wf
zwsJSKN9%zSCXl&@IXtZI7rh0Q9R?s<;vw}K2Ut01GzzT2`c$!a>w!{Xk8W;I+F<&B
z5#0T?zF+hbS?3vWoe0tE(QMl#2kOM!ERpc&<*k=vWO%`44eG3vaDW`12NE!~0(EFb
zt4@O`UhmTk3@_^b|Nq~5pft*(m-oIU1H+3hOOTwbJXndX!f6JE*L)sWJkV^b46?37
z-lLaS3S{<NE3jq!uEqz9PdfGnF#Q*0l4E25`6)&P#joJ95j1oo0Uomg5Arm>ad7Q^
z(0$9L`zJU&Ux>*wFidE+oyW__z{ub7hk=3NIBOS(!@$7c(xF<<%gE4ro4@ruD6YGC
z8)O+7UKs0x;_?G%n9snY^#Fg%e28Q;NKy<e`2!@W;M4sL<OU6&?iV1wg-7#y4$zRG
zf`|3LBAyrb^%xjDEZIw$UOxi~#CUY`zqk$(>%Q^gFo^DC|9{z|o0l78?mmzJsEFtN
zBE!h=V!a-yRq?r$)yMipiGok}XHa6$@PN<;a0|O34td?`(JRVx3KZhJZ%;BXyx8*>
zGyo&Y2@(1Q5?cB9|NjY~F<~x9!2FeAU~p}HQmS^GwT_1oG~~tL*z2Rh@#2XL1A}At
z`4>EY|NnRFKL1}-`8cTc)g7Z!0Gf9IRaFk~s_O6=P@mZN(#x!Wp!T<`@d3x)0LGUw
z|Nj364HdZbIx)WV2TPp+kFpz|bm>0y(iS8F$rCSj>ViW1gh%&{7q4tV%+oIxL1{h_
z2)_%;uY%H-K*_KB^ows65cx|Wx|g^9|Ns9ll0e3FvOfO_DlWl&K~Ts+rg}hQfS_s|
zRE8V;7mYr~z%XHlZxjPVnkDPAtN;I(CV3>YN?rp6o$0l!|Nnb1A8WJ#O{<o08{h7P
zG(}$f?c`<x>F|(17PV;J0c!8_l_RNCF}`g%12n?RKlLz7w*cHAk6zQFtN;J+2Q?zQ
z&%apb3`+K;ik7xK+>8vRtS@$&Ffi<t0Tt8jM$p3O#n#{d|G$XPhpBwT1y<P)QVE*G
zeGv;+*$q-DXU4!V;l%=ekorolozft~*na>2|6erXD5!R1t(0P9c+ubpX18)NGQ6m9
zfT{(ROD}Hy`v3n$rY%&66Quq4umAtM&%ZeH8<g8i*t<`>*a}i~!iIstp`}J8hktvB
zN`d1}&@`_Lzw0TV?gPe`KuwDDxBvfl{{RiMw%#rUX*>4!|Nj>^|Nj5~TB`d;^B!<B
zkD-*K`^1YKfB*kK^Wq#Rxpp6a&AJ0r4EyxXQ31uAXLq!OXLqrJXZK@plLXYiezD&P
z9M>8zg+R&bj7RqokIo1VkIoDUkIn)G(3lrW`QY1K$>H0r=-FLp;j8`pn<Gn_FQ_^7
z%BTA!f9oC4oWXyOPLC5loemc)?fBcYK`nvaIG%3jA3oL(_?wo4+K|qFK<wt(3=9m-
z)hrDBEufZVvo&LhWH&Q7b$N7O^<+N&|3d2l{ti&Ws4I4CtYt_p&V5j-;n8gSU4oH;
zp+wH3m-n3nBg2c8rl2q`;R9z8&+fDTMXyURGIV>hK!)$YhMj+L*@=O{v)j#~JD9~c
z*_Q!S<Y;(yyJ>hbUk8t?p9P61{1@#$%)s#CniB)V|KlFbhXt(dinCtY{r~^p_`vHl
z&+bYE<F}sL|1I^(LOgoo1iHPy_*g$IvV(Z9*v!NFXAzHw^^an9$8WAI3Z?qZ)(j<_
z-OL`=KT4Eei+gm3s8o0|AK%F6*~#Y8?fl1=`MBf%3;&OTZPF{+0PeK-^n#}&qYXT}
zvmHFUi#<HMA0rnTkopExR0@E{9~C^hZ@zfJ&%n@q;)S9UC@lC}rh}5(fj6L0+XDt3
z);CI7j1RmPez6WBk^mAZ2V3@^HIJQ<;k&a0s2x_C?9;1y2{d$*{KK=^<_|-u_D;|O
zg%@5z3=E!~EPp^FDiR*O&I%r#&H^5t%;2%uPG^-)XO7pBp4~iujytP>G#q#408t*D
z-U1$-+>PE6OoGq}r`Jrdx~RKG#R63MLS|cAPnH;f8f*&uyOJb$Ji2cc%XoC3dT~&M
zfuS*3;{Ut<|C^Il7(AMl89bVk1sFgY!R;ysu%>TL5)Pi-H%fRsnyUmDN?9HMGrU%7
zcH;P7!Ryh@)WPBLpNW6l!Pgx8`%b=irUM=)EoI?ke$Dis8ER7Nr8*x_S%*BA0~&Gk
z?EdN5{h|AoL)S}CN2~jqL)Y2=r(d-G|Np<){(lKe>+SmIkk&wVj*11Sh<5;)2+3cl
zbLHUHh2u8|kW(RsdUU@m;qh#)06Upc@U?mCr8?s-Uj~Rx|4+Y=1GSU?A8oe(Un>5>
zR)B$_*+Q#S5F)+N{>A@)|Npn%u0M;z0U-aNbkiH(TmX%!ce8%`%)kJh#Xi9Vo^0v9
z32ORgfZ9sEJ}MQS-4}ejUv|2vB)D`x=yXvDaq0fh>7oM4BN3f0DgiH2KL7vkYJADl
z`c|pqi^cp5492(7o7N!f6<%!TV_>kD1McjW@OyN(sC0m`J*4dp8V3K%&cNW<eE$D8
zX9)+NUfwz9|NrN2-34wloPHt13#yex%Re(PI9eYs(EtrfEBhoL@ag3(KL7u}XZH!m
z<_GeiQEuPt0};N=EhihC85v%4`E(!h>E#VL|Np<^HwTOQQcaL<IgoBi@WA+?=120N
z;abRu_>_YnUEiE68cG~rT<62>m)E?w{o>et{G}l~0|PivewA!@=+but&5ebqIJk6%
zsJJ+GU-Idk0v;N1w0gzg@`?>q{mxMVjhQ&^1`T9;{6Fq!{mG*fQk?VmoL~b@>O8QC
zC>QeJ-*?oBe_s#BhtCWQ%@6rsGdp&l@<=}9k$lplSLB2f|Gp_)0$&&y4*p{43{i>c
zKILeAiNB?ioq?hGB_n@J2M3g)4`aNBN!@}m7Qh(O*%%m_e=_p7+ORP&IPmW~+WaGh
zzrT)=fq}oJfeDm%9Qj*7y|U&X&ipMGK(YD5mA^%g5hUf#-=Yd;1efGC|A^pkc>?A|
zm54Y0NaSw;&3QEcNak+=)dMd*SU^RxD}!hAQ4UY*LnZni-4Ps~*0)O39Qk)W;pX4Z
zP%Jd_xQj{vsFv40bn(YaAr=M(P-q6c<N!}x$@+d|V0ihFnSsIa`w;^U22j@L-}Q#u
zvpbf-)%v?*_pzOzJ{!NwL69Ae-;W4zfV=@3T=%rT1vA=%-$j<^BPcpfzx)K6978p$
z`6vfeXNit0|90OW9=%gkz`gEX9~Bqh?!zypJAmWe(fUw{>~R;B2#|YU3p;kX{y6TU
z;sWAzv_N&t0n;yinHd;B)8rsIhlZmHj?HHrT&+KO^g`qvyFc^y>M}7fIPPO(U|@Ke
z4G#BI{vJ_gP$;L@op1h;$=~u39Qb+sEnC5ieEybMU`9bnYV(g`{+6%*{{L_OQOe(P
z1}t2`-+GmafnkR_XtpEx|A{mgOTiLOkLH6+j@E}t-+O4E_PF@-wW6o>El`MjdJhhf
z*IfTkxL635aCrPb2vYV@`*f#|ip$Gxu<Jk#CrAEWZ}@kBdZnQ9!f_`^%(dl7Wdcj!
zF&7md1IOOLPaQ5QzOREF!Hs8-oC`=3=WAQf?pkp4ztFLT1tEV+#UD_<J)%&;n$~Il
znyJ$q7N#$AKr!8X#sShs>JCxy0HqZEB6bkPQ_SVt4M|O}^}zA{?TA8&h~u{-4khfq
z{QF&hycT!m-|qV3wE$R*%{STg$7>eXZr2}RKCiF!p;`{l?>9hh;{ch+U&IBXc#4=^
zyAQZpf2!qh+y{!W*W8ZHPrkcae|F{f|LoFTqmlrc{^^~gvL95ue!n4oQu$P;kBWz5
z_c_P^=Nzq1)wB9qA1YBWzU0|`z%%)z$M=su-3NM|44Qvf)-gLWAMarH_<#EK1<-0A
zkP(ji|NsC0U;D7f|HB~rIXhicT=<(oqbi^z#@S$Pz~90RYFYh1{oh5!<ruTUOHkje
zl+U5zZ+fXC)RC4@2Rb(X11%-0({$|J7YovreEvlxXb!Zq1za3~y2b1s-8Z_wzh-mX
z2U6<U?aJWM%{$>212}RV`1k$wNd5*|^8_lbUIZwDN@X9F3YYHlpjyKKG9q}a(?>-E
zG>Z*V<k5ZErL#mu;r|84?mxx{8lQv4Qc7f9tUr`Wcy#mn{$gNw!2vcWM5V$5)ZI5e
z0Cv5U^^a09k8WONkcwvtAe&$+8mx6oLGkj212mc3efovJ6*$p=g2%-&L?wd1)f+UN
z3yN?<P{45%vx8Eg?rUzxZ$}tQ1V9{ZaG#;GM#bZ`pyRhAOeJ6?3a?*u*QkK1?-0<M
znhfm{6&LOAj^B>(lnVOv`lvYgbRX@$wo&25mGA%mg9ShhRUeS(^%o*P!0DBvMBMS)
z5f&5;1}_$W|Np<cM#aVWfTfE{KuM|fkGevS?$<8-+kF|p1qmq0^!9)o=#D!;x&8ln
zkLIIHFPv<^o&)7MqwXmXdFx9hYChdADj85G^r#$QVqkbN`8&8WcC`Lgx*Y8M*UDhZ
zvHN(Zi;BZ*Nw9LTV?DZ0zes^7?{-mfaI`*DBL#AGi3nT`$eVA!flUO}*Py|CQ0Xk}
z(S72DBNy0Fu$s)H8&X+ym#8>&hp5E(^zz<5{{KIuJ_FT&R<HP5Ret{e?_vQN*#|WN
zdLT`Jh2Y`4?qi^_SWqJbG&TS36=*7dj*0>^1A|B75m0Ld-tvu$J?zl%*R#aRq2X^v
ziMB(--<%R&hlao9rPDwemiu*ogMCgZ7pNBH-}Q#)b%SH`8G)DO|NsAYY(As#GVlNY
z|6QPR;tjuzS*b`vJ)=n}pGWg?CXi<Sm;V3%|F<y)iyOhkzwo~_2Z^Wfx9EfDO#T*i
z5S`E8A`hZV`CG(6bOnD4KZuUtZ(;xc|39dPiUF<QsBqxlb{517c=5vwwC>URScxL2
z6OaKK?sRbII{U)r>;L}_UHTsXk2_es<8NUC<<IUAPz1ZEfE7r81;@n8ng9O(cWC&l
zRVwM)T?)>YuGXLUd#C^V|KGLy`^)}+|NlGp@@xZD*e<;#9v5ELf@MCvEQM*5b%d6V
zj@E}jO*;PGsDI$VVflXJHGj8@N=PqH14w_bi^m0!f|phhtqLWM4h?^mOAH+v{%V&f
zIW+v$EfIET_-nx5DgiNp<0U_Y!Sa#~!eD&)7c>IGzv~VA%g-QI^BJa>ul_;;rvMZt
z5g;N2M0mJ%KXUE<4q^tp1b1zNSV74Qv@#4d4gwk`Qh*NEX0R|YI9O~^0ZkLVEdK@?
zHbL}R3j{nmD<ph66BMBHQjKpw>Ofgl;lJq0tqcqkc13`Ou6mPBfM!DOvw{{n-f%Vk
z?`eI!lmpZptp;VsPS&X$j0}$5XF7RHK*Qv$4BVgrr5nZ0t{v4Jp3U6<9gjJ4a=CU^
z^SE|YTR0wbw&Zd==4=HL32^PG_VH{!9O2Q;>W{3s=x{f$8V4gonu}$PN)msICpfBI
zR5CoRkMp;H=AnFgGgv&54Lq5@?q=X%V6c?n_mKdXR@SHadwW6iM7^ee*clnXegL^&
z9^!sa>*FPvo}DcJx>=91Gcq_bAL(S>!_LUy+1m|q_|0NR42L^5BwI9Kce!Ub%Rdj8
zpNo!mv*v@kg#V9QAFgS6&EGAXz|P3<n%$?@6eRB0{om30eqEhMv)%uaY>#HUe<i7o
z-&`3OOX5HjM=762H{X9zpDmCkyr)m{bI=;IgFjduo1e)0W<QDWWmY-n(aq-B$)e)e
z<;vjL;iAIf+3TYsuxkN71H+43S`eM=j{jX$cwU2J=_+V-;c-t;$N3nC_3xS{*Y4+@
z-Tyth?|Wq5j__cXy~@VO;L&XTAJikX{#U}*;LXwSy8f6mN26n}i^_jc72SOB>yB^#
z|NnQje$MZ5;=kyk&7k(q2M^Hd7cWqdx_We<_%AwnGsJpxk4|I$Z3mivFqMK#b9l|!
z{DZlarNNtn!=u+5>Q+6dTUq}*^Sl;lKJovxUV}G>gU4}Z(6SH5|3^GPqYD3-`FjFE
zL)pAyY@lU|3Y$S)u-DAZC;o$mYCuWWvpZVBv%6Tsv%A{Bw>#MaJ_G<75BC7AIchyw
zs`^3;lv<lXb7ttBuNU^9hWCm8ubI0YWjvaXSR4k8Q}eR^U;wYBX?*j5m4Tr-MWuiN
zlsig{FFEd*!oa}rg6BS{eglnG_O_@9fRbo$510l`iGdey2K*O2z6lgmb5uA$*7t^}
zICylQb~Qfm;%_}<OyAn0IYq^S0aVgCfQ(N7w-P|C2p`a*J7_xrWV}!JVUVPP@yQoE
z>lqkcD}bt;7ofG7oh?xFTU22D6(IL?L-?T9vp5R_XkMlS)FuP9PC#vp|DuAMKnoDN
zZ~PbizY)}Y@KN#jFZyO9Xket2r}cIzN3RFdiytPSNr-bB85nkfOaVvr4v_N3BcPB0
zk1c>YupEfB?x6m=fk*dCk8a+5-xwGiyKj1S|M2Mk^uj>`;%zCP?hsIi`81@1?$LeL
z2Q)YM|H5lk@C@^dW)o0(6N9cMMn&O8#y?Qa7Xu2)9M}@|<|78+aRi@U-m6bQNyM}J
zqD!v>hc#D;_WuK(%omz}=oWqIb$r|WL$I7}2QLEy!{Nq*E}*G>&<twxPd-O}w*!Yg
zW;k}c9Ar5RUIXx=9OBqgPLE#J=T8|JUbA>K9}oa90|1W)h9k+JhRKV7<soA&-8Wwt
zBdJ*qSJNr+LP`R(Kuxs&DI`Exe0l=}x=+8b235kHOrU`gP{3jdR|Vt$9^D_C&;ADu
zccy?QDZ9bTcQh<nqrNgQlqrCQ(od{sU~uW3|ALu;!NpqE=_@D>e)GHkwf<Xr0@U7t
z4!?9ChKz?aA5n-uj2O=p@aQa%@aU{ifDD>}Ed1or{nD}d%zx0LuI_7~g@>8oUOCum
zElbw>Ul<t5lt5PdqF8<W3)pH$e)m6))_+P5AX{Doiamr2K%-l@-S7=G-U4xhNB4D*
z0~8Q`*Y{}sU!rBn8VPa5x&NZa*MS0H9y9<P!LIo1$nXBe(fUj2J_4=)<$sjD8{lzW
z&={BTH*i9J<=A}ozfbo=aO%AZs$bGE9dqV0I7rU@7qvoh%oflPO*hCfUmdN#mhJ{Q
z2DZ}z92($ZG4KTaVbE-vIe6U82Q-1t`{O@oCB=WyhIQaPD*hrEGywz3z-jBiqnf|}
z{Qutx8>xf)qeKNV{%K(Rt=Et7MHUMK!-U>A=FS)u1#4LoVMd19OrPY(9^I@Q%!~|P
z%{C7hN&>vPc^-UolxQvyc(KVC)Rq2U!uJ1IXNihR^KX$FLyvCO+f0lMAXOgV)o63q
zf=W8xV-UfIFC71a)|kp}V`60RZdQ5B@c%H#y4U^S)hsWbgO=SM1EoF(P*=hOye=W;
zFf_fFsDRfZD0DkY7=QEVzNx}&!&GYj-BE%AG@NbLZK+);(E7hl_k|2-0dRM)fJ^uB
z?h`K_SurqJA1~$ac9v*4P|4r?;BTk1#B26uZwZCwbN@ZMy#<<+IT%3g=n@qRk4|oo
z^{|;f*gP$0{<HODDf<i1F09u&FS5Y%jU}w08cL3TSF!|Ou_&l#u;}Oi|J^5EEVgD~
z_<lqB0C=z#G=~eCA1wjx`>6p<u&1a<K-*W%Zwy?zKe`$}fkXkw{}YV=gZBhApZ{-d
zyH1difxov6)O1OH@6pX##|Vyz7Yrp?Ufm)uzBx%Wmn3wbf6;aQ|NjXd-K=pS`EH&U
z;3zV6Z2resD)Pb-RC-t+FHv>;f5fFTMMdScv}^0PQn7E25=<omFQg#Sj{Gj)J4;kF
zJi0|Cz@~`2>OTKs=XKD21dxNk9RNr)fd;QYW;^n`e1U`;WIK>gcZx~^IL_ih+kg&(
zRlj5cuZ=^*A!y)T0#b(f^s26T0BYA8|M%>^(_GELSgPugd<@)f`G3r#m#4v_mvz+#
zP$k53!lRS>1)mZqg_r1h^s;V#1e$j_Eb#xhhxLt`!{EVqNYr(M;<39%1(IW84tpdY
z_h3HY*{pJe!T7-I+wk-c+k*wFmlQmDWfdQQEYghv8QlHbqubo0^;?N_b3F%RiKs{S
zx&NXUR)G@pxfeB{6)Mf@3?9wL1w5?()?9(kaPxqD!1iBsIY?piVFAzvfyYosp^a{X
zM;=+%-3RS<IqA{ObHd}lssu<IWX!t+v_Gr{lukeej7RcK@VJRbvn@AxphEnGgd_t)
zub=FT7h<sKIk5+z8t}IV^M9XS-O&4>p@*8k3=AbK-N#;6?*#3Id~q1O3?5uM^S{vh
z`TzfM@HRo?1FxfYf+o#gq%klsOz><5=_}O-M*}ET&rkq`dZ{>w-2j@}`}_m0_1kL!
z&(4^?46ivsvPr+e>5#YVKB#rzv62CtuRt^BsF4y2$<vUKPrm8VYr6!rkA(TQN3+d+
zhEl;7ppm!M1E8jc;ERj*Kpx|{4+%(6t>p1v^~nm*ykU$Ac-?>jWO)*(Tr>i$J9B#A
z@%^KR_3>hr7ari1_vkG=(B{Y&vERY7Qn4QV>wiL$PwRgVewQDh1;zg#l!Jy@=KW$|
z=ndfT=|28nRBI);QZChPww?Bifq|h!613!ck32YRPJ6W8F4=UP8D#M5RUi%<gadLk
zC?SGcBG5d5obC)j+gZ9_dbFP8Z}|-xv~Rt{-vSy#1y!#%L5o`y9lID>4wOiN#<dtc
ztgrL8?E$Iljb!X#JjQJ0@&B-A_eI~<lO>Lh4VDZg)}R)$^*{dRX$%YuT}&ST4}r$U
z4mVgals@(BKKbH?1p`Bag?@=}gGEdUA4G9+E@Ug9N4Jkk0w@qAUkgEHg1Z>O`aS+1
zY_Mb~eF;*M0a9Yv#n^J7MB7HML<y=?;~29ZXeA#^s|32%UUx<h>tkgC$6Og0UTpaG
z|Nm~#BDB|n$CyF+Qu)PPkPxWh<$=~B@0574@$3Kpkamd!Qq2f$;6cL`T0b~+-}30b
z2x=@VIClSZ?EdiL$4yWIa#7K6;oo-Kv89Gtwp70L8z@t|fL5M$fXXu`{_QN0%Ev$@
zcI$x>R&aWNua@#rF=&Piw}7HE08}?ccr+hz0IhrJKGc2DaVKbpuSfR@SK|ZVa`Ma>
zm>_r|$;&8683^ikfc^F&613c>`G^I$@y_AV_y#nq<I&68`wo<GmM;Ufb7d>uGcbU<
z4H2OBRc{DrMVyaH#Ea|2prr4j65!EXqY}VS;t1MkXaU;)0oo-7?qe8$SPr1sCJm2X
zR*QEK4GKP>{av8(uLw}rBEk6Ni`HTWhSy4<J_FbRovbXNQR`mFER#p`0S=E&)`=kP
z-K?)bR3~fnTTmg`0v<r{=wyv~2U^o&^p=5v6V#bt)p^SRUd`dr&3f?$#M%sxZq~C<
zcENwqO-mUVI$7tuWnci;4=>h%7D}G{FFI){sQBgeUI_|;+NBH(&9-H4LCaFPAnMvQ
zKoT)a85nkftOEBq+(3F7kAU0`?w_Hy&%i}zZ={Sz_se~Z;I7YUpYCJEmtLe_1dR#Z
z_UNq@aP0MFbL8KC*rhX;#icWr!=*EpC++iUk6zm#(6%G(zg;ZykQ~tbj<NKUM{lnz
zBLl-OkRQ8PEISxI{vY&ceg%^01{ZT^#XNYf8L|GO0n{<;X5D_B0XBVD02cY!?a2Zf
z@Cx`ZdU^>1!)}oAptV1?puJ!RKr#g#O#csf{6A!Uxaez_i%Qrr7nK49(Dtsd*P8s>
z!Wmuow;gb?K2$E|sC~h+`+!%k4@&`P{mUkW7nK)4)7ZzEy4YI|lwR(3;{kUrK_h4d
zoh~W{-EJ%{-KRmTmO;bk1<VW#;DrFjCqc<a;l*rwa6i|9q1%n6JB+8(Ma2TFj*)?(
z6Xau%M$ph_flK#c<CC4BzF3M4b}dZkS{%U}P@uZ>Y(RaVIVvC*c=Y<o8eek!#>`m4
z)4(av)gl5q4gfUoz|2%4)WE3#5@BLs=x79m)NA%*V449G8UGJ?HXmjJ?K&yl|Joi@
z8~Dk(^g7LV>~&CR{vlb;(ZDIt>!k3S#}UNiYv5Gqb$Wni&i_Lm{|{PUE&}hm1;>!_
znHQ6;f_nCIR6ucvx)KCb{y>_hFYbco1-gH9gO_@?^19t;U?>sxXx;&u?qUFKgP8$Z
zWcoU9C#bXe;`<M9bvYj-1~SCJ!&;X69s@&(3#bN>`OwV#zf{blm-RSkD_}Qh>z?(A
z64n=gK7-0L)`y@CeVy%K&E2e*!8{iggAdINjG$u50AdGdY}*6eYxh=o(RLlA6WpHw
zuN{bo><e<}2JcY?tt>rr<^TU?)vND76JEdnm8u?RJ@yWgqyLLKECTPXwqPg;2Gs+w
zGV!%*^Y6c<LdRL>z*X`sVqkcErTO=tQW1}C7Zru$tPN1PZU>gvyWs^ZVi_uI6)Gqg
zU~}#s&2Jn$x>-9xdu5D|fRdvHXt=-=w3_60_YdpCrM#f-F6*EF|6fWlfl`m|-8-Pw
zlpfu$J-d%O?g5Q!SX%J6sDoxTn9q1Jzwu~3V9@-NwdiHz{}+EjQ<<Qh){XyPg4sV9
z7#R4spZ_l!zmS2!`Y?aXb8t-?q5|$c8$kt+fd&0!Ktn!^p#6rDXaE22tYhhn<8iS}
zQBmM;0}VBT3Sc#h7!|b=U5g0D5)J-s7W~^h7_EPni)x?u=nXNKb!0x%z{TRpe8p4y
zOzBsT<^xO?5~Y_tdfnu9{sV1d=iu;UJ_45O_G4*$xrCX4p+uwkB}<7+^Gn_m0Y~dI
zB`n>CUrX&^VPRl+ExZFXxBHrB2MY%S!)w+Zf-DRSoo+lXooO7enLFb+JbLQ{__rV4
z37Q~D`@H%kXw$Ey?7KG%4E(LzLDQTk{=WnrRpHT#<TLv-pw(zOxePwNvelryz|3zQ
zcY&%p-(Huu0-)6c77`_f7Lkl4I{e!N`L{VTT3;v!O_mtRI(9KTGGB4zU<8T!GM}-&
zQ1%8iQ)(eudLFb{#h3YxulAMF-JNwTjqgEz1G%(BrTINeiA3{z-Vz?rz<|_lh~IWY
z{I(n7x7}dB#qoIbh6#A~*1Tl_dy0QMJ7_i{4Kz%0hzS&KZ$XKp<`<}u2THCMpb3(*
z7eN_djtXd`3si%HJJg^R@9;4O<S}rM<~Ii2KOLLT{(r#&+D6>{;e`OG?cY5Ql<B(9
zzu5QZ|9_Y62iDFk{4M>A3=BIJK+{Pv??9H^F#hiW8kw#E*F4ieIy|~hIPL%|d1}SL
z&}r?_ec7@5%nJ_CuzvRo>*M^bDqzKZAjKb=8UL3`d31w0KE0}kt}-xqTAwN5d-3P}
z|No%zW7YLnK{YJcF&~<l8Naoi0G*b?-^$6z!0?Ur#4QE}M*db%hXGO)bbR^$e?qr2
zOD8MWYX*jHXO2!*RxpF7la&F)xDFa_^XX*`U;F=m^Dov~Nsr`H{M%i;1=1WlTRb{!
z85#Z`0x5a@s2i-b@fRoq)QWo~pXzdvlyT~4VN}q9D|!g(Ha7kTmC&_P9?9psS|mYr
zCrFinHY3CT;~@Fh_dL2;#cwh&d}wC)Un=O)&C7KY;!oBWBJcnI_vn=Uc>^TN%n0$s
z;ZOhnzt#rrS61`sRb6`pr1(w=XmjF=C-46Me-Zu$)HeY&BVV%`|99zr?+DuU4IUUQ
z0SztHs04uesi5|ofn)4p(3oAbEib6aT`IEkFK7|x$G`voA7}mk5mM}ddILu^ApI54
zL<*#!_vmia07unL(ClxeM=x(Nr~_ktuq4-`yBRbv3ldLkwqPiY@#yXb9ozzHHH$S{
zf_gXB-~`eQGU0`@9jHCk4O)_iq(Tx&#ZB<S({7NVFBp-;zrF<}vu4nKYmjB`Aj_OQ
zy1Okv4r_b~Dnwpf1gq)xU}Rv}4^H#i=U?oFh=Epxcxa!0u@1ro8S`QhgbiAN;nB;g
z0BQkQpD2-P-U&KU2ITTYYp`oU3SN|g6!%s~fR|W!^s**`+IW`kA4-Hgy7@tV;R5-V
z^@T4;U32{pP)*qF&w(Uk43;^r0NN5=x)*eu2c!{I0$JG>|5E5JXoBiPGb5u%cOxhO
zKptg*)NqZEKs`_b<3oZF!3X&Wp}yBK0x~`9(JKmWe^~~60PTbj@MygRGJ=WGqq*V-
zLkX`(cK`>H7<dyJW9dnc?naQWKQuRh!h#Vzj{xemfu?sIn@|4#;KIm>;z$=p4v%gm
zM?&}rM?&}rM}qjsjuZkl5>XxL!pMc;NU#{XBV8CfK(6%YJ_vFrWZc=K`xeMsj-c?j
z@#z-yvA$HI587JSed@)mfB*mcwq7cc_v}9PLKQS1)NBRXQ`5^j=Nf3{?m`Lci(lZ9
z4|HA(Y{M<Y+!rrF>8<+)tj!a2je(&=0^a7~dvOvhKLgYRdab<^)I)yp?>(sD)7uRa
z^XL|xew~5gMc98(a=rmka2J%$VXc-6=Rh)uy`~=jRgcbOU^ruZ(&NACZV>Ct8IS*}
zJ3%Z^e(vT?yAE1|^}mGozbHt)nK$G*1H*sNApFb!;3NfZmvcbIA0XQsdRYS(gG$pz
z&`RIqjxwOO!|_H?feK<BYXnV_I3H{L&d9*v?9t0=asjLuR8T|8C2g>mx|=~FpacpL
z6@B;rKg37eVENA7U@y1+2Tkj-&c6mSq!}#K4GxSK0-%-05FIx`xdWUbKw}=T{tej8
z|3!OdFferU)?H&@=>G9v^w<ngwgeCCc=UQO?gFg`c;Wa06l@^D660>(V31wi7ygSb
z0;@gUdZ0wi_|l6n|3E9Umx08Zy*d7OGQVbjG3Vv~|HijL!}e_;aY(-#IwT5>^Fl~u
zc|gW!1YYQ#1=$6SBJgMic;#|u40OyEG=SReX#q-mtS@X{f)smuKzMo(UIc`v0O5hh
z7+7BjL3jlaITi@70>b+S_Fgx*RBJt1!usMVL;w_j9=)v13mF(Zz|G~eFaH0B#76sD
zP_pap2E`F**31B8k}SBQ75C_6O*jV%MQAgd?Zwm=|Nl>bX!Lsni$)iS5wK`1(FP3y
zeg6IbzlXK$g)0mUB~l)}tm&Yw)z&{s_?qn*KzkX_zu5Z|WEME>GlA9+cb|S?26k=?
zw5UVm(-(>7|Nnn+<`sC2dxA$V?^<vaaZd+zn|rT72HictQ4HxAM?M1uCpexByLq!g
ztz}R=@0tc0nJSSpz62VX1MR2yFS>6UXwVcK&)^Y`*X%D&{{c6Un!&pjKx3oG!&3<!
z$v?YafyPoCJi9NvSbyUGf0y2PM#skApjy3L)C05z#-kfNg2KO@rSc_cvr6}OP>0pw
z;6Dxr{%z-8*oi`Wl&uF!<QzJ-fLE_LbnH>-WME)8)}qn{8o6-k^<sQ23=#$P<&U+1
zB^g}0PkDg1nun-Z_&^6Gx*bKpy;esSu(LqjPf%OC0MtEDc=6T%<mpl|3m26LQ0eZX
z5&+%jW_;ka6#sS?l>+6X4K*qe;9YQ_({3Q+I-oV<37*~AsO$T|YxxCWYxz4pU<Jl0
zkM3J9wmtm+zuQ~FBl*L(gH5I4FYY}CH9SE36u?spC;q=Q0X4%8I+XCfI0Tjh4|hE>
z{{QVDV~J#EHOIGu0{ktYPylTcY<~F9qm#MQTcX=pqO+Q#`N8|<6HJ}X5-Y(A%k^Iv
z?*sMX!HdyL_+F?&cnP3|=-l1sUStY`Cpo~)po^f{2WRlC2!9KxFVd~;(H$(Hoh{(e
z>%{2M$=vO%^8bYO`%Y($I!TxAquu9T>{A4lBd^1oPbzeJOT4rPt<L`UzeKtD-@g($
zkM46G-N!t7MGrg!EuMug{5=`r!OU~$HM>VIuf%Z%hHs7>3MJykm%7in^g1!U5Cv_L
zY5wt_zvVr6V%A%r%SFYYgYmW4UQlrgN+1T^=UlpvzHkOxZT*+O_2|F<|M|CpPM_%p
z<%;ec&}1&C%?2(0AZ0dq`oO0%M@0dAWSW6buW83c1_sa(BA(sHtT{@!K?kKA5NQ4_
zUi7i~w>W?E6;Q(*bmroV|Db`1AB_Ahpf>qVu+SSDaDw4&wzWJ4YA&}VGBPkU{s%Rh
z`CDdzYOY>ei3bb}j(bIzK|M@X?zx~s;=E_~)fX*hAiX7`=;M_yZr=y>n?!%!XJCMw
z<z;;G80$Mwm+QZ%@+6R^QbV6!))jNWBVL#8GcfG>4eB@;<1(-dY#{H7`wR>(W(hGc
zcz_PT_+eA#=F!VL86?;W66_UidIWZ(H`rhwi+he>PkLxye8B+O<bml{eei+>R*^ZN
zwZvCJrJ1J*$c0$E#R5{AeAu%aq|BH3fPc5kF^(5fxRhT7jobH%PMQr01px)nIVtB~
zbXYPlymsCB1++j@G=Cx}EPsF+X-436BRU?*w>_9|dv^QW<9M-A5agtgdmNDP1r0KJ
z_;ere098z^lR!Gbt$J{SK1T)8ppOHUqo6hb*yAtwtU<*kV~IF~`yaf!uT-|#*5?QV
z17oSkPEb6*Sn~J(fAD_G7qdVUr{E*KAoU!0Lv62@#EY-s$rbQEu{zLUJe{nUL38w-
ztVcjp>+Mq3UT2BdY@q!W;0^=m7!X)`h0o<69rO3`Mg1{wUBuh{l!4)e9cWc#_XCe^
z-VzX3A7n-M4NvPM{7s<trAPM<PwhWGz4;uT&3`%gn_3t^A#>(MJt&uTfAF+ES{$+q
zykW%pkO#lh1rO#69@ZC%1VMAq`yYTRa}VporBbh%jBk7NhADVhUn_D0$t?!?%KC7L
zrN_bl%pScmKR`<q=Y0e9x>!Fy0oifxML(F!?9uDZ@uC^bX1xHGx(71u#gU_+$_G56
z1f8?(t^tiqBcB8aijNoIasV_b`u)cL6QGvZVMzFZ+cO@$vd*BP++JIorMUKLB3eSA
zF(PPD+$$>$(I-NxzQgAj81{oEy+G$Pt@;Y`Gc$O9YV&)>(%0YtG|+kr@B$L(u4548
z(S2|yWYZo;2{UL1aI%Mu2lENz1C5rTy?UiQyC56%0wwsT9Qb_rj8C$ojjQoVpYBUO
z%m*F$w>yZq@^6n|^Xm0skZ^6iT_V>V$m3&usferFk%Re=kM)Hjen-%d@<9z(>(fP#
zKsG=c@gU1V=cP5j(eUX$=+n!)X)b63$4S^+w34s(LC@|BpgEonP~)uiKnZ`hgUZ1d
z^4~8sKVSq+Y(PRCa^B1fV^CancYyXEfLcK;|1Z8~c+mvf%Lq>Ypg8mB<-G{%5chlm
zg$}DGsD}%ZJOtX237MxvZY(Hxbbspp`63Lw;PSQyDE%JhZ|MS+q1_#zR+&#S>q_uW
z<%^b9CBmR3-_3^vJPtl!@nAj(O0O?LLU3*|i=|ZwvuF2ZPwUJ4EzY2WF1npKd_m)K
zW{jZO%^$3#ygr>#9FDyXe_n!iO?Wo{V1%qf6bD<n8oZFYb2EtQ_F`%N$-&?H0z8*4
zDtZ>wd=@^-z~IPy%D4NJi}l4?Ezg4wSv<O%K~8l94I>{E@a>FY{L#(({0sv_H|x_g
z3=GUCT&yqF+-kJyV_-PYy&H4}Ln+VkW)R&B+7(dNXf=U>;Q&mm5hRw>Xf+W@43v3a
z`!!lkMiOfUsk3Ud>O~R*om22yt<kC<Ner|S;I&Yr)g+J@7sOsr`>A^}$OYit0gnGK
zbb{UWnjIWC|1WrSf&=2^W6-wP1CW%BvDwO_lQ$65-S6ZD&wF(8219rucNiGJWokFC
z;~fTums380(n1Vqdb&gfb?bBYP4Lo%0^@Jp7n@%(@wb46p}>qqpwVQI2&l0R76Gl%
zYktMd-_j12Vkz-$e#KUz)BKCEB>u&eTcDN{Xb8tcu|x&=?5|Zf|NjTAGQ9{&4ZW(%
zL1U8LybEqKFo4&2cGjpAyaXQz(yKZfA~yv^t`8LZy{hF9xdLRl*QGD!fc)0|0o<tp
z*^&)TMH4{j!K3?>PcrN4Qw$82ku0DQ{euGV#CpiX`b5zS6mBsqNEwsyNuS<C4&QDa
zmDln<y{aE>fhsNDm$#6d`@;DnXhqBm&*s03rR>HBUVdX>VDN2yTgv6w>&yH?^YH)w
zXIlT4a2TI_aq_|c{}Y;jbCifR|K=_cZ2rws!s7$l1?bXUqEhhM(5HJJD5d*!f;R>(
z1F;#Je{+-yyL4{@C6D86AhHLP)L6k<K$4c-yr6yB-4{E3R1CUV8Bc-II4CoCB%ktN
zKIzfj2KIh)$_Wn0;GaP^?~RiT46iT0sQvK&KWNcu>;DpV<C8D6?*IS4AGCAV`hF>I
z_cV}Q-RB+uUwzHmecJK=RqOjDTp)L|HveWR74qo>yVd%BDZ5K2*mcGSKy7db&+cdo
z&+cLe_<~JG$T^B0oxC@1GB6zW=;VEfLN~v$_%F)V1wQbi(?vz$wUn(mD0gs!bHjhp
z!=0d|(6?PcGgFYWE<j5;&v<n5t^}C_sprAnQ{EXj85mw{1`Rs49w-q2Z>nfLP{I!B
zDKR0{>&<U8Jh~YhEx<c!wVNv>SV~p99TaR8SSL%Ch}tTGC_Y;y5XElG;4qW1l<h_P
zumAtgfXx6M%>`ad=+Vo&5!?=%-T_*j2rixxb(`^jOWU%$pe<Q1!e4_bSy>Oz6i+Yf
z?jF!WgxencE;kyi70NjqtQks-TmP46Hdrf_avC3K{m(z;K=%*+ZQL))9)f$3%%J@q
z{|~>uV53mZ>GA(?7jw&j($AoyM-Y`NsBXb5(+!$!KZ158m$JUN^a|{V+h-U+=ft+&
zE|mu5k&_Gz3^ukUO#hFAdYS(~qvX9Y%#2_gp7**lf?H6alM*+Br=EUzbh1XC0lEJ`
z$pMdU+1@h@3?TQXf^;8X2XSnB3m8kBJ(Aynry)UW`YJ$LJJ~_a#3ImoS5W)&#0xfU
z9L?0&E1;gzaSo5<V;;;m8mt*g7kPBcDuZn8KK)|<4Unv=FlbAcN3%M^an`T5;Um4E
zgN)JF7kG5@E<eq{@S+W(an@<jhB8LbguVy3e+b&^jkGorw6Y5{@$A!`qmtm;{n4}g
zhhuXpXg>duNB2#~<BZ_`PwS-;cArir&*mc>#&1FKCTM)1^{vA;CH^S~JpLc<e(~B8
zbhIsK1tWVGa|gS}|Kt4Ij6pKzUM##1j#OcE1s<Stc)yiMx4tc1>(KB|p@hw$;U8z|
zLXaVx$K3xjyaw%(GX4fS0vCMzScA1f32TEjXDKUa-Nr|-ILLRttxrlgJUeYvK+bdg
z&jyYN<CCvJ%Kjg0u#PGD26D1l%c)Y?)^8<z9=*<t4HinJtRCGrUUM5CFuv6K4U_~w
zTzvUj@c&7W{cOkBV?aAg{<|`?o-BP0N**Qtt=~#HY!ph|Z8%GuTQ8NE^Y1(H;s~hI
z(E7hby7fQ_Ul%Chf;|uND>NKlbAvJ^XlvJhR|b%{$N$4GBf(9c|0Qh4*cqVqycGEl
z8q|DJ!s^+qqQc<#pAA&?Auk^R9bpY><AD~df!CRK#(+-bE>TecHA)SdZNJ?Ftv_IW
zas4@{KWE!;71Waf%@`V=^yt2RjI{_fWA<M(paoQ}%Yw=ik51cJCqc>kHYj8nN|`}R
z>U&*OJV3n{2hd^=&}fVYsGxeW7u4BEE>Ust0By1a6$J7g)*p*wJd%A>JUp6z{x1&n
z=oR_sVSTa41GJZ$6_l>K!M!C5pI(*^pkWV)x!|?0(6g}9!IMd#o>8am{Syofj{i>^
zA8_fEJ%56M0lY*W6bkSqETCmci2WZKNa+|f`P$7p^(v_JeB#-C$Fa9Wg~`$SOsUa-
z(fwc#gZd{WJjYpcuR`+AYsLSfUz<Vgs`#s*ZdV1r%ehY8U=aH!BV<pqr}dpu(f^|L
zaQ)yaPZ(U!{!VkTR4x(nVE&ipVyRyG9maU))0v`T0U``Mw10bC{O{9!*!Yr5uRo*l
zNzige4Um+=e^Dinp~){Ct>2V5f=Z2Rmq6v!2T$uGC59j+5F<ePzy=tf?95To0LR3C
z(Pzz|O$tX!xj|EgbFY9J)?Yy7zv$6sP}ClKU2J`>gwxUb41cQ+D56A{g2h20z~5p8
z+OlM!P$J;*|A32yLg^1E{XzTi{{tS$A3$b$f*te2)A|T#;P>=@(U@iihL;TB)v(7v
z$4z#hcyUn<WY_8cq7Gogk3%C0)V1v{0WJQi0Uw9u;0QWiz0*g91Jp)$H9i3D`GHOh
zwgBntWPJ%5eQZ5Yq6}K%VE|d11R4Z9aoj}(bcQR#e^It(=y3w@I!6MO<P|)+S*5pv
zh6qzs3>ZB28!fu8J5w7pj(WU=$K(42k4{#WtqcsW%RobK2LDB$H-TInqhj!1^hy)B
z2KF?*{a-W!iM<7+q}NBq!lnBLSaNm~s4R?8vG6gz?Xd$Cn4oJge3Wl^>@bE}=VN`}
zhu`IfPp53(76t~-@0Wc#WqY<jtOBj2Q$X*Ook5%j<<a=&1`7j&ukit2&<d6m6$Q{?
zdm1mM`GI%Df#g8V*)wO(K+k&w2V`f6iUjB^9|6zf2SJtiYYs?vD{TToF{s@RZ3{QQ
zv1tDJuax)2tMj0iDrn5_bx`Zc3O#Gymdgwb#cJTyouU&!5z&1RboA@NAFQA=O+C6<
z4)O1E;oxX~;P6`M#p?5*x(I!7BFMNG2hKr<Wi6oRiNe-sywKVVO4lwb3ZT_&(6LwW
z>NQn{2H5%x9?-C<0c_1$^AYgzUXXJVVdfZLdhuWrxh6qE2SFl*Kj=ibn;t7c+nG!F
z(<XF*az)FflK2(urJp@_{0ARp`L7OfR+mS&fN%E+&{8uW=2ITuFL@eY^i;lF^1`D#
z;77})lE9X4CGH-O^Rp~lzLn@h*@~bewjjb>E#FFadi1(5{yz*N|AEQBVDb-`{0%05
zfytj>^2cG1ZeBysK9>U?%_kW>EP3}_U|`^%asV>Vo95E#qoNQR2Feo&#&5x^`#*u&
zh}Kt2g?+4#mhpL5pDkhP)HFWuatUZTi1pbL=4Q_So{c~L|NmcKrt;$A+5i7Bj^P7s
zg;99%><nlr<Li76=%!RqUUGO5vJun`h*5EHw9FRaZ#@fMiUQeR3?7<Fvp!hn<6-@^
zM99PXZyB#o_i<2`KKEkIs{j9AB%cK(L(mN(FCxzV|KH8vV37kE|3-{(gHB)vb-z5C
zk0gN3_yd{c>|y=4+~$P}$g!ZoX~ZU|P6>!(EzkV_4>pXy#RF8uf))@$lNEStX9t^y
z_1zM-<IJE|4OHQC@Q5#B<o)F}kN|Y}zH<$D{NJ(Ln*~(%T7axE0FCW~#<?896B@>s
zI%_~BGidj-s81aOgZ0r8F-wR({#JgFGpz5HOzLEQ-S=O#r504xRPncd2U&s{J~b=<
z|9|0p2D;c3(}NMG;T}u}nb3{o?l6!5V$J45P<;(rv)QaV6Lex1B&{H?3ApLe{PRJ1
z4Y)7r(R$K@-}R?QH*X|pTB-G9sltoo*Z=?Tlml%OGkggfa*PLOLSB<|pknbj=yHLB
zHK3vn+zr*SWYs>$z)->mY90rE{{O%AKnd^b)h~)pgCZO}os<q|dUPLqE%ZYB^Z)-Z
zg5ZMi(_&zA>acl4WOv{4=>F-^da{%Y)XV^#E%-VMbnYMfi%Dny|9>6h(fsQ{xwA(%
zZ~s|Xwb2Uhet=V<59naFrwBLaTe6m)Wnd@?0J(YYC$O8fJ(_<%C<D##zv%w-|No0k
zr(o{Kbl;1qr$EKhjsK!6s=>QgY)^r9ue`qcq6Q|>50Ov-OMtw+8#0y%_mcr=`SdN&
zL6xnSN(@1Z0No#WeE;leeV|zRg(=7w#Tw*+1;{%17v3j9h3;!xPyY2cK!ai&FJwU{
zU4wS1T?W<Shd~JfJU~z)=3)K2SP*pnXD<)C@g<+`!!HDvgWQd_eFaoi!TWRu&FBAv
zijmfnrOGeXo&5jbLoo)`8K6Or7e`L~|IdB=wHtUBht-R}pjBAir@Mc=;MW4BjMFcy
zkAt_FywCvkfGSy=&;Nfd?9uJ50dh0fi@T>mwMw!ELvykOLpQh?0jf2@O+9cp34rE4
z!2_rU9^E&a&;K_*0GhI$dZ6_{smcqnlc2Z(IRrB9j>t1Fv`_s1-+lbG+BZiDhZ45t
zL<xr15--**0S{!Kejy6llKBG^>)J~}>Ok!m572fHSQvmxRM7nnj$w}BI}D^57+&1V
zVqoyle&Er~x?~M}Nvwi21B3Bf<NvPRFMPTmc_iQL%u#W0Z9M>PD?SHpFl)V3s`sMr
z#Q*<_7BA9IfPxV%HbJg`QF|ORShR%=l(l|?j<M@y{d1au!SmohR>$V&@?PCMAACAX
zR04dn|3^4>mGE0QFnx2l@Xw*)9}~Fq#8}Gd*nRZ-g%yk?6CA&}@N+1X@ETw0J`JAY
znk5HXYWU*)cTfuFZ}|w`%gH+DGy{WIH_HddZ!YW{4g4*)K=V4sA!G2pAu16b-5ucR
z{$AFi)1bj55s)K1yLtHeryTw-x~>uwqx>yPm>3vZZ<la7w0z@lna%`S_}pE|z@S*8
z;^WzUr_)6x!nO4+e@i(NsL@rT60sMwoD`(EwHe%&4p9l{;&wIu*6@?dqgR&$bPQs5
z$W;bM{wc>Cn`^`a7)lfzyIjP5I($@O9l?iCb-1X+I5ww<2QYx<=3-uZf{uDR4fb1!
ziD&mw5ADOA%tt($e=zd*od?+gI=cm;6?DsnsTQah{?Ff129o=K__Yk|@UY9E`pxBq
z2uwjJNC9{SGAMZ&fQ}N60QF>IK&@35SPgL8MMZ-ZRI~m+45}s+{);+SFfeq#04<7!
zbQi$u-$6|$k6vDN&`E>cJO@FYEFZA@K_TkWee}QRopMNsI)P4={Ozdyhq*?@!7@k1
zhrb8Z)ddHfYwI`umh~XpK&3y(Sqcme9XTp79=*J0PJ(9Cd{lf~dR@PGbn_g98~<Ol
z0c!R$&=_WoiVtH=^?w%?hyTZ4r#dwJV+1E5rc!bK?aZ#m-_n|YaHWAx+5km@NAqDO
zBqe72+kI4AUSy~-Fr-<7&MIl03^MXKlWXg@63OnfX`MMLE-yS`(xnyukAp1gKJ2J{
z#L@aFe-q=s|NpyVRD66uS2KYoPFw%;x9(sDB_jToD$toXzghWPQ<)hUUYH*RWp8jB
z)92{_|D6&qZ~XcHzl#~H_5X3NZlAB9E#&+@UfnKV861zhu!9zgF@Q{ez4X7RNEzrd
zg4ff){DmI9tgBCe5<Cwm!SjO>{3+0RShqd9-++@NXnFyhRR4f(5eeo6jXOGc^lnj6
zU<Yq9J__+cv04}C4xghoT&3I{Vvhfhd4SMC&{^SZAZFvw|H2FmMHj&3C209MNV`k-
zF&FIv9=)s@CqSnfm4FTzDNzXkB?1qR-YH-!V7cqR=;cySLMSn125m6yZ2`-AXn*iX
zc2V*0us+7$1DbyBKDrB(lOT@bZ}R*9|Nl$K@(Y<#kiTCp0H5gakBPq(biW(eXG%;A
z3}9Wj{AS3%-IW1!Bnc=9l=7!_ia9nPWAXswgG``Bv1y%bU~c2je;{uj#qLeV<3xD#
zO$o@G{4HMp|NqD7)mwl6|3~vGXv+WPp}+tCgZ<<OS}?r>6cnJ`TVQ;t8x~P|D4yX-
zbLnIR`M{(35EBTeLAi~;R<JQJ6rBKNCJP1-X}|!=<ptU&K>54?l)poH85p_`?gXv9
zo~eDv_|nB6F5M?!kqgcBz9pa%?gJ>>H~jtoAGGfik@1tydGt=<0VM_3?qeRkyb7Qz
zaG=G2hl}<xP$BSN^j0w_L`t}sOH@2utiRRoea-P-)VCNEoi5hj`1?=%`TxKBuOryE
zj@o}5t^e{jv4J9f{U6Xc01v+hsI34_RggPV{)@IljRYNeV|@E%{~ypAs$WGQBVRUw
zj63~8;L!j7FY7@2?Rr@|j)JlXv`%m+;dX4WQIX<r0d2s0vEm>oJAzNz+<Wl<|7Hb-
zmmWX=|JVKts<?YpKy@K#-LmLXP}^dTN(bm5=EftS$`kou7tp#L*qjWgLkr%T460^5
zn%@|>c0T}J_mzCJ`S-t4nHOOP|Nl4s-)Zqe7i=}CBmfQMg3`0`f9w1FJqsBa7_4P?
zA7NnNZ-!is^4X{RGpN$^>9yT+gn^;?nY>5#w+QcUmhb%gd<;06A2OC|zxa3HKgiVU
z2S6SInF?B|fjoKhc0ag2ex2KW`o&jO28IbB1HQQ!a4?n#x^^G&?7rH48hk!b_m9`2
zFZ$u;yjTJ@x%vEm(Ahg`3=G}JUu%NpJ1t&hz?Gp}R|l~U)C$P}?bs>+HAUco2I|*?
z+GP@;-~ye*4+<%d<e$y||CI{A5Q3Wu3L4NTVCzZ#j&-1bv0Zc+6fmGEEzsCr_jiwj
z|5$x`RTm#-U}%0U4>~`?vzz4$|2`iHaKNa(IJzGmBF&%*3#mbMYab*?s=Cj=c%%Z_
zd)dwM<(rEH2V;qL_xTszDxmh>iT|SW3PEYOl<U9flmbvH15LfR-YyY+(YYT~guh6F
zThV+PbV90~D(LX+*UB$E;S!)csK9_^cO1lSQ20PL?Z(8%A<fALfYysbx&<mPnD&F3
zl&Fq}9w;Ne58P%h1FbE+?qPkZ_!FqeFaRwVYgh#7(^@z-S936wN;cG}crbYMI{z>6
z0F6&LKs%DJtvq^z|AX#`vi?=h&A*Mw>6?p$EKBKIkM7eR+NYWyGJ0s=1nUK@=<-p4
z=>wSrb3OQsc+l=U(7h9&ctt*U0@UX8Xnqsm3hK&(PL2fMMR3#C`fMqmCxp0Ks$hKJ
zwVkK+*%EP2>#Jo#AW2r24$apue65d`+PidUzWBQrOP?OR66uA|UQnMNG=UWWIe8>o
z!?U~C05pjOz6cD|*9T2`f`jHo#zJVgcz|XyPP<xWbCfFhbf5R>KK3F)kb%L)B1gre
zWFtx#E%s>s|G!kc3sfC~cbz#}9WBuVZ#{ecS`Ag02P9m=<^fvC@YK`#Zz-Egho;B>
zgPzt``CC~TK^EwNr2jLPM*8$7{`c(u;$!`|NQ!?OAE<R>@IoDQ29@<u(3y4TJgh$#
zKXdFpqJ3-yV~Lh)hmOjNFMIy~-vt_N=oElB6+GMoi<a&~FF%9&Ng(&ecr^cIEc5s1
zEz$nx(f!ZE`ZLHDeuymxkNyAe2(jfns5kYj`<V9e6^tbcE**Msb6r#%pbPkR1b`-9
zX8imA-=!l*`~T}ZE*;u0GWTHV*+b%_Za3)ItQ-{&{+2|Ldq4{bp(*ZV09fFlhxTEQ
z<{wNoksiH;nC?@=;XZAb4!sv2cB6&?e+vs}U;?xr66#)XD1iOJ-?9KSbbu_^4?1Sp
zArzD{p~ZB9M=xl>TW4&5M`vk-M`vw<M>lKVd{D3Gs7I%(giE)m%032$eW0s0jQ{&~
z-}LG96>#ZvWpL^K)EUa*(S6gUH}AiT_4QJJpI+9+as~$1?z7;1ijbQD!Nuc$(VSe+
zLctOq*Y2w>ow}FyGBCWB{x52m!@%IuEqZt_s1;w~!tZj;rBih4UQoX&R=}m(x4^~v
ze4VLd_eoDsoAa!Lg+&RMC-YJ3^Q9k~PyTo8KB#@rQTwQ)^}$*$mtGG>mrmb;*K97`
zCpujVT&%D0x5R)tD%RKeTY{Mw7+gWg5OflzOZQUHYR~TPF4oUW**&_MUAhxkzRv|^
z6yNT{j@@UZp(8;xDhkbyI2@U;{uf=6!@%H^{KLiiKYxo2sLQqc17r-D-*MmFyP$P?
zpsSVZqCtIrrw5+jzk?#U$j7_a$6mnG`fRzLN3SElhxNg7X3+F!^MemBqGBL@P|)R{
z9<BfRTb?p9FdSz;bB2N8wZIDr&_Z;`qzk)Cr-27(%Rflb0Z=yT_AT(~b`{tK8vJtX
zKH~xzx2jQ5_%He=8`QqFKFHq!I#RDYl%W%JXb)&uvD=r!6_nSH{};WV4Vqm6%@H_S
zf8cLX1e+Pk;K;x05m&KwcPnVT&e8e+e+xS!1B3Mk{{H`<<DY#wI$c2LG`Lnk%yI0#
z1Z^$#XEQLoyv+cb%lJ^200{z*@87^d5a`kCV+IZaEsP)tkA?<8jEaM&^^Fqw<IG_1
z3%`(j3)(4rzyq|H=RgT01P%+hbcZs$X7&UL-YCg~d&sf-68HoO&{X?>Q6^{zl-NT&
zVtffS>|o*2eGW8-3tDbqeXx`p9xShUVZH);#<Ba%e^LJ|@Fi!x-XB~n4NF;HFz*J<
z!}&vbUw8fg-+k=mSx|?v`@2u~a~JFHpcx!ym+k@)m(Eg-?!BPo)%w4b&7+&SyMo2B
z``n8R1yD+V0op$VT5T}_w2-8`wgME5pv_t~pbfXTeR_Qhx-WE}?~DPBLxQ%nwt@~)
z?Ec_keYoT#C_i+EGWc{KaO^$@SMpz!F$<J5Pq=jYvbb2EE@kij{Svfg#l`wGBx%+q
zd3K-l1dR|zdNdyt@M!!AN~+~19=(zL9@aO@xjf)$*`xXK2aoQ<FZM-(BIdCN=tOJK
zmQYn_#0b1-051suFZxEriZ2UjrzeZ??bpq|$p=9L#HU|WPXTRFi)Dejy4#lnv=l<a
zr~4SFnpF5N>XpgB(CNz3dZ3iW`2TA?NM!l+`m*?R9|lE9_jSkav!F#K3NPyA85p{2
zS$w)57#{!~LGJRy0~$9PFVc7Z|NmMMq8n-#NVjA6Ik4XUqK`5_YmAL=dsu%4ZPz;Y
z!gS~V|321_OL%>)|CDfm)*~wKgp3>cN_ZHbeW5rD)aH#1@aQg$@aV2h@aRodfVJPS
z+)-1|{Rz77Kfts5repVy7Ywuh|L<;50j>6T>4qE(3#xzvKmp(Y+Q{790zUa2w4NNa
z1s=3w26S&P$lcv7;1eTVx{r5X1JBm_|N8&Gp++SGx^O%JT9tt6`~uJJXaUdeVhQNM
z@Q~R9q_W)sRJI#<bjCV(be4K}bk+uVbhB=n2`k$<T)KIEc0d;e8Q=Ep{@~L6%cuKg
zZ#g3<A=&!$f{wZrU0VoBy2nAwU$>=$HmH_xblQsSU|@J{_FuFn4J66Sx&u~%pL6Nt
z{k|P^($hKq7Bx`GVttyw1+)Rr#riydD`-7kcWH+8=TdgiX{Fr-EZ<`*T)KTDe7lcH
zUxK9T=0_ahG{SuSzo<?+C~-e<v3?9GjU4xaO53^&j~&qRx8BG4L3yM%=-fG2$~J`+
zG+c01{2rhp_jwp7Sw8@6UpMfu{tY>Q7hdEp1#gV_0m^GUE}a^nBKI}3NB3{AO3)Q&
zzTHPaY5Tk{^MMz0CW4YT*xBG>xceM<P8eF-m8F5hNz|v?H^Bw8boe^>PKoj~P$Sx-
z7gUmHma@KBy$#fSdkHEnT)I;WJi33oSU)c100oRocY+9NIDvL-D#?I?`F|<sRQOQq
zV<jp+y<jJFUx0)hIM`kU$bg#fV2@n)0bSPUng9)9M^L6Z11{+Pi#|*RmvYv>LD}N`
z3ptQuj(K$Za)2^{%ye)jaPa6Z_3-Gf4e;nq6+q4eAe%Vg<K7AIJm3I1UhT!7Y2Z8n
zTEqp)1E3@h$^#CdJYWGz_}!36CQzCO<pEIT>(UK6fvx)**nKbb{(=)e`i==u%Nu?r
zM*?Vw7cm`(G#~5JebYnxB7f67$dXNtqQq|p*-OkoTOhc*Shzg@p8&UJza3;M;ZN&k
z;qq*L!2}&d_;!$`gcl;j0v=Xi0bK`p@Fi<$AcVnOBI41_!sP*$<na7|vh;&z^8<EY
z(558N&2XUm0J~VYz!rG^KT!(4E-noMVD}TIrKL@P-WRCAz)<W2GSH_xgo^`o5uHb;
z;{zYiHG$nOTpvK9Kfw0}I)3o!4E#}g#k2W={7cYIs5Hd<XW9gh#$TYN*hO1+fG+>$
zmtf)ImvG^7@Mt^;s?PtPD1GD6_!6XIhXZIeVmA*L$Yc&5{==L;po<56x_!6=Ktd8e
z{D(aSKw=UgF$IvAhDY;32axy!koXIbIK*N9Pk=-}fJA?kuJUYr0kXlf@dt?FZw5IM
za#P{XfB*l3LIBnOX%o^Wcru>=-_(c{K_354!r}-VK_1O7nUEq096=t<FInJ`1c?{c
z(f|kp6hX}|IY40w4md_c1hGRRhylq8BICz}>jx+#K6o_0RPg9@l<?^c6!7SF;o|V=
z7U2S0<H+IDDOh?H96iPV(fkXJpAY~4mqX&mqwysuTHw(HiJya@V1vew57a(T`2GNe
z?*~w*zW})b6bYU$Kw=L-VmCly7d)C@f@262eSrcXaj?rE5d?~6L45JE3)C|K?JIr2
z$iM(T;|(-n)a}Xff(<-T=q>Q#??zCO;4Sgu3xuKY;x&Y!@!}DLVesN6n8E$xBAE7e
zcyR*4@OZHw!U%Y=4Z?_cu@=Hec(DY+$apau!mxNT3Bo9N(FtKxyl4P3z`O2Vlt9>^
zV)I1?gbgY_Uc^Aypc&m40T4E*{CVL5VS~z`7ZwmUXqD&-9S9p#Prp!rut9SqFGL`0
z&>qYe91u2WJo&|+4WIz%z5$v@{QzNu_SU?30%3!ec)z#-VS_GPe{lxF{sB^d0Kx`s
zUwg3y!Ui25_hJQv4QjBxm;+%;fDU(<0AYjn8oy|Pu)*85D<Evp_T3jb5H@Jv^@{`u
z8+4@5ix3DKwE6ml2ZRk8OMhVlVna9Ffu`)75b@0EVa=<#fPtZe^@SKnRkt^Xhc&M}
zM1%z*BH&@oD+&?$v>r4r1KPR=n!p3!|A{cmQ^LcV_se{+VJATfyS)`Wta)ESM7Bdj
zG(4<%A3#KwLPQKata-0NL?%N-EIh1v&p<>PAtDYQ*1U%xBKZ&z4-aeJ9T1UNkO<U!
zkToX;KHVol9_0lM5^;daXC0Rg#usbWKnGON$EG?ZUL05rs**uNcF~7H=URa-asv%(
zlzsxuOtU(62)^F$*u~)a{{XmnZ#e)O(0B#fxzT#5l;5#K@P!}9bkM4X*9(jfyxt1C
zL(Raq`-X4p$x=Shgf}0^Fwn@4y+`ZG5^<38gg}z4E*+e&U%(y8yau;J#gQE9(|ysW
z`;cez&;O+oj$O>2{|`HMFnRtz)N-Ii2Xt>~>8sZ&XyQB|@e(%hRmM+1Rx`VHaQU_#
z;BQR>-Jl9Girb~bMex64uS3A=8OInIUX-qej(NPy1+7Abo>2(i%Ze7j-XN8rxlk+t
z9KQ+?z&_n4Az|s*!RYz_AUrT%fr5vxL+}L?$RKc7ZZ$se`V>-44`CweKgd;lpgLX}
zasi*!q0%r9u$keoyZ4?=KrH`3yN2&H(lvbh5!dheFkb@QzX!gT&lr3G-|^S{u*>(1
z4;%*7;>6#<*A3cL1HHKqi~GT~pc2RnB54!47_C^iN_9Y^Xa7%pJIG%84qCO9%KL)0
z*g)iYAo8UjLAU!!9{^nmIKlJaOQsTYk8VZ}YZk83Xpe434i9S=E{;+kk8Vc+5L2Mk
z)}z}|0>qRk)dMv+Ky8?_pn3~xNy%)Oerd4Z|DP;<2WsNHZU%ATxSL1Nga3pF|49$)
zgAm)n^Zei`eg%(YP-h5q%ce#5=@&mhH^P8=zk)AxS0cuxPyBx!-VNSm>!M-<x|RTR
zbaO&90|Tg=1X3>iUsN&*GzeY7*?r=L(aQh-U!Mex&vqa7=oMWKn!JZzat^({yCH>x
z<F7|I=(H$|HRh1>us{RvxaTQkU#wdJou_DBf$YwgpwW29M8#6jc)YC88qj$BOz`wA
z(nN*u8tfAlIxj+3fF~;S5XOQIB0(A%cL6Qr03GdF*nRqiH!sReg%EtE0(54ANB57{
zVlSR7hdJ=Y&*dPqJs@)xpeZGf?&GhuUOWN|zt{~|2=1RCS$T08s31S_AJnSGI$HtR
zr|_SZ0lfY6CgfVF&mf0_Zju5m3u^Y3;DBBq^;)>uTY?32&(v{e70`eo_`0cXX93Vj
zrylT=V4;1792Ei31PFBDx`Si)3!m;+KHVQ*%mEGU-}dPK;bAGeWhLmOAW-$|(aZZk
z2ecxgGXm7T0j*QwZ|MOI!t{z>%K-_U_%E6o4q60#fWM^}B+-51g$HQEa<Ax8u!3_Q
zovg{=bKY!0>bg(7(1b|m!KHn`(sEE~E{L=~T-p>Y{U6ki>^|}0^<L0``VEgxR$a&;
zjU|d6y`nF(L5?~1U-Sl4*^#}Vy-Tc&D?uZB9^I@zRxp6?g=Brd0yNSo`vG*Or1kNV
zWFPDMC2^p=kjp?ix_PgIB)UJmm=3n*fk*4N5_`~Y1grnoK$I@%(hg87$Ps*S189QN
z05sO6;Mg1Z6?Ep$|0|#+>)%{dEEr4K_;<Y(eQoE_&6^1_)%tvi(F=Q!HLV9qH2z=k
z0H50o+H}nu2$dIlArF-YZSRIC>E=~l!NBl>4Jskv(tXyq`=}@A5a!eWFMv1uL9R^9
zQGr~U7za7&2z1_!MeE55h3213b-c|#nM=jGStVvOFuXSGW)+ytz|hId1>z~c;0Mh(
zqRm%9r+ieFfM>11r=r8oQdfI%ZwV*~W1S=Vyci^P;{R(Q$brS~%OM9AvxA}+w4(0J
z8Snw$FQ0XR&U^7_e6xZTbb?XebOr{-5-!Nur2h{7|No*Cv}g)+?fXtpwf3Uu<p2NQ
zSktF7Fff(GgJJ=cK>v%ThcbYVWj6qw(FJaXmNtT#j4di4b3yBZT~r)E)6oW?CDEb`
z4B(>@6+m;(AOk@CUXA~vj8Ib){)@f~VPJr4A)e6-a^V^5Yv!R@D8L8W4fi<V+WpYC
z`^Ag0cF<OYw<RpTouv%Et=~$uUaSX)3D)2`vIyMc_F#AkI$8yEYbK9l^B<;~(~ix5
zRO*j9cIo+ayQml#|M%>TV{~lZ0XiXou}%t{?m#zYfcM<IFxm&o6fP<TuZ27z*8qd$
z__wooG(X^IJy62o(53D1|M2U5-H_WLK-W@~vNoS%dd&v9r=pY%BJbMzguf#gv>u@O
z4<kSL)&-C=`1?Tz<h!;$Db)boWKqK5xCgYE_O(TWbwvqpgLMQ*1hgCMwVLA|(2Yi~
zL4FV@l>n(O6#}VZZLp3g<#6cAX7p%2%;eiW0n}(VzSMl;zvK5WF5M?U&UNMA&f?|x
z?Ep&&rvv}Kv&}CJUQ0QCKLA>8TB6hIIv*rxBU#Se{8FL$;7Ld8GsR-f=Qtd#e-<f~
zvRI!glW9K30@_U{<?;Wt!?$A`rINm_Z$0^4?-~Dp9qGuw{txp{h&NwP+zVQ|>+tOu
zOR22Gw_}W@R^7*%A25}0G=c`*8_GFa50t7~|1DE~@pU1nxCga{K<Y}s%kOv{x{j$Z
zeY+w3|NDLBzrL++OISQRV;LO29b+nC`hFkF>}B`y*K%NWpd{g7QKRAkn%zW9cR}{U
zp-m@NgD)}w=Vj13&gM53#s^%xPxy3$E+kR#=)P#lYCWF;bmmAeZ_oq=hSyBSCtn1D
zCZ9mL3|!uW)-)@Cj`cYI;tlBRNzio-ksjTwkC!kofHPt9f5uWyhn5|n?pP_8_0Lk-
zZw?8JCE_pkvNAx9>;&DGx&fru`f!O{_xTq~Kx|Nh!9Ez&LI6!uzYPS9uz{wjyU)J>
zExPyVzVFd}9(2>3BWRYqSG0HusC4Ez<(qvw!s(ccBnLz5?Gm2u(=V<q0GBSXG7Ng|
z49M*gpm8n*c)I~IV-H=`(69j7S_oeNiXG7U1JKkxXnPu@u>d*`*IM@JVo+lNv}M+#
z`?F8?W6y(sSbchRpDjjeEVw*nKw8$Iz5rCCzhHnHi(Yk$&4;)*vHSE3IaY9E!R09f
zWL*Py_vsgHptV^)Uh}=!J0I>c@KT1Etk9(lN9KdAm<yLjw_@`=uoa-jK>}zg1L#(C
z18{*3IloZ>v{KZg`(}yKH%AGM5*d$fPk|TL7XJU=m@M)AH)wtyROxp*3v@bjctCn)
z9?fq+=d$X8wu~5q&sGd*wpE(Mz`&5!>7(LMlIGFP`vP>x0%)TH&x?!PpxENQ1`+ws
z-?9_b-U3$-pp`K$pc!2U$dbSRq5*-RWWe7FI@+Y!_UuFk1}6SiQ2qE{^r}B-;IyK&
zwpn#6=+@HzqSAqo{U#O+piYVb185153uwQTi;4rrYCzCP{C`o40I*{`p^hmr0O?d<
zfIGy)rTf5t(Om%`SCj~+f#zLb3m#{6oCw{g^mYem%L!<DJpi<}W+$j_Xg-nwThEQW
zr#%3)WZ(n%mVuid)>lh}e5{X_@H$v%mCA#*05GS4_5eWRB}WC`atnw*3>sxM@a(?$
zqN)*84#%h%fL8XGs)E<c^KWBM>tqJ4mq*L>kiDks__y(cLe$^|<GKI;t&j4z%mD>A
z=mb!g?oLo~@7Vm4vChEJ`eTiDw<k;YQ4j08{8JD3bRXXZO8MZyT*xe3i9aZ;d{hjq
zkCqB~BsYRIdsu%c(r~cIXDm_b1`B{4!rx*7p20>euz0Bq+WpTq7nE#4)BRv&sHGGr
zkNpKD@S~8pg1E!6HxP7YHrN@UnhKP86}mlG{);~K11;z0Z)N=d|NrYHXF&HipM2Q@
zzBw1t69XwlUb_L>O6k#ktMz0>rZunn0tSZSM33a39=*E83qT(G-uzr1v;fB=`+tN7
zXu+aKvkm+IQrl+RtOn2tAL^|qOC*|KGM4Z(|70wc1fM(dnrG)%koBxPLD$#(7hMV3
z8U)tcDZ_4j;I-Hb;W;2LgF^C!#vJgXtY%2l+yJyW6naet<Ww4jd%*>3>&c2@Yu@_#
z3=GBD9-xEGb-O`R_}#xjh2Fvctf1vV9^Ec~86b;%+&!9YB>tB;G~4d32RT<0#kta0
zoNIjPzvvHNkk?)QGI%ueF#iX;IB_=I#bvXxxESnMP+JX@okd>+LDam^f@^yn+j_FX
z(3<ziJO+khO^@V@9=*I5=7H=%zU$MYo8{m)7Xc2&5;l)+7J=6~FF2qkJ(vY*;-#n{
zFEKjK01m>hGeJ@(K*z6HAnp@EJ7*KrO+}Q)Ve{aNsl2;Oo<er_H`f^RFq9hi`g6Y6
zw-B@y9?X~Y==Cv%ULW-S;D6B7M3<C*{dY0ufixQ@FZlnz^?!+gcel?|P@_;%;J@f{
zFHp$~%C-ie;?%+ebXx%ER7lWrbp=Pz<RT;l&VhSd=po?I>mwlG@n1E=3v_%N_{?dH
zdmS7+LHD9`zi~DG2D;ds=Y=xJ9S2G|9J`Oa1f7VtlN&S~`E|kn|BxFWR6KfF<L5Fk
zH2-(t@0|^rmQMcf)h+YGqxCj_3uw3!l+p~mx><feu9ot!zQNxN+9vePnS+tP6?E!B
zb2Se`sWrsgb3g`z1r!k1E1f?8TB}~l?b2Jo=mMImf6e^g85&O6^FeDrzm<ZO{}*lX
zWMBZ9T*3p={$I4llY!y22iQ}s-%9O|Idd@jbSnGwvaX)Pz~HSd^TT7u;%>cNFBWy{
zd3=BE)BVcx;9nNdy77ZA?0uMDbRR$XfYpWhg$wB5rq_}lp!>Z*$47$<^yp<xo5R5H
zQsF=7GO0KGt#iS*Q+3v;fWicHmeEVlmLl-2UA<l>USxvO6KLuR)b}d!NWSjV%c=@G
zzNnMsLNhDV90mpj&u*Rz9*qY<w|9A1A1szS=D@+=)2VRGfs?B_frr7P`9OpR$b{F|
z4nAiE_5MAQ&wF$q^ni|GWS@-i>}EM|%!Px4vHScBkH4T`bL4mV<I?>eq#6=;mh(VY
z)E@;UqXbY2$^fMx&?-ad1@+**mPa@1$!gF<FSw4?0JYH-9Ki?H?qU&OU^wQYqQ>xF
z^qnWDt||rJC&C4)ITT*Z1}$#s1}z#fKJ!AX8kB`Vmryx`2E#h*j-VUmLDec~b{TX~
zast>Q&}tzApYE-op>@}8MbOn6H$1w(ch)k1R}6K(a_Ro*(HYBOeTu(D7-UIrsKkHK
z5D(D0ApRE60dCE;5{&$<;H96vp%RXu8^KMX(xAB#kaTI)aaT~HWN>W$^S>m)vHMT!
zfBwFepjs;VJbbpd-oyF?e>-R`yGO4NCw#?24z79O^PuBrv>(8iJJ>*%JNSV%l`J~`
z|9@`<<Lhaz-DiBd4})iW9lOsXt-0y&0Ie_pjh*KI2Q_+LnuA90!$8}8AiZk7;|!o#
zYtU`spr$EkMa4~@WbjV9)1b*@|6)*8?aJZWeFoL|7|@a)O%Kp&o&S!Ybt0g4rLXn(
z66@|(P&*m4#K8hY7=Y?L7tr#a!^W4u>n6av*xKAdYjTc5Zff`J{`L~oG;*=5Whm7F
z>4IoQ(gt2h1d;)*&u|C%%F+6GNw`Pyb?^?k7irT#-PsSITh^RF$}kLogo+Eu*<292
zA!lVDoDN#k{2kmG`wuF_eFZuhL5nyVEkPku%KBpdbdb@Y`DX*r{PUa&(2|=}57?Y@
zd|WiBcsv8zf$hZgvhwr)|7Uza7f>81v2o?!#^w3{kYlgoe$d(KERM|w75KMtdHg>F
z6=7~Zr~n@C=5hs{*yv(?vgEXj_DRR?gNKa|97gX`gDTVj*xt*RpfT|l&?04zUXL4~
zc9jyyWvy>ZZC|8J0p$+#x(7T!P&pael}2s0>;U!k!1Mi}v7CJ#ji5DT_2pYZ1C|EO
z6(S6!%08e4*w;WC$z}h;%!mTD86BW2KVJLrZv(B%2vIS3!NknKzz<zL*?q&~|Irs8
zKsoFGG0+;!5{}l}B`nrAO3rKFz}69j9I4tJ1KQ$^+J*$3$pPAHY?}&dE0=<fZY@=R
zQ92o?ce^J2{}1-tYgy1-#uey>)bi6WBL4mV|C+<q_~eUepczI`cMx<2i3h0ZYyi5*
zPJ_V_v|)t7qnEcJ5|q$Sf-Vtv0PTua_%GV)3aaW@ueE_1>qk5wccFQ7^Bx5Y{QM8P
zC-CRL61M-M)*zMLyh|`7lt2=o<D(#B)1bZ_<SgZ8+cMA?jYqeveFvz)@v$Tqw2Vp4
z!&26+gMpzW{)ILRxOfcn=$4fMDQUf3;suI0SJ0-suEU@N`vZChkI{=N5a0TEnS@6-
zcY}?kZ7Dw_Dqq|M?T0x4nkPEU@%n;CH?v2tiv{FhEbtID_=*~ELkSe_kh4%qKnERx
z?%@dm^)@|0i#R}=C3k|hH@~o$397sgfEEpc_s*%kxHa)VWZQ421Snt?kk?zkoACet
z%Wa?%5_EMCC`mw1i);PH57w^yVm2P_>nHsG|GEm~;k}>;1n)vD1ugYT0}WKR9{T?u
zTx9w5sxX0;QfcIY#yUY~rj&}jaGnTi9fG%uT1@=^zgq%ySkN)g?kgaz`<{YoH!R2f
ziT3~h4=N&=eL9tmZ$rH7IvqS~1UV-KbT%XOv^N9Lp#-44yx=G;05{QnR03Yqmi+$@
zIRd;m33TU3K=Uq84}`H!0#p+QfSufZ{zcnrP#lJ+1ia?+=xzdy1MzQXsc3${2swzS
z2{eVuzm3J>C1`FJz6#4lB>}qDw)^<YhoF!J?cZvKj)$3bzX$c90uKHKokM!|#Wrx`
zr$pYNV-5KDchF&@jSS!;NI^$!G3){jl)qMZAvOUTl*bvsot}<8VCBbJR6wd3Kt({n
zaTgVkBN=>pd%%+2jx3HlK=mPLx&$<g2$}~6jV*%Cm;|*nG(g9ucL$1q>h^#a&No3p
z&fj7LI%o3-BmXwYbt)yi{M&j|Kw16Z0}k$kaDV!!z*d`ibVIg5do&*@h)1-gA?J30
z%F6_g?vJ3}Dx{3`?0)IledEQCB5*{ON?OD~c7-GMI2#{$3EueD`mNOJg$yXd!F_tf
z%mj4E*RT&<20|7AA+$rvngWm3|0M@K8h?XI)$$#n5b|iQ<X|Wj_US$gTI>nBn(y3;
zgKXeoW=EFpKps#yfS2Hb8i79D=Nxx13V=$O8Wjytzx4$t8z{$@^fVv%*MRf1R?wom
zY@`!gU5!t^d;!WFpks$Yi4lCLg##!j1~7PZ%YFb2c62j)fOZps+skMFgXCZ%56vkm
z8sI?)1qK(8yAOcw&iyZX%ASG2Bl!nN6DVpty3d1C?Tbf!pd1F;jnsOeqzc&}AJ9tX
zvmo6_)o`;t*hlUlp9dIUdT|=;!%9(5Xa#t*o-E;hp)vtdum>=J4<dxPv=wx;4P=*e
z1gQ53+N<FJihEG@`qU5F$o2ZsnKP*ELeSt&Z;pzAM>nf?A*l5UY7}aCbngYNy>RKi
z)EUaqEqZnW1B2skP^t&5IsEC;>B{2M{n4Ydmcz9-`M>pL@IrD6PtZd0Ga%1^7uJDJ
z(*V^6_TYteT#nsWTzg|w7+*{N7yW6=z|bvP4mY*=M};H5%Vp4F;ZD(n2@DJ_-Myf7
zATHLY>mtEx$&Wi~pJ_h#-$J5<)06p#_36_0-RHWGX&-c9KH<^{QQO@LYR9@*9|kQy
zKjG00(t=R`38wylOD9<2Ymw%2|6Q!l)gCiG@Ny~mqRV47UmQUv2(D*hU;xp}nLur^
zE2Z~by4Ql*ZZ6iZL2DrST)Hzs>vl^xU91oDx2|RYEmS`N>aQJs8N&?X9H|3$-u%Iw
zGj&|x>hh%n=&J4BPyui=na>s+EX_zhHEOOEU@E$75i91=>nc`q$|8cX<fvm8zZFLj
ztCa_183*L%kJnGZ+i+ikwh>#-1^Ky78?3VjrnA{1f|0+a>i_@$2+gOVnjiT>M}8c;
z&myfzF1H0O+Wg>R{h7bz&A<QuJ$FDCYx38nKvsu)LRW`}dV^Mn!xnBL7RiH7wF9l#
zG}VQ!*ep>o@BkS%_uv2j$JwB(#6N?k=OC-2`C(1$V*;Q>o1ejo3qYGTAd&CeecZA8
zievX#aQ_q32vGPhdfo;UZ2T=>KzB=b_kw)ygVjUJKz9TsLsp?4XJBBcONV*m3wV)x
z1j_nTLl5X$fAsaI={iu~)PQ{RyQChv_EZ=$57`Y~vI+Oeaj;K7%TG(fTwtzq<p7rg
zV2`ALR*8dG{j-5RQX<zK%F^x2;0jvmehi##z$3c<MZ;`B!{VTYr||Z+eh;XD?e_sL
zAlCz`V!<_?NB3`^?$<8XmrJ=lyV+d214LXpLm6DUmqOC*V^F$f18tgc>^}9P?;~g>
z><8;({4ETi3&X9Cl%)Fff^(5?_wnuvpzFBd>)E${1XZ{ofAY6n`UC0p`1FE9-m&`{
ziqbB~0fnFwWO+fy1J`x`|Nn9xSkHf-?gOt`e7apZpxG1>#}MCxdP3mR!WVRVUWhep
zk*fg65X){*KjiES!|wn8L03rnYJfT$`Z=JmNVP!gY=A~Su&!~1uJe}20r`B63aD^{
zuG<EcvWPXVpoOjACML*D-H^)Gr~5QwarZvR;%-RwhJ0oU=pyIt67U=<WQ{ADTVU0#
zkBWn5_eD@;+ntTCvONT9rL=x4wSBR^9a7jMw-KS0?U6Rzl`VL+BB;LI2di(vofe1g
z0D;y^rJ|rQa0f({y9#t!ie0w@2RJ-@y3c{yC!i`9y}q6K57Z(l6?h@h4r(fb`c5w^
zL9G+4^)G1118wauC|o2uLsSGpk%lKgn@^43c7qlZICkF!ZM9Q*vAqqnqXc#}J$S1Y
z)Z1rU|Nnpa3cMy((bxJZf6HYC28La>(6f#=vw->rKR}JC0#DG8_*Rfg>j(TTYe1!j
zMFyisx9PuXP;K?sk$=i@4{OsO)eH=!1s>h+9J`NtT7Ly)qOY$*J(`bk{6FAhsaN{-
z{{iq+Dd>1Y5m0o14*CF{rd%q&6FhPmp7S4kvc`!QXF=V$PS6cQ93IU_IXt>u89c3z
zmOk<6)CUdy6m)~;**i_^szKM$e1%MXI9k6gvGlRjt*mBXC^2}E_8qd_E$hXWR#+H=
zhn3;C5g8!Tee7XZ>%S$S<>mLm=UBerXalu2SY^Q$94$HK)2ZQOsVfKap(I4bvsSPQ
zZm5bSKAjpK-KKA<K*9FT)B0=4B#&-BP^b2vqxKP><QJeehrLJlMew?TGcWdk1E&Bf
zk8XCyh8k7|TmBZ%9#=<;7*+=Umg%5$+kBh@a<dEQx@gl$Ad|KKfsT&;e&5yjEokF(
z59oAJAIn?@{uWT1+9Ub9N4L*ch8JG#prO6LC22mEIbRt{WIcL)zH)eUGlFh&Kgi+H
z>GGAq<Nq<RWa$f!<m<45!T!s8SYP0829F?h^D0z<&ffz~D!(Xf`~Tn5`e;eb>tc^?
zQ+9+?UKWAQRO?Ln%HZ3n_d3=Ubg(?AVeV-Cx0dPq{a$w_>*M@Apcx0B<O2w6e5?=f
zH|PEP{~wYdy3f7fhuFa10_r(?B%k-`R5{_(nR9}}w^PrflXXfZ1A~iYj!Ff83urbG
z)a7E_3hg*}fG$Ws+yX9PL5|D;$v)ol|G#hd5zr)PZvfK^j~kHGAcAOWgY&|R`JmY-
zP=oorr}h;O<`9(vmkuqD|A$<y|9bMfUi~jBWd>@$94+N*KK=hiW-}-$f%+++QuT2w
zB$&BD7G7)p|KGP$ulw-JnSVir?U@%xAR;f9fhL6E{aaAC0dx)wC_T8nu-O7~_6N`{
zA}?gNgV^8$2X#Gq!x+Kk%83`f*Fh--ONa4E14#XG*vu{TJaEV*ouKjoQHBS2bl>d$
z1uB%l8->Huz+3yR@0Gf|nBIh3K7bnt(DGqzBj~8663mHmP;msG7X?kdfmX6v7IBoy
zgTnFj3(%mYg9S+ARZwdiK7ezae;aq2^|=yb{%xRH4Ox~FS<o4p7RDtr__s0hZ$EkP
zAqV#f>z}2(psmKQ_wa8&X#JxEbPDF{qhL0FYtDbHZu00p{1UW&6Ewed0DR2fYj&$c
zCA=R04}$JZE&XhDsFcM6GVJwVHNuF2;lJu4FuBACG{W)*bW=*H+KVnwV!+-bn-2<X
z&>}T?(DK-;py8ei9^Fi!G4T@(77QhaU5yXCXaZde02%86mCc~3^I+5hI>K=e=z0;4
z<b#ggH$Y7llg=0w3rFiCrIIgn8liLQ%#EN_1}YL?%7f1B_z%iM@7Wj_tXZeDfF{%*
zgHGk?{@~O7!Kas3(((U)&}jk9&*Z(kdp<TeGctgV3+Qq&<XFMT-?E*JfdSH0EE9im
zvH?8xy{G|X0l3y##m2zU{oeXMe@hn|1H%d?{?;at;nvqnF1d8o7+N^)09`=m%Jkpy
z!hc8pedj@wd!o%R8B4jl4}(wYS>62jpHKIz*C|l`?2E4*t#3H;JKg9${o-H)sIBwD
z!}@rs^a~xZt>9r1M=%pqw7j$hIiLr;`wKkC$@pT!HPFqEyp9eay*IqOTflzu>5MUO
zfN?y#uR87kEr0>d`+Gp<YrA|5I32A{@VE4X)+yeHoOSKk;mZKi<k)=bza#T4&)!f*
z$KH(ZE*&lgoGw=XOOjv;x_k^Q9j#831X|xO@$KM(2|F_1@&FC9X8ZtYv2<+s&seGl
zlkD;_umb6kwZ2~>iO>Vl@Y9j`7D$g3EMh?I1p^n*4L>}F&^GEJL&!|Pc~FI$9HL@i
zeVxDO5DVx)0Z?JwzMX}E!Kati*#7^2=2za`EgwJ;4DxmZe@i6`1A}A3e<uDGP;bWi
zdI_InLoEYWDSLyD0SC)#)`k=Vj^7^1M?Jgm`gT9{WIhV2&K-QLU+_0uF)}cKPvddy
zVo|Y?;&0(%WMFWxI$FXDzJAs7|B;ukL6s0_Hs9m_2_NeR#nPU=E-H)-7F?yAp3O&?
zUV;W)e7YaJ+{?hg;N9H=b{N=$pwnPLoeGa`9z)0?1<(ISpx(V~0P-$q&5ETym{o0A
zqhe4}>eI^_VE6w&vIjj%lp6MccMNiss5^9M!|dpSY$NP&G30#h?rD9ulpm(7l=T=h
z*K6Z$NOFQ$?a_Sd{|nF=#V|!ay{yk{|Nk%H2i@t%dfWE@e}@jx$}Au26cq>lCQ!%i
zwLG#r93bJz^qLbCR^Z_2e(k9J7L*Y9TR|hw*6;aSUV!?!;G^g~weNppZYbsOWWN7$
z69WT-WB2vf0?ofz>Lom_?-mJrYTtKczRtgm*~wxLgMbMmL&;<QZQM@$`&t-5JnQ47
zA}<(gK^YWO&p0-p`Tuev=t!yq)`v<tJdzK2FyD9`hwMI&5^GQ9`^~?YI(!T`YXrNP
zVFBgIe80oR(6ad#b18<X704v*8?Qy6f%W~CYxi-F<V!D%F8}`zT1V{Dy$9UFchtUn
z@r6tGY2WUnpys^sCGZI{pji-w|DvsWpi`o(kC%%57tPdVVCX*aqOIotf3TyUfHpyP
zr>K}%ANJ^FEw=gp-wT?09r&jnXMWpRW8m=;6kyiZcY(5U316C{WhetAurU&^U$2dZ
zul0NW=4wV*!sXx2qLSA9LyEt}l@WB3)6o)vG|*z(!=Q7XnO=ggDCl+n2T!_8X_f-u
zq|5RW)Gq)fUC_niu+V}hT~Kcil5|0XHK3#pO}pZH;1tXEU$j;S#NuxS9Z>>Gzx*wr
zb18j#S$nL})36)Zb7_`Sz#C&rywf_hyC9onVHSfDa#xEAXo(M!kR>dNJ3<VsUWbFy
zxd@6;rL1Y4!msV1@#k^;5U65t>2+d$k$>_3f3Q-YUe@1M|Np}+7k$kG6Mqa6@6-k_
z1+;$7-?R=iVW9-G6I8yylRb|kIHVy#3r_hiplF395MS%}pzXwGUt9sl{GWd={4P%&
zyN|ri{4W}+4O)N1S}OfQzY3J1L3P>-7ci3*bi9Pz-~a!cf8>_3x^zE(y$-Z)x$6J_
zm!JzejSsxmd?8f@uC6{;!t^3qZ{R3-!C47esnvWW0;w?{4LMf@$GUe%P{sKQdiIRW
zi*1#l3tKuRUi89k0j;tT1@BC^{>|U>2vnWeO4ouaUeE#5KHblKy1#>JT%TTBnOX)0
z$L1&UzS&Q}2lP1c@AFXrA4H?~BBm02Sd1y$Tu`G7`Gg+t3b5;6g646%4?99mGv%Ll
z!1{2h_6s?P?(Y>Kzk{l3bltoV-LLby&%Y48_y0fmd>^N8E()Lneq6ebfe!dN|DyQ&
z|Nq@LUW>k12Q~;C0f#F<4uc$B(|iv!{P9{7EZ-^dq8+Xb-M+cyVAq0LfAED@h%OXp
zeI)pNb^)JG2MLc(4-VvpPvaX<qtN)j<CX?T(1`i1;|?n%7#J9O^BFrU=76RKK)cI4
zIx9A~wwx*9=&ab`xJ}?SduNVHflJqSP{TFk#Y#R<o-09W!9&u(-O~U6`FB0zFB1KJ
zjKP7Op_Hq!MkNGvIByBFE7zCqbC8KPP_91UsC)u6&DLOjz9dBZY>Aci*%HGSTgpMH
zteN}&i>~tjkohFEbk-^HVtyGYoL>HB1C6Wxcr6K9-CDx&{TKrSJ45MP$NdZp3=XfE
zUAljD_o#q&$2sl+6&}qm1xj>4gffVb1QGnrKOIWDU95j~pXZ-)@U?(r_leisj@@To
zvvr?+&D4Fq``9i9b_US-6&}imO5AKgy{QrlTLvZuh7v7X2GF&{a<-t83_v_q28I$f
zTLw1JnWff;N~B-vgD#Woe)C!ow0e}`HP>EH>+LnOWA_XGUC%fi_kyAUv?wH?Sgwmz
zJ%@qe+XbZ-70@)#iU!AC*G3n97x1Ey0EchK97@C-`FFjQa^&CjUZD9T3s_&LkBSHX
zu4g>OTp&3Pu$aTQV+tkgAinf#ZijEj1WLe?GGNIUo_9d!iGnt@D8BG4g9WvG87N(Y
z(!dK5P|z~GTmW9y+M)v5i|En~Iwr2WM+LGzyhg<UR5~X(c3%gXsc{?>C=8&rE&oN6
zG(Zy>E}#pke*EWe1@(wQCFudj?&Hb_tq+zu?*JVa;?VM;#1hj~NB&*k<-taS&2{X)
z4l$G$+0asJk7RD2UR{GqP~RT;d}+^am!k}ztvCPvi)MjN$~y6)z4ZV87fz-B|94xw
zJOgUdffnliQw1g6QeTKUFDmevqXagm`^F2~Qc(BKM<wFFXqY+!gZ2H=<u6{AfI<y)
zP~7WTpiTpuW5YRz*PP8im`hn48_scn=KLbMxnHP)E>8eEx*Bd7cmNf&<i>^T6WHOP
z6S7@8N;o(?lDR!l&dml(H>7Y_G&pu0Q}O6<QSsq#Z37L_w|wL8JOpa#w0tS4=;n6q
zJ_2f9E#n05Tyg<LvgC^t&?F@2aCC-}fNt&=UoZXt|MDeh(IPi!f)KiF)uE$C#o@)(
zPyhd0A1{??s8Ml{Di!od4pDLG=6<n{9aL@nFFDxF4L-yFg)1jSU<23_t{_){PNUfg
z%I~coO9i@JR6>*wf;M}+<9p4-{h|Aq@<Ce$2L^@`FI&(m)Dj(A1_wrl5>;CU1}26Q
zZCeHhCWaCfTLuOeh7!=7AuJ4~8XZ$qK&8-Y`JIf+3=AM6tPhq7xpXXn2y?)SDM+U0
zZvnZbvqr_m@!K&6{?;|1HT&JiRT&r<4uA&H9Qa#6w@ZVV4J9=o>HvRhJLq7U_xx@3
zAjQ^i%J`c9vXogg|7GQG&0%C<;NRB+whPj7?SAj5eS*IQv=`RV`UHO~Xfx|^7ZsQP
z{}>ovf_BS-!{7MQi+a#54eR422VlXK2NGxoT?beL4|f+xG58|sBdE&#&ksJO$<g{q
zi2^9~WH;8RxV+!JpP^LHrPtw~OGgXXAumCfk$|pobg}*SpMjxN3Y4}k{{R0Xp$J-1
zc1m>re)*V@fx#B!tWssL6CAs*yqE-uL;jYZpc@jPf%p=Xh`>sWFTE&$sCaE{{l2Ww
z(fSR4+aJ))=zm%G+h2j5?Fu@0;>AMHiL;<ZK=&YmpbIZv^ne6G$;|>h+yV*~kn0`y
zfM$TZxjmAPx^^G&=nY|UanU~d!fylA&$)m9|7U*TV*RxKHYAKalDQqa)`0yA$pQ`y
zPwPRM1e7@t*}#D#hr_}nS=gf+d2ym=x6e_A?qdxpf)@1$UkDs{z|P?!XaU+>;8Usy
zt{|jwWGx>K4h2V~#BzYY6|@q}vE>7Q3uxs$Xxt>?zi6B?0|RJ|9kbv9HN_Ey*KrpW
z1(3%byRZKj4O9jVY5e$KYW83BD(JSy6E8j${QvKhEDbtMs`)YaLP^jz0I>I*8d4-U
z{&jP|Sajw8|Cdgnn^i&HJk|V29<+PFBl}W>XSdH;29Hh_uI}TYQ_Vs9!#x_0fNBz?
zHW#G+?+gG}|2~}_3gFY+Bbq&K{BKUU!{7=&^VpGp>H*i*1Em@-6be8E8Ms-4Hs12W
zG#}i~cnKbb>}>&0_=C=?cj<Qc(VU`Uz~BP%JjlzS107ttPk}Z$^@f0U7=cc8Edw=p
zK6JXMcr@3jxG<Dhf;M`2B-em$w><CBeH;|IKE15T#gNN2p=%Gph4^b0(8AR2^DpwQ
z{{Ii*w0<k$c~PAI|9__eXz+)r`?yE*kqFSqeXxDNzTFo*x(|U)4QM@Cs`kP?ALl$n
z3}}rA$dpjfsL@sMmNih_69HPA;o#YQ3A8-qJO`wtyXMpFqY?qyc;w*GeHpw{<i&Gv
z4e0~&$&D9jh0yBZMGTk)x(wJL8g|a20B9;m0=WqWo*ek*3pt#!`=v+sM^Ec>r5Z1$
z<slCMg3f1FfDQnz$pv}k#Q&G#pyR|W3`;J1T3;(U=h4mNX??8Zn2Uu$$-!MQpk=jX
zd<+b`^ufagXFa-qyh!6?U~mL=?HD|*kMXyHR?~Z0|Ko23O-DQShFgM`c?E&*<^2Ix
z0A5wuefEXke9*}0b&uW%X3!GE_n-g+-M4s*zXf!#gikMPjtQvlybKDd(nFvj-DAiN
zLa^&!oXG|a932H;^KtIQs{=TcEd|XS_0}=H=JmAxSHkLHeY}hrwE436^nZ`;^S#0P
zFXn?b?{=R9`Bu&N(hC6|&`9tx{?_jd3=F>D6Es2VgT8`>ce`(ZSH!%?nFscPPj3P%
zXi!)e>;teTTh4(dP(aOc@G_w72XQ!y59F-wb1#(Ufkweh*k63j`TyTn`<Y9(g=a5|
zjZd#?KoX?IQ{dapqT<ng!4q`O)<GPD#QU@U|2Mt_8m$iG2Cs+!-MsuQ5p<#78x9}q
z2OixnDh0J$U(3Dd%>e})B)>uK9Chimcp(n)9ms$$AkSETE#Uz9`Z<UL8pw(P&(<M2
z0&(E=in#7-0*!tvcyzxq{tp`Lb7$=S_~PIpki9R!7m^0J^tv+{U+O;hV)Y?V;`{Nx
z#MYzxu7~yw59|B<eFs4+l|>iGfl?Rf$dKM}4v+2=;0e#);KP5wBaMbH4rPN%7w|~q
z_H57v4WLd7)~kr(LECx`?*jD}y3f4;ou=*5{lKOBu&4EXkM66k{JzJ#&%Ic`2wZ)X
z@OaFCxTH?{_3an6+5i7HTd<aLzX%3f2Wpjpb|O1=U+F&g0(2kuf6=e93=BTqM?Jbv
zfHo5N%P=s!4y}y^6^7kcyU)Eib`au8{+1BXVeaQ%oCMua0%|dCk!4``e#1lhzsL9c
z9{<mSPoq?Q@hS`CFOWqq{%3)*|Be5mpQITWKwb0y|M^?^Kufxf4}f}p=U!yO4gU_l
ziSQ+e0(I&T^8%n<0FK>1x<7TFe&GkQ8dReSyl4hn1L`V*N~<83?(?q32S9sWPy83%
zEdyE}3sT4NU$jgbyyxve>jCgK_3o_y|6iYhZ&PQ;V_*Q4wxA1HkhiIWs*xBK=vDye
z0zk04e3B1(^va&h1?8?2j?E9`JrDk5_02vI;nmG^+NsNh(ZY>?TMQ!y(*eiE$DsPh
zg@4}#$BVxje}S8N5skk<@mK;n5r~12p+uwc7r3>j0HRqKN<Ew!d>A<zyt-LVJ2j**
zSTs5{_%K*7zBWJ;Zvu-my_RrlNMYote=Pu$=K<+sv}kZ`y<N(_17z20e#h^(qz|Yv
z9AIEz1vvtg&^SPKA?O~9){~{`FU&GQag24ftarx$|2sf+;A^gK)=fDK44sU|2f*8W
z&-irus3?FA5fBItMeN#dd;{uQ8vpNp+3U{Y(wolg(*50~>%H~)65-~bj3s<^f{xZ_
z>e#J8>u9zz`gZ?#?eOAS2B^#RVtod3F%K!>A^qp0>Hq(~bYNlt9q!?1VNv?S(V~K}
zgx&ENgM#P(10a!SyE8y#d#{g50p#k1X|DhOcgCm`bjz}U&WG$}70m&4P)hVc2g@d(
zg0!SSQ4eWFu^e!)sNvu!<@kU4|0(PHrFTHb9v=o>{QSF61~ja)9n|*S4q0QKcJKjn
zua5*vT4#?6X!MkS`^gv2GC*^!kWn)aP*boC)Q-O2DFIq(0P5KLB;WSv^<eSr4Pj=f
z3-{?h?$UkQr&qQv8<dnTcy=Ff1h;2?u=-|SituF?IqcZw#IZu4l&gc$vzy7Ilj$|P
zLx-hDGuMC5{|7uk7s4Lm0G|<Z5XlA?tM?^Fj@EbJHo5ToJa(~uUMKF@eFUoAqxldA
zSpN&g(l?I#Kr<XKLefE5wMPYXkd3SH$xaK8UKf=BP$2+nrGPjEp552ML-QcpK<C<k
zV#Wd_VgO#Z18VGmda?gSUBp2vTK<dv5eL<SJ>W4#m+l8IA~OH~x4vJ>1v)K_CH?>Z
z*G0{LnMy&|ScV1s|9{5%eW^C6O&QR9>i>Vy?_wa$J}LpAfqGE);=kw}kWlg-6%g+=
zCwR`s`UPkWyN^o1f6;3a3=FSXK{M|GAX6g#iyn~x8FBnI|BJ9RP?-cOYdt{I>y1Z1
zNfh2NjEx4}r-a-NX?z2z?O7E;+j)$^`!p&%x>;xGfL1|&1DzGz8={io+MCAY+x^m`
zlZk&jYnu)O11LvCq;)!Rbg@?IfTHzBhZ7g*xQ<RAl?2D`Z=irO05t$CKr9o`<$v9O
zK=*W<cyS%He82fHM{f-~qenNhr}eSY7v0A}-8Y8r^Po`nc+ryf|G#G^J4i|iv_tqs
zeJadbFQ$N*pr`~5488>4OYWkQ0UDLEFuwG{@iL?)mv8<d#@`B>okolvf!w3;!aDi?
z|JNlT^%*a`L2l{xQL%9BwP688bAYGyxe}fi#?$`)XZ`^dc*oxo1wP2ZmBFL??rRZ`
z?h`MBKpLA5bGY`Vu)uur+@o7`R}^Rs#I;iG7fU9B(i!O1uw`JeW2NGr-Tckx{=cwF
z2hB~JgFN;UG=k*X{cf|Zi-l2%Mi-Mu_bIExCGsyeO$F%|&5mMVaP7@uW%Nuw>e0(1
z(8cIzb*%KRYxh^r<g>5!9V`kNOAHz+nXF2+EFzgpRULcXSUi$Xcrc%OQ2;SP6Kp~W
z8>?sXIS=Mj7Lp~W96@W2?mB88bzy!0n)Gz=uq<ULQHO+xC0HAHY#_s@`@oB@tl)M^
z5O`6hrE%#^7v|@V-Dkkj_2Nzn$dx`S5uj7(S`U<Zdv^1`h)x5QZQp!5&0m~IhDY1o
z<p2Mh&;38n0E)SnoJ<T1$6ZuRK-uW^2AA#>6$4OkxOC^J7=UgPFnG-h5_AA1@&wOr
zd7p0Z!FJ%;XA97<iU+7g%D4mE%o0JrC^s?@<ShOdxl{iC|9`+^h6nQv5AgC0(2DSq
zFwm|y56^CKAJCbIr#-YUdoW*nv2{DxEX*t7d7y?VfcIH|F4jEZ!F=-=vw}xAJLqQ7
z)&r%RyGv9IK$p=*9CQB9aEzJ3v)kSSbVUhhwYRJGSI=b7o$(&bqH`h`7(A2jf$qzB
zxE>rz9?ZXeK%wvL*nP*R8<fB<gBD3>U-x7df1$V?l9rJMSs_WdA_3$<UxpXm;N1{M
zIUv6L0Wzv|hl^#2iV1%!Xgjk<at!EB2vGj$J`cL8<lHtKMye)&8n~=c;F1jFh8Ol*
zaVY&253=1y#R8O9)It5dZm<SETpCV-G%){u4Y~;g)Vk;Mw6+Hw%WdxQ|F}zsxkoo|
zb2up5oGW2{Aq!1X7CxP(xo}bT6v#?BAC(Hwrezk_|NlK2kAR9Uc-a;g8x7eHZqR)T
zbh?%9i>yTOUeFg#pcn-AYcVb*dl8lZ8c2Q}@cq!w|NsA&p8hX-Lm1rU1I?kS3W4X)
zK>A<&1u0~Bt-eB_RB;7kiR`z-OeGR8*b_ksoE6mTx|0B6f?9*GFM-<)2GOuR)g>z6
zjRD|wAMgX>jsL%hb%CswGkY-~6rrG-77&FMq*3r<YdmO;1(pL6Ue|-VqZW>q6`-Xa
z*FgCpkcoi-G~VG+k_@UC;7dJ1`L}U<bYFD(=E5k;QlbjF1DCtyWQowhM;!dy4su_x
z{!}XF(OdohwSY(K|59#`?%%K3tUr42yZrX}f4Jpj=>ZEL$hs56?r2cg9kOYs1bi<e
z_z3zlpfl(>K>Mg6>uYfBCHJvD3ck(=d|gkkj|zCFcz`pg;}N4`;RrerUKn&lZ})YO
zufCuD|NkXuPSL~qZmG?Sl6X+Yfi0l}Ep&(Vkh|hQK?OQJo(I&Af*+j@TA2S5d?~v1
z-;({Hu=sz@<Nsl&Z!VIuEG3Q(7TTq(Y29aEd-HE&PCNLJ!{h(qH0~2=j@I4+MSLJi
zsGL2`k=a}1wI+xsR-^=?B+8{hf>N(V__rSfAKEWa!s*1ntw#cM%q;&lagYDUoxZt9
zL9EaRS#cF)1$)}TM;spikEd~8NOQCfhFB2{u_72^MKHvQV2BmLU@HzGSuq7{MVj@+
zQmr)Wvn8A!)?fKsRltjJz$d;h1Z@KVEfs)n5P3P_-~a#82bv!+{XgLVK3*T?%z98O
zIRUh~9zKx-icQdd0+WBBI01!q7o*4jgN{}QO22vhKj~?GvV_G#u=I<Cpbx*xLC@|3
zpn(p^7Ix6xl4-E>H9eZ&2>5i0sQ7@=gRk*zpWYA^2_NkXzWh#?Q+>K+R6%E>_*!2s
z7E5z%e8lj<w|6$fhyVW_k1;d&T3;^x;L|Ol;?oV<W88d1;4o;NKWHNos8Q1GoABb0
zC8#Zb#31&tLnvgY{Htd0lnO%$7i3l7lw`091tb-qHcI!!ZjKig;3Y&ykmVrT3*)h9
zO7>L%?U3yj{RQgncZ-~QF&ARF0=Rz-^*Y=c5QD_97}U)h;mpABUsMY;n9+=CJE-h<
z@h}O)$>4L9UYx)p0oJh|E`i|;P&@ENKU^N}z8BoiFk7H{AQW7IM>nJK$wmuS28ILt
zQx0|?>^=xOIRhGu1|Hq7nrjOfz!#qzLQF@F1dnb;SL54_7NDER9r>pmhFm-j3uusT
zk8WRw7t9u5H^6j)#Jhb1UNnF^%J5i)2q!@M&v0STs0C!N_Xcq3jvA7n1q?5y!zCb|
zI|KI}WCwFOTpla|vIw%xD-I$7bC?6zyDkhR=FPPppmtJnsDnrMDbO(E!5^$Xy{yaP
zunb-@cZWK3pL((B0N9fbv4<H(0mA`dP=k+w;SQAk1f@AdAmUO`+6YQ}K<NZ1T>+(g
zp!5_dy$nikfzrpI^bIKe3`+li(j1`m1PlxeVo+KSN;^U6FeqIFr6)k?B~W??l)eO|
zpF!zwP?|{$;vYUJEd`}jptJ#$c7oDDP&x@p7eMJcDBS_2XF%z7P<j`XJ_e<)LFs=`
zS^`w-F)%O~Kxr>1odBh)p!5VNJr7FnfYK+R^gSs314^@j=DR@Q2c<Qjv<;N@fznA(
zx(G_QK<Q~vdIgl;1*MNc=_^qB36%Z?rMV;_;VK2CHK4Q=l=gwrB~ZEnN>6~&i=Z^2
ztXLrhnxAA~m=Fx1SHweTjtmHmuK&auh<J=NghrQ#@zWABb5c_jO7a!bQ%e+5D>6$I
zlJiqi71E0Ga}^4T@{?1Gi}kn|7!c}`i&7IyQjz5pRErr@iy<aD=a=TBDCFgX%t}oL
z$w0*u^FV@WnRzJ+0hJ{g`FRSd6{*RkC5cHnsS2vapz;x<QdzM8EUTAVkqY61NCpOH
zi2nS7)I6|i-Qwh;%z_fVg35BR0_Xf9*NV)N0Emkj7;+hk8Il?D8HyNE8B!Va7*ZH=
z7;+dG7&I927)rrxO|U+VywaQ;2oua_V_;wdEgleHU}j@rV-jF-b#-M00aF78(1kY)
z8VVKx5$qfc<^~4g0qhJ63JRd^BLhc5MnXbD0s})uK}AJH1qV9^XyFG32L}TK2LlHK
zhzmAfz=F{MlwvkOX+|by7FITP4o)s^9$r3v0YM>Q5m7O52}vnw8Cf}b1w|!g6;(BL
z4NWa=9bG+r14AQY6H_yD3rj0&8(TYj2S+Do7gslT4^J;|A74NJfWV;OkkGL3h{&ku
znAo`Zgv6xel+?8JjLfX;oZP(pg2JNWlG3vBipr|$n%cU02GG1S$YDjLc_o>-sS2q@
zMfpVv3=F)`2nq4=4-STif`x)T{oIkb3@-k@j-Gx9ksvbzV-sF3$2^6^f`XjP<iwK9
z{5*w>#A1cq#FSKp#5{$>l9JTif)Y@Y%gIknQ7FksRd7~-*`Je{RFqg$sgRkMoL^Lw
znp~1osmB$NlbTqZs*s$YSCW`q0@i_Kx_YrfacMz8eo=`+Nor!QLRx;2LT-LhszPR7
zT7FS3*adoE$1^Z6fZS)y%cZN}h;T+}ajJrEu%{1F$}h>tELKP?E>6u&%BfUHDJ{y(
zOIOHCEXgbbIU@yRc4kRtVoqii*m$lGkowHL6p)8gixm<Tl1kGRGV>HF^Gl16Lqbo%
zvqT}YSRpsRxI`f*Gdne>66~F#)Z)^d5{3LUh2+GX9FS#+d0;o`Cg<lCfU~HEesWHc
zrb1e2UNSgL!8tS$;i$aglA_Y&lKdit{31y9b;-%`P0Y*#`yJ$OBapvAxiB>^zcf8V
zp|~J1ITajSIr+(nIUrBL0}MI53_<#k!YeZm>i1Nz+ns|#AmLq-k(j5DpO>7fM|^l7
z+hYK-2V@$^jR;FpKx%@_42&#5@}+s;5~Czv0ii-6BQ>!AqzW9rM&=-OATzM|vpf??
zBRK95`pj_ZD=taFqt6tiub{LjRiP}isH8M82N6l2*aTYua=!^k9aeY6=jVZnUj4)p
z5TyVv6v5g+>DAB@qz~b5a2c4KpI4lpld6!CT9%od3Q-Hn$3bQWhR|?Ittd!ME=f%R
zhYli#f>eRS$q*b)rFn35xurQJnI#!Tsfj5HIr+)i$a+BL;tn6Erj*2zM1)ho7V$!o
z0#bGb7Y0SCg{7&*Ajg5Se-O0rDaltTNiE9F%mY<0nI)hMl$fVbnpav33e@sMDi#Gn
zW(Ee}aK#!Qsd;6YMfrKTsd*((|A5qk!xgLg#G>?4km6#fYH;`(fb&~gPJUtuC_@+I
zXXcf_ODd2tpyDqToVpnpd^3}a@{9A+N)*B}!M=6Y)>eRpiw~qw1O+G;7XyQyo*siu
zK~a8sQDUw_USe*lLTO%hUVeF=9RmYQiz}!cSLEUffGD#9-F*Sl59&XGPPziIL0Fc7
z;Q(j}AczgZ)6n?63=9Xr6&y&Cfq|h9jo**PpMb`nh{m6U#-EJFXKQF^YiMj>U=Uz#
zYiMg~5MgC?b#-lRZDnO(FfeEcXy{<zV9-#v2ncUrU<Xyg0Rf;fHwBG`jt0<-UqVJg
zMn(n)2YW?9L3u#|M*R!*#)zd97|@{x0}P_eVB>o*2;hY+444pAM<W9QGBOYckxgh~
zKtLu2;vh^vEEkN}=x1QSh<^o!40@*k#zr_~Boe@45JWdIA|MkZaS)^rgt4V*(!>bm
z0FW&r3?fLm1eq<sK%|GE%Fxvl=Uap-0R{vc!eRt<Kj0alp|PpCrM0cSqqD2Kr?;<v
z!o*3Fr%atTea6gLv**m6H-EvxMT?g#UABD1%2lh^tX;Q$!^TaUw`|?EeaFsSyZ7wf
zxBtMwLx+zXJ$C%W$y2A#oIQ8`!o^FMuUx%${l?8(x9{A&cmKh|M~|O8efIpt%U7@8
zynXln!^cmbzkL1n{m0K=zyJLG_n(2%4iN4R4pAMTf%gAE+fQ-$6Y7BCmIrr02ipH0
z9#*-zR>jcK3kHUil#~=51z%rZUj-1Ova+%goL78(^;1&xA)EkT1_no8urPy5YI16B
zQfd)|$H3s1Uxvc>PcF#^Ne8DEl)xk$OVdk>OBfiuN^`)5dzI#a$2uGfiZVfC6uyZ?
z$r(@s-BOc^N)wB~>OewXiFshIOKLL6E(ZVP5{BT^0tUy@bdY%rUZr^qzKN9#js-;w
zzKKN)ZmCHOUWs`O!HFfMMJb73bKHtDp)3Z5kc`rzVmOb1Av`rDFBM53q!hyQ&Cdg?
z3ND4xi6snfMVTP|AUzBrrKt?Q`FRY%rFkG{GPtM0#$v)V^HTE5gG<1jEs%I<acYr&
zQdVkmi6^3i?g-Y!0Fw7fEG}_O26eRq@(W4}AQJAWP%(&c48Ezw#fj;uPWcrOouR?5
zLB>XUE<QdG^}(fizWI3}rK#bmDIpo9Zbg~Fi6smSps;XDP4Z1Fax5tFO|0}P&GRbF
zaV$*_PA%|HF7eAR0|hJt1B0`_pMPkG3WHv9elEyF*m#s)64)39z2w{!usCRaD+2>V
zaAk2xYHm<|KFAV~1Odz_$HO33!p$I;!o?sL!pR_K!oeVCB=tbzg4h8`c~%BqlL-vG
zj6Do&1q=*3<QW(OSQr=>c|qdx47`joU~xqT28Iu!3=HSQ7#LL885ux)5POk01A_pV
z&%(fP#e;$2h$mPLTwI2YLFS4FgUAt2296XjR5=bN29A&*6mumN*ckX2y&2d)us&ce
zU@`!?$AF1}K~RR3K_*G!fLMWOf`|bF!vk#w(9jt}k0b*_q!a^#188R)0|Nu2Bo~9E
z2|t5mkmv{D2Z9&)5AYW7Bya~XvN18R6)_nwiZC&VY!WbF<Y!^vH(_JoH{vc}<YHmq
zGGSxjGGZ$bl;L8KN#SRZG2vs7DU$dg_CVx<&;fx0n0=qs85sU(Ffc^G>;su=#1z0O
z#Lgg;BEcYJBF-ShD8j&90C6K|;}w$@0|TEH#J%ga85rJcF)&QjW?-m#1fdxfco-B?
z1Q`@U1Q--d_!tz5WIjM*N2GvJfQ><*gq=aagpEPKi01$!Cldpw5vu{C1P6me3I~Hk
z2s?v>2^)iikw^if2nT~m3I~Ho2s?v_2^)imkwAf@CO3n)NeY8FV-$nH2fhb97q|{^
z6tE|-1wi8Z1QP=Trvfj7!VyUZg%Sw{g%oiH1rsp_1x6tT$q(WWL@z-60jkKiSTQgh
zu!8s_2DFuhlbL~&aSsEN0W{o8I2j~UI2a^D*cl{E*cc>@L=P}Za4|@va4|@Pa56}k
zaDdzi4o^ldCQx`A2!i~V!pR_D!oeUA#B%@^&hwoZ7{r|!7^XqPSr8PjM|c<{OSl;%
zQ@G&q3sMgX<7gKKhJ`K+4C|rlm0TDY_PH=H+=ucRML8HmOE?%rQ`i|qP1qPjjRX$}
zVv1b=nFsRgVmAhc$8HP^KVbU7VavrJ62i$KV#2{75+qQ-$j`>WpTf<+Z^FgEU&LL&
z$iu|I!zjogsRBw1TNs2)HZuq@ZUCnRP&zJPWnd5lr!{tv-{EOW$d7>`+mC@k<S`^8
zOUiRF2$%>k2oxb=3#8wIfq?-M4%`fqC0q=WDVz+FCLEx!fV;afh=IX67-5zmBz+pd
z{KXy4z@Qk;z@Q7Y3*sI~+6Soth2_0)28Ng63=D2iHUGjH7*rz|7}B78L17jKVH0)+
zVIzL9A3%DVA{iJqL?ZMYjbvc>6N%6R2`d2x{t$i!{!QEkjN%*&;whXA;vpOi;wJ12
z;zq&+;5fR%%^+IB#UN_J!5|tW_yFu*WWO4TJ`lbj2u~+`2@DM96Brokp>AVjVPs%&
zVqoBe(jY&9;?q5efuSmifnmX82#qd3Gl_v=ZW1JIgJ?l<E(Y-w0S0jseg^R(;SYij
z_%HAt;0F5_WS&DB1H<Js28M%Bd%@-<A@WK{Is-#;Is?Pq#}JxPmWM&MgquM&g^NKp
zgp)zmgo8oWNb-UB1<?bLuz{wdAnpQi8CJr}Aeq9$AQ{5VAZfzIAXy}OfRTfdfy0S`
z0a9LZfYT5t#W1onF|aevW?&RzV-PYCU=Z5GSHPRV696%nlY!ragMlApE;#LRFmMI2
z6@bgbAf^C8a5=~cmWPGa^)d#Ahh+>5|Dk@9)aPc9H7R74WlUqnR)#1@GcX8Bb1_J#
z@G(f6@G?jTiGP5^5+r?q!i%S#fx)((fkE#H$i)l{f`V)ef+jo+f<d5A<w}6rE#JVv
zklet)AP!Xr@hcAl*Ce(ANLeDlAQ8gPAYsDCATbG2HcRUAy2_V`Fi58eGl-iAF$g>J
zZQ}aC@qq0D%K;{6ITrz{8^HNhkb&PsfPw!KcY&lKuc>m00E2uAKZCRhAA`8DP!Zn;
zo(EhPI1a$dM^K)Fgd;x#zX=~C?eZ}(@ELI#5c2c3=?n}nrz8B#D8|Jg7Q)XUX2QoH
zRwVR5-~!(Po&xR!Nc?SOfTR&Y2H6w=2H6mP23Zq62H8oFG$IJjFT4!mCOiz{L7*If
z2;0Z=85lSgAcYw;&r1q3GO!$il=GnZByipkVqgIKCxjhd|AF(^5l#ll5)KB*6nNPU
zFH^jiGB9K>WngfH#tB3{AA=+)jhgU)(k8gB1;rt#EXZBPz%Y3k14A5Cy~r{KhNH_F
z80w&Wu)C5V?$TgjV31Vjc9nD%VH9NG{lNWz^8)(;)&iCUW&>E<ftqDtw}bL0C|@@*
zFhI&~E(XyQPFPt1FB2}VWnkF3j)7r1)IM+;3K3-By2J*pBLx^lLiia(O!z=;0Z2I>
z!o$FC!VNCRB~`dg#f$|Hp}PiD27}WPs7^BxV2}tB`GAN;E@*z^W#BjAVc?$x%Ez1x
zl8aE=AzTIw1oO(9V+;&($C1*FA{T?Ai6n#KC#eq-55z8r91toHOb~#zX#xaAm>EPC
z2^8=rAj+Tf=NTCOoM&Lz01E?9nh0VtfTS^ua_9r1973cEMph;URue`BMj1{98Acff
zB%cIu8!#|PDswSl#99EP%~k=*Z{RwUk3l4amqEmYhe2eLK!JfEs5F3-0coK5XwWUK
z5H1Eex?TbjR-@}BAmK33>m`C2-Ba^YixNvxogp(~&Lu@Tu4SotB@7J58QoJ$K&t|r
z^HWmcD+7vH!V@z~-13WpGxO4OQXxH2hG`7W;B^g9WsVFCTbP4WOOOopNX$#gNiAad
z3NqC<KczG$)h#n8)h{tO)scbWHiK(kNotXEQD#YIa$-(!DtMBXf#DsKPikUWDu(zk
zgeee%!x<R#S%Py?QwtcBn4rC9$CQ+!RM6N28zaaYP`5D@g7iA)=jJBnrTAp#r8+X$
zfOG_xBo>vF7Jxd{jtujdgGzEj^U5>xQd}z-zJUA!vBx>T6cjdg5FIHHK?a7KATvS!
z38^edWjMg#lA4oRg5hjymJrzd9LzBct3f)QON)w9^I%<m1|OEtybN%7rMOlkrxt)F
ztlctmN<iZz$}GXDB{-!oFnJccq$ZW7r>7PL6r~n}B62>+FJYPBsa1%V7#L=N#C-De
zvr7xypflpGc_pB6l8GQ0=fr}N(jrirC`qj-VR#O5BWPR!JT1n+u#CwgHL<|0C^eOV
zVG)?^n3I#A%n%Dw=NteELWU3!+tE3Ifk6ZmR{pNOAoeXL&*HGeoXiw(no3MhWw_4Z
zng?1k69AguOD$s92^tduB{(SGfzd6e*gdr*EHS4vmBA6j3x@IRK|HWCet=>K$%X4d
zwnIZT1Ux0{nZm$e2T~7lD#L7+@S@BTa2jOzz~qykm;#+9bYx)I#pDT}qen}6j(I7;
z1(|t}WZ=UHvfLFh+ZkK}TIo>i$Z!y3Kc)nOFAg2y3>_@tnJKBx8Hq(9`M#i;WT(oK
zREERY%?W2<SOpIE;8f&MAO?mdU{Oe3WMBwp4lGSAstiai0xwL+OHKv5JGF=*3lt|I
znaSB;0S1OOAbX(U1x=csDGb3NRgj^Xkj&gv$6{~_&&*9_SP8Z#C>0Wztzg~I0wjQe
zVLB4uH$Nqnfx(&4EvK|N1Ek-nG%YQ)sF;D_0h5ojZ(;!?%p4gQB$?s<4#|fF2E!v{
zRpAT_4q!Kd!x@y<92pp#QAI#KJ&^rA;6)jrwCKpd@CKAVK(@n@8N+I@4}vqRQW+Rr
z7@TwRi&LSQc>*M5K+7&ihS?y~pgjN5l7i9_P)eSKqAHw$3zRQ|5hX$uv_u41>c|kx
z;GCaZkXV!o_iY%eNH_z-U631*(o9%lQ6^}yh9iTwYmlF-kFk+nN=^;~Lk4qDYGMk=
zTn2_)5IrgWX%M~|C@i262+E@j45vY^2T3}XloVwqm6oIyLx%h?+9u=(JaC1q$AamF
z@lj?;Kx@Kb3UJV%Ha4V2#GwF97^EJA(S%32qaiRF0wjch(W3jhGqo8Q&c-TSO1tv^
ze~cz%y(>I#eSz>le1_1Vi-kbA0lL1C1gnTr3MvCYJGMdggD~jS6%Y+tV*@(O3bZi`
zv`2!Cfq?<EfgW^m4QNjUXpIes28n@akn=!tptU+MIgq&^y&#&O0kn0U0d&X#14vAe
zfq_8?ib3{)<^n+CrciaDA``@ShVnsU4<J233=ClX!B9FJw1%32fgzHC0d!j%c+D(G
zA7~N;w0Z*6@0Vd<U;s^cf!qr62gp63wKpI)gYIMj(V*j|LGsN|^ID+hgRblVEw`Nq
z<u8P~2Xs6l$gj(x;@d&vstgPaphGc0{<#iyj|4jd11Nkz7!)qBNCAaAj18jE`5-Z5
zj4qGPM^+1BqstTGgY+O{boIz`AU3)@AwEbCGA5)RT^?EQD4SLxAb=A<Y*fGrAo4?<
z#JxBJ;xpWf10eFlfy9{vpsh-rNdQ#b4u=3h^}|q45*m>H0wWU(xcXVb%)pS)RM`Zo
zZ$Tbib{|ACFf3dOp&REv_yb}&)HQ(V70e6_2N&O3j4N^*|AAC9FgQTztwgGKgsR`h
z%)oGd(UV0|3{MxmSQHI042guBU$+pfBaoGWA@Ek*Ed_@7TUob^kW@mLjhAoSd+?Ki
z!LSaZ^UFU-I|_7`Fh~WcJprO&m|pdagDxZ<VD_TZ11%2<2M|Vg7mOcZgx&og{y@UF
zfe|Xt452R=K<EIdzhP#>_zci=32NKI>;TcAwiAes_ysW+oM=J&prCwE8x17?<0nKO
z)OG{$6QF!(A;q8p<%8OcAo(9ZAnHMFP7wbBlrIe8FfcGIfbv0YUXV}*lrIV5fX>2&
z@};1B4k%w5%D?a(Vm_#?2@+ZX<;#IM3=9k%P`*5ruK?x4^3{uP5dE-x`Qa;suLM;e
z0Of<`L_k6gP(FBp6li}UlwSps1g)Bd^1+#yfq_8+%Ks0Q=YaAhW<%_u7R}56+DFE~
z06G~D6gRN=fLhA{OD~_G`7(eNl1_Y}v<H-Sfzl38+6GEnKxqRgtpTMKptJy#W`NRP
zSRm%VfYMK(^aCh;2TI?7(pRAL1t@(6N}qtzN1*fpD7^<t?|{-9p!5PLJq1elKxvry
zEl_?9lrDkN8BjU_N(Vq`2Pka;rA?r;29y?n(hN|V6SV#c7U&EN46yvDha?7KIzaPv
zjuRxDD5dM609Iar@;%5-5Dl^qls;g29K>%ZfUKAJ@bN!5X$Ay`fP~4$0WOs3e*g^+
z1!G8fpqEeRd{Dgt5`)noHYm?qGcYhjF)%QI@+;`_BhYPApxcK(gZhb#3=9U03=DpZ
z3=Fx@fPv|=g7#%WyF@_;r*2_jU;y1?^@)LjL4c8gL7$O<!IzPN0d%@9!!Q8QW#c$0
zCN#hd1u(B$utDO<07`2>X$2^aoYr7^hBPg}!0=pvfuVwpk>P^?14E<`1H%+HMur3-
z28Pwb5b+Jd3=CI<85mNy85tf3Gca(7GBB)RV`LBzWng$K%E0i2gArxDB=Q<e(3;D5
z2?mBQY>W&bdc6b#!yPt81`xenf`Q=-8zTdVzAC}Mu!oJ2;fDkRL#`A9gAF?)LxmIr
zLzFZFLk1rsLyR;7L$fr*4K30P43DAWPeAK@WFTrpWEdE-WFTsCWEdDGL)lYg7#OZX
z)r811Fl?8Hs0Xc`xGE1(e?y*u;lDfsgAG3;1A_ts!%`&%h7@*2h80Q-3}(s<3=jAj
z848pc7$j97dSz4?7-p$3Fx0R!GR#q7U@%o>U}#}yWZ+O^U@%pKsIgFEU?_yLOVk(`
zx}fYOY77k5)fgCh*clmas4*}IsxvUmU}t0yQD<N{3}qitXJGKtWMEjr&dAWA$-wYl
z6Jq8EO$LUO+6)YL*clnlXfrU}(}uVow9chbmw`cogOQ;{mw_QvkAcC2gOMRZkAb0A
zkAcC3gOOo^9s|R5J%~9s^cWa4^%)p^I2ajp^cfgd=`%1Sa4<5g(Pv<oXvM%#!okQe
z#fpKU(UyT>2FOfX2Jqc?pzt|j%fRr`j)CC<2P4B9I|hbAdj^I*oQw>6>=_vD*hAa{
zqW?hIAlk_RVy}w>1H%Rfh+QDs*pY$Z4hJKHi6aBUPAGeiBLjnr6C_=M=td_71|CjE
zh88CV1`}rn1`$q1Fum59fnk9FBf|z~28Qp>5c7XHGcdeyVPLS~WMuf^!obkv%D_+q
z((B5=!0raISHX>efy14FVFD*3nD%jpgg=P>?asi^z{AM!$DM&8$P?nP5Kjh%^PUV0
z7dROi{&+Gl2zWu#35bsJW?*>0$;c4n&A{-^8)E(kZw7|Tz6=a6I2jqP_%bj|@MB<L
z;bH{S3jUBZ1EQw~GB9XxF*3{u1fOfb-~v(;%)qcC7!rmc+9(v_$C5AxhSOmXKb{F=
zU~mj)U?|~YWJm~SU}z18sP718V6ci{V3@+i$Y2w}z;GY};x7>WBm$xrL`z07Fr46G
zWRQtsV3->P5nm9+z_2o!f#DAqBg2|#1_sMm1_mB(Mh2T$28P6V1_lLgMuwDl28QMF
z5W7~yGcdf0hv<D1&%p38fq}t<n~~v50s{kgB18>OA_Id<BE$_Kx(3Py(VL)bha?7u
z#v}%Y9BxL2mLvv-<w*<-J=}~8E0P!(jwC_MIg!M`Ff9cVwntJJ7);X{7}jtzG6bYE
zFtnyKFx=s0WSEf7z;GxX;+`Yv3=FIp5WO533=9fTHi({?0ddcq3<ieNnUMHBlgYp^
zJDY*w4>u#joNNY$NjVG*5<H9yQ*sy>-0~P0G<X;pJn|SArsOd&IDo|S7#Q6185lfx
z7#R}s85mmf85kmX7#WV_GcXtzK+=Xu0Ruy20VJ+#3K$p;L)i-o85lMcGcY9ZFoNkL
z#SrypiWwN1N+5CFQo_IxUJ7AHlrk`UDrI0O;9+F=Qp&(kTLwv=4P^`r-^v&mrtmN_
z{3v5!2&-dY09`a5QOCg0S<k?5hli1&r=Edfeggvo4=*Fbf(8bLs73|`6JAD!ltu;y
z?iL0H2VO=7o)!iM&rSx02wp}8pH2pbN1Y4|4ZMsDPdXVG{CXG|Ch#&c1oSX4-0Wds
z*ul%lpfZ7hfo~E6!wFtS27yTo3=xwcc@spxg^GWe#K2HFnSr53fRUkQG6O^46bL(H
z3IoGYC_7^s1H<2Gkhox&&cI+kgMr}!FC&A+3<ieo8IXAFnZdx&FpGhKfsYYPUzi06
zD-bO<8^TtZ&A@PUHUonMA0xww*$fO`^B5Qu_!t>{<}onT%!8-_(H8R|c7f=C1q=)}
ze2ferx_tq}u8su^409GTFck1Hf@$8x3=AIx7#S26GccTA3`u(z7Beu^EMZ{i;9~^S
z3`-&AgXm>T85m~pF*00O%E0huIRnE9K1MKYzk-2*gP)PXVFd%j(Nzo#68ww|GOHOF
zbk{)4H(0~K(7gs?PR|+!hU04(7+m-n8BVNWU|?PgNy98_85owXg`|fSYZ(}BuVY~F
z;b&yH1EM!DFjVj}GWcv@V2Iwxz|g|a$dIy;fgx-Y1H%k{Muvz@3=Brw85maZGcuTL
zXJFX79TJZRwlgqX-2q|W*ulWiv4?@-1V1B~{=Ns2-hS+1V0gC|QunFsV_+!X2XSY`
zJ_d&GM;RDC@G~;}ILg3~b)12LLx7PX=QsmH)_Dd73lRG}14HBm28IX$MuwOR3=AJH
zK+?dM3k(dUmmzg)#bpKtfvXG*Edq>Sdf8Q|AFnbnlwD(B*dV~jP;rfcVf!_Ry*sWk
zFf`v}VAvtR$k1|=fg#}@1H%OYMlk*19>jbQefK`Z%`fgVFsyzE3Fi+F85ryyF)%dn
zF*1PmWq|fd^zbl(_e_BHJX~RC1n+$St?dV~K{ROHK8OvXuRda60I@-9_d)CLL2M8W
zS|1N$gJ{tDbr2gwgVw2o*dRLoF+?wDtvYB;I7l2sPlk$v)_;T6Y=gu>G-!P`$Za4R
zwB8vc4x&Npk3r%f8nk8^#0JrzHLxHyhz6~11*r$o<xe2?g4Vc#)}4aHK{ROnB}hGp
V{_})^Apq177}AZ{QOA=T0ss*!rV{`F

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/gui.exe b/venv/lib/python2.7/site-packages/setuptools/gui.exe
new file mode 100644
index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94
GIT binary patch
literal 65536
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/launch.py b/venv/lib/python2.7/site-packages/setuptools/launch.py
new file mode 100644
index 00000000..308283ea
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/launch.py
@@ -0,0 +1,35 @@
+"""
+Launch the Python script on the command line after
+setuptools is bootstrapped via import.
+"""
+
+# Note that setuptools gets imported implicitly by the
+# invocation of this script using python -m setuptools.launch
+
+import tokenize
+import sys
+
+
+def run():
+    """
+    Run the script in sys.argv[1] as if it had
+    been invoked naturally.
+    """
+    __builtins__
+    script_name = sys.argv[1]
+    namespace = dict(
+        __file__=script_name,
+        __name__='__main__',
+        __doc__=None,
+    )
+    sys.argv[:] = sys.argv[1:]
+
+    open_ = getattr(tokenize, 'open', open)
+    script = open_(script_name).read()
+    norm_script = script.replace('\\r\\n', '\\n')
+    code = compile(norm_script, script_name, 'exec')
+    exec(code, namespace)
+
+
+if __name__ == '__main__':
+    run()
diff --git a/venv/lib/python2.7/site-packages/setuptools/launch.pyc b/venv/lib/python2.7/site-packages/setuptools/launch.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..71528557d016977d0ff1ef920636a7cf8b123b55
GIT binary patch
literal 1108
zcmZSn%*&NH<x)&C0~9bZFfceUFfbH5GB7ZtFfc?hFr+Xtq%bk$Ffv3j!q`j<QA`Xe
z%nU6I3{lJssVodBEDYI93`MpKsmu(`3=E8U3?Mzh8mu6rq8S(%xO@^z^O7?ZN-|Ov
z0xC-~^79mmlZ!G7N)+<*z=Fy7xw(mXDGE86d8rDCX(g#eT*av+r3EGV`8mZ3nZ*i8
z`S~TqB}It^1*s_tWtoWznYjh|MJ0M%ng9R)|L+I(0UHAY13Lo)gA>Twi3|)3sSFH^
zsf-L+Odyv_)-r(Hm%_wQ!vJ!93JXIDD?<twLo)+&Eh7V5ojio4k;=-D%Epkw#*oU+
z(9FzG%fwIv*4oU-ki`M=W-T*A4KqU)CqoK5Lkb5&GZRBC3qvXwLk$bq22QXpR)!i@
zh8ji&me3R~hF}eDkkbM{A)=t5pb%6F@jWywGV>IQD~t6Ki_*)Y4PzA&ixo1{6f#Q`
zG7?j`K+2O+Q}Yxu^UCtGQ&SZ35=%;p5_57Y^}uqOj0_A6B^(S44Ds=4nK`NP@lZ})
zVlIM{o0ypwA726rr1<!h{N(uf5*7vqhWvumykZa|rYI(_7?cQN^1u?Q6{*R7U`Lnm
zfQ?Qn&CDsu%qxzMFJT6GrLq{T4&-DoBPBDr1kCWu&r1c{lb%|VSW;31c1=lsc4}T`
zRca8(F0itq)Wj69vZB<2oWx{^mgM~0g3O#$4N!cRfI|$NR^mZkDdA*bU;r_S3qZ<2
zDGcQL_!5v}NH~JE<mDIT#zXla+miEBQZ+!S9845vGcYjd7ZhcdC6=V>mn9bIr{(9Q
zq!tzHXBX;c7aN(I8y036nU@(_m>1_%rkBT?q?ni(7#J9&=jn&&7i1RbX66-_B<AGk
zmM2=424?6Z5-Tz@2b}8l3M#>YRaBbC3kov{kTY0W7<n1lz>t$kkV%LU0)s$-56(A1
zpzsX>g?bPux`M<Q7#M;;kqq_#f}p!sKxxb-H$SB`C)ExVvc+5s3=C|nJd8ZdoT5C8
E0LDEEr2qf`

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py b/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py
new file mode 100644
index 00000000..4b1a73fe
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py
@@ -0,0 +1,62 @@
+"""
+Customized Mixin2to3 support:
+
+ - adds support for converting doctests
+
+
+This module raises an ImportError on Python 2.
+"""
+
+from distutils.util import Mixin2to3 as _Mixin2to3
+from distutils import log
+from lib2to3.refactor import RefactoringTool, get_fixers_from_package
+
+import setuptools
+
+
+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)
+
+
+class Mixin2to3(_Mixin2to3):
+    def run_2to3(self, files, doctests=False):
+        # See of the distribution option has been set, otherwise check the
+        # setuptools default.
+        if self.distribution.use_2to3 is not True:
+            return
+        if not files:
+            return
+        log.info("Fixing " + " ".join(files))
+        self.__build_fixer_names()
+        self.__exclude_fixers()
+        if doctests:
+            if setuptools.run_2to3_on_doctests:
+                r = DistutilsRefactoringTool(self.fixer_names)
+                r.refactor(files, write=True, doctests_only=True)
+        else:
+            _Mixin2to3.run_2to3(self, files)
+
+    def __build_fixer_names(self):
+        if self.fixer_names:
+            return
+        self.fixer_names = []
+        for p in setuptools.lib2to3_fixer_packages:
+            self.fixer_names.extend(get_fixers_from_package(p))
+        if self.distribution.use_2to3_fixers is not None:
+            for p in self.distribution.use_2to3_fixers:
+                self.fixer_names.extend(get_fixers_from_package(p))
+
+    def __exclude_fixers(self):
+        excluded_fixers = getattr(self, 'exclude_fixers', [])
+        if self.distribution.use_2to3_exclude_fixers is not None:
+            excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers)
+        for fixer_name in excluded_fixers:
+            if fixer_name in self.fixer_names:
+                self.fixer_names.remove(fixer_name)
diff --git a/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc b/venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2dbd371c5a5ffb00afc9d9bf835277c6401b62f3
GIT binary patch
literal 3490
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
ZX}#Ei*u|jOWMdLw6krr%;$ar!1^`!iGdTbN

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/monkey.py b/venv/lib/python2.7/site-packages/setuptools/monkey.py
new file mode 100644
index 00000000..3c77f8cf
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/monkey.py
@@ -0,0 +1,179 @@
+"""
+Monkey patching of distutils.
+"""
+
+import sys
+import distutils.filelist
+import platform
+import types
+import functools
+from importlib import import_module
+import inspect
+
+from setuptools.extern import six
+
+import setuptools
+
+__all__ = []
+"""
+Everything is private. Contact the project team
+if you think you need this functionality.
+"""
+
+
+def _get_mro(cls):
+    """
+    Returns the bases classes for cls sorted by the MRO.
+
+    Works around an issue on Jython where inspect.getmro will not return all
+    base classes if multiple classes share the same name. Instead, this
+    function will return a tuple containing the class itself, and the contents
+    of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024.
+    """
+    if platform.python_implementation() == "Jython":
+        return (cls,) + cls.__bases__
+    return inspect.getmro(cls)
+
+
+def get_unpatched(item):
+    lookup = (
+        get_unpatched_class if isinstance(item, six.class_types) else
+        get_unpatched_function if isinstance(item, types.FunctionType) else
+        lambda item: None
+    )
+    return lookup(item)
+
+
+def get_unpatched_class(cls):
+    """Protect against re-patching the distutils if reloaded
+
+    Also ensures that no other distutils extension monkeypatched the distutils
+    first.
+    """
+    external_bases = (
+        cls
+        for cls in _get_mro(cls)
+        if not cls.__module__.startswith('setuptools')
+    )
+    base = next(external_bases)
+    if not base.__module__.startswith('distutils'):
+        msg = "distutils has already been patched by %r" % cls
+        raise AssertionError(msg)
+    return base
+
+
+def patch_all():
+    # we can't patch distutils.cmd, alas
+    distutils.core.Command = setuptools.Command
+
+    has_issue_12885 = sys.version_info <= (3, 5, 3)
+
+    if has_issue_12885:
+        # fix findall bug in distutils (http://bugs.python.org/issue12885)
+        distutils.filelist.findall = setuptools.findall
+
+    needs_warehouse = (
+        sys.version_info < (2, 7, 13)
+        or
+        (3, 4) < sys.version_info < (3, 4, 6)
+        or
+        (3, 5) < sys.version_info <= (3, 5, 3)
+    )
+
+    if needs_warehouse:
+        warehouse = 'https://upload.pypi.org/legacy/'
+        distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse
+
+    _patch_distribution_metadata()
+
+    # Install Distribution throughout the distutils
+    for module in distutils.dist, distutils.core, distutils.cmd:
+        module.Distribution = setuptools.dist.Distribution
+
+    # Install the patched Extension
+    distutils.core.Extension = setuptools.extension.Extension
+    distutils.extension.Extension = setuptools.extension.Extension
+    if 'distutils.command.build_ext' in sys.modules:
+        sys.modules['distutils.command.build_ext'].Extension = (
+            setuptools.extension.Extension
+        )
+
+    patch_for_msvc_specialized_compiler()
+
+
+def _patch_distribution_metadata():
+    """Patch write_pkg_file and read_pkg_file for higher metadata standards"""
+    for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'):
+        new_val = getattr(setuptools.dist, attr)
+        setattr(distutils.dist.DistributionMetadata, attr, new_val)
+
+
+def patch_func(replacement, target_mod, func_name):
+    """
+    Patch func_name in target_mod with replacement
+
+    Important - original must be resolved by name to avoid
+    patching an already patched function.
+    """
+    original = getattr(target_mod, func_name)
+
+    # set the 'unpatched' attribute on the replacement to
+    # point to the original.
+    vars(replacement).setdefault('unpatched', original)
+
+    # replace the function in the original module
+    setattr(target_mod, func_name, replacement)
+
+
+def get_unpatched_function(candidate):
+    return getattr(candidate, 'unpatched')
+
+
+def patch_for_msvc_specialized_compiler():
+    """
+    Patch functions in distutils to use standalone Microsoft Visual C++
+    compilers.
+    """
+    # import late to avoid circular imports on Python < 3.5
+    msvc = import_module('setuptools.msvc')
+
+    if platform.system() != 'Windows':
+        # Compilers only availables on Microsoft Windows
+        return
+
+    def patch_params(mod_name, func_name):
+        """
+        Prepare the parameters for patch_func to patch indicated function.
+        """
+        repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_'
+        repl_name = repl_prefix + func_name.lstrip('_')
+        repl = getattr(msvc, repl_name)
+        mod = import_module(mod_name)
+        if not hasattr(mod, func_name):
+            raise ImportError(func_name)
+        return repl, mod, func_name
+
+    # Python 2.7 to 3.4
+    msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler')
+
+    # Python 3.5+
+    msvc14 = functools.partial(patch_params, 'distutils._msvccompiler')
+
+    try:
+        # Patch distutils.msvc9compiler
+        patch_func(*msvc9('find_vcvarsall'))
+        patch_func(*msvc9('query_vcvarsall'))
+    except ImportError:
+        pass
+
+    try:
+        # Patch distutils._msvccompiler._get_vc_env
+        patch_func(*msvc14('_get_vc_env'))
+    except ImportError:
+        pass
+
+    try:
+        # Patch distutils._msvccompiler.gen_lib_options for Numpy
+        patch_func(*msvc14('gen_lib_options'))
+    except ImportError:
+        pass
diff --git a/venv/lib/python2.7/site-packages/setuptools/monkey.pyc b/venv/lib/python2.7/site-packages/setuptools/monkey.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3f706b5c139551db4fe46d5175e43116da111e01
GIT binary patch
literal 6451
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
VCN_3XK2A<fAx?Epc1}S~763?)GzkCz

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/msvc.py b/venv/lib/python2.7/site-packages/setuptools/msvc.py
new file mode 100644
index 00000000..b9c472f1
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/msvc.py
@@ -0,0 +1,1301 @@
+"""
+Improved support for Microsoft Visual C++ compilers.
+
+Known supported compilers:
+--------------------------
+Microsoft Visual C++ 9.0:
+    Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
+    Microsoft Windows SDK 6.1 (x86, x64, ia64)
+    Microsoft Windows SDK 7.0 (x86, x64, ia64)
+
+Microsoft Visual C++ 10.0:
+    Microsoft Windows SDK 7.1 (x86, x64, ia64)
+
+Microsoft Visual C++ 14.0:
+    Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
+    Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
+    Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)
+"""
+
+import os
+import sys
+import platform
+import itertools
+import distutils.errors
+from setuptools.extern.packaging.version import LegacyVersion
+
+from setuptools.extern.six.moves import filterfalse
+
+from .monkey import get_unpatched
+
+if platform.system() == 'Windows':
+    from setuptools.extern.six.moves import winreg
+    safe_env = os.environ
+else:
+    """
+    Mock winreg and environ so the module can be imported
+    on this platform.
+    """
+
+    class winreg:
+        HKEY_USERS = None
+        HKEY_CURRENT_USER = None
+        HKEY_LOCAL_MACHINE = None
+        HKEY_CLASSES_ROOT = None
+
+    safe_env = dict()
+
+_msvc9_suppress_errors = (
+    # msvc9compiler isn't available on some platforms
+    ImportError,
+
+    # msvc9compiler raises DistutilsPlatformError in some
+    # environments. See #1118.
+    distutils.errors.DistutilsPlatformError,
+)
+
+try:
+    from distutils.msvc9compiler import Reg
+except _msvc9_suppress_errors:
+    pass
+
+
+def msvc9_find_vcvarsall(version):
+    """
+    Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone
+    compiler build for Python (VCForPython). Fall back to original behavior
+    when the standalone compiler is not available.
+
+    Redirect the path of "vcvarsall.bat".
+
+    Known supported compilers
+    -------------------------
+    Microsoft Visual C++ 9.0:
+        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
+
+    Parameters
+    ----------
+    version: float
+        Required Microsoft Visual C++ version.
+
+    Return
+    ------
+    vcvarsall.bat path: str
+    """
+    VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f'
+    key = VC_BASE % ('', version)
+    try:
+        # Per-user installs register the compiler path here
+        productdir = Reg.get_value(key, "installdir")
+    except KeyError:
+        try:
+            # All-user installs on a 64-bit system register here
+            key = VC_BASE % ('Wow6432Node\\', version)
+            productdir = Reg.get_value(key, "installdir")
+        except KeyError:
+            productdir = None
+
+    if productdir:
+        vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat")
+        if os.path.isfile(vcvarsall):
+            return vcvarsall
+
+    return get_unpatched(msvc9_find_vcvarsall)(version)
+
+
+def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs):
+    """
+    Patched "distutils.msvc9compiler.query_vcvarsall" for support extra
+    compilers.
+
+    Set environment without use of "vcvarsall.bat".
+
+    Known supported compilers
+    -------------------------
+    Microsoft Visual C++ 9.0:
+        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
+        Microsoft Windows SDK 6.1 (x86, x64, ia64)
+        Microsoft Windows SDK 7.0 (x86, x64, ia64)
+
+    Microsoft Visual C++ 10.0:
+        Microsoft Windows SDK 7.1 (x86, x64, ia64)
+
+    Parameters
+    ----------
+    ver: float
+        Required Microsoft Visual C++ version.
+    arch: str
+        Target architecture.
+
+    Return
+    ------
+    environment: dict
+    """
+    # Try to get environement from vcvarsall.bat (Classical way)
+    try:
+        orig = get_unpatched(msvc9_query_vcvarsall)
+        return orig(ver, arch, *args, **kwargs)
+    except distutils.errors.DistutilsPlatformError:
+        # Pass error if Vcvarsall.bat is missing
+        pass
+    except ValueError:
+        # Pass error if environment not set after executing vcvarsall.bat
+        pass
+
+    # If error, try to set environment directly
+    try:
+        return EnvironmentInfo(arch, ver).return_env()
+    except distutils.errors.DistutilsPlatformError as exc:
+        _augment_exception(exc, ver, arch)
+        raise
+
+
+def msvc14_get_vc_env(plat_spec):
+    """
+    Patched "distutils._msvccompiler._get_vc_env" for support extra
+    compilers.
+
+    Set environment without use of "vcvarsall.bat".
+
+    Known supported compilers
+    -------------------------
+    Microsoft Visual C++ 14.0:
+        Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
+        Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
+        Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)
+
+    Parameters
+    ----------
+    plat_spec: str
+        Target architecture.
+
+    Return
+    ------
+    environment: dict
+    """
+    # Try to get environment from vcvarsall.bat (Classical way)
+    try:
+        return get_unpatched(msvc14_get_vc_env)(plat_spec)
+    except distutils.errors.DistutilsPlatformError:
+        # Pass error Vcvarsall.bat is missing
+        pass
+
+    # If error, try to set environment directly
+    try:
+        return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env()
+    except distutils.errors.DistutilsPlatformError as exc:
+        _augment_exception(exc, 14.0)
+        raise
+
+
+def msvc14_gen_lib_options(*args, **kwargs):
+    """
+    Patched "distutils._msvccompiler.gen_lib_options" for fix
+    compatibility between "numpy.distutils" and "distutils._msvccompiler"
+    (for Numpy < 1.11.2)
+    """
+    if "numpy.distutils" in sys.modules:
+        import numpy as np
+        if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'):
+            return np.distutils.ccompiler.gen_lib_options(*args, **kwargs)
+    return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs)
+
+
+def _augment_exception(exc, version, arch=''):
+    """
+    Add details to the exception message to help guide the user
+    as to what action will resolve it.
+    """
+    # Error if MSVC++ directory not found or environment not set
+    message = exc.args[0]
+
+    if "vcvarsall" in message.lower() or "visual c" in message.lower():
+        # Special error message if MSVC++ not installed
+        tmpl = 'Microsoft Visual C++ {version:0.1f} is required.'
+        message = tmpl.format(**locals())
+        msdownload = 'www.microsoft.com/download/details.aspx?id=%d'
+        if version == 9.0:
+            if arch.lower().find('ia64') > -1:
+                # For VC++ 9.0, if IA64 support is needed, redirect user
+                # to Windows SDK 7.0
+                message += ' Get it with "Microsoft Windows SDK 7.0": '
+                message += msdownload % 3138
+            else:
+                # For VC++ 9.0 redirect user to Vc++ for Python 2.7 :
+                # This redirection link is maintained by Microsoft.
+                # Contact vspython@microsoft.com if it needs updating.
+                message += ' Get it from http://aka.ms/vcpython27'
+        elif version == 10.0:
+            # For VC++ 10.0 Redirect user to Windows SDK 7.1
+            message += ' Get it with "Microsoft Windows SDK 7.1": '
+            message += msdownload % 8279
+        elif version >= 14.0:
+            # For VC++ 14.0 Redirect user to Visual C++ Build Tools
+            message += (' Get it with "Microsoft Visual C++ Build Tools": '
+                        r'https://visualstudio.microsoft.com/downloads/')
+
+    exc.args = (message, )
+
+
+class PlatformInfo:
+    """
+    Current and Target Architectures informations.
+
+    Parameters
+    ----------
+    arch: str
+        Target architecture.
+    """
+    current_cpu = safe_env.get('processor_architecture', '').lower()
+
+    def __init__(self, arch):
+        self.arch = arch.lower().replace('x64', 'amd64')
+
+    @property
+    def target_cpu(self):
+        return self.arch[self.arch.find('_') + 1:]
+
+    def target_is_x86(self):
+        return self.target_cpu == 'x86'
+
+    def current_is_x86(self):
+        return self.current_cpu == 'x86'
+
+    def current_dir(self, hidex86=False, x64=False):
+        """
+        Current platform specific subfolder.
+
+        Parameters
+        ----------
+        hidex86: bool
+            return '' and not '\x86' if architecture is x86.
+        x64: bool
+            return '\x64' and not '\amd64' if architecture is amd64.
+
+        Return
+        ------
+        subfolder: str
+            '\target', or '' (see hidex86 parameter)
+        """
+        return (
+            '' if (self.current_cpu == 'x86' and hidex86) else
+            r'\x64' if (self.current_cpu == 'amd64' and x64) else
+            r'\%s' % self.current_cpu
+        )
+
+    def target_dir(self, hidex86=False, x64=False):
+        r"""
+        Target platform specific subfolder.
+
+        Parameters
+        ----------
+        hidex86: bool
+            return '' and not '\x86' if architecture is x86.
+        x64: bool
+            return '\x64' and not '\amd64' if architecture is amd64.
+
+        Return
+        ------
+        subfolder: str
+            '\current', or '' (see hidex86 parameter)
+        """
+        return (
+            '' if (self.target_cpu == 'x86' and hidex86) else
+            r'\x64' if (self.target_cpu == 'amd64' and x64) else
+            r'\%s' % self.target_cpu
+        )
+
+    def cross_dir(self, forcex86=False):
+        r"""
+        Cross platform specific subfolder.
+
+        Parameters
+        ----------
+        forcex86: bool
+            Use 'x86' as current architecture even if current acritecture is
+            not x86.
+
+        Return
+        ------
+        subfolder: str
+            '' if target architecture is current architecture,
+            '\current_target' if not.
+        """
+        current = 'x86' if forcex86 else self.current_cpu
+        return (
+            '' if self.target_cpu == current else
+            self.target_dir().replace('\\', '\\%s_' % current)
+        )
+
+
+class RegistryInfo:
+    """
+    Microsoft Visual Studio related registry informations.
+
+    Parameters
+    ----------
+    platform_info: PlatformInfo
+        "PlatformInfo" instance.
+    """
+    HKEYS = (winreg.HKEY_USERS,
+             winreg.HKEY_CURRENT_USER,
+             winreg.HKEY_LOCAL_MACHINE,
+             winreg.HKEY_CLASSES_ROOT)
+
+    def __init__(self, platform_info):
+        self.pi = platform_info
+
+    @property
+    def visualstudio(self):
+        """
+        Microsoft Visual Studio root registry key.
+        """
+        return 'VisualStudio'
+
+    @property
+    def sxs(self):
+        """
+        Microsoft Visual Studio SxS registry key.
+        """
+        return os.path.join(self.visualstudio, 'SxS')
+
+    @property
+    def vc(self):
+        """
+        Microsoft Visual C++ VC7 registry key.
+        """
+        return os.path.join(self.sxs, 'VC7')
+
+    @property
+    def vs(self):
+        """
+        Microsoft Visual Studio VS7 registry key.
+        """
+        return os.path.join(self.sxs, 'VS7')
+
+    @property
+    def vc_for_python(self):
+        """
+        Microsoft Visual C++ for Python registry key.
+        """
+        return r'DevDiv\VCForPython'
+
+    @property
+    def microsoft_sdk(self):
+        """
+        Microsoft SDK registry key.
+        """
+        return 'Microsoft SDKs'
+
+    @property
+    def windows_sdk(self):
+        """
+        Microsoft Windows/Platform SDK registry key.
+        """
+        return os.path.join(self.microsoft_sdk, 'Windows')
+
+    @property
+    def netfx_sdk(self):
+        """
+        Microsoft .NET Framework SDK registry key.
+        """
+        return os.path.join(self.microsoft_sdk, 'NETFXSDK')
+
+    @property
+    def windows_kits_roots(self):
+        """
+        Microsoft Windows Kits Roots registry key.
+        """
+        return r'Windows Kits\Installed Roots'
+
+    def microsoft(self, key, x86=False):
+        """
+        Return key in Microsoft software registry.
+
+        Parameters
+        ----------
+        key: str
+            Registry key path where look.
+        x86: str
+            Force x86 software registry.
+
+        Return
+        ------
+        str: value
+        """
+        node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node'
+        return os.path.join('Software', node64, 'Microsoft', key)
+
+    def lookup(self, key, name):
+        """
+        Look for values in registry in Microsoft software registry.
+
+        Parameters
+        ----------
+        key: str
+            Registry key path where look.
+        name: str
+            Value name to find.
+
+        Return
+        ------
+        str: value
+        """
+        KEY_READ = winreg.KEY_READ
+        openkey = winreg.OpenKey
+        ms = self.microsoft
+        for hkey in self.HKEYS:
+            try:
+                bkey = openkey(hkey, ms(key), 0, KEY_READ)
+            except (OSError, IOError):
+                if not self.pi.current_is_x86():
+                    try:
+                        bkey = openkey(hkey, ms(key, True), 0, KEY_READ)
+                    except (OSError, IOError):
+                        continue
+                else:
+                    continue
+            try:
+                return winreg.QueryValueEx(bkey, name)[0]
+            except (OSError, IOError):
+                pass
+
+
+class SystemInfo:
+    """
+    Microsoft Windows and Visual Studio related system inormations.
+
+    Parameters
+    ----------
+    registry_info: RegistryInfo
+        "RegistryInfo" instance.
+    vc_ver: float
+        Required Microsoft Visual C++ version.
+    """
+
+    # Variables and properties in this class use originals CamelCase variables
+    # names from Microsoft source files for more easy comparaison.
+    WinDir = safe_env.get('WinDir', '')
+    ProgramFiles = safe_env.get('ProgramFiles', '')
+    ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles)
+
+    def __init__(self, registry_info, vc_ver=None):
+        self.ri = registry_info
+        self.pi = self.ri.pi
+        self.vc_ver = vc_ver or self._find_latest_available_vc_ver()
+
+    def _find_latest_available_vc_ver(self):
+        try:
+            return self.find_available_vc_vers()[-1]
+        except IndexError:
+            err = 'No Microsoft Visual C++ version found'
+            raise distutils.errors.DistutilsPlatformError(err)
+
+    def find_available_vc_vers(self):
+        """
+        Find all available Microsoft Visual C++ versions.
+        """
+        ms = self.ri.microsoft
+        vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs)
+        vc_vers = []
+        for hkey in self.ri.HKEYS:
+            for key in vckeys:
+                try:
+                    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 vc_vers:
+                            vc_vers.append(ver)
+                    except ValueError:
+                        pass
+                for i in range(subkeys):
+                    try:
+                        ver = float(winreg.EnumKey(bkey, i))
+                        if ver not in vc_vers:
+                            vc_vers.append(ver)
+                    except ValueError:
+                        pass
+        return sorted(vc_vers)
+
+    @property
+    def VSInstallDir(self):
+        """
+        Microsoft Visual Studio directory.
+        """
+        # Default path
+        name = 'Microsoft Visual Studio %0.1f' % self.vc_ver
+        default = os.path.join(self.ProgramFilesx86, name)
+
+        # Try to get path from registry, if fail use default path
+        return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default
+
+    @property
+    def VCInstallDir(self):
+        """
+        Microsoft Visual C++ directory.
+        """
+        self.VSInstallDir
+
+        guess_vc = self._guess_vc() or self._guess_vc_legacy()
+
+        # Try to get "VC++ for Python" path from registry as default path
+        reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver)
+        python_vc = self.ri.lookup(reg_path, 'installdir')
+        default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc
+
+        # Try to get path from registry, if fail use default path
+        path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc
+
+        if not os.path.isdir(path):
+            msg = 'Microsoft Visual C++ directory not found'
+            raise distutils.errors.DistutilsPlatformError(msg)
+
+        return path
+
+    def _guess_vc(self):
+        """
+        Locate Visual C for 2017
+        """
+        if self.vc_ver <= 14.0:
+            return
+
+        default = r'VC\Tools\MSVC'
+        guess_vc = os.path.join(self.VSInstallDir, default)
+        # Subdir with VC exact version as name
+        try:
+            vc_exact_ver = os.listdir(guess_vc)[-1]
+            return os.path.join(guess_vc, vc_exact_ver)
+        except (OSError, IOError, IndexError):
+            pass
+
+    def _guess_vc_legacy(self):
+        """
+        Locate Visual C for versions prior to 2017
+        """
+        default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver
+        return os.path.join(self.ProgramFilesx86, default)
+
+    @property
+    def WindowsSdkVersion(self):
+        """
+        Microsoft Windows SDK versions for specified MSVC++ version.
+        """
+        if self.vc_ver <= 9.0:
+            return ('7.0', '6.1', '6.0a')
+        elif self.vc_ver == 10.0:
+            return ('7.1', '7.0a')
+        elif self.vc_ver == 11.0:
+            return ('8.0', '8.0a')
+        elif self.vc_ver == 12.0:
+            return ('8.1', '8.1a')
+        elif self.vc_ver >= 14.0:
+            return ('10.0', '8.1')
+
+    @property
+    def WindowsSdkLastVersion(self):
+        """
+        Microsoft Windows SDK last version
+        """
+        return self._use_last_dir_name(os.path.join(
+            self.WindowsSdkDir, 'lib'))
+
+    @property
+    def WindowsSdkDir(self):
+        """
+        Microsoft Windows SDK directory.
+        """
+        sdkdir = ''
+        for ver in self.WindowsSdkVersion:
+            # Try to get it from registry
+            loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver)
+            sdkdir = self.ri.lookup(loc, 'installationfolder')
+            if sdkdir:
+                break
+        if not sdkdir or not os.path.isdir(sdkdir):
+            # Try to get "VC++ for Python" version from registry
+            path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver)
+            install_base = self.ri.lookup(path, 'installdir')
+            if install_base:
+                sdkdir = os.path.join(install_base, 'WinSDK')
+        if not sdkdir or not os.path.isdir(sdkdir):
+            # If fail, use default new path
+            for ver in self.WindowsSdkVersion:
+                intver = ver[:ver.rfind('.')]
+                path = r'Microsoft SDKs\Windows Kits\%s' % (intver)
+                d = os.path.join(self.ProgramFiles, path)
+                if os.path.isdir(d):
+                    sdkdir = d
+        if not sdkdir or not os.path.isdir(sdkdir):
+            # If fail, use default old path
+            for ver in self.WindowsSdkVersion:
+                path = r'Microsoft SDKs\Windows\v%s' % ver
+                d = os.path.join(self.ProgramFiles, path)
+                if os.path.isdir(d):
+                    sdkdir = d
+        if not sdkdir:
+            # If fail, use Platform SDK
+            sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK')
+        return sdkdir
+
+    @property
+    def WindowsSDKExecutablePath(self):
+        """
+        Microsoft Windows SDK executable directory.
+        """
+        # Find WinSDK NetFx Tools registry dir name
+        if self.vc_ver <= 11.0:
+            netfxver = 35
+            arch = ''
+        else:
+            netfxver = 40
+            hidex86 = True if self.vc_ver <= 12.0 else False
+            arch = self.pi.current_dir(x64=True, hidex86=hidex86)
+        fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-'))
+
+        # liste all possibles registry paths
+        regpaths = []
+        if self.vc_ver >= 14.0:
+            for ver in self.NetFxSdkVersion:
+                regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)]
+
+        for ver in self.WindowsSdkVersion:
+            regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)]
+
+        # Return installation folder from the more recent path
+        for path in regpaths:
+            execpath = self.ri.lookup(path, 'installationfolder')
+            if execpath:
+                break
+        return execpath
+
+    @property
+    def FSharpInstallDir(self):
+        """
+        Microsoft Visual F# directory.
+        """
+        path = r'%0.1f\Setup\F#' % self.vc_ver
+        path = os.path.join(self.ri.visualstudio, path)
+        return self.ri.lookup(path, 'productdir') or ''
+
+    @property
+    def UniversalCRTSdkDir(self):
+        """
+        Microsoft Universal CRT SDK directory.
+        """
+        # Set Kit Roots versions for specified MSVC++ version
+        if self.vc_ver >= 14.0:
+            vers = ('10', '81')
+        else:
+            vers = ()
+
+        # Find path of the more recent Kit
+        for ver in vers:
+            sdkdir = self.ri.lookup(self.ri.windows_kits_roots,
+                                    'kitsroot%s' % ver)
+            if sdkdir:
+                break
+        return sdkdir or ''
+
+    @property
+    def UniversalCRTSdkLastVersion(self):
+        """
+        Microsoft Universal C Runtime SDK last version
+        """
+        return self._use_last_dir_name(os.path.join(
+            self.UniversalCRTSdkDir, 'lib'))
+
+    @property
+    def NetFxSdkVersion(self):
+        """
+        Microsoft .NET Framework SDK versions.
+        """
+        # Set FxSdk versions for specified MSVC++ version
+        if self.vc_ver >= 14.0:
+            return ('4.6.1', '4.6')
+        else:
+            return ()
+
+    @property
+    def NetFxSdkDir(self):
+        """
+        Microsoft .NET Framework SDK directory.
+        """
+        for ver in self.NetFxSdkVersion:
+            loc = os.path.join(self.ri.netfx_sdk, ver)
+            sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder')
+            if sdkdir:
+                break
+        return sdkdir or ''
+
+    @property
+    def FrameworkDir32(self):
+        """
+        Microsoft .NET Framework 32bit directory.
+        """
+        # Default path
+        guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework')
+
+        # Try to get path from registry, if fail use default path
+        return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw
+
+    @property
+    def FrameworkDir64(self):
+        """
+        Microsoft .NET Framework 64bit directory.
+        """
+        # Default path
+        guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64')
+
+        # Try to get path from registry, if fail use default path
+        return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw
+
+    @property
+    def FrameworkVersion32(self):
+        """
+        Microsoft .NET Framework 32bit versions.
+        """
+        return self._find_dot_net_versions(32)
+
+    @property
+    def FrameworkVersion64(self):
+        """
+        Microsoft .NET Framework 64bit versions.
+        """
+        return self._find_dot_net_versions(64)
+
+    def _find_dot_net_versions(self, bits):
+        """
+        Find Microsoft .NET Framework versions.
+
+        Parameters
+        ----------
+        bits: int
+            Platform number of bits: 32 or 64.
+        """
+        # Find actual .NET version in registry
+        reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits)
+        dot_net_dir = getattr(self, 'FrameworkDir%d' % bits)
+        ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or ''
+
+        # Set .NET versions for specified MSVC++ version
+        if self.vc_ver >= 12.0:
+            frameworkver = (ver, 'v4.0')
+        elif self.vc_ver >= 10.0:
+            frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver,
+                            'v3.5')
+        elif self.vc_ver == 9.0:
+            frameworkver = ('v3.5', 'v2.0.50727')
+        if self.vc_ver == 8.0:
+            frameworkver = ('v3.0', 'v2.0.50727')
+        return frameworkver
+
+    def _use_last_dir_name(self, path, prefix=''):
+        """
+        Return name of the last dir in path or '' if no dir found.
+
+        Parameters
+        ----------
+        path: str
+            Use dirs in this path
+        prefix: str
+            Use only dirs startings by this prefix
+        """
+        matching_dirs = (
+            dir_name
+            for dir_name in reversed(os.listdir(path))
+            if os.path.isdir(os.path.join(path, dir_name)) and
+            dir_name.startswith(prefix)
+        )
+        return next(matching_dirs, None) or ''
+
+
+class EnvironmentInfo:
+    """
+    Return environment variables for specified Microsoft Visual C++ version
+    and platform : Lib, Include, Path and libpath.
+
+    This function is compatible with Microsoft Visual C++ 9.0 to 14.0.
+
+    Script created by analysing Microsoft environment configuration files like
+    "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...
+
+    Parameters
+    ----------
+    arch: str
+        Target architecture.
+    vc_ver: float
+        Required Microsoft Visual C++ version. If not set, autodetect the last
+        version.
+    vc_min_ver: float
+        Minimum Microsoft Visual C++ version.
+    """
+
+    # Variables and properties in this class use originals CamelCase variables
+    # names from Microsoft source files for more easy comparaison.
+
+    def __init__(self, arch, vc_ver=None, vc_min_ver=0):
+        self.pi = PlatformInfo(arch)
+        self.ri = RegistryInfo(self.pi)
+        self.si = SystemInfo(self.ri, vc_ver)
+
+        if self.vc_ver < vc_min_ver:
+            err = 'No suitable Microsoft Visual C++ version found'
+            raise distutils.errors.DistutilsPlatformError(err)
+
+    @property
+    def vc_ver(self):
+        """
+        Microsoft Visual C++ version.
+        """
+        return self.si.vc_ver
+
+    @property
+    def VSTools(self):
+        """
+        Microsoft Visual Studio Tools
+        """
+        paths = [r'Common7\IDE', r'Common7\Tools']
+
+        if self.vc_ver >= 14.0:
+            arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
+            paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow']
+            paths += [r'Team Tools\Performance Tools']
+            paths += [r'Team Tools\Performance Tools%s' % arch_subdir]
+
+        return [os.path.join(self.si.VSInstallDir, path) for path in paths]
+
+    @property
+    def VCIncludes(self):
+        """
+        Microsoft Visual C++ & Microsoft Foundation Class Includes
+        """
+        return [os.path.join(self.si.VCInstallDir, 'Include'),
+                os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')]
+
+    @property
+    def VCLibraries(self):
+        """
+        Microsoft Visual C++ & Microsoft Foundation Class Libraries
+        """
+        if self.vc_ver >= 15.0:
+            arch_subdir = self.pi.target_dir(x64=True)
+        else:
+            arch_subdir = self.pi.target_dir(hidex86=True)
+        paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir]
+
+        if self.vc_ver >= 14.0:
+            paths += [r'Lib\store%s' % arch_subdir]
+
+        return [os.path.join(self.si.VCInstallDir, path) for path in paths]
+
+    @property
+    def VCStoreRefs(self):
+        """
+        Microsoft Visual C++ store references Libraries
+        """
+        if self.vc_ver < 14.0:
+            return []
+        return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')]
+
+    @property
+    def VCTools(self):
+        """
+        Microsoft Visual C++ Tools
+        """
+        si = self.si
+        tools = [os.path.join(si.VCInstallDir, 'VCPackages')]
+
+        forcex86 = True if self.vc_ver <= 10.0 else False
+        arch_subdir = self.pi.cross_dir(forcex86)
+        if arch_subdir:
+            tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)]
+
+        if self.vc_ver == 14.0:
+            path = 'Bin%s' % self.pi.current_dir(hidex86=True)
+            tools += [os.path.join(si.VCInstallDir, path)]
+
+        elif self.vc_ver >= 15.0:
+            host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else
+                        r'bin\HostX64%s')
+            tools += [os.path.join(
+                si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))]
+
+            if self.pi.current_cpu != self.pi.target_cpu:
+                tools += [os.path.join(
+                    si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))]
+
+        else:
+            tools += [os.path.join(si.VCInstallDir, 'Bin')]
+
+        return tools
+
+    @property
+    def OSLibraries(self):
+        """
+        Microsoft Windows SDK Libraries
+        """
+        if self.vc_ver <= 10.0:
+            arch_subdir = self.pi.target_dir(hidex86=True, x64=True)
+            return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)]
+
+        else:
+            arch_subdir = self.pi.target_dir(x64=True)
+            lib = os.path.join(self.si.WindowsSdkDir, 'lib')
+            libver = self._sdk_subdir
+            return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))]
+
+    @property
+    def OSIncludes(self):
+        """
+        Microsoft Windows SDK Include
+        """
+        include = os.path.join(self.si.WindowsSdkDir, 'include')
+
+        if self.vc_ver <= 10.0:
+            return [include, os.path.join(include, 'gl')]
+
+        else:
+            if self.vc_ver >= 14.0:
+                sdkver = self._sdk_subdir
+            else:
+                sdkver = ''
+            return [os.path.join(include, '%sshared' % sdkver),
+                    os.path.join(include, '%sum' % sdkver),
+                    os.path.join(include, '%swinrt' % sdkver)]
+
+    @property
+    def OSLibpath(self):
+        """
+        Microsoft Windows SDK Libraries Paths
+        """
+        ref = os.path.join(self.si.WindowsSdkDir, 'References')
+        libpath = []
+
+        if self.vc_ver <= 9.0:
+            libpath += self.OSLibraries
+
+        if self.vc_ver >= 11.0:
+            libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')]
+
+        if self.vc_ver >= 14.0:
+            libpath += [
+                ref,
+                os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'),
+                os.path.join(
+                    ref,
+                    'Windows.Foundation.UniversalApiContract',
+                    '1.0.0.0',
+                ),
+                os.path.join(
+                    ref,
+                    'Windows.Foundation.FoundationContract',
+                    '1.0.0.0',
+                ),
+                os.path.join(
+                    ref,
+                    'Windows.Networking.Connectivity.WwanContract',
+                    '1.0.0.0',
+                ),
+                os.path.join(
+                    self.si.WindowsSdkDir,
+                    'ExtensionSDKs',
+                    'Microsoft.VCLibs',
+                    '%0.1f' % self.vc_ver,
+                    'References',
+                    'CommonConfiguration',
+                    'neutral',
+                ),
+            ]
+        return libpath
+
+    @property
+    def SdkTools(self):
+        """
+        Microsoft Windows SDK Tools
+        """
+        return list(self._sdk_tools())
+
+    def _sdk_tools(self):
+        """
+        Microsoft Windows SDK Tools paths generator
+        """
+        if self.vc_ver < 15.0:
+            bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86'
+            yield os.path.join(self.si.WindowsSdkDir, bin_dir)
+
+        if not self.pi.current_is_x86():
+            arch_subdir = self.pi.current_dir(x64=True)
+            path = 'Bin%s' % arch_subdir
+            yield os.path.join(self.si.WindowsSdkDir, path)
+
+        if self.vc_ver == 10.0 or self.vc_ver == 11.0:
+            if self.pi.target_is_x86():
+                arch_subdir = ''
+            else:
+                arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
+            path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir
+            yield os.path.join(self.si.WindowsSdkDir, path)
+
+        elif self.vc_ver >= 15.0:
+            path = os.path.join(self.si.WindowsSdkDir, 'Bin')
+            arch_subdir = self.pi.current_dir(x64=True)
+            sdkver = self.si.WindowsSdkLastVersion
+            yield os.path.join(path, '%s%s' % (sdkver, arch_subdir))
+
+        if self.si.WindowsSDKExecutablePath:
+            yield self.si.WindowsSDKExecutablePath
+
+    @property
+    def _sdk_subdir(self):
+        """
+        Microsoft Windows SDK version subdir
+        """
+        ucrtver = self.si.WindowsSdkLastVersion
+        return ('%s\\' % ucrtver) if ucrtver else ''
+
+    @property
+    def SdkSetup(self):
+        """
+        Microsoft Windows SDK Setup
+        """
+        if self.vc_ver > 9.0:
+            return []
+
+        return [os.path.join(self.si.WindowsSdkDir, 'Setup')]
+
+    @property
+    def FxTools(self):
+        """
+        Microsoft .NET Framework Tools
+        """
+        pi = self.pi
+        si = self.si
+
+        if self.vc_ver <= 10.0:
+            include32 = True
+            include64 = not pi.target_is_x86() and not pi.current_is_x86()
+        else:
+            include32 = pi.target_is_x86() or pi.current_is_x86()
+            include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64'
+
+        tools = []
+        if include32:
+            tools += [os.path.join(si.FrameworkDir32, ver)
+                      for ver in si.FrameworkVersion32]
+        if include64:
+            tools += [os.path.join(si.FrameworkDir64, ver)
+                      for ver in si.FrameworkVersion64]
+        return tools
+
+    @property
+    def NetFxSDKLibraries(self):
+        """
+        Microsoft .Net Framework SDK Libraries
+        """
+        if self.vc_ver < 14.0 or not self.si.NetFxSdkDir:
+            return []
+
+        arch_subdir = self.pi.target_dir(x64=True)
+        return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)]
+
+    @property
+    def NetFxSDKIncludes(self):
+        """
+        Microsoft .Net Framework SDK Includes
+        """
+        if self.vc_ver < 14.0 or not self.si.NetFxSdkDir:
+            return []
+
+        return [os.path.join(self.si.NetFxSdkDir, r'include\um')]
+
+    @property
+    def VsTDb(self):
+        """
+        Microsoft Visual Studio Team System Database
+        """
+        return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')]
+
+    @property
+    def MSBuild(self):
+        """
+        Microsoft Build Engine
+        """
+        if self.vc_ver < 12.0:
+            return []
+        elif self.vc_ver < 15.0:
+            base_path = self.si.ProgramFilesx86
+            arch_subdir = self.pi.current_dir(hidex86=True)
+        else:
+            base_path = self.si.VSInstallDir
+            arch_subdir = ''
+
+        path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir)
+        build = [os.path.join(base_path, path)]
+
+        if self.vc_ver >= 15.0:
+            # Add Roslyn C# & Visual Basic Compiler
+            build += [os.path.join(base_path, path, 'Roslyn')]
+
+        return build
+
+    @property
+    def HTMLHelpWorkshop(self):
+        """
+        Microsoft HTML Help Workshop
+        """
+        if self.vc_ver < 11.0:
+            return []
+
+        return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')]
+
+    @property
+    def UCRTLibraries(self):
+        """
+        Microsoft Universal C Runtime SDK Libraries
+        """
+        if self.vc_ver < 14.0:
+            return []
+
+        arch_subdir = self.pi.target_dir(x64=True)
+        lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib')
+        ucrtver = self._ucrt_subdir
+        return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))]
+
+    @property
+    def UCRTIncludes(self):
+        """
+        Microsoft Universal C Runtime SDK Include
+        """
+        if self.vc_ver < 14.0:
+            return []
+
+        include = os.path.join(self.si.UniversalCRTSdkDir, 'include')
+        return [os.path.join(include, '%sucrt' % self._ucrt_subdir)]
+
+    @property
+    def _ucrt_subdir(self):
+        """
+        Microsoft Universal C Runtime SDK version subdir
+        """
+        ucrtver = self.si.UniversalCRTSdkLastVersion
+        return ('%s\\' % ucrtver) if ucrtver else ''
+
+    @property
+    def FSharp(self):
+        """
+        Microsoft Visual F#
+        """
+        if self.vc_ver < 11.0 and self.vc_ver > 12.0:
+            return []
+
+        return self.si.FSharpInstallDir
+
+    @property
+    def VCRuntimeRedist(self):
+        """
+        Microsoft Visual C++ runtime redistribuable dll
+        """
+        arch_subdir = self.pi.target_dir(x64=True)
+        if self.vc_ver < 15:
+            redist_path = self.si.VCInstallDir
+            vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll'
+        else:
+            redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist')
+            vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll'
+
+        # Visual Studio 2017  is still Visual C++ 14.0
+        dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver
+
+        vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver)
+        return os.path.join(redist_path, vcruntime)
+
+    def return_env(self, exists=True):
+        """
+        Return environment dict.
+
+        Parameters
+        ----------
+        exists: bool
+            It True, only return existing paths.
+        """
+        env = dict(
+            include=self._build_paths('include',
+                                      [self.VCIncludes,
+                                       self.OSIncludes,
+                                       self.UCRTIncludes,
+                                       self.NetFxSDKIncludes],
+                                      exists),
+            lib=self._build_paths('lib',
+                                  [self.VCLibraries,
+                                   self.OSLibraries,
+                                   self.FxTools,
+                                   self.UCRTLibraries,
+                                   self.NetFxSDKLibraries],
+                                  exists),
+            libpath=self._build_paths('libpath',
+                                      [self.VCLibraries,
+                                       self.FxTools,
+                                       self.VCStoreRefs,
+                                       self.OSLibpath],
+                                      exists),
+            path=self._build_paths('path',
+                                   [self.VCTools,
+                                    self.VSTools,
+                                    self.VsTDb,
+                                    self.SdkTools,
+                                    self.SdkSetup,
+                                    self.FxTools,
+                                    self.MSBuild,
+                                    self.HTMLHelpWorkshop,
+                                    self.FSharp],
+                                   exists),
+        )
+        if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist):
+            env['py_vcruntime_redist'] = self.VCRuntimeRedist
+        return env
+
+    def _build_paths(self, name, spec_path_lists, exists):
+        """
+        Given an environment variable name and specified paths,
+        return a pathsep-separated string of paths containing
+        unique, extant, directories from those paths and from
+        the environment variable. Raise an error if no paths
+        are resolved.
+        """
+        # flatten spec_path_lists
+        spec_paths = itertools.chain.from_iterable(spec_path_lists)
+        env_paths = safe_env.get(name, '').split(os.pathsep)
+        paths = itertools.chain(spec_paths, env_paths)
+        extant_paths = list(filter(os.path.isdir, paths)) if exists else paths
+        if not extant_paths:
+            msg = "%s environment variable is empty" % name.upper()
+            raise distutils.errors.DistutilsPlatformError(msg)
+        unique_paths = self._unique_everseen(extant_paths)
+        return os.pathsep.join(unique_paths)
+
+    # from Python docs
+    def _unique_everseen(self, iterable, key=None):
+        """
+        List unique elements, preserving order.
+        Remember all elements ever seen.
+
+        _unique_everseen('AAAABBBCCDAABBB') --> A B C D
+
+        _unique_everseen('ABBCcAD', str.lower) --> A B C D
+        """
+        seen = set()
+        seen_add = seen.add
+        if key is None:
+            for element in filterfalse(seen.__contains__, iterable):
+                seen_add(element)
+                yield element
+        else:
+            for element in iterable:
+                k = key(element)
+                if k not in seen:
+                    seen_add(k)
+                    yield element
diff --git a/venv/lib/python2.7/site-packages/setuptools/msvc.pyc b/venv/lib/python2.7/site-packages/setuptools/msvc.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3c089e83aa42f48d5a5c5957c6274e6587440073
GIT binary patch
literal 44714
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
Lv~a8Ne}+T=0q@|q

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/namespaces.py b/venv/lib/python2.7/site-packages/setuptools/namespaces.py
new file mode 100644
index 00000000..dc16106d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/namespaces.py
@@ -0,0 +1,107 @@
+import os
+from distutils import log
+import itertools
+
+from setuptools.extern.six.moves import map
+
+
+flatten = itertools.chain.from_iterable
+
+
+class Installer:
+
+    nspkg_ext = '-nspkg.pth'
+
+    def install_namespaces(self):
+        nsp = self._get_all_ns_packages()
+        if not nsp:
+            return
+        filename, ext = os.path.splitext(self._get_target())
+        filename += self.nspkg_ext
+        self.outputs.append(filename)
+        log.info("Installing %s", filename)
+        lines = map(self._gen_nspkg_line, nsp)
+
+        if self.dry_run:
+            # always generate the lines, even in dry run
+            list(lines)
+            return
+
+        with open(filename, 'wt') as f:
+            f.writelines(lines)
+
+    def uninstall_namespaces(self):
+        filename, ext = os.path.splitext(self._get_target())
+        filename += self.nspkg_ext
+        if not os.path.exists(filename):
+            return
+        log.info("Removing %s", filename)
+        os.remove(filename)
+
+    def _get_target(self):
+        return self.target
+
+    _nspkg_tmpl = (
+        "import sys, types, os",
+        "has_mfs = sys.version_info > (3, 5)",
+        "p = os.path.join(%(root)s, *%(pth)r)",
+        "importlib = has_mfs and __import__('importlib.util')",
+        "has_mfs and __import__('importlib.machinery')",
+        "m = has_mfs and "
+            "sys.modules.setdefault(%(pkg)r, "
+                "importlib.util.module_from_spec("
+                    "importlib.machinery.PathFinder.find_spec(%(pkg)r, "
+                        "[os.path.dirname(p)])))",
+        "m = m or "
+            "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))",
+        "mp = (m or []) and m.__dict__.setdefault('__path__',[])",
+        "(p not in mp) and mp.append(p)",
+    )
+    "lines for the namespace installer"
+
+    _nspkg_tmpl_multi = (
+        'm and setattr(sys.modules[%(parent)r], %(child)r, m)',
+    )
+    "additional line(s) when a parent package is indicated"
+
+    def _get_root(self):
+        return "sys._getframe(1).f_locals['sitedir']"
+
+    def _gen_nspkg_line(self, pkg):
+        # ensure pkg is not a unicode string under Python 2.7
+        pkg = str(pkg)
+        pth = tuple(pkg.split('.'))
+        root = self._get_root()
+        tmpl_lines = self._nspkg_tmpl
+        parent, sep, child = pkg.rpartition('.')
+        if parent:
+            tmpl_lines += self._nspkg_tmpl_multi
+        return ';'.join(tmpl_lines) % locals() + '\n'
+
+    def _get_all_ns_packages(self):
+        """Return sorted list of all package namespaces"""
+        pkgs = self.distribution.namespace_packages or []
+        return sorted(flatten(map(self._pkg_names, pkgs)))
+
+    @staticmethod
+    def _pkg_names(pkg):
+        """
+        Given a namespace package, yield the components of that
+        package.
+
+        >>> names = Installer._pkg_names('a.b.c')
+        >>> set(names) == set(['a', 'a.b', 'a.b.c'])
+        True
+        """
+        parts = pkg.split('.')
+        while parts:
+            yield '.'.join(parts)
+            parts.pop()
+
+
+class DevelopInstaller(Installer):
+    def _get_root(self):
+        return repr(str(self.egg_path))
+
+    def _get_target(self):
+        return self.egg_link
diff --git a/venv/lib/python2.7/site-packages/setuptools/namespaces.pyc b/venv/lib/python2.7/site-packages/setuptools/namespaces.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0df0819e628eb97823590863af96de6803cfd6d6
GIT binary patch
literal 5681
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
O0*pLN0?a(j!qEUx;g|FP

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/package_index.py b/venv/lib/python2.7/site-packages/setuptools/package_index.py
new file mode 100644
index 00000000..6b06f2ca
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/package_index.py
@@ -0,0 +1,1136 @@
+"""PyPI and direct package downloading"""
+import sys
+import os
+import re
+import shutil
+import socket
+import base64
+import hashlib
+import itertools
+import warnings
+from functools import wraps
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import urllib, http_client, configparser, map
+
+import setuptools
+from pkg_resources import (
+    CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST,
+    Environment, find_distributions, safe_name, safe_version,
+    to_filename, Requirement, DEVELOP_DIST, EGG_DIST,
+)
+from setuptools import ssl_support
+from distutils import log
+from distutils.errors import DistutilsError
+from fnmatch import translate
+from setuptools.py27compat import get_all_headers
+from setuptools.py33compat import unescape
+from setuptools.wheel import Wheel
+
+__metaclass__ = type
+
+EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$')
+HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I)
+PYPI_MD5 = re.compile(
+    r'<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)'
+    r'href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)'
+)
+URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match
+EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split()
+
+__all__ = [
+    'PackageIndex', 'distros_for_url', 'parse_bdist_wininst',
+    'interpret_distro_name',
+]
+
+_SOCKET_TIMEOUT = 15
+
+_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}"
+user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools)
+
+
+def parse_requirement_arg(spec):
+    try:
+        return Requirement.parse(spec)
+    except ValueError:
+        raise DistutilsError(
+            "Not a URL, existing file, or requirement spec: %r" % (spec,)
+        )
+
+
+def parse_bdist_wininst(name):
+    """Return (base,pyversion) or (None,None) for possible .exe name"""
+
+    lower = name.lower()
+    base, py_ver, plat = None, None, None
+
+    if lower.endswith('.exe'):
+        if lower.endswith('.win32.exe'):
+            base = name[:-10]
+            plat = 'win32'
+        elif lower.startswith('.win32-py', -16):
+            py_ver = name[-7:-4]
+            base = name[:-16]
+            plat = 'win32'
+        elif lower.endswith('.win-amd64.exe'):
+            base = name[:-14]
+            plat = 'win-amd64'
+        elif lower.startswith('.win-amd64-py', -20):
+            py_ver = name[-7:-4]
+            base = name[:-20]
+            plat = 'win-amd64'
+    return base, py_ver, plat
+
+
+def egg_info_for_url(url):
+    parts = urllib.parse.urlparse(url)
+    scheme, server, path, parameters, query, fragment = parts
+    base = urllib.parse.unquote(path.split('/')[-1])
+    if server == 'sourceforge.net' and base == 'download':  # XXX Yuck
+        base = urllib.parse.unquote(path.split('/')[-2])
+    if '#' in base:
+        base, fragment = base.split('#', 1)
+    return base, fragment
+
+
+def distros_for_url(url, metadata=None):
+    """Yield egg or source distribution objects that might be found at a URL"""
+    base, fragment = egg_info_for_url(url)
+    for dist in distros_for_location(url, base, metadata):
+        yield dist
+    if fragment:
+        match = EGG_FRAGMENT.match(fragment)
+        if match:
+            for dist in interpret_distro_name(
+                url, match.group(1), metadata, precedence=CHECKOUT_DIST
+            ):
+                yield dist
+
+
+def distros_for_location(location, basename, metadata=None):
+    """Yield egg or source distribution objects based on basename"""
+    if basename.endswith('.egg.zip'):
+        basename = basename[:-4]  # strip the .zip
+    if basename.endswith('.egg') and '-' in basename:
+        # only one, unambiguous interpretation
+        return [Distribution.from_location(location, basename, metadata)]
+    if basename.endswith('.whl') and '-' in basename:
+        wheel = Wheel(basename)
+        if not wheel.is_compatible():
+            return []
+        return [Distribution(
+            location=location,
+            project_name=wheel.project_name,
+            version=wheel.version,
+            # Increase priority over eggs.
+            precedence=EGG_DIST + 1,
+        )]
+    if basename.endswith('.exe'):
+        win_base, py_ver, platform = parse_bdist_wininst(basename)
+        if win_base is not None:
+            return interpret_distro_name(
+                location, win_base, metadata, py_ver, BINARY_DIST, platform
+            )
+    # Try source distro extensions (.zip, .tgz, etc.)
+    #
+    for ext in EXTENSIONS:
+        if basename.endswith(ext):
+            basename = basename[:-len(ext)]
+            return interpret_distro_name(location, basename, metadata)
+    return []  # no extension matched
+
+
+def distros_for_filename(filename, metadata=None):
+    """Yield possible egg or source distribution objects based on a filename"""
+    return distros_for_location(
+        normalize_path(filename), os.path.basename(filename), metadata
+    )
+
+
+def interpret_distro_name(
+        location, basename, metadata, py_version=None, precedence=SOURCE_DIST,
+        platform=None
+):
+    """Generate alternative interpretations of a source distro name
+
+    Note: if `location` is a filesystem filename, you should call
+    ``pkg_resources.normalize_path()`` on it before passing it to this
+    routine!
+    """
+    # Generate alternative interpretations of a source distro name
+    # Because some packages are ambiguous as to name/versions split
+    # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc.
+    # So, we generate each possible interepretation (e.g. "adns, python-1.1.0"
+    # "adns-python, 1.1.0", and "adns-python-1.1.0, no version").  In practice,
+    # the spurious interpretations should be ignored, because in the event
+    # there's also an "adns" package, the spurious "python-1.1.0" version will
+    # compare lower than any numeric version number, and is therefore unlikely
+    # to match a request for it.  It's still a potential problem, though, and
+    # in the long run PyPI and the distutils should go for "safe" names and
+    # versions in distribution archive names (sdist and bdist).
+
+    parts = basename.split('-')
+    if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]):
+        # it is a bdist_dumb, not an sdist -- bail out
+        return
+
+    for p in range(1, len(parts) + 1):
+        yield Distribution(
+            location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]),
+            py_version=py_version, precedence=precedence,
+            platform=platform
+        )
+
+
+# From Python 2.7 docs
+def unique_everseen(iterable, key=None):
+    "List unique elements, preserving order. Remember all elements ever seen."
+    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
+    # unique_everseen('ABBCcAD', str.lower) --> A B C D
+    seen = set()
+    seen_add = seen.add
+    if key is None:
+        for element in six.moves.filterfalse(seen.__contains__, iterable):
+            seen_add(element)
+            yield element
+    else:
+        for element in iterable:
+            k = key(element)
+            if k not in seen:
+                seen_add(k)
+                yield element
+
+
+def unique_values(func):
+    """
+    Wrap a function returning an iterable such that the resulting iterable
+    only ever yields unique items.
+    """
+
+    @wraps(func)
+    def wrapper(*args, **kwargs):
+        return unique_everseen(func(*args, **kwargs))
+
+    return wrapper
+
+
+REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I)
+# this line is here to fix emacs' cruddy broken syntax highlighting
+
+
+@unique_values
+def find_external_links(url, page):
+    """Find rel="homepage" and rel="download" links in `page`, yielding URLs"""
+
+    for match in REL.finditer(page):
+        tag, rel = match.groups()
+        rels = set(map(str.strip, rel.lower().split(',')))
+        if 'homepage' in rels or 'download' in rels:
+            for match in HREF.finditer(tag):
+                yield urllib.parse.urljoin(url, htmldecode(match.group(1)))
+
+    for tag in ("<th>Home Page", "<th>Download URL"):
+        pos = page.find(tag)
+        if pos != -1:
+            match = HREF.search(page, pos)
+            if match:
+                yield urllib.parse.urljoin(url, htmldecode(match.group(1)))
+
+
+class ContentChecker:
+    """
+    A null content checker that defines the interface for checking content
+    """
+
+    def feed(self, block):
+        """
+        Feed a block of data to the hash.
+        """
+        return
+
+    def is_valid(self):
+        """
+        Check the hash. Return False if validation fails.
+        """
+        return True
+
+    def report(self, reporter, template):
+        """
+        Call reporter with information about the checker (hash name)
+        substituted into the template.
+        """
+        return
+
+
+class HashChecker(ContentChecker):
+    pattern = re.compile(
+        r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)='
+        r'(?P<expected>[a-f0-9]+)'
+    )
+
+    def __init__(self, hash_name, expected):
+        self.hash_name = hash_name
+        self.hash = hashlib.new(hash_name)
+        self.expected = expected
+
+    @classmethod
+    def from_url(cls, url):
+        "Construct a (possibly null) ContentChecker from a URL"
+        fragment = urllib.parse.urlparse(url)[-1]
+        if not fragment:
+            return ContentChecker()
+        match = cls.pattern.search(fragment)
+        if not match:
+            return ContentChecker()
+        return cls(**match.groupdict())
+
+    def feed(self, block):
+        self.hash.update(block)
+
+    def is_valid(self):
+        return self.hash.hexdigest() == self.expected
+
+    def report(self, reporter, template):
+        msg = template % self.hash_name
+        return reporter(msg)
+
+
+class PackageIndex(Environment):
+    """A distribution index that scans web pages for download URLs"""
+
+    def __init__(
+            self, index_url="https://pypi.org/simple/", hosts=('*',),
+            ca_bundle=None, verify_ssl=True, *args, **kw
+    ):
+        Environment.__init__(self, *args, **kw)
+        self.index_url = index_url + "/" [:not index_url.endswith('/')]
+        self.scanned_urls = {}
+        self.fetched_urls = {}
+        self.package_pages = {}
+        self.allows = re.compile('|'.join(map(translate, hosts))).match
+        self.to_scan = []
+        use_ssl = (
+            verify_ssl
+            and ssl_support.is_available
+            and (ca_bundle or ssl_support.find_ca_bundle())
+        )
+        if use_ssl:
+            self.opener = ssl_support.opener_for(ca_bundle)
+        else:
+            self.opener = urllib.request.urlopen
+
+    def process_url(self, url, retrieve=False):
+        """Evaluate a URL as a possible download, and maybe retrieve it"""
+        if url in self.scanned_urls and not retrieve:
+            return
+        self.scanned_urls[url] = True
+        if not URL_SCHEME(url):
+            self.process_filename(url)
+            return
+        else:
+            dists = list(distros_for_url(url))
+            if dists:
+                if not self.url_ok(url):
+                    return
+                self.debug("Found link: %s", url)
+
+        if dists or not retrieve or url in self.fetched_urls:
+            list(map(self.add, dists))
+            return  # don't need the actual page
+
+        if not self.url_ok(url):
+            self.fetched_urls[url] = True
+            return
+
+        self.info("Reading %s", url)
+        self.fetched_urls[url] = True  # prevent multiple fetch attempts
+        tmpl = "Download error on %s: %%s -- Some packages may not be found!"
+        f = self.open_url(url, tmpl % url)
+        if f is None:
+            return
+        self.fetched_urls[f.url] = True
+        if 'html' not in f.headers.get('content-type', '').lower():
+            f.close()  # not html, we can't process it
+            return
+
+        base = f.url  # handle redirects
+        page = f.read()
+        if not isinstance(page, str):
+            # In Python 3 and got bytes but want str.
+            if isinstance(f, urllib.error.HTTPError):
+                # Errors have no charset, assume latin1:
+                charset = 'latin-1'
+            else:
+                charset = f.headers.get_param('charset') or 'latin-1'
+            page = page.decode(charset, "ignore")
+        f.close()
+        for match in HREF.finditer(page):
+            link = urllib.parse.urljoin(base, htmldecode(match.group(1)))
+            self.process_url(link)
+        if url.startswith(self.index_url) and getattr(f, 'code', None) != 404:
+            page = self.process_index(url, page)
+
+    def process_filename(self, fn, nested=False):
+        # process filenames or directories
+        if not os.path.exists(fn):
+            self.warn("Not found: %s", fn)
+            return
+
+        if os.path.isdir(fn) and not nested:
+            path = os.path.realpath(fn)
+            for item in os.listdir(path):
+                self.process_filename(os.path.join(path, item), True)
+
+        dists = distros_for_filename(fn)
+        if dists:
+            self.debug("Found: %s", fn)
+            list(map(self.add, dists))
+
+    def url_ok(self, url, fatal=False):
+        s = URL_SCHEME(url)
+        is_file = s and s.group(1).lower() == 'file'
+        if is_file or self.allows(urllib.parse.urlparse(url)[1]):
+            return True
+        msg = (
+            "\nNote: Bypassing %s (disallowed host; see "
+            "http://bit.ly/2hrImnY for details).\n")
+        if fatal:
+            raise DistutilsError(msg % url)
+        else:
+            self.warn(msg, url)
+
+    def scan_egg_links(self, search_path):
+        dirs = filter(os.path.isdir, search_path)
+        egg_links = (
+            (path, entry)
+            for path in dirs
+            for entry in os.listdir(path)
+            if entry.endswith('.egg-link')
+        )
+        list(itertools.starmap(self.scan_egg_link, egg_links))
+
+    def scan_egg_link(self, path, entry):
+        with open(os.path.join(path, entry)) as raw_lines:
+            # filter non-empty lines
+            lines = list(filter(None, map(str.strip, raw_lines)))
+
+        if len(lines) != 2:
+            # format is not recognized; punt
+            return
+
+        egg_path, setup_path = lines
+
+        for dist in find_distributions(os.path.join(path, egg_path)):
+            dist.location = os.path.join(path, *lines)
+            dist.precedence = SOURCE_DIST
+            self.add(dist)
+
+    def process_index(self, url, page):
+        """Process the contents of a PyPI page"""
+
+        def scan(link):
+            # Process a URL to see if it's for a package page
+            if link.startswith(self.index_url):
+                parts = list(map(
+                    urllib.parse.unquote, link[len(self.index_url):].split('/')
+                ))
+                if len(parts) == 2 and '#' not in parts[1]:
+                    # it's a package page, sanitize and index it
+                    pkg = safe_name(parts[0])
+                    ver = safe_version(parts[1])
+                    self.package_pages.setdefault(pkg.lower(), {})[link] = True
+                    return to_filename(pkg), to_filename(ver)
+            return None, None
+
+        # process an index page into the package-page index
+        for match in HREF.finditer(page):
+            try:
+                scan(urllib.parse.urljoin(url, htmldecode(match.group(1))))
+            except ValueError:
+                pass
+
+        pkg, ver = scan(url)  # ensure this page is in the page index
+        if pkg:
+            # process individual package page
+            for new_url in find_external_links(url, page):
+                # Process the found URL
+                base, frag = egg_info_for_url(new_url)
+                if base.endswith('.py') and not frag:
+                    if ver:
+                        new_url += '#egg=%s-%s' % (pkg, ver)
+                    else:
+                        self.need_version_info(url)
+                self.scan_url(new_url)
+
+            return PYPI_MD5.sub(
+                lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page
+            )
+        else:
+            return ""  # no sense double-scanning non-package pages
+
+    def need_version_info(self, url):
+        self.scan_all(
+            "Page at %s links to .py file(s) without version info; an index "
+            "scan is required.", url
+        )
+
+    def scan_all(self, msg=None, *args):
+        if self.index_url not in self.fetched_urls:
+            if msg:
+                self.warn(msg, *args)
+            self.info(
+                "Scanning index of all packages (this may take a while)"
+            )
+        self.scan_url(self.index_url)
+
+    def find_packages(self, requirement):
+        self.scan_url(self.index_url + requirement.unsafe_name + '/')
+
+        if not self.package_pages.get(requirement.key):
+            # Fall back to safe version of the name
+            self.scan_url(self.index_url + requirement.project_name + '/')
+
+        if not self.package_pages.get(requirement.key):
+            # We couldn't find the target package, so search the index page too
+            self.not_found_in_index(requirement)
+
+        for url in list(self.package_pages.get(requirement.key, ())):
+            # scan each page that might be related to the desired package
+            self.scan_url(url)
+
+    def obtain(self, requirement, installer=None):
+        self.prescan()
+        self.find_packages(requirement)
+        for dist in self[requirement.key]:
+            if dist in requirement:
+                return dist
+            self.debug("%s does not match %s", requirement, dist)
+        return super(PackageIndex, self).obtain(requirement, installer)
+
+    def check_hash(self, checker, filename, tfp):
+        """
+        checker is a ContentChecker
+        """
+        checker.report(
+            self.debug,
+            "Validating %%s checksum for %s" % filename)
+        if not checker.is_valid():
+            tfp.close()
+            os.unlink(filename)
+            raise DistutilsError(
+                "%s validation failed for %s; "
+                "possible download problem?"
+                % (checker.hash.name, os.path.basename(filename))
+            )
+
+    def add_find_links(self, urls):
+        """Add `urls` to the list that will be prescanned for searches"""
+        for url in urls:
+            if (
+                self.to_scan is None  # if we have already "gone online"
+                or not URL_SCHEME(url)  # or it's a local file/directory
+                or url.startswith('file:')
+                or list(distros_for_url(url))  # or a direct package link
+            ):
+                # then go ahead and process it now
+                self.scan_url(url)
+            else:
+                # otherwise, defer retrieval till later
+                self.to_scan.append(url)
+
+    def prescan(self):
+        """Scan urls scheduled for prescanning (e.g. --find-links)"""
+        if self.to_scan:
+            list(map(self.scan_url, self.to_scan))
+        self.to_scan = None  # from now on, go ahead and process immediately
+
+    def not_found_in_index(self, requirement):
+        if self[requirement.key]:  # we've seen at least one distro
+            meth, msg = self.info, "Couldn't retrieve index page for %r"
+        else:  # no distros seen for this name, might be misspelled
+            meth, msg = (
+                self.warn,
+                "Couldn't find index page for %r (maybe misspelled?)")
+        meth(msg, requirement.unsafe_name)
+        self.scan_all()
+
+    def download(self, spec, tmpdir):
+        """Locate and/or download `spec` to `tmpdir`, returning a local path
+
+        `spec` may be a ``Requirement`` object, or a string containing a URL,
+        an existing local filename, or a project/version requirement spec
+        (i.e. the string form of a ``Requirement`` object).  If it is the URL
+        of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one
+        that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is
+        automatically created alongside the downloaded file.
+
+        If `spec` is a ``Requirement`` object or a string containing a
+        project/version requirement spec, this method returns the location of
+        a matching distribution (possibly after downloading it to `tmpdir`).
+        If `spec` is a locally existing file or directory name, it is simply
+        returned unchanged.  If `spec` is a URL, it is downloaded to a subpath
+        of `tmpdir`, and the local filename is returned.  Various errors may be
+        raised if a problem occurs during downloading.
+        """
+        if not isinstance(spec, Requirement):
+            scheme = URL_SCHEME(spec)
+            if scheme:
+                # It's a url, download it to tmpdir
+                found = self._download_url(scheme.group(1), spec, tmpdir)
+                base, fragment = egg_info_for_url(spec)
+                if base.endswith('.py'):
+                    found = self.gen_setup(found, fragment, tmpdir)
+                return found
+            elif os.path.exists(spec):
+                # Existing file or directory, just return it
+                return spec
+            else:
+                spec = parse_requirement_arg(spec)
+        return getattr(self.fetch_distribution(spec, tmpdir), 'location', None)
+
+    def fetch_distribution(
+            self, requirement, tmpdir, force_scan=False, source=False,
+            develop_ok=False, local_index=None):
+        """Obtain a distribution suitable for fulfilling `requirement`
+
+        `requirement` must be a ``pkg_resources.Requirement`` instance.
+        If necessary, or if the `force_scan` flag is set, the requirement is
+        searched for in the (online) package index as well as the locally
+        installed packages.  If a distribution matching `requirement` is found,
+        the returned distribution's ``location`` is the value you would have
+        gotten from calling the ``download()`` method with the matching
+        distribution's URL or filename.  If no matching distribution is found,
+        ``None`` is returned.
+
+        If the `source` flag is set, only source distributions and source
+        checkout links will be considered.  Unless the `develop_ok` flag is
+        set, development and system eggs (i.e., those using the ``.egg-info``
+        format) will be ignored.
+        """
+        # process a Requirement
+        self.info("Searching for %s", requirement)
+        skipped = {}
+        dist = None
+
+        def find(req, env=None):
+            if env is None:
+                env = self
+            # Find a matching distribution; may be called more than once
+
+            for dist in env[req.key]:
+
+                if dist.precedence == DEVELOP_DIST and not develop_ok:
+                    if dist not in skipped:
+                        self.warn(
+                            "Skipping development or system egg: %s", dist,
+                        )
+                        skipped[dist] = 1
+                    continue
+
+                test = (
+                    dist in req
+                    and (dist.precedence <= SOURCE_DIST or not source)
+                )
+                if test:
+                    loc = self.download(dist.location, tmpdir)
+                    dist.download_location = loc
+                    if os.path.exists(dist.download_location):
+                        return dist
+
+        if force_scan:
+            self.prescan()
+            self.find_packages(requirement)
+            dist = find(requirement)
+
+        if not dist and local_index is not None:
+            dist = find(requirement, local_index)
+
+        if dist is None:
+            if self.to_scan is not None:
+                self.prescan()
+            dist = find(requirement)
+
+        if dist is None and not force_scan:
+            self.find_packages(requirement)
+            dist = find(requirement)
+
+        if dist is None:
+            self.warn(
+                "No local packages or working download links found for %s%s",
+                (source and "a source distribution of " or ""),
+                requirement,
+            )
+        else:
+            self.info("Best match: %s", dist)
+            return dist.clone(location=dist.download_location)
+
+    def fetch(self, requirement, tmpdir, force_scan=False, source=False):
+        """Obtain a file suitable for fulfilling `requirement`
+
+        DEPRECATED; use the ``fetch_distribution()`` method now instead.  For
+        backward compatibility, this routine is identical but returns the
+        ``location`` of the downloaded distribution instead of a distribution
+        object.
+        """
+        dist = self.fetch_distribution(requirement, tmpdir, force_scan, source)
+        if dist is not None:
+            return dist.location
+        return None
+
+    def gen_setup(self, filename, fragment, tmpdir):
+        match = EGG_FRAGMENT.match(fragment)
+        dists = match and [
+            d for d in
+            interpret_distro_name(filename, match.group(1), None) if d.version
+        ] or []
+
+        if len(dists) == 1:  # unambiguous ``#egg`` fragment
+            basename = os.path.basename(filename)
+
+            # Make sure the file has been downloaded to the temp dir.
+            if os.path.dirname(filename) != tmpdir:
+                dst = os.path.join(tmpdir, basename)
+                from setuptools.command.easy_install import samefile
+                if not samefile(filename, dst):
+                    shutil.copy2(filename, dst)
+                    filename = dst
+
+            with open(os.path.join(tmpdir, 'setup.py'), 'w') as file:
+                file.write(
+                    "from setuptools import setup\n"
+                    "setup(name=%r, version=%r, py_modules=[%r])\n"
+                    % (
+                        dists[0].project_name, dists[0].version,
+                        os.path.splitext(basename)[0]
+                    )
+                )
+            return filename
+
+        elif match:
+            raise DistutilsError(
+                "Can't unambiguously interpret project/version identifier %r; "
+                "any dashes in the name or version should be escaped using "
+                "underscores. %r" % (fragment, dists)
+            )
+        else:
+            raise DistutilsError(
+                "Can't process plain .py files without an '#egg=name-version'"
+                " suffix to enable automatic setup script generation."
+            )
+
+    dl_blocksize = 8192
+
+    def _download_to(self, url, filename):
+        self.info("Downloading %s", url)
+        # Download the file
+        fp = None
+        try:
+            checker = HashChecker.from_url(url)
+            fp = self.open_url(url)
+            if isinstance(fp, urllib.error.HTTPError):
+                raise DistutilsError(
+                    "Can't download %s: %s %s" % (url, fp.code, fp.msg)
+                )
+            headers = fp.info()
+            blocknum = 0
+            bs = self.dl_blocksize
+            size = -1
+            if "content-length" in headers:
+                # Some servers return multiple Content-Length headers :(
+                sizes = get_all_headers(headers, 'Content-Length')
+                size = max(map(int, sizes))
+                self.reporthook(url, filename, blocknum, bs, size)
+            with open(filename, 'wb') as tfp:
+                while True:
+                    block = fp.read(bs)
+                    if block:
+                        checker.feed(block)
+                        tfp.write(block)
+                        blocknum += 1
+                        self.reporthook(url, filename, blocknum, bs, size)
+                    else:
+                        break
+                self.check_hash(checker, filename, tfp)
+            return headers
+        finally:
+            if fp:
+                fp.close()
+
+    def reporthook(self, url, filename, blocknum, blksize, size):
+        pass  # no-op
+
+    def open_url(self, url, warning=None):
+        if url.startswith('file:'):
+            return local_open(url)
+        try:
+            return open_with_auth(url, self.opener)
+        except (ValueError, http_client.InvalidURL) as v:
+            msg = ' '.join([str(arg) for arg in v.args])
+            if warning:
+                self.warn(warning, msg)
+            else:
+                raise DistutilsError('%s %s' % (url, msg))
+        except urllib.error.HTTPError as v:
+            return v
+        except urllib.error.URLError as v:
+            if warning:
+                self.warn(warning, v.reason)
+            else:
+                raise DistutilsError("Download error for %s: %s"
+                                     % (url, v.reason))
+        except http_client.BadStatusLine as v:
+            if warning:
+                self.warn(warning, v.line)
+            else:
+                raise DistutilsError(
+                    '%s returned a bad status line. The server might be '
+                    'down, %s' %
+                    (url, v.line)
+                )
+        except (http_client.HTTPException, socket.error) as v:
+            if warning:
+                self.warn(warning, v)
+            else:
+                raise DistutilsError("Download error for %s: %s"
+                                     % (url, v))
+
+    def _download_url(self, scheme, url, tmpdir):
+        # Determine download filename
+        #
+        name, fragment = egg_info_for_url(url)
+        if name:
+            while '..' in name:
+                name = name.replace('..', '.').replace('\\', '_')
+        else:
+            name = "__downloaded__"  # default if URL has no path contents
+
+        if name.endswith('.egg.zip'):
+            name = name[:-4]  # strip the extra .zip before download
+
+        filename = os.path.join(tmpdir, name)
+
+        # Download the file
+        #
+        if scheme == 'svn' or scheme.startswith('svn+'):
+            return self._download_svn(url, filename)
+        elif scheme == 'git' or scheme.startswith('git+'):
+            return self._download_git(url, filename)
+        elif scheme.startswith('hg+'):
+            return self._download_hg(url, filename)
+        elif scheme == 'file':
+            return urllib.request.url2pathname(urllib.parse.urlparse(url)[2])
+        else:
+            self.url_ok(url, True)  # raises error if not allowed
+            return self._attempt_download(url, filename)
+
+    def scan_url(self, url):
+        self.process_url(url, True)
+
+    def _attempt_download(self, url, filename):
+        headers = self._download_to(url, filename)
+        if 'html' in headers.get('content-type', '').lower():
+            return self._download_html(url, headers, filename)
+        else:
+            return filename
+
+    def _download_html(self, url, headers, filename):
+        file = open(filename)
+        for line in file:
+            if line.strip():
+                # Check for a subversion index page
+                if re.search(r'<title>([^- ]+ - )?Revision \d+:', line):
+                    # it's a subversion index page:
+                    file.close()
+                    os.unlink(filename)
+                    return self._download_svn(url, filename)
+                break  # not an index page
+        file.close()
+        os.unlink(filename)
+        raise DistutilsError("Unexpected HTML page found at " + url)
+
+    def _download_svn(self, url, filename):
+        warnings.warn("SVN download support is deprecated", UserWarning)
+        url = url.split('#', 1)[0]  # remove any fragment for svn's sake
+        creds = ''
+        if url.lower().startswith('svn:') and '@' in url:
+            scheme, netloc, path, p, q, f = urllib.parse.urlparse(url)
+            if not netloc and path.startswith('//') and '/' in path[2:]:
+                netloc, path = path[2:].split('/', 1)
+                auth, host = _splituser(netloc)
+                if auth:
+                    if ':' in auth:
+                        user, pw = auth.split(':', 1)
+                        creds = " --username=%s --password=%s" % (user, pw)
+                    else:
+                        creds = " --username=" + auth
+                    netloc = host
+                    parts = scheme, netloc, url, p, q, f
+                    url = urllib.parse.urlunparse(parts)
+        self.info("Doing subversion checkout from %s to %s", url, filename)
+        os.system("svn checkout%s -q %s %s" % (creds, url, filename))
+        return filename
+
+    @staticmethod
+    def _vcs_split_rev_from_url(url, pop_prefix=False):
+        scheme, netloc, path, query, frag = urllib.parse.urlsplit(url)
+
+        scheme = scheme.split('+', 1)[-1]
+
+        # Some fragment identification fails
+        path = path.split('#', 1)[0]
+
+        rev = None
+        if '@' in path:
+            path, rev = path.rsplit('@', 1)
+
+        # Also, discard fragment
+        url = urllib.parse.urlunsplit((scheme, netloc, path, query, ''))
+
+        return url, rev
+
+    def _download_git(self, url, filename):
+        filename = filename.split('#', 1)[0]
+        url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)
+
+        self.info("Doing git clone from %s to %s", url, filename)
+        os.system("git clone --quiet %s %s" % (url, filename))
+
+        if rev is not None:
+            self.info("Checking out %s", rev)
+            os.system("git -C %s checkout --quiet %s" % (
+                filename,
+                rev,
+            ))
+
+        return filename
+
+    def _download_hg(self, url, filename):
+        filename = filename.split('#', 1)[0]
+        url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)
+
+        self.info("Doing hg clone from %s to %s", url, filename)
+        os.system("hg clone --quiet %s %s" % (url, filename))
+
+        if rev is not None:
+            self.info("Updating to %s", rev)
+            os.system("hg --cwd %s up -C -r %s -q" % (
+                filename,
+                rev,
+            ))
+
+        return filename
+
+    def debug(self, msg, *args):
+        log.debug(msg, *args)
+
+    def info(self, msg, *args):
+        log.info(msg, *args)
+
+    def warn(self, msg, *args):
+        log.warn(msg, *args)
+
+
+# This pattern matches a character entity reference (a decimal numeric
+# references, a hexadecimal numeric reference, or a named reference).
+entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub
+
+
+def decode_entity(match):
+    what = match.group(0)
+    return unescape(what)
+
+
+def htmldecode(text):
+    """
+    Decode HTML entities in the given text.
+
+    >>> htmldecode(
+    ...     'https://../package_name-0.1.2.tar.gz'
+    ...     '?tokena=A&amp;tokenb=B">package_name-0.1.2.tar.gz')
+    'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz'
+    """
+    return entity_sub(decode_entity, text)
+
+
+def socket_timeout(timeout=15):
+    def _socket_timeout(func):
+        def _socket_timeout(*args, **kwargs):
+            old_timeout = socket.getdefaulttimeout()
+            socket.setdefaulttimeout(timeout)
+            try:
+                return func(*args, **kwargs)
+            finally:
+                socket.setdefaulttimeout(old_timeout)
+
+        return _socket_timeout
+
+    return _socket_timeout
+
+
+def _encode_auth(auth):
+    """
+    A function compatible with Python 2.3-3.3 that will encode
+    auth from a URL suitable for an HTTP header.
+    >>> str(_encode_auth('username%3Apassword'))
+    'dXNlcm5hbWU6cGFzc3dvcmQ='
+
+    Long auth strings should not cause a newline to be inserted.
+    >>> long_auth = 'username:' + 'password'*10
+    >>> chr(10) in str(_encode_auth(long_auth))
+    False
+    """
+    auth_s = urllib.parse.unquote(auth)
+    # convert to bytes
+    auth_bytes = auth_s.encode()
+    encoded_bytes = base64.b64encode(auth_bytes)
+    # convert back to a string
+    encoded = encoded_bytes.decode()
+    # strip the trailing carriage return
+    return encoded.replace('\n', '')
+
+
+class Credential:
+    """
+    A username/password pair. Use like a namedtuple.
+    """
+
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+
+    def __iter__(self):
+        yield self.username
+        yield self.password
+
+    def __str__(self):
+        return '%(username)s:%(password)s' % vars(self)
+
+
+class PyPIConfig(configparser.RawConfigParser):
+    def __init__(self):
+        """
+        Load from ~/.pypirc
+        """
+        defaults = dict.fromkeys(['username', 'password', 'repository'], '')
+        configparser.RawConfigParser.__init__(self, defaults)
+
+        rc = os.path.join(os.path.expanduser('~'), '.pypirc')
+        if os.path.exists(rc):
+            self.read(rc)
+
+    @property
+    def creds_by_repository(self):
+        sections_with_repositories = [
+            section for section in self.sections()
+            if self.get(section, 'repository').strip()
+        ]
+
+        return dict(map(self._get_repo_cred, sections_with_repositories))
+
+    def _get_repo_cred(self, section):
+        repo = self.get(section, 'repository').strip()
+        return repo, Credential(
+            self.get(section, 'username').strip(),
+            self.get(section, 'password').strip(),
+        )
+
+    def find_credential(self, url):
+        """
+        If the URL indicated appears to be a repository defined in this
+        config, return the credential for that repository.
+        """
+        for repository, cred in self.creds_by_repository.items():
+            if url.startswith(repository):
+                return cred
+
+
+def open_with_auth(url, opener=urllib.request.urlopen):
+    """Open a urllib2 request, handling HTTP authentication"""
+
+    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
+    # failing test. We would expect "nonnumeric port". Refs #20.
+    if netloc.endswith(':'):
+        raise http_client.InvalidURL("nonnumeric port: ''")
+
+    if scheme in ('http', 'https'):
+        auth, address = _splituser(netloc)
+    else:
+        auth = None
+
+    if not auth:
+        cred = PyPIConfig().find_credential(url)
+        if cred:
+            auth = str(cred)
+            info = cred.username, url
+            log.info('Authenticating as %s for %s (from .pypirc)', *info)
+
+    if auth:
+        auth = "Basic " + _encode_auth(auth)
+        parts = scheme, address, path, params, query, frag
+        new_url = urllib.parse.urlunparse(parts)
+        request = urllib.request.Request(new_url)
+        request.add_header("Authorization", auth)
+    else:
+        request = urllib.request.Request(url)
+
+    request.add_header('User-Agent', user_agent)
+    fp = opener(request)
+
+    if auth:
+        # Put authentication info back into request URL if same host,
+        # so that links found on the page will work
+        s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url)
+        if s2 == scheme and h2 == address:
+            parts = s2, netloc, path2, param2, query2, frag2
+            fp.url = urllib.parse.urlunparse(parts)
+
+    return fp
+
+
+# copy of urllib.parse._splituser from Python 3.8
+def _splituser(host):
+    """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
+    user, delim, host = host.rpartition('@')
+    return (user if delim else None), host
+
+
+# adding a timeout to avoid freezing package_index
+open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth)
+
+
+def fix_sf_url(url):
+    return url  # backward compatibility
+
+
+def local_open(url):
+    """Read a local path, with special support for directories"""
+    scheme, server, path, param, query, frag = urllib.parse.urlparse(url)
+    filename = urllib.request.url2pathname(path)
+    if os.path.isfile(filename):
+        return urllib.request.urlopen(url)
+    elif path.endswith('/') and os.path.isdir(filename):
+        files = []
+        for f in os.listdir(filename):
+            filepath = os.path.join(filename, f)
+            if f == 'index.html':
+                with open(filepath, 'r') as fp:
+                    body = fp.read()
+                break
+            elif os.path.isdir(filepath):
+                f += '/'
+            files.append('<a href="{name}">{name}</a>'.format(name=f))
+        else:
+            tmpl = (
+                "<html><head><title>{url}</title>"
+                "</head><body>{files}</body></html>")
+            body = tmpl.format(url=url, files='\n'.join(files))
+        status, message = 200, "OK"
+    else:
+        status, message, body = 404, "Path not found", "Not found"
+
+    headers = {'content-type': 'text/html'}
+    body_stream = six.StringIO(body)
+    return urllib.error.HTTPError(url, status, message, headers, body_stream)
diff --git a/venv/lib/python2.7/site-packages/setuptools/package_index.pyc b/venv/lib/python2.7/site-packages/setuptools/package_index.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b2c2dfd7dfd9e5528659e5e3357f9b1df9723cd4
GIT binary patch
literal 44733
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
aV&-J!<l*7x6cZMdR1?zYWEW!QWB~x*8?)m8

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/pep425tags.py b/venv/lib/python2.7/site-packages/setuptools/pep425tags.py
new file mode 100644
index 00000000..48745a29
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/pep425tags.py
@@ -0,0 +1,319 @@
+# This file originally from pip:
+# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py
+"""Generate and work with PEP 425 Compatibility Tags."""
+from __future__ import absolute_import
+
+import distutils.util
+from distutils import log
+import platform
+import re
+import sys
+import sysconfig
+import warnings
+from collections import OrderedDict
+
+from .extern import six
+
+from . import glibc
+
+_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)')
+
+
+def get_config_var(var):
+    try:
+        return sysconfig.get_config_var(var)
+    except IOError as e:  # Issue #1074
+        warnings.warn("{}".format(e), RuntimeWarning)
+        return None
+
+
+def get_abbr_impl():
+    """Return abbreviated implementation name."""
+    if hasattr(sys, 'pypy_version_info'):
+        pyimpl = 'pp'
+    elif sys.platform.startswith('java'):
+        pyimpl = 'jy'
+    elif sys.platform == 'cli':
+        pyimpl = 'ip'
+    else:
+        pyimpl = 'cp'
+    return pyimpl
+
+
+def get_impl_ver():
+    """Return implementation version."""
+    impl_ver = get_config_var("py_version_nodot")
+    if not impl_ver or get_abbr_impl() == 'pp':
+        impl_ver = ''.join(map(str, get_impl_version_info()))
+    return impl_ver
+
+
+def get_impl_version_info():
+    """Return sys.version_info-like tuple for use in decrementing the minor
+    version."""
+    if get_abbr_impl() == 'pp':
+        # as per https://github.com/pypa/pip/issues/2882
+        return (sys.version_info[0], sys.pypy_version_info.major,
+                sys.pypy_version_info.minor)
+    else:
+        return sys.version_info[0], sys.version_info[1]
+
+
+def get_impl_tag():
+    """
+    Returns the Tag for this specific implementation.
+    """
+    return "{}{}".format(get_abbr_impl(), get_impl_ver())
+
+
+def get_flag(var, fallback, expected=True, warn=True):
+    """Use a fallback method for determining SOABI flags if the needed config
+    var is unset or unavailable."""
+    val = get_config_var(var)
+    if val is None:
+        if warn:
+            log.debug("Config variable '%s' is unset, Python ABI tag may "
+                      "be incorrect", var)
+        return fallback()
+    return val == expected
+
+
+def get_abi_tag():
+    """Return the ABI tag based on SOABI (if available) or emulate SOABI
+    (CPython 2, PyPy)."""
+    soabi = get_config_var('SOABI')
+    impl = get_abbr_impl()
+    if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'):
+        d = ''
+        m = ''
+        u = ''
+        if get_flag('Py_DEBUG',
+                    lambda: hasattr(sys, 'gettotalrefcount'),
+                    warn=(impl == 'cp')):
+            d = 'd'
+        if get_flag('WITH_PYMALLOC',
+                    lambda: impl == 'cp',
+                    warn=(impl == 'cp')):
+            m = 'm'
+        if get_flag('Py_UNICODE_SIZE',
+                    lambda: sys.maxunicode == 0x10ffff,
+                    expected=4,
+                    warn=(impl == 'cp' and
+                          six.PY2)) \
+                and six.PY2:
+            u = 'u'
+        abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u)
+    elif soabi and soabi.startswith('cpython-'):
+        abi = 'cp' + soabi.split('-')[1]
+    elif soabi:
+        abi = soabi.replace('.', '_').replace('-', '_')
+    else:
+        abi = None
+    return abi
+
+
+def _is_running_32bit():
+    return sys.maxsize == 2147483647
+
+
+def get_platform():
+    """Return our platform name 'win32', 'linux_x86_64'"""
+    if sys.platform == 'darwin':
+        # distutils.util.get_platform() returns the release based on the value
+        # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may
+        # be significantly older than the user's current machine.
+        release, _, machine = platform.mac_ver()
+        split_ver = release.split('.')
+
+        if machine == "x86_64" and _is_running_32bit():
+            machine = "i386"
+        elif machine == "ppc64" and _is_running_32bit():
+            machine = "ppc"
+
+        return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine)
+
+    # XXX remove distutils dependency
+    result = distutils.util.get_platform().replace('.', '_').replace('-', '_')
+    if result == "linux_x86_64" and _is_running_32bit():
+        # 32 bit Python program (running on a 64 bit Linux): pip should only
+        # install and run 32 bit compiled extensions in that case.
+        result = "linux_i686"
+
+    return result
+
+
+def is_manylinux1_compatible():
+    # Only Linux, and only x86-64 / i686
+    if get_platform() not in {"linux_x86_64", "linux_i686"}:
+        return False
+
+    # Check for presence of _manylinux module
+    try:
+        import _manylinux
+        return bool(_manylinux.manylinux1_compatible)
+    except (ImportError, AttributeError):
+        # Fall through to heuristic check below
+        pass
+
+    # Check glibc version. CentOS 5 uses glibc 2.5.
+    return glibc.have_compatible_glibc(2, 5)
+
+
+def get_darwin_arches(major, minor, machine):
+    """Return a list of supported arches (including group arches) for
+    the given major, minor and machine architecture of a macOS machine.
+    """
+    arches = []
+
+    def _supports_arch(major, minor, arch):
+        # Looking at the application support for macOS versions in the chart
+        # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears
+        # our timeline looks roughly like:
+        #
+        # 10.0 - Introduces ppc support.
+        # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64
+        #        and x86_64 support is CLI only, and cannot be used for GUI
+        #        applications.
+        # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications.
+        # 10.6 - Drops support for ppc64
+        # 10.7 - Drops support for ppc
+        #
+        # Given that we do not know if we're installing a CLI or a GUI
+        # application, we must be conservative and assume it might be a GUI
+        # application and behave as if ppc64 and x86_64 support did not occur
+        # until 10.5.
+        #
+        # Note: The above information is taken from the "Application support"
+        #       column in the chart not the "Processor support" since I believe
+        #       that we care about what instruction sets an application can use
+        #       not which processors the OS supports.
+        if arch == 'ppc':
+            return (major, minor) <= (10, 5)
+        if arch == 'ppc64':
+            return (major, minor) == (10, 5)
+        if arch == 'i386':
+            return (major, minor) >= (10, 4)
+        if arch == 'x86_64':
+            return (major, minor) >= (10, 5)
+        if arch in groups:
+            for garch in groups[arch]:
+                if _supports_arch(major, minor, garch):
+                    return True
+        return False
+
+    groups = OrderedDict([
+        ("fat", ("i386", "ppc")),
+        ("intel", ("x86_64", "i386")),
+        ("fat64", ("x86_64", "ppc64")),
+        ("fat32", ("x86_64", "i386", "ppc")),
+    ])
+
+    if _supports_arch(major, minor, machine):
+        arches.append(machine)
+
+    for garch in groups:
+        if machine in groups[garch] and _supports_arch(major, minor, garch):
+            arches.append(garch)
+
+    arches.append('universal')
+
+    return arches
+
+
+def get_supported(versions=None, noarch=False, platform=None,
+                  impl=None, abi=None):
+    """Return a list of supported tags for each version specified in
+    `versions`.
+
+    :param versions: a list of string versions, of the form ["33", "32"],
+        or None. The first version will be assumed to support our ABI.
+    :param platform: specify the exact platform you want valid
+        tags for, or None. If None, use the local system platform.
+    :param impl: specify the exact implementation you want valid
+        tags for, or None. If None, use the local interpreter impl.
+    :param abi: specify the exact abi you want valid
+        tags for, or None. If None, use the local interpreter abi.
+    """
+    supported = []
+
+    # Versions must be given with respect to the preference
+    if versions is None:
+        versions = []
+        version_info = get_impl_version_info()
+        major = version_info[:-1]
+        # Support all previous minor Python versions.
+        for minor in range(version_info[-1], -1, -1):
+            versions.append(''.join(map(str, major + (minor,))))
+
+    impl = impl or get_abbr_impl()
+
+    abis = []
+
+    abi = abi or get_abi_tag()
+    if abi:
+        abis[0:0] = [abi]
+
+    abi3s = set()
+    import imp
+    for suffix in imp.get_suffixes():
+        if suffix[0].startswith('.abi'):
+            abi3s.add(suffix[0].split('.', 2)[1])
+
+    abis.extend(sorted(list(abi3s)))
+
+    abis.append('none')
+
+    if not noarch:
+        arch = platform or get_platform()
+        if arch.startswith('macosx'):
+            # support macosx-10.6-intel on macosx-10.9-x86_64
+            match = _osx_arch_pat.match(arch)
+            if match:
+                name, major, minor, actual_arch = match.groups()
+                tpl = '{}_{}_%i_%s'.format(name, major)
+                arches = []
+                for m in reversed(range(int(minor) + 1)):
+                    for a in get_darwin_arches(int(major), m, actual_arch):
+                        arches.append(tpl % (m, a))
+            else:
+                # arch pattern didn't match (?!)
+                arches = [arch]
+        elif platform is None and is_manylinux1_compatible():
+            arches = [arch.replace('linux', 'manylinux1'), arch]
+        else:
+            arches = [arch]
+
+        # Current version, current API (built specifically for our Python):
+        for abi in abis:
+            for arch in arches:
+                supported.append(('%s%s' % (impl, versions[0]), abi, arch))
+
+        # abi3 modules compatible with older version of Python
+        for version in versions[1:]:
+            # abi3 was introduced in Python 3.2
+            if version in {'31', '30'}:
+                break
+            for abi in abi3s:   # empty set if not Python 3
+                for arch in arches:
+                    supported.append(("%s%s" % (impl, version), abi, arch))
+
+        # Has binaries, does not use the Python API:
+        for arch in arches:
+            supported.append(('py%s' % (versions[0][0]), 'none', arch))
+
+    # No abi / arch, but requires our implementation:
+    supported.append(('%s%s' % (impl, versions[0]), 'none', 'any'))
+    # Tagged specifically as being cross-version compatible
+    # (with just the major version specified)
+    supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
+
+    # No abi / arch, generic Python
+    for i, version in enumerate(versions):
+        supported.append(('py%s' % (version,), 'none', 'any'))
+        if i == 0:
+            supported.append(('py%s' % (version[0]), 'none', 'any'))
+
+    return supported
+
+
+implementation_tag = get_impl_tag()
diff --git a/venv/lib/python2.7/site-packages/setuptools/pep425tags.pyc b/venv/lib/python2.7/site-packages/setuptools/pep425tags.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d69e608df9e93f14f405bbe239f061669fa7dc8f
GIT binary patch
literal 10272
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
Pg;R=Ckkgivkv|>)Y9IuU

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/py27compat.py b/venv/lib/python2.7/site-packages/setuptools/py27compat.py
new file mode 100644
index 00000000..2985011b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/py27compat.py
@@ -0,0 +1,28 @@
+"""
+Compatibility Support for Python 2.7 and earlier
+"""
+
+import platform
+
+from setuptools.extern import six
+
+
+def get_all_headers(message, key):
+    """
+    Given an HTTPMessage, return all headers matching a given key.
+    """
+    return message.get_all(key)
+
+
+if six.PY2:
+    def get_all_headers(message, key):
+        return message.getheaders(key)
+
+
+linux_py2_ascii = (
+    platform.system() == 'Linux' and
+    six.PY2
+)
+
+rmtree_safe = str if linux_py2_ascii else lambda x: x
+"""Workaround for http://bugs.python.org/issue24672"""
diff --git a/venv/lib/python2.7/site-packages/setuptools/py27compat.pyc b/venv/lib/python2.7/site-packages/setuptools/py27compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7346ef1ff0fec3cf4f553cc6fc527ee60ccb5b2c
GIT binary patch
literal 1261
zcmZSn%*&NH<x)&C0~9bZFfceUFfbICFfcHrFfc?hFr+Xtq%bk$Ffv3jg4xUrIZO<>
z%nVV?42&r(3@r={Q7jCp%nVtq3`GtMDXdVDJO+kTMusdlhGqta6gGxzCWib7sIn+_
zhE#TjqI8B-4u(87h7@+N7EX{g!5SPO+l?3)7`UACa|;qnGLtfMGD|8If=deu@{39o
z((;QG0xC-~^79mo^vo3!^HLO26N_>(Q;WDV|NsC0-%o>)fq|if8DvamMKZ`kFzgHx
z<7HrAs9|8pVqmCYWN2n&2nMS!_5j(aprD}Oo>`Wfr;wPZ;1LoM;G0@poS2@fqfnGu
zQd*R!keHLBkdd00l3G-(kegVNoROKAu8^pZ4%U;MTB*kcG6HO32|EJ=LwagSd}2<H
z2FL|qfn11zVCQA0R%(EP9ZVGGGcYjd7ZhcdC6=V>mn9bIr{(8>?9tCI)Xy$9GB-CY
z%rY`BGqf--&Z$f<k2gs%F)=VOFi6kS5795kEYQu&D=taQ$<ZxOv@8wG&@WCcDJ>|;
z&(A4FW)@T$nJ0t8Rj;73gdgF=c&N9yKw$)OE&~g(VFwLykk0hf5~w*~F9(4P3Iat1
z*pFahAUqnx!oa{F1os(Z2`d8wgHL8&X+<(9vA{4meSnnKFhG-qAK1x|_ynn{fbc=F
zHW2<O0c8%GoW$Iultepekbgif(Ex=!ICaIxr{pKc$Ags><Rq4)<rn3a2!hnX6N6rA
zMM-K=UJytlI9R|*F(A^Ygbk#wvbZEQ7o09~K*1AVP-zsOSe%@h3078IQdGjtz`#(H
zTT+yo8eg24mWl`vFl*pKB{x5%G$+*#l-P<vQO(B0!z94W$<E2h!z#qc$t=nU0G87^
AqW}N^

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/py31compat.py b/venv/lib/python2.7/site-packages/setuptools/py31compat.py
new file mode 100644
index 00000000..e1da7ee2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/py31compat.py
@@ -0,0 +1,32 @@
+__all__ = []
+
+__metaclass__ = type
+
+
+try:
+    # Python >=3.2
+    from tempfile import TemporaryDirectory
+except ImportError:
+    import shutil
+    import tempfile
+
+    class TemporaryDirectory:
+        """
+        Very simple temporary directory context manager.
+        Will try to delete afterward, but will also ignore OS and similar
+        errors on deletion.
+        """
+
+        def __init__(self, **kwargs):
+            self.name = None  # Handle mkdtemp raising an exception
+            self.name = tempfile.mkdtemp(**kwargs)
+
+        def __enter__(self):
+            return self.name
+
+        def __exit__(self, exctype, excvalue, exctrace):
+            try:
+                shutil.rmtree(self.name, True)
+            except OSError:  # removal errors are not the only possible
+                pass
+            self.name = None
diff --git a/venv/lib/python2.7/site-packages/setuptools/py31compat.pyc b/venv/lib/python2.7/site-packages/setuptools/py31compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ab366f69cb0fe0ce0997249575512779b39c0d07
GIT binary patch
literal 1712
zcmZSn%*&NH<x)&C0~D|_FfceUFfbH@MA8`;q8J!b85yFO7%D{=QWzLg7#VVy8FE<|
zqF5Lh!}DwySW;OTvbh+F;ushi89@q|7;@McqS(NSnLvu8m>E)-8B$moQdk&T7#Nxv
z7$T!s81fhyB2t(bf;HF}7#K4D|NsAAgOP!Op+ty*fgvO{w;;bLv8d7|vnVyWB)_QA
zF9_s3kdr_(14yM4$dQ^13=F9Z3{i|A>!O%I&TC;{0NKa{vMY)OWHm^Hl_4ltg9W5z
z1p@;EmjV=or505x6ldlZ<fJN;z-(1Wfmy4NoS#>cT2Z2qo0ylFo?4^_*BG9elcP{l
zRH;ysuaJ_OlUkChkeF7IT2!7`l%k`MR9d1?4pNbrQ=G4mnVy$ll&at#tdN+O0<tYL
zC$R`_Qfg6Aeo?VPejdb}%=|orEy*B{GBGePfUq~n_3{i1Ag|UiFvK%5lrS-5F*DRK
zGW0SqKtxg)7=pp!=m+*}3CPEO`FW{eMqXlWY6%A@kW+ID(lT>WOV}A07;>{yKt9(1
zSpim7oSKtX0*aOF^2DO_VhvD;gNfpN1_lQGf}+f_#FA9~vcw|&wEUcu)S_bj>_YwQ
zVk2{N!@?{h^D;vV^WvP!^zwL<6cZBz0|SHfJpB;;g3JQl%)H`~#GD-6@<hwhzzqH3
z)RNMIlKlLfVq|7PrLkdher`cxiC#e^*uC-bnR%Hd@$n*{5CD0JfsvCD95$fv0bys5
z49GV%3=CO_FaSvffjkBdlORyq2Kxj|42X9)85kJi<5TlWQj6l_B|xqQIgf!c8RRVx
z2DuUJ8w&;ohDvdU5(b7WMo{c#F)@@dGc+@SvYj9UO9=}&+i8Ka9XKyRk^mDZb-<DU
zC=$UjS)5T?l9>Z$7Uh-{rKW-d1svNUMWv8*;2-P?N{K<BFaswZaBzW>NNPoLNo4^f
z?W9&DmnG(u!Z{^HiOH$p@B|YB5~!dw9Uq@s0ZJp%pfKeErCCO1MsY@7MixeJ5d%#~
zpga&CUjkAPAD^3_Qks(*9}o6qe0)lNa(sLcC=~^PObilWU|;}y3PB8n_rOITFUVUU
zSFy3OF>$hRGDF-1axB#Ki8(p(@!%*0#}!CJe0*+dNn&zNVsUYNd=N7O0|VHs5^e?t
s22W5CTLOu4&cWePa1_}<BE=4r42$^~7#P@?*qE7_L>PG)c^G+^04Rf+wEzGB

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/py33compat.py b/venv/lib/python2.7/site-packages/setuptools/py33compat.py
new file mode 100644
index 00000000..87cf5398
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/py33compat.py
@@ -0,0 +1,55 @@
+import dis
+import array
+import collections
+
+try:
+    import html
+except ImportError:
+    html = None
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import html_parser
+
+__metaclass__ = type
+
+OpArg = collections.namedtuple('OpArg', 'opcode arg')
+
+
+class Bytecode_compat:
+    def __init__(self, code):
+        self.code = code
+
+    def __iter__(self):
+        """Yield '(op,arg)' pair for each operation in code object 'code'"""
+
+        bytes = array.array('b', self.code.co_code)
+        eof = len(self.code.co_code)
+
+        ptr = 0
+        extended_arg = 0
+
+        while ptr < eof:
+
+            op = bytes[ptr]
+
+            if op >= dis.HAVE_ARGUMENT:
+
+                arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg
+                ptr += 3
+
+                if op == dis.EXTENDED_ARG:
+                    long_type = six.integer_types[-1]
+                    extended_arg = arg * long_type(65536)
+                    continue
+
+            else:
+                arg = None
+                ptr += 1
+
+            yield OpArg(op, arg)
+
+
+Bytecode = getattr(dis, 'Bytecode', Bytecode_compat)
+
+
+unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape)
diff --git a/venv/lib/python2.7/site-packages/setuptools/py33compat.pyc b/venv/lib/python2.7/site-packages/setuptools/py33compat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c34cda37c4b9601044125f26799122bc14362ed7
GIT binary patch
literal 1962
zcmZSn%*&NH<x)&C0~D|_FfceUFfbIKVqjoMVPHsMWXNG)h=Q{j8KM|r;!F%tObnF*
zFfKDg6f;A3o;U+bDhoq47ekRR10y423L{83kC7n)WEvAg4jV%*J3|yZ10#sf%#g#u
zkju#s#mT^!%Eb`H&5+8(kj2B0!orZk%FxWj5XH-o!p4xo#gM|z(89pb%)k&C#mA7!
z&ydQ%kix-`%E!>m%n&627GY*c;bchVWXKW(sml@qO9_Fz5Ujz?z`&6C|NsC0ej1Dn
z3=AdAAU|eSKsX@DjFQ}(_=3cu;?$xNP$2jhI2NTBb1^V5<QF98r=%(*7NwW)GcYhX
zRhFcJ1mctPa|;qn;2{Sx)(K>)6axdub&zmsVE_eE3M0tzQOpcM!5T~q3=GL20*0MI
zns^x)7-|?9Y8V*e!C@T?b{W*MEFdlUDXCz+B_LjLYED`Zh@k<BH!xA0&%nT-Ur>};
zmRORiUzS*;pO&AKl3G-(pIxY*U2J4-ZdjOQWL{=yVP2e5nO+`ml44?FU|?X7o~Iw8
zUyxa#o0(T!l9-dDTb^iH8knJ9oLW*^P?DdYQ;f_ks5CZ)_*}1`vV?<yfgwIVGcU6w
zK3*8)50IxA7?VMP0g?kb5fnnjPeFmsz>oz_Q8f$<S&R%>OrQv^WdubALWGf_mWd&S
ziJ_JmOtLUktYD~NW~gCe$Yx+DdH@b2W(LVxR)!i@h7uNrELMhWR)(VeP>B>~260JH
zKr(~Ukho+DD}#u54GV*KEgQ&~6gCF)T4tD5Him2_hNANfCF~4Y9H0~?S<B8)!^Tj<
z4oX|ij0_^REDVK~429<z@&rJM3u*{6*pLz~kU2GMAYX(r7Fsfdr*JX^Yk-nWu^j^g
zLu6)ZPKtuMMt*@#Vo|!Lx<Wx>W|2Z#evv|IVseH;enDzcVo7Fxo<e4x0w_T#<R@jN
zCYLCvgE;CXpdd`j1VwKqh?xlr*-QpT28K*f+6AZOOa=x<20w7x2B+D?qN2n~aIz?2
z2Pc_$kWt{Yo|Bpfrc*MDOF(JO!!gV?-Z98M)YsK7q=biofx$H*#MRHm)deIP1hN*a
zE;FwrH9fT`zNE4swHTcA{POcsgFuea07Y;RD6fDmPpT|QEe6|>nx6)y3rdQ>CZ|@E
zq~@ihro@A?5J+c!0azZy<z!%B$jQ%32U`G6$6#V06LU#wQGC1@C^0L5f`M6rQHY6+
zk&TI;iHnJ!Nr{n*iJy^|QGk(?nT?T)NduI`q4^*$F*h|nz66v4;^TAkQ%ZAE<Ku(a
z7#J9W#2FYEz&=9|1L4OYP}&g!`3>Z3Hbzcnu+w2>8kkd>ms*^hSda>FDJWM5feOeV
zP;{4oSjqW0IjPB@qzg$AprR8j;h9^IUsU2+RFq#71S%>^1VJ{zixE9gLMY0EBra)e
zQhLRi6?(b(WvRtMpfnFoZ=jS1PKxpIxv3?I$vKI|#n3<og?CCxX+aJoL4rL8PWkDn
zC5a^^MM0pV7#tlQA-+BV;KDr!WHH2Rpx6bo1|lZFL2Uy`Bz7Rr7K0qi!^p$P!^F%e
Wz{tzU#U#Kez{JKR#4M~N#0&tb-@DNO

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/sandbox.py b/venv/lib/python2.7/site-packages/setuptools/sandbox.py
new file mode 100644
index 00000000..685f3f72
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/sandbox.py
@@ -0,0 +1,491 @@
+import os
+import sys
+import tempfile
+import operator
+import functools
+import itertools
+import re
+import contextlib
+import pickle
+import textwrap
+
+from setuptools.extern import six
+from setuptools.extern.six.moves import builtins, map
+
+import pkg_resources.py31compat
+
+if sys.platform.startswith('java'):
+    import org.python.modules.posix.PosixModule as _os
+else:
+    _os = sys.modules[os.name]
+try:
+    _file = file
+except NameError:
+    _file = None
+_open = open
+from distutils.errors import DistutilsError
+from pkg_resources import working_set
+
+
+__all__ = [
+    "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup",
+]
+
+
+def _execfile(filename, globals, locals=None):
+    """
+    Python 3 implementation of execfile.
+    """
+    mode = 'rb'
+    with open(filename, mode) as stream:
+        script = stream.read()
+    if locals is None:
+        locals = globals
+    code = compile(script, filename, 'exec')
+    exec(code, globals, locals)
+
+
+@contextlib.contextmanager
+def save_argv(repl=None):
+    saved = sys.argv[:]
+    if repl is not None:
+        sys.argv[:] = repl
+    try:
+        yield saved
+    finally:
+        sys.argv[:] = saved
+
+
+@contextlib.contextmanager
+def save_path():
+    saved = sys.path[:]
+    try:
+        yield saved
+    finally:
+        sys.path[:] = saved
+
+
+@contextlib.contextmanager
+def override_temp(replacement):
+    """
+    Monkey-patch tempfile.tempdir with replacement, ensuring it exists
+    """
+    pkg_resources.py31compat.makedirs(replacement, exist_ok=True)
+
+    saved = tempfile.tempdir
+
+    tempfile.tempdir = replacement
+
+    try:
+        yield
+    finally:
+        tempfile.tempdir = saved
+
+
+@contextlib.contextmanager
+def pushd(target):
+    saved = os.getcwd()
+    os.chdir(target)
+    try:
+        yield saved
+    finally:
+        os.chdir(saved)
+
+
+class UnpickleableException(Exception):
+    """
+    An exception representing another Exception that could not be pickled.
+    """
+
+    @staticmethod
+    def dump(type, exc):
+        """
+        Always return a dumped (pickled) type and exc. If exc can't be pickled,
+        wrap it in UnpickleableException first.
+        """
+        try:
+            return pickle.dumps(type), pickle.dumps(exc)
+        except Exception:
+            # get UnpickleableException inside the sandbox
+            from setuptools.sandbox import UnpickleableException as cls
+            return cls.dump(cls, cls(repr(exc)))
+
+
+class ExceptionSaver:
+    """
+    A Context Manager that will save an exception, serialized, and restore it
+    later.
+    """
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, exc, tb):
+        if not exc:
+            return
+
+        # dump the exception
+        self._saved = UnpickleableException.dump(type, exc)
+        self._tb = tb
+
+        # suppress the exception
+        return True
+
+    def resume(self):
+        "restore and re-raise any exception"
+
+        if '_saved' not in vars(self):
+            return
+
+        type, exc = map(pickle.loads, self._saved)
+        six.reraise(type, exc, self._tb)
+
+
+@contextlib.contextmanager
+def save_modules():
+    """
+    Context in which imported modules are saved.
+
+    Translates exceptions internal to the context into the equivalent exception
+    outside the context.
+    """
+    saved = sys.modules.copy()
+    with ExceptionSaver() as saved_exc:
+        yield saved
+
+    sys.modules.update(saved)
+    # remove any modules imported since
+    del_modules = (
+        mod_name for mod_name in sys.modules
+        if mod_name not in saved
+        # exclude any encodings modules. See #285
+        and not mod_name.startswith('encodings.')
+    )
+    _clear_modules(del_modules)
+
+    saved_exc.resume()
+
+
+def _clear_modules(module_names):
+    for mod_name in list(module_names):
+        del sys.modules[mod_name]
+
+
+@contextlib.contextmanager
+def save_pkg_resources_state():
+    saved = pkg_resources.__getstate__()
+    try:
+        yield saved
+    finally:
+        pkg_resources.__setstate__(saved)
+
+
+@contextlib.contextmanager
+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():
+                with save_argv():
+                    with override_temp(temp_dir):
+                        with pushd(setup_dir):
+                            # ensure setuptools commands are available
+                            __import__('setuptools')
+                            yield
+
+
+def _needs_hiding(mod_name):
+    """
+    >>> _needs_hiding('setuptools')
+    True
+    >>> _needs_hiding('pkg_resources')
+    True
+    >>> _needs_hiding('setuptools_plugin')
+    False
+    >>> _needs_hiding('setuptools.__init__')
+    True
+    >>> _needs_hiding('distutils')
+    True
+    >>> _needs_hiding('os')
+    False
+    >>> _needs_hiding('Cython')
+    True
+    """
+    pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)')
+    return bool(pattern.match(mod_name))
+
+
+def hide_setuptools():
+    """
+    Remove references to setuptools' modules from sys.modules to allow the
+    invocation to import the most appropriate setuptools. This technique is
+    necessary to avoid issues such as #315 where setuptools upgrading itself
+    would fail to find a function declared in the metadata.
+    """
+    modules = filter(_needs_hiding, sys.modules)
+    _clear_modules(modules)
+
+
+def run_setup(setup_script, args):
+    """Run a distutils setup script, sandboxed in its directory"""
+    setup_dir = os.path.abspath(os.path.dirname(setup_script))
+    with setup_context(setup_dir):
+        try:
+            sys.argv[:] = [setup_script] + list(args)
+            sys.path.insert(0, setup_dir)
+            # reset to include setup dir, w/clean callback list
+            working_set.__init__()
+            working_set.callbacks.append(lambda dist: dist.activate())
+
+            # __file__ should be a byte string on Python 2 (#712)
+            dunder_file = (
+                setup_script
+                if isinstance(setup_script, str) else
+                setup_script.encode(sys.getfilesystemencoding())
+            )
+
+            with DirectorySandbox(setup_dir):
+                ns = dict(__file__=dunder_file, __name__='__main__')
+                _execfile(setup_script, ns)
+        except SystemExit as v:
+            if v.args and v.args[0]:
+                raise
+            # Normal exit, just return
+
+
+class AbstractSandbox:
+    """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts"""
+
+    _active = False
+
+    def __init__(self):
+        self._attrs = [
+            name for name in dir(_os)
+            if not name.startswith('_') and hasattr(self, name)
+        ]
+
+    def _copy(self, source):
+        for name in self._attrs:
+            setattr(os, name, getattr(source, name))
+
+    def __enter__(self):
+        self._copy(self)
+        if _file:
+            builtins.file = self._file
+        builtins.open = self._open
+        self._active = True
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        self._active = False
+        if _file:
+            builtins.file = _file
+        builtins.open = _open
+        self._copy(_os)
+
+    def run(self, func):
+        """Run 'func' under os sandboxing"""
+        with self:
+            return func()
+
+    def _mk_dual_path_wrapper(name):
+        original = getattr(_os, name)
+
+        def wrap(self, src, dst, *args, **kw):
+            if self._active:
+                src, dst = self._remap_pair(name, src, dst, *args, **kw)
+            return original(src, dst, *args, **kw)
+
+        return wrap
+
+    for name in ["rename", "link", "symlink"]:
+        if hasattr(_os, name):
+            locals()[name] = _mk_dual_path_wrapper(name)
+
+    def _mk_single_path_wrapper(name, original=None):
+        original = original or getattr(_os, name)
+
+        def wrap(self, path, *args, **kw):
+            if self._active:
+                path = self._remap_input(name, path, *args, **kw)
+            return original(path, *args, **kw)
+
+        return wrap
+
+    if _file:
+        _file = _mk_single_path_wrapper('file', _file)
+    _open = _mk_single_path_wrapper('open', _open)
+    for name in [
+        "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir",
+        "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat",
+        "startfile", "mkfifo", "mknod", "pathconf", "access"
+    ]:
+        if hasattr(_os, name):
+            locals()[name] = _mk_single_path_wrapper(name)
+
+    def _mk_single_with_return(name):
+        original = getattr(_os, name)
+
+        def wrap(self, path, *args, **kw):
+            if self._active:
+                path = self._remap_input(name, path, *args, **kw)
+                return self._remap_output(name, original(path, *args, **kw))
+            return original(path, *args, **kw)
+
+        return wrap
+
+    for name in ['readlink', 'tempnam']:
+        if hasattr(_os, name):
+            locals()[name] = _mk_single_with_return(name)
+
+    def _mk_query(name):
+        original = getattr(_os, name)
+
+        def wrap(self, *args, **kw):
+            retval = original(*args, **kw)
+            if self._active:
+                return self._remap_output(name, retval)
+            return retval
+
+        return wrap
+
+    for name in ['getcwd', 'tmpnam']:
+        if hasattr(_os, name):
+            locals()[name] = _mk_query(name)
+
+    def _validate_path(self, path):
+        """Called to remap or validate any path, whether input or output"""
+        return path
+
+    def _remap_input(self, operation, path, *args, **kw):
+        """Called for path inputs"""
+        return self._validate_path(path)
+
+    def _remap_output(self, operation, path):
+        """Called for path outputs"""
+        return self._validate_path(path)
+
+    def _remap_pair(self, operation, src, dst, *args, **kw):
+        """Called for path pairs like rename, link, and symlink operations"""
+        return (
+            self._remap_input(operation + '-from', src, *args, **kw),
+            self._remap_input(operation + '-to', dst, *args, **kw)
+        )
+
+
+if hasattr(os, 'devnull'):
+    _EXCEPTIONS = [os.devnull,]
+else:
+    _EXCEPTIONS = []
+
+
+class DirectorySandbox(AbstractSandbox):
+    """Restrict operations to a single subdirectory - pseudo-chroot"""
+
+    write_ops = dict.fromkeys([
+        "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir",
+        "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam",
+    ])
+
+    _exception_patterns = [
+        # Allow lib2to3 to attempt to save a pickled grammar object (#121)
+        r'.*lib2to3.*\.pickle$',
+    ]
+    "exempt writing to paths that match the pattern"
+
+    def __init__(self, sandbox, exceptions=_EXCEPTIONS):
+        self._sandbox = os.path.normcase(os.path.realpath(sandbox))
+        self._prefix = os.path.join(self._sandbox, '')
+        self._exceptions = [
+            os.path.normcase(os.path.realpath(path))
+            for path in exceptions
+        ]
+        AbstractSandbox.__init__(self)
+
+    def _violation(self, operation, *args, **kw):
+        from setuptools.sandbox import SandboxViolation
+        raise SandboxViolation(operation, args, kw)
+
+    if _file:
+
+        def _file(self, path, mode='r', *args, **kw):
+            if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path):
+                self._violation("file", path, mode, *args, **kw)
+            return _file(path, mode, *args, **kw)
+
+    def _open(self, path, mode='r', *args, **kw):
+        if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path):
+            self._violation("open", path, mode, *args, **kw)
+        return _open(path, mode, *args, **kw)
+
+    def tmpnam(self):
+        self._violation("tmpnam")
+
+    def _ok(self, path):
+        active = self._active
+        try:
+            self._active = False
+            realpath = os.path.normcase(os.path.realpath(path))
+            return (
+                self._exempted(realpath)
+                or realpath == self._sandbox
+                or realpath.startswith(self._prefix)
+            )
+        finally:
+            self._active = active
+
+    def _exempted(self, filepath):
+        start_matches = (
+            filepath.startswith(exception)
+            for exception in self._exceptions
+        )
+        pattern_matches = (
+            re.match(pattern, filepath)
+            for pattern in self._exception_patterns
+        )
+        candidates = itertools.chain(start_matches, pattern_matches)
+        return any(candidates)
+
+    def _remap_input(self, operation, path, *args, **kw):
+        """Called for path inputs"""
+        if operation in self.write_ops and not self._ok(path):
+            self._violation(operation, os.path.realpath(path), *args, **kw)
+        return path
+
+    def _remap_pair(self, operation, src, dst, *args, **kw):
+        """Called for path pairs like rename, link, and symlink operations"""
+        if not self._ok(src) or not self._ok(dst):
+            self._violation(operation, src, dst, *args, **kw)
+        return (src, dst)
+
+    def open(self, file, flags, mode=0o777, *args, **kw):
+        """Called for low-level os.open()"""
+        if flags & WRITE_FLAGS and not self._ok(file):
+            self._violation("os.open", file, flags, mode, *args, **kw)
+        return _os.open(file, flags, mode, *args, **kw)
+
+
+WRITE_FLAGS = functools.reduce(
+    operator.or_, [getattr(_os, a, 0) for a in
+        "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()]
+)
+
+
+class SandboxViolation(DistutilsError):
+    """A setup script attempted to modify the filesystem outside the sandbox"""
+
+    tmpl = textwrap.dedent("""
+        SandboxViolation: {cmd}{args!r} {kwargs}
+
+        The package setup script has attempted to modify files on your system
+        that are not within the EasyInstall build area, and has been aborted.
+
+        This package cannot be safely installed by EasyInstall, and may not
+        support alternate installation locations even if you run its setup
+        script by hand.  Please inform the package's author and the EasyInstall
+        maintainers to find out if a fix or workaround is available.
+        """).lstrip()
+
+    def __str__(self):
+        cmd, args, kwargs = self.args
+        return self.tmpl.format(**locals())
diff --git a/venv/lib/python2.7/site-packages/setuptools/sandbox.pyc b/venv/lib/python2.7/site-packages/setuptools/sandbox.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..802e2307a23c9bebd88e4df55d36dddf4af297af
GIT binary patch
literal 21816
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
LjE#|#QJVz-Qfv88

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/script (dev).tmpl b/venv/lib/python2.7/site-packages/setuptools/script (dev).tmpl
new file mode 100644
index 00000000..39a24b04
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/script (dev).tmpl	
@@ -0,0 +1,6 @@
+# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r
+__requires__ = %(spec)r
+__import__('pkg_resources').require(%(spec)r)
+__file__ = %(dev_path)r
+with open(__file__) as f:
+    exec(compile(f.read(), __file__, 'exec'))
diff --git a/venv/lib/python2.7/site-packages/setuptools/script.tmpl b/venv/lib/python2.7/site-packages/setuptools/script.tmpl
new file mode 100644
index 00000000..ff5efbca
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/script.tmpl
@@ -0,0 +1,3 @@
+# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r
+__requires__ = %(spec)r
+__import__('pkg_resources').run_script(%(spec)r, %(script_name)r)
diff --git a/venv/lib/python2.7/site-packages/setuptools/site-patch.py b/venv/lib/python2.7/site-packages/setuptools/site-patch.py
new file mode 100644
index 00000000..40b00de0
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/site-patch.py
@@ -0,0 +1,74 @@
+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")
+
+    known_paths = dict([(makepath(item)[1], 1) for item in sys.path])  # 2.2 comp
+
+    oldpos = getattr(sys, '__egginsert', 0)  # save old insertion position
+    sys.__egginsert = 0  # and reset the current one
+
+    for item in PYTHONPATH:
+        addsitedir(item)
+
+    sys.__egginsert += oldpos  # restore effective old position
+
+    d, nd = makepath(stdpath[0])
+    insert_at = None
+    new_path = []
+
+    for item in sys.path:
+        p, np = makepath(item)
+
+        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/lib/python2.7/site-packages/setuptools/site-patch.pyc b/venv/lib/python2.7/site-packages/setuptools/site-patch.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..85d15f89ce42b48b14a40d4622cc771eb1a03f25
GIT binary patch
literal 1847
zcmZSn%*&NH<x)&C0~9bZFfceUFfbIWF)%QsFfg<*Fhnshq%tz3FfwE_F%&5=q%trx
zGcYhlGce>aFr+Xs1ZyxeFff1(5M^LsU}Iola0VH0g^2;ADTRR{hk>CM&Sqq&Wn`#f
zWXNJ-$YKWRZ)RkuWn!pd0@;?$!BFhOP{Y8G#mbPv47M;7B*jw{%8<?gQkN$L;%Bje
zjbLYhXfELZ=}BQ>$Yfw>W@e~m263}E8A`Z7iklf3<ZD^L8aNrUxEV@#z}i?DD*iIm
zurRp9zGSFnW2j+cs9^=!SiBU(<|#VDP`DK2#TsUiLu=T;n%Eg?*uf6vWGLcetYK%!
z;$=u-1xs--)NsJ0`WS0C7_#`FQj7tGeT;=m87lQ)0m9Ev%gIo~3DsT0#*og)(9FaT
z!^}|2#Zb%5P|L#*o+rY<QX;^R&Bag@#K_19G9ZtUA)<y0YzYTLQ7Tx7fuTwYY!ukG
z8ZL$!ZiX5jhGrH9#_$vdh8ix0EJ1LDMFbQsWe6`3U`PRbrHPTDL<kh9pwQ-IaEX-x
zg+hri$n(vN3@Pjkk}2#AX-o`pObmsq89@Qf%K!~%4u%v?a6t2c7&QzG@gfWr5}>el
zi4_1FBMLQ!vG5aPcnt#sOO^;j4IhI!Q@jWR$PN~eM#*MIh8QM>T7HIF0g$I^1wrnq
z6=JC9fkvQ9Y$Mn>n5#glg&Ar^7-~cqY6L*BRn)*#BM8!*&B0LAzyykMA#ijEg5yqv
zp@x?sn~kA(29mNBOf^CbSz>S}I)eG)3^jsaAtnY!kdf>R=Cy(hg^o<&H9}D5XrwSO
z1Z!|HFfjOK{{R2~e+h^g5E<g(?-$@0;!(oNz`#(RnP+TNBFw<RP>@)X5uce`kY7}i
zS`?q0n4FPX!UD<}nI);kDxhqVUz(GWr(U9vmYJ8LP?C|VP?VaOqo7`#S(2)*kei=U
znv<Hz$iTo*!p*?I5FekKo}QUkoLW?p3CgS*5+E5+-Yc#wE&=7+{NfUJ1_p-Iyt2%q
z{Jav7RC;O&*iOIvywnm7kfU-EOVaX-a=~sbF38C&0qX&|wK%l^%uY`&Nh~QT0_y{b
zgAK|_%>zrOWESNm=0ePhk59|YNsW&OI}hZCc!-<9{G9y66c``mlFZx!u(&5UKwOK8
z@{7Q3NY2SGhJ;H>W^xJGjk$^0sUVAkK%oT=<HVE{P@tq_7L|a?m&AgC)Vvfh6A~aA
zppqvD6#PLT`5;jEfSp~CnGAMzaY+iuM6ivyl^}CKW@nb9=7Md6#S+*^kjqnxf<!>U
z3o@;^q$o8pH;50!2U(GlTAW-2_DgnNetBLz$lzkI&itH|g8bqVP?V*BV<a!7gp+}R
z0piH`M2PqDQp>@5!0HMh>IyVKP6iXj`3wvU`UORqWr-!J`elhl`f2$&DXB%p`q_p0
z*~LcY=7xn?M&@OP7Usn{mFea2CMhN+1_lNO>3RAg`URN<x|w;!C5bsXy5)(MrGXjx
z#i=Ew1tt0UImIZ<%#u{yg2a;K484L%u<PUFlk)Syjw((7xrUL4k%v);QHhb0Nr*{^
zQJ7JPiI-8Bk&Tg`kq3mCcp2H5m>GE(l^A&$*%^5l*%+Cbq?ouFS($j4jF^NNIhlAF
z`Iz{b#2DEa*_Z?vg_tCm_?aXa1(*dG`Iv%0slrbKlyHM|Kw%3?p7HUZ)D<5O4haM?
ZAYlS>j}0V6+kv9A7?c<|-FX<<837IwjSv6;

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/ssl_support.py b/venv/lib/python2.7/site-packages/setuptools/ssl_support.py
new file mode 100644
index 00000000..226db694
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/ssl_support.py
@@ -0,0 +1,260 @@
+import os
+import socket
+import atexit
+import re
+import functools
+
+from setuptools.extern.six.moves import urllib, http_client, map, filter
+
+from pkg_resources import ResolutionError, ExtractionError
+
+try:
+    import ssl
+except ImportError:
+    ssl = None
+
+__all__ = [
+    'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths',
+    'opener_for'
+]
+
+cert_paths = """
+/etc/pki/tls/certs/ca-bundle.crt
+/etc/ssl/certs/ca-certificates.crt
+/usr/share/ssl/certs/ca-bundle.crt
+/usr/local/share/certs/ca-root.crt
+/etc/ssl/cert.pem
+/System/Library/OpenSSL/certs/cert.pem
+/usr/local/share/certs/ca-root-nss.crt
+/etc/ssl/ca-bundle.pem
+""".strip().split()
+
+try:
+    HTTPSHandler = urllib.request.HTTPSHandler
+    HTTPSConnection = http_client.HTTPSConnection
+except AttributeError:
+    HTTPSHandler = HTTPSConnection = object
+
+is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection)
+
+
+try:
+    from ssl import CertificateError, match_hostname
+except ImportError:
+    try:
+        from backports.ssl_match_hostname import CertificateError
+        from backports.ssl_match_hostname import match_hostname
+    except ImportError:
+        CertificateError = None
+        match_hostname = None
+
+if not CertificateError:
+
+    class CertificateError(ValueError):
+        pass
+
+
+if not match_hostname:
+
+    def _dnsname_match(dn, hostname, max_wildcards=1):
+        """Matching according to RFC 6125, section 6.4.3
+
+        https://tools.ietf.org/html/rfc6125#section-6.4.3
+        """
+        pats = []
+        if not dn:
+            return False
+
+        # Ported from python3-syntax:
+        # leftmost, *remainder = dn.split(r'.')
+        parts = dn.split(r'.')
+        leftmost = parts[0]
+        remainder = parts[1:]
+
+        wildcards = leftmost.count('*')
+        if wildcards > max_wildcards:
+            # Issue #17980: avoid denials of service by refusing more
+            # than one wildcard per fragment.  A survey of established
+            # policy among SSL implementations showed it to be a
+            # reasonable choice.
+            raise CertificateError(
+                "too many wildcards in certificate DNS name: " + repr(dn))
+
+        # speed up common case w/o wildcards
+        if not wildcards:
+            return dn.lower() == hostname.lower()
+
+        # RFC 6125, section 6.4.3, subitem 1.
+        # The client SHOULD NOT attempt to match a presented identifier in which
+        # the wildcard character comprises a label other than the left-most label.
+        if leftmost == '*':
+            # When '*' is a fragment by itself, it matches a non-empty dotless
+            # fragment.
+            pats.append('[^.]+')
+        elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
+            # RFC 6125, section 6.4.3, subitem 3.
+            # The client SHOULD NOT attempt to match a presented identifier
+            # where the wildcard character is embedded within an A-label or
+            # U-label of an internationalized domain name.
+            pats.append(re.escape(leftmost))
+        else:
+            # Otherwise, '*' matches any dotless string, e.g. www*
+            pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
+
+        # add the remaining fragments, ignore any wildcards
+        for frag in remainder:
+            pats.append(re.escape(frag))
+
+        pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
+        return pat.match(hostname)
+
+    def match_hostname(cert, hostname):
+        """Verify that *cert* (in decoded format as returned by
+        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
+        rules are followed, but IP addresses are not accepted for *hostname*.
+
+        CertificateError is raised on failure. On success, the function
+        returns nothing.
+        """
+        if not cert:
+            raise ValueError("empty or no certificate")
+        dnsnames = []
+        san = cert.get('subjectAltName', ())
+        for key, value in san:
+            if key == 'DNS':
+                if _dnsname_match(value, hostname):
+                    return
+                dnsnames.append(value)
+        if not dnsnames:
+            # The subject is only checked when there is no dNSName entry
+            # in subjectAltName
+            for sub in cert.get('subject', ()):
+                for key, value in sub:
+                    # XXX according to RFC 2818, the most specific Common Name
+                    # must be used.
+                    if key == 'commonName':
+                        if _dnsname_match(value, hostname):
+                            return
+                        dnsnames.append(value)
+        if len(dnsnames) > 1:
+            raise CertificateError("hostname %r "
+                "doesn't match either of %s"
+                % (hostname, ', '.join(map(repr, dnsnames))))
+        elif len(dnsnames) == 1:
+            raise CertificateError("hostname %r "
+                "doesn't match %r"
+                % (hostname, dnsnames[0]))
+        else:
+            raise CertificateError("no appropriate commonName or "
+                "subjectAltName fields were found")
+
+
+class VerifyingHTTPSHandler(HTTPSHandler):
+    """Simple verifying handler: no auth, subclasses, timeouts, etc."""
+
+    def __init__(self, ca_bundle):
+        self.ca_bundle = ca_bundle
+        HTTPSHandler.__init__(self)
+
+    def https_open(self, req):
+        return self.do_open(
+            lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req
+        )
+
+
+class VerifyingHTTPSConn(HTTPSConnection):
+    """Simple verifying connection: no auth, subclasses, timeouts, etc."""
+
+    def __init__(self, host, ca_bundle, **kw):
+        HTTPSConnection.__init__(self, host, **kw)
+        self.ca_bundle = ca_bundle
+
+    def connect(self):
+        sock = socket.create_connection(
+            (self.host, self.port), getattr(self, 'source_address', None)
+        )
+
+        # Handle the socket if a (proxy) tunnel is present
+        if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None):
+            self.sock = sock
+            self._tunnel()
+            # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7
+            # change self.host to mean the proxy server host when tunneling is
+            # being used. Adapt, since we are interested in the destination
+            # host for the match_hostname() comparison.
+            actual_host = self._tunnel_host
+        else:
+            actual_host = self.host
+
+        if hasattr(ssl, 'create_default_context'):
+            ctx = ssl.create_default_context(cafile=self.ca_bundle)
+            self.sock = ctx.wrap_socket(sock, server_hostname=actual_host)
+        else:
+            # This is for python < 2.7.9 and < 3.4?
+            self.sock = ssl.wrap_socket(
+                sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle
+            )
+        try:
+            match_hostname(self.sock.getpeercert(), actual_host)
+        except CertificateError:
+            self.sock.shutdown(socket.SHUT_RDWR)
+            self.sock.close()
+            raise
+
+
+def opener_for(ca_bundle=None):
+    """Get a urlopen() replacement that uses ca_bundle for verification"""
+    return urllib.request.build_opener(
+        VerifyingHTTPSHandler(ca_bundle or find_ca_bundle())
+    ).open
+
+
+# from jaraco.functools
+def once(func):
+    @functools.wraps(func)
+    def wrapper(*args, **kwargs):
+        if not hasattr(func, 'always_returns'):
+            func.always_returns = func(*args, **kwargs)
+        return func.always_returns
+    return wrapper
+
+
+@once
+def get_win_certfile():
+    try:
+        import wincertstore
+    except ImportError:
+        return None
+
+    class CertFile(wincertstore.CertFile):
+        def __init__(self):
+            super(CertFile, self).__init__()
+            atexit.register(self.close)
+
+        def close(self):
+            try:
+                super(CertFile, self).close()
+            except OSError:
+                pass
+
+    _wincerts = CertFile()
+    _wincerts.addstore('CA')
+    _wincerts.addstore('ROOT')
+    return _wincerts.name
+
+
+def find_ca_bundle():
+    """Return an existing CA bundle path, or None"""
+    extant_cert_paths = filter(os.path.isfile, cert_paths)
+    return (
+        get_win_certfile()
+        or next(extant_cert_paths, None)
+        or _certifi_where()
+    )
+
+
+def _certifi_where():
+    try:
+        return __import__('certifi').where()
+    except (ImportError, ResolutionError, ExtractionError):
+        pass
diff --git a/venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc b/venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2d16236af784f8ff50311d0b6cdfb2d3e4482829
GIT binary patch
literal 9597
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
L2PY@L1Sb~&amCLz

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/unicode_utils.py b/venv/lib/python2.7/site-packages/setuptools/unicode_utils.py
new file mode 100644
index 00000000..7c63efd2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/unicode_utils.py
@@ -0,0 +1,44 @@
+import unicodedata
+import sys
+
+from setuptools.extern import six
+
+
+# HFS Plus uses decomposed UTF-8
+def decompose(path):
+    if isinstance(path, six.text_type):
+        return unicodedata.normalize('NFD', path)
+    try:
+        path = path.decode('utf-8')
+        path = unicodedata.normalize('NFD', path)
+        path = path.encode('utf-8')
+    except UnicodeError:
+        pass  # Not UTF-8
+    return path
+
+
+def filesys_decode(path):
+    """
+    Ensure that the given path is decoded,
+    NONE when no expected encoding works
+    """
+
+    if isinstance(path, six.text_type):
+        return path
+
+    fs_enc = sys.getfilesystemencoding() or 'utf-8'
+    candidates = fs_enc, 'utf-8'
+
+    for enc in candidates:
+        try:
+            return path.decode(enc)
+        except UnicodeDecodeError:
+            continue
+
+
+def try_encode(string, enc):
+    "turn unicode encoding into a functional routine"
+    try:
+        return string.encode(enc)
+    except UnicodeEncodeError:
+        return None
diff --git a/venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc b/venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9cef80ae7eaaa3eb6861656d63ad4badbb570acd
GIT binary patch
literal 1688
zcmZSn%*&NH<x)&C0~9bZFfceUFfbImGcYiuFfgPrGUPBYM8VmN3{i|=aVCZwCWc&Q
zhA3tR#uR3T76yhW7KRiSFoTsLg%!+T1L+UeU}Iol$o&8R|9?LXMg|6k5@wJEnH9+(
z4hXX{FfcfS#PUG03=B043?+;VSxgMgObkUzAoW=+Ad_ksKqA4FCLk4AtPCkk49$!T
zwO|vGRn&rw$YMh%2+tE_U@2i|$mU`w%4A?<WXxk^h^S#;2-X0(#SiQvKR1_RkV{HS
z(sV5}I6zL}0y(@mGq1QLF)uka2oy#ooFIwRijw$}%7WAqZUzR1(!9*%{FKy`#F9j?
zY+im*ZemVmRcZ;y<0+{iNiZ`t56t9YU|<M^=y5G7$}fTh3JU`RLqTFmh6czMFi~8@
zz`&qiP?TAgSdyw=mRO{pmY<W7T2!o`U8tX3Y-Db3SeRvGUS?=vUYt{zULJ3fVq#)o
zU|^7*ryrtUkXfJ$c6m;YZh4|*X<&waacW6vK}mjoPBAhQ>iqc9lFXc9y@E=xA3(0o
zEyyoU1%*Sg5Xeo8LW}~8%#8euLX5(Uyo@Z2;P?YM8{|!J{1t-21|0Z^_!9#~R&WV3
zLlz4|GXq0`Dkvsv85wFAL5wsehFT_u3NwZpCI**SJ%(ClhDt$@jx1J&8fH-R28S0~
zGq9Aff#WU%6nBNz429MV5rx(a;VDeeC@hX-U|`@<P*6~C%_}Y~N>wPyNGwq($w*a5
z&n!#LQvijmLT0f7$X_X`DLP=Ke*S*03gsE8c?x;?3aJ$ZsmUd&DGK0N%FIhwD9<m-
zE(R+^qzgX{b_NE9AW${|Cx;+V`T-}O;>zL@Q3eKv^wg5H%$!sZH#HY#RuCwNN<hH~
zjd&Mus(?g4C<ueV$qJ+@tvEh4FS!Ji^pX?vQZiE#OHzx$Hl*eygVP0=7^uX-$H2e<
z^<O+BFhxK)7vwbtHX%k9CLu;1CSFEnMnOhi#$-@9fiNgvfm4VU0|P9A89+&(nUNtl
zJWq&$rGyb2!K$DLPGMvSjsOuFAic%<pj1^_l&1hqsfZZL%qz)PNK{BG%}XxH%+E{A
zQ7FnUEy>JF^#kYYAW&Q(hq@~`1A;@n1QhCi`FW{eJHXkqxTGjEFFi<rfq?-W#9(5e
z!Wk6*B}J8>w2+^YstyWcP*!AMf`lw28G`%}1S*0`1VIYm*;_BQq9nB_50XMbCIx}y
pgFwj>>?s5>P~HRi#U?jDr8Fni4papcgIvkO$ipPS!pXxa3;+c&l@kB}

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/version.py b/venv/lib/python2.7/site-packages/setuptools/version.py
new file mode 100644
index 00000000..95e18696
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/version.py
@@ -0,0 +1,6 @@
+import pkg_resources
+
+try:
+    __version__ = pkg_resources.get_distribution('setuptools').version
+except Exception:
+    __version__ = 'unknown'
diff --git a/venv/lib/python2.7/site-packages/setuptools/version.pyc b/venv/lib/python2.7/site-packages/setuptools/version.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8723c1bcbde2cf53e5aac70c3551cbdf7656b95d
GIT binary patch
literal 376
zcmZSn%*&NH<x)&C0~D|_FfceUFfbH@h!h5f6h?*|28JjGhDtGpR0f7DMurq7hGs^F
zEGC91W`^)QaR!!D7KUsth9YYQMn=XIW{_|mBSS<ABSWwT3j+f~=Kufy|NE72fecM8
zDJ>|;&(A3?VP{}qD9y{x%P-H<0NGi>%fP@;kewc1lv<o$T9lkxTq3~0z>uC=5}%S;
zTvC*oR9cdmp9j`gmReK{VskSvFvQ10dGYZjoD2*Mt`*6t1t66gAP*sk;v5DB2K|Df
z%(BFiRQ<BVBK@@doRrj}V*Ttw{p?~Rb92MOEF<$WLksiboXYg_c#{+p69WSSgY-Q8
z5dDJ80^Q8K;*!Li9NqFn%hJFM{bIOZkeN`&=oM6!a4;}1*yQG?l;)(`F@ih~65wHC
KW)x%OWds1T7h&%J

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/wheel.py b/venv/lib/python2.7/site-packages/setuptools/wheel.py
new file mode 100644
index 00000000..e11f0a1d
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/wheel.py
@@ -0,0 +1,211 @@
+"""Wheels support."""
+
+from distutils.util import get_platform
+import email
+import itertools
+import os
+import posixpath
+import re
+import zipfile
+
+import pkg_resources
+import setuptools
+from pkg_resources import parse_version
+from setuptools.extern.packaging.utils import canonicalize_name
+from setuptools.extern.six import PY3
+from setuptools import pep425tags
+from setuptools.command.egg_info import write_requirements
+
+
+__metaclass__ = type
+
+
+WHEEL_NAME = re.compile(
+    r"""^(?P<project_name>.+?)-(?P<version>\d.*?)
+    ((-(?P<build>\d.*?))?-(?P<py_version>.+?)-(?P<abi>.+?)-(?P<platform>.+?)
+    )\.whl$""",
+    re.VERBOSE).match
+
+NAMESPACE_PACKAGE_INIT = '''\
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
+'''
+
+
+def unpack(src_dir, dst_dir):
+    '''Move everything under `src_dir` to `dst_dir`, and delete the former.'''
+    for dirpath, dirnames, filenames in os.walk(src_dir):
+        subdir = os.path.relpath(dirpath, src_dir)
+        for f in filenames:
+            src = os.path.join(dirpath, f)
+            dst = os.path.join(dst_dir, subdir, f)
+            os.renames(src, dst)
+        for n, d in reversed(list(enumerate(dirnames))):
+            src = os.path.join(dirpath, d)
+            dst = os.path.join(dst_dir, subdir, d)
+            if not os.path.exists(dst):
+                # Directory does not exist in destination,
+                # rename it and prune it from os.walk list.
+                os.renames(src, dst)
+                del dirnames[n]
+    # Cleanup.
+    for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True):
+        assert not filenames
+        os.rmdir(dirpath)
+
+
+class Wheel:
+
+    def __init__(self, filename):
+        match = WHEEL_NAME(os.path.basename(filename))
+        if match is None:
+            raise ValueError('invalid wheel name: %r' % filename)
+        self.filename = filename
+        for k, v in match.groupdict().items():
+            setattr(self, k, v)
+
+    def tags(self):
+        '''List tags (py_version, abi, platform) supported by this wheel.'''
+        return itertools.product(
+            self.py_version.split('.'),
+            self.abi.split('.'),
+            self.platform.split('.'),
+        )
+
+    def is_compatible(self):
+        '''Is the wheel is compatible with the current platform?'''
+        supported_tags = pep425tags.get_supported()
+        return next((True for t in self.tags() if t in supported_tags), False)
+
+    def egg_name(self):
+        return pkg_resources.Distribution(
+            project_name=self.project_name, version=self.version,
+            platform=(None if self.platform == 'any' else get_platform()),
+        ).egg_name() + '.egg'
+
+    def get_dist_info(self, zf):
+        # find the correct name of the .dist-info dir in the wheel file
+        for member in zf.namelist():
+            dirname = posixpath.dirname(member)
+            if (dirname.endswith('.dist-info') and
+                    canonicalize_name(dirname).startswith(
+                        canonicalize_name(self.project_name))):
+                return dirname
+        raise ValueError("unsupported wheel format. .dist-info not found")
+
+    def install_as_egg(self, destination_eggdir):
+        '''Install wheel as an egg directory.'''
+        with zipfile.ZipFile(self.filename) as zf:
+            self._install_as_egg(destination_eggdir, zf)
+
+    def _install_as_egg(self, destination_eggdir, zf):
+        dist_basename = '%s-%s' % (self.project_name, self.version)
+        dist_info = self.get_dist_info(zf)
+        dist_data = '%s.data' % dist_basename
+        egg_info = os.path.join(destination_eggdir, 'EGG-INFO')
+
+        self._convert_metadata(zf, destination_eggdir, dist_info, egg_info)
+        self._move_data_entries(destination_eggdir, dist_data)
+        self._fix_namespace_packages(egg_info, destination_eggdir)
+
+    @staticmethod
+    def _convert_metadata(zf, destination_eggdir, dist_info, egg_info):
+        def get_metadata(name):
+            with zf.open(posixpath.join(dist_info, name)) as fp:
+                value = fp.read().decode('utf-8') if PY3 else fp.read()
+                return email.parser.Parser().parsestr(value)
+
+        wheel_metadata = get_metadata('WHEEL')
+        # Check wheel format version is supported.
+        wheel_version = parse_version(wheel_metadata.get('Wheel-Version'))
+        wheel_v1 = (
+            parse_version('1.0') <= wheel_version < parse_version('2.0dev0')
+        )
+        if not wheel_v1:
+            raise ValueError(
+                'unsupported wheel format version: %s' % wheel_version)
+        # Extract to target directory.
+        os.mkdir(destination_eggdir)
+        zf.extractall(destination_eggdir)
+        # Convert metadata.
+        dist_info = os.path.join(destination_eggdir, dist_info)
+        dist = pkg_resources.Distribution.from_location(
+            destination_eggdir, dist_info,
+            metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info),
+        )
+
+        # Note: Evaluate and strip markers now,
+        # as it's difficult to convert back from the syntax:
+        # foobar; "linux" in sys_platform and extra == 'test'
+        def raw_req(req):
+            req.marker = None
+            return str(req)
+        install_requires = list(sorted(map(raw_req, dist.requires())))
+        extras_require = {
+            extra: sorted(
+                req
+                for req in map(raw_req, dist.requires((extra,)))
+                if req not in install_requires
+            )
+            for extra in dist.extras
+        }
+        os.rename(dist_info, egg_info)
+        os.rename(
+            os.path.join(egg_info, 'METADATA'),
+            os.path.join(egg_info, 'PKG-INFO'),
+        )
+        setup_dist = setuptools.Distribution(
+            attrs=dict(
+                install_requires=install_requires,
+                extras_require=extras_require,
+            ),
+        )
+        write_requirements(
+            setup_dist.get_command_obj('egg_info'),
+            None,
+            os.path.join(egg_info, 'requires.txt'),
+        )
+
+    @staticmethod
+    def _move_data_entries(destination_eggdir, dist_data):
+        """Move data entries to their correct location."""
+        dist_data = os.path.join(destination_eggdir, dist_data)
+        dist_data_scripts = os.path.join(dist_data, 'scripts')
+        if os.path.exists(dist_data_scripts):
+            egg_info_scripts = os.path.join(
+                destination_eggdir, 'EGG-INFO', 'scripts')
+            os.mkdir(egg_info_scripts)
+            for entry in os.listdir(dist_data_scripts):
+                # Remove bytecode, as it's not properly handled
+                # during easy_install scripts install phase.
+                if entry.endswith('.pyc'):
+                    os.unlink(os.path.join(dist_data_scripts, entry))
+                else:
+                    os.rename(
+                        os.path.join(dist_data_scripts, entry),
+                        os.path.join(egg_info_scripts, entry),
+                    )
+            os.rmdir(dist_data_scripts)
+        for subdir in filter(os.path.exists, (
+            os.path.join(dist_data, d)
+            for d in ('data', 'headers', 'purelib', 'platlib')
+        )):
+            unpack(subdir, destination_eggdir)
+        if os.path.exists(dist_data):
+            os.rmdir(dist_data)
+
+    @staticmethod
+    def _fix_namespace_packages(egg_info, destination_eggdir):
+        namespace_packages = os.path.join(
+            egg_info, 'namespace_packages.txt')
+        if os.path.exists(namespace_packages):
+            with open(namespace_packages) as fp:
+                namespace_packages = fp.read().split()
+            for mod in namespace_packages:
+                mod_dir = os.path.join(destination_eggdir, *mod.split('.'))
+                mod_init = os.path.join(mod_dir, '__init__.py')
+                if os.path.exists(mod_dir) and not os.path.exists(mod_init):
+                    with open(mod_init, 'w') as fp:
+                        fp.write(NAMESPACE_PACKAGE_INIT)
diff --git a/venv/lib/python2.7/site-packages/setuptools/wheel.pyc b/venv/lib/python2.7/site-packages/setuptools/wheel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..058edfdcf0a22086b0cd084df3cd4f83483f10bc
GIT binary patch
literal 9839
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/setuptools/windows_support.py b/venv/lib/python2.7/site-packages/setuptools/windows_support.py
new file mode 100644
index 00000000..cb977cff
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/setuptools/windows_support.py
@@ -0,0 +1,29 @@
+import platform
+import ctypes
+
+
+def windows_only(func):
+    if platform.system() != 'Windows':
+        return lambda *args, **kwargs: None
+    return func
+
+
+@windows_only
+def hide_file(path):
+    """
+    Set the hidden attribute on a file or directory.
+
+    From http://stackoverflow.com/questions/19622133/
+
+    `path` must be text.
+    """
+    __import__('ctypes.wintypes')
+    SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW
+    SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD
+    SetFileAttributes.restype = ctypes.wintypes.BOOL
+
+    FILE_ATTRIBUTE_HIDDEN = 0x02
+
+    ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN)
+    if not ret:
+        raise ctypes.WinError()
diff --git a/venv/lib/python2.7/site-packages/setuptools/windows_support.pyc b/venv/lib/python2.7/site-packages/setuptools/windows_support.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5e455f93ace2b1802caf585c92a92fba49c040c1
GIT binary patch
literal 1490
zcmZSn%*&NH<x)&C0~9bZFfceUFfbIGFfcHrFfgPrGUPBYM8VmN3{i{>DNGD43=C0B
z45>^EDa;^tGb2M3Ge~i;1`7iNL+1bg|Nr|XGcqtRfH25VXON+?3=9k<3=CO}49#Gp
zvzZx+B%#Iy*Dx>yYcMk~F!+_QGcYiOXXd5kmluOw1~LF-P&~*GkOe6qwIC5c4G>uZ
z67$Q?OVt3W1oIM$(u+&j7#J9`%Rx*HkpI9$aR~zhgML9#W?5oMs(x8wk$zf!PD*M~
zv3_=;es-~uxw&CsmXUdxp@n&IPGx#|yh)0QiGhKEL3*Bkh<-t4fo^7AaY<rMj&6CP
zWoclBesO9^X+cSTeoiqmvmE05_~O!ng8ZTqy@JXT4h9AWo1Dblq?ANEkPnN&ZUVa)
zBvp`;Sdx}slnZusab<ByYA(WaX{C9|VCRF0f%5|o0|NuhYx#LOm8_r`0R=MyqYxuI
zBRI-IkpYTFaFiE9qCAC>p_!3^v4oK!i-{qNnIVgXp_Y*W#ARj3VuLZ*8Pb>-Y8V;f
zIbb53U@jLZjnsmrY8V)5m>8Ow7;2drYM2>{bHOUPK?$mfks*%(lprCAu(+Fnfq_dw
zK|vunwM3yLBUK?IGbJT8Pa(0Sq$o3~v?Ns_KTjc1AuTf}RUyAfAtkdYHMu0es8Wv$
ztjnz^KUX26q@=(~U%$8{F*!TGEVU>tC%;@TIX_pwur#%}Br`v+Sl`gn%*e>l*jOK;
zEukQ>BqKo~x3suKAt_a%B(<VM4{TmBKLZ0pa!F-DYO!8<W*(T435tC`4N$0-a4|42
z#K&jmf|5&oJUA6VRD+qIK+nkmr=jfBqP)}`W1|uw1_p-U)DpMMoK#1cpNhl5YG4+C
z_4)*a2Zscefa1y}+&{<#tRk@}9qa^fZgKMW_W|d+qSRuLC|E^!W}a(NQGO9POM{hx
zyjCKJ&DIi81_lN<PaoHK$B>X9Pp8lj*LV+47Z+E*5>QeoN-Y5=Tre?ksh5+1fgvL^
zB{d!t=iH#AD*(!aoLr3jjM9w!Ol(a2jBJcx{|13VD+m-PL7>bTB+0<Q0Cqis7&w1`
aTx64*pHiBWY6mL+ia|M$hmnVwlMMhhBzM^W

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/INSTALLER b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt
new file mode 100644
index 00000000..c3441e6c
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/LICENSE.txt
@@ -0,0 +1,22 @@
+"wheel" copyright (c) 2012-2014 Daniel Holth <dholth@fastmail.fm> and
+contributors.
+
+The MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/METADATA b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/METADATA
new file mode 100644
index 00000000..2354dd4e
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/METADATA
@@ -0,0 +1,60 @@
+Metadata-Version: 2.1
+Name: wheel
+Version: 0.33.1
+Summary: A built-package format for Python.
+Home-page: https://github.com/pypa/wheel
+Author: Daniel Holth
+Author-email: dholth@fastmail.fm
+Maintainer: Alex Grönholm
+Maintainer-email: alex.gronholm@nextday.fi
+License: MIT
+Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues
+Project-URL: Documentation, https://wheel.readthedocs.io/
+Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html
+Keywords: wheel,packaging
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Topic :: System :: Archiving :: Packaging
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Provides-Extra: test
+Requires-Dist: pytest (>=3.0.0) ; extra == 'test'
+Requires-Dist: pytest-cov ; extra == 'test'
+
+wheel
+=====
+
+This library is the reference implementation of the Python wheel packaging
+standard, as defined in `PEP 427`_.
+
+It has two different roles:
+
+#. A setuptools_ extension for building wheels that provides the
+   ``bdist_wheel`` setuptools command
+#. A command line tool for working with wheel files
+
+It should be noted that wheel is **not** intended to be used as a library, and
+as such there is no stable, public API.
+
+.. _PEP 427: https://www.python.org/dev/peps/pep-0427/
+.. _setuptools: https://pypi.org/project/setuptools/
+
+
+Code of Conduct
+---------------
+
+Everyone interacting in the wheel project's codebases, issue trackers, chat
+rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
+
+.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
+
+
diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/RECORD b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/RECORD
new file mode 100644
index 00000000..0da2b17a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/RECORD
@@ -0,0 +1,32 @@
+wheel/__init__.py,sha256=OyOAcqlvJaBEASYRGijJyAkY_HL_5HR3alvjO5BEwKg,96
+wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417
+wheel/bdist_wheel.py,sha256=x2beC81u8AzTNVLwD36EPkVX5AxAYs2q70N09BxvMN0,14756
+wheel/metadata.py,sha256=uBv2aOz4U2sERF834C8DeNo235drcsp3ypTzT7MTWEA,4699
+wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908
+wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257
+wheel/util.py,sha256=zwVIk-9qWVQLRMgkgQTMp4TRE4HY03-tCUxLrtCpsfU,924
+wheel/wheelfile.py,sha256=U_13q1XpVt02704XXkFRzmUbz_0R9-GgNxMOZFP3tOs,7168
+wheel/cli/__init__.py,sha256=GWSoGUpRabTf8bk3FsNTPrc5Fsr8YOv2dX55iY2W7eY,2572
+wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497
+wheel/cli/pack.py,sha256=vkvZc4-rRZyWiwc6sHjpqIjzwDRMEF5u3JUNU9NY_jA,2263
+wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673
+wheel-0.33.1.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125
+wheel-0.33.1.dist-info/METADATA,sha256=ZKo4q8P_vXXg-OGjDZGlaIf4gafusgkeCd6jDxbrJLA,2082
+wheel-0.33.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110
+wheel-0.33.1.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108
+wheel-0.33.1.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6
+wheel-0.33.1.dist-info/RECORD,,
+../../../bin/wheel,sha256=OCFWNKDpsEXoJHgrake_1yGLK_AVoqhPfggZMMr5qKg,233
+wheel-0.33.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+wheel/cli/convert.pyc,,
+wheel/util.pyc,,
+wheel/cli/pack.pyc,,
+wheel/cli/unpack.pyc,,
+wheel/__init__.pyc,,
+wheel/metadata.pyc,,
+wheel/pkginfo.pyc,,
+wheel/__main__.pyc,,
+wheel/cli/__init__.pyc,,
+wheel/pep425tags.pyc,,
+wheel/wheelfile.pyc,,
+wheel/bdist_wheel.pyc,,
diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/WHEEL b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/WHEEL
new file mode 100644
index 00000000..c8240f03
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt
new file mode 100644
index 00000000..b27acadd
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/entry_points.txt
@@ -0,0 +1,6 @@
+[console_scripts]
+wheel = wheel.cli:main
+
+[distutils.commands]
+bdist_wheel = wheel.bdist_wheel:bdist_wheel
+
diff --git a/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/top_level.txt b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/top_level.txt
new file mode 100644
index 00000000..2309722a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel-0.33.1.dist-info/top_level.txt
@@ -0,0 +1 @@
+wheel
diff --git a/venv/lib/python2.7/site-packages/wheel/__init__.py b/venv/lib/python2.7/site-packages/wheel/__init__.py
new file mode 100644
index 00000000..745cefc2
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/__init__.py
@@ -0,0 +1,2 @@
+# __variables__ with double-quoted values will be available in setup.py:
+__version__ = "0.33.1"
diff --git a/venv/lib/python2.7/site-packages/wheel/__init__.pyc b/venv/lib/python2.7/site-packages/wheel/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b83d7301415430a7c560e8f78744c2628f0e8461
GIT binary patch
literal 219
zcmZSn%*&NH<x)&C0~9baFfceUFfbHzF)%QsFfc?hFr+Xt1ZyyX#Ml@Z7!34`jr9!u
zG(ZYVxEUB2;^WIwi;6Sz^Wx(*K!zZQVvwo&1x1-<i6yD}Wr;=lY56%RsYS*5*@gPq
z#YX1lhJ{&1=4FN!=EXUc>E-bzDJCWc1_lP{dHNyx1(^l9nR&$}i8(pC<%yQ1ff@Sc
m8L6o`P%=I~GcU6wK3=b&vV?<yfx#v>KczG$)eh`XkUId2^fdbb

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/__main__.py b/venv/lib/python2.7/site-packages/wheel/__main__.py
new file mode 100644
index 00000000..b3773a20
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/__main__.py
@@ -0,0 +1,19 @@
+"""
+Wheel command line tool (enable python -m wheel syntax)
+"""
+
+import sys
+
+
+def main():  # needed for console script
+    if __package__ == '':
+        # To be able to run 'python wheel-0.9.whl/wheel':
+        import os.path
+        path = os.path.dirname(os.path.dirname(__file__))
+        sys.path[0:0] = [path]
+    import wheel.cli
+    sys.exit(wheel.cli.main())
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/venv/lib/python2.7/site-packages/wheel/__main__.pyc b/venv/lib/python2.7/site-packages/wheel/__main__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c194b581c03fb76163a7306e4e350952bad0fc5a
GIT binary patch
literal 811
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI`F)%QsFfc?hFr+Xtq%bk$Ffv3jGNdpwv@kG4
zF)^evGo-LEWHT`oSuvzCGGwtZq%tuyGcYtWGBD;bfHVYau!797WME+63eQMQ%~43s
z&&^HDOHs(l%u7`$$<NPG&`8ZoOv*`BD5xyS$j?*I%~dD|t1Pa}D@m--<jVa2|NnnK
zu;Z8+7#LU>7#N&Eh88g}FqD8@26BN9$hs5;kP~Ye7-|?8vX~gMm=TN;7Lc==85wFB
z8EP0A(is^_SV3x1m_h#0hBz0bpN*lG2`tCXP{YKK#leup3G-7514FO|$bP>PP)LCt
zmI-2MaDm*y&A`AAA77A|oSm4S8XsT6&cMKsU#wS<Sdvi!(gkLK1XD7L@)C1XOE|z9
z(lT>EszH7$t}HI$WME(b2Y_C3P9|7iYDH#A2}l|ykeis9rvVZu0mW2)aS)gd3Td!L
z4X~3yL@_AT^b3kI%Mwdc^~(~A^waWlQc{bG^|K50vx|+)%?%5)jLgdnEzFB^D$~p3
zO;Suu3=9km()08~^b0ZzbTjjcOA>Q(bjuShO9M0X!RABB_;`>z;^XxSDuY1&2l=L$
z2V^ZH4-*fg9HST`4<po%5S8G>01lS;_>}zQ`1l|;1_lPOW~e$)u*Am)fs8`<0?eY9
dSHKRj$<0qG%}KQbg=;a$F>Fjc%$!_2i~voMx$po0

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/bdist_wheel.py b/venv/lib/python2.7/site-packages/wheel/bdist_wheel.py
new file mode 100644
index 00000000..4f06d369
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/bdist_wheel.py
@@ -0,0 +1,372 @@
+"""
+Create a wheel (.whl) distribution.
+
+A wheel is a built archive format.
+"""
+
+import os
+import shutil
+import sys
+import re
+from email.generator import Generator
+from distutils.core import Command
+from distutils.sysconfig import get_python_version
+from distutils import log as logger
+from glob import iglob
+from shutil import rmtree
+from warnings import warn
+
+import pkg_resources
+
+from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform
+from .pkginfo import write_pkg_info
+from .metadata import pkginfo_to_metadata
+from .wheelfile import WheelFile
+from . import pep425tags
+from . import __version__ as wheel_version
+
+
+safe_name = pkg_resources.safe_name
+safe_version = pkg_resources.safe_version
+
+PY_LIMITED_API_PATTERN = r'cp3\d'
+
+
+def safer_name(name):
+    return safe_name(name).replace('-', '_')
+
+
+def safer_version(version):
+    return safe_version(version).replace('-', '_')
+
+
+class bdist_wheel(Command):
+
+    description = 'create a wheel distribution'
+
+    user_options = [('bdist-dir=', 'b',
+                     "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"),
+                    ('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]"),
+                    ('universal', None,
+                     "make a universal wheel"
+                     " (default: false)"),
+                    ('python-tag=', None,
+                     "Python implementation compatibility tag"
+                     " (default: py%s)" % get_impl_ver()[0]),
+                    ('build-number=', None,
+                     "Build number for this particular version. "
+                     "As specified in PEP-0427, this must start with a digit. "
+                     "[default: None]"),
+                    ('py-limited-api=', None,
+                     "Python tag (cp32|cp33|cpNN) for abi3 wheel tag"
+                     " (default: false)"),
+                    ]
+
+    boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal']
+
+    def initialize_options(self):
+        self.bdist_dir = None
+        self.data_dir = None
+        self.plat_name = None
+        self.plat_tag = None
+        self.format = 'zip'
+        self.keep_temp = False
+        self.dist_dir = None
+        self.egginfo_dir = None
+        self.root_is_pure = None
+        self.skip_build = None
+        self.relative = False
+        self.owner = None
+        self.group = None
+        self.universal = False
+        self.python_tag = 'py' + get_impl_ver()[0]
+        self.build_number = None
+        self.py_limited_api = False
+        self.plat_name_supplied = False
+
+    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, 'wheel')
+
+        self.data_dir = self.wheel_dist_name + '.data'
+        self.plat_name_supplied = self.plat_name is not None
+
+        need_options = ('dist_dir', 'plat_name', 'skip_build')
+
+        self.set_undefined_options('bdist',
+                                   *zip(need_options, need_options))
+
+        self.root_is_pure = not (self.distribution.has_ext_modules()
+                                 or self.distribution.has_c_libraries())
+
+        if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api):
+            raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN)
+
+        # Support legacy [wheel] section for setting universal
+        wheel = self.distribution.get_option_dict('wheel')
+        if 'universal' in wheel:
+            # please don't define this in your global configs
+            logger.warn('The [wheel] section is deprecated. Use [bdist_wheel] instead.')
+            val = wheel['universal'][1].strip()
+            if val.lower() in ('1', 'true', 'yes'):
+                self.universal = True
+
+        if self.build_number is not None and not self.build_number[:1].isdigit():
+            raise ValueError("Build tag (build-number) must start with a digit.")
+
+    @property
+    def wheel_dist_name(self):
+        """Return distribution full name with - replaced with _"""
+        components = (safer_name(self.distribution.get_name()),
+                      safer_version(self.distribution.get_version()))
+        if self.build_number:
+            components += (self.build_number,)
+        return '-'.join(components)
+
+    def get_tag(self):
+        # bdist sets self.plat_name if unset, we should only use it for purepy
+        # wheels if the user supplied it.
+        if self.plat_name_supplied:
+            plat_name = self.plat_name
+        elif self.root_is_pure:
+            plat_name = 'any'
+        else:
+            plat_name = self.plat_name or get_platform()
+            if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647:
+                plat_name = 'linux_i686'
+        plat_name = plat_name.replace('-', '_').replace('.', '_')
+
+        if self.root_is_pure:
+            if self.universal:
+                impl = 'py2.py3'
+            else:
+                impl = self.python_tag
+            tag = (impl, 'none', plat_name)
+        else:
+            impl_name = get_abbr_impl()
+            impl_ver = get_impl_ver()
+            impl = impl_name + impl_ver
+            # We don't work on CPython 3.1, 3.0.
+            if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'):
+                impl = self.py_limited_api
+                abi_tag = 'abi3'
+            else:
+                abi_tag = str(get_abi_tag()).lower()
+            tag = (impl, abi_tag, plat_name)
+            supported_tags = pep425tags.get_supported(
+                supplied_platform=plat_name if self.plat_name_supplied else None)
+            # XXX switch to this alternate implementation for non-pure:
+            if not self.py_limited_api:
+                assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0])
+            assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag)
+        return tag
+
+    def run(self):
+        build_scripts = self.reinitialize_command('build_scripts')
+        build_scripts.executable = 'python'
+        build_scripts.force = True
+
+        build_ext = self.reinitialize_command('build_ext')
+        build_ext.inplace = False
+
+        if not self.skip_build:
+            self.run_command('build')
+
+        install = self.reinitialize_command('install',
+                                            reinit_subcommands=True)
+        install.root = self.bdist_dir
+        install.compile = False
+        install.skip_build = self.skip_build
+        install.warn_dir = False
+
+        # A wheel without setuptools scripts is more cross-platform.
+        # Use the (undocumented) `no_ep` option to setuptools'
+        # install_scripts command to avoid creating entry point scripts.
+        install_scripts = self.reinitialize_command('install_scripts')
+        install_scripts.no_ep = True
+
+        # Use a custom scheme for the archive, because we have to decide
+        # at installation time which scheme to use.
+        for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'):
+            setattr(install,
+                    'install_' + key,
+                    os.path.join(self.data_dir, key))
+
+        basedir_observed = ''
+
+        if os.name == 'nt':
+            # win32 barfs if any of these are ''; could be '.'?
+            # (distutils.command.install:change_roots bug)
+            basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..'))
+            self.install_libbase = self.install_lib = basedir_observed
+
+        setattr(install,
+                'install_purelib' if self.root_is_pure else 'install_platlib',
+                basedir_observed)
+
+        logger.info("installing to %s", self.bdist_dir)
+
+        self.run_command('install')
+
+        impl_tag, abi_tag, plat_tag = self.get_tag()
+        archive_basename = "{}-{}-{}-{}".format(self.wheel_dist_name, impl_tag, abi_tag, plat_tag)
+        if not self.relative:
+            archive_root = self.bdist_dir
+        else:
+            archive_root = os.path.join(
+                self.bdist_dir,
+                self._ensure_relative(install.install_base))
+
+        self.set_undefined_options('install_egg_info', ('target', 'egginfo_dir'))
+        distinfo_dirname = '{}-{}.dist-info'.format(
+            safer_name(self.distribution.get_name()),
+            safer_version(self.distribution.get_version()))
+        distinfo_dir = os.path.join(self.bdist_dir, distinfo_dirname)
+        self.egg2dist(self.egginfo_dir, distinfo_dir)
+
+        self.write_wheelfile(distinfo_dir)
+
+        # Make the archive
+        if not os.path.exists(self.dist_dir):
+            os.makedirs(self.dist_dir)
+
+        wheel_path = os.path.join(self.dist_dir, archive_basename + '.whl')
+        with WheelFile(wheel_path, 'w') as wf:
+            wf.write_files(archive_root)
+
+        # Add to 'Distribution.dist_files' so that the "upload" command works
+        getattr(self.distribution, 'dist_files', []).append(
+            ('bdist_wheel', get_python_version(), wheel_path))
+
+        if not self.keep_temp:
+            logger.info('removing %s', self.bdist_dir)
+            if not self.dry_run:
+                rmtree(self.bdist_dir)
+
+    def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'):
+        from email.message import Message
+        msg = Message()
+        msg['Wheel-Version'] = '1.0'  # of the spec
+        msg['Generator'] = generator
+        msg['Root-Is-Purelib'] = str(self.root_is_pure).lower()
+        if self.build_number is not None:
+            msg['Build'] = self.build_number
+
+        # Doesn't work for bdist_wininst
+        impl_tag, abi_tag, plat_tag = self.get_tag()
+        for impl in impl_tag.split('.'):
+            for abi in abi_tag.split('.'):
+                for plat in plat_tag.split('.'):
+                    msg['Tag'] = '-'.join((impl, abi, plat))
+
+        wheelfile_path = os.path.join(wheelfile_base, 'WHEEL')
+        logger.info('creating %s', wheelfile_path)
+        with open(wheelfile_path, 'w') as f:
+            Generator(f, maxheaderlen=0).flatten(msg)
+
+    def _ensure_relative(self, path):
+        # copied from dir_util, deleted
+        drive, path = os.path.splitdrive(path)
+        if path[0:1] == os.sep:
+            path = drive + path[1:]
+        return path
+
+    @property
+    def license_paths(self):
+        metadata = self.distribution.get_option_dict('metadata')
+        files = set()
+        patterns = sorted({
+            option for option in metadata.get('license_files', ('', ''))[1].split()
+        })
+
+        if 'license_file' in metadata:
+            warn('The "license_file" option is deprecated. Use "license_files" instead.',
+                 DeprecationWarning)
+            files.add(metadata['license_file'][1])
+
+        if 'license_file' not in metadata and 'license_files' not in metadata:
+            patterns = ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*')
+
+        for pattern in patterns:
+            for path in iglob(pattern):
+                if path not in files and os.path.isfile(path):
+                    logger.info('adding license file "%s" (matched pattern "%s")', path, pattern)
+                    files.add(path)
+
+        return files
+
+    def egg2dist(self, egginfo_path, distinfo_path):
+        """Convert an .egg-info directory into a .dist-info directory"""
+        def adios(p):
+            """Appropriately delete directory, file or link."""
+            if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p):
+                shutil.rmtree(p)
+            elif os.path.exists(p):
+                os.unlink(p)
+
+        adios(distinfo_path)
+
+        if not os.path.exists(egginfo_path):
+            # There is no egg-info. This is probably because the egg-info
+            # file/directory is not named matching the distribution name used
+            # to name the archive file. Check for this case and report
+            # accordingly.
+            import glob
+            pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info')
+            possible = glob.glob(pat)
+            err = "Egg metadata expected at %s but not found" % (egginfo_path,)
+            if possible:
+                alt = os.path.basename(possible[0])
+                err += " (%s found - possible misnamed archive file?)" % (alt,)
+
+            raise ValueError(err)
+
+        if os.path.isfile(egginfo_path):
+            # .egg-info is a single file
+            pkginfo_path = egginfo_path
+            pkg_info = pkginfo_to_metadata(egginfo_path, egginfo_path)
+            os.mkdir(distinfo_path)
+        else:
+            # .egg-info is a directory
+            pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO')
+            pkg_info = pkginfo_to_metadata(egginfo_path, pkginfo_path)
+
+            # ignore common egg metadata that is useless to wheel
+            shutil.copytree(egginfo_path, distinfo_path,
+                            ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt',
+                                                 'not-zip-safe'}
+                            )
+
+            # delete dependency_links if it is only whitespace
+            dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt')
+            with open(dependency_links_path, 'r') as dependency_links_file:
+                dependency_links = dependency_links_file.read().strip()
+            if not dependency_links:
+                adios(dependency_links_path)
+
+        write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info)
+
+        for license_path in self.license_paths:
+            filename = os.path.basename(license_path)
+            shutil.copy(license_path, os.path.join(distinfo_path, filename))
+
+        adios(egginfo_path)
diff --git a/venv/lib/python2.7/site-packages/wheel/bdist_wheel.pyc b/venv/lib/python2.7/site-packages/wheel/bdist_wheel.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..22c7dcd6c53746ad919e70833a8380f459edc0bc
GIT binary patch
literal 14280
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
VOgv0V2tG3>BPSCZGbalt3jo*?@38;?

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/cli/__init__.py b/venv/lib/python2.7/site-packages/wheel/cli/__init__.py
new file mode 100644
index 00000000..95740bfb
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/cli/__init__.py
@@ -0,0 +1,88 @@
+"""
+Wheel command-line utility.
+"""
+
+from __future__ import print_function
+
+import argparse
+import os
+import sys
+
+
+def require_pkgresources(name):
+    try:
+        import pkg_resources  # noqa: F401
+    except ImportError:
+        raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name))
+
+
+class WheelError(Exception):
+    pass
+
+
+def unpack_f(args):
+    from .unpack import unpack
+    unpack(args.wheelfile, args.dest)
+
+
+def pack_f(args):
+    from .pack import pack
+    pack(args.directory, args.dest_dir, args.build_number)
+
+
+def convert_f(args):
+    from .convert import convert
+    convert(args.files, args.dest_dir, args.verbose)
+
+
+def version_f(args):
+    from .. import __version__
+    print("wheel %s" % __version__)
+
+
+def parser():
+    p = argparse.ArgumentParser()
+    s = p.add_subparsers(help="commands")
+
+    unpack_parser = s.add_parser('unpack', help='Unpack wheel')
+    unpack_parser.add_argument('--dest', '-d', help='Destination directory',
+                               default='.')
+    unpack_parser.add_argument('wheelfile', help='Wheel file')
+    unpack_parser.set_defaults(func=unpack_f)
+
+    repack_parser = s.add_parser('pack', help='Repack wheel')
+    repack_parser.add_argument('directory', help='Root directory of the unpacked wheel')
+    repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir,
+                               help="Directory to store the wheel (default %(default)s)")
+    repack_parser.add_argument('--build-number', help="Build tag to use in the wheel name")
+    repack_parser.set_defaults(func=pack_f)
+
+    convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel')
+    convert_parser.add_argument('files', nargs='*', help='Files to convert')
+    convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir,
+                                help="Directory to store wheels (default %(default)s)")
+    convert_parser.add_argument('--verbose', '-v', action='store_true')
+    convert_parser.set_defaults(func=convert_f)
+
+    version_parser = s.add_parser('version', help='Print version and exit')
+    version_parser.set_defaults(func=version_f)
+
+    help_parser = s.add_parser('help', help='Show this help')
+    help_parser.set_defaults(func=lambda args: p.print_help())
+
+    return p
+
+
+def main():
+    p = parser()
+    args = p.parse_args()
+    if not hasattr(args, 'func'):
+        p.print_help()
+    else:
+        try:
+            args.func(args)
+            return 0
+        except WheelError as e:
+            print(e, file=sys.stderr)
+
+    return 1
diff --git a/venv/lib/python2.7/site-packages/wheel/cli/__init__.pyc b/venv/lib/python2.7/site-packages/wheel/cli/__init__.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3059b5b91b402cadd18dfb424ab07c1c0feebcd9
GIT binary patch
literal 4405
zcmZSn%*&NH<x)&C0~9bbFfceUFftTRW?*1QVPJ@2U`SzPNMT~gVPwc<Vu)g5U<C1*
z8FH8zqL{&Q%nUg!3{fmFHY-CED?<tkLkj~#6dOYdD?=(fLmDGP3L8kInSmiPii07A
z9mI*^WJuuvGq@O1IKd2Vh7>L^gNGr78_eKkNZ|o9_!v@{8G<!<85kIfWf>S4xWY41
zQ*#uO^K)|(^HOwkGV@XuN=q_xGD|A;xHA9$|Nmcuk%57sgpYxNp`a);uOvRLG%vX%
zGe6HS86?5Pz`(%Dz`)=P@~tfc14E?%*b58{ISdT7j11v<Y78tTj11Xa3`G_UjEsyW
zOrUVcVrHmeU}$Cpp(aL#JVu6y6b6Q14N$=OfvqjpXJBAZuQsSvSIA3EO(|9=$WD(h
zN-fSWElN%;R?sL&EGkjRPg5vPEh#N1$<NOz*3{Er0XY@qHx$Js+zbp1p1B42MJ299
zMfpV~JPZsBL8W;mnYpPD0X7B(hP3>m+{6+MkcUb@=Hw;jrUrq$r~!&pFj1V&z`&qi
zP?TAgSdyw=mRO{pmY<W7T2!o`U8tX3Y-Db3SeRvGUS?=vUYt{zULJ3fVq#)oU|^7*
zryrtUkXfLcnO9trn3JPho@iMbn4w<|3VbM;oRg^^AD@|*SrQ+wS5R3Z!oa{#lv-Gt
zS(F-Ikev?qI>_<G93VF_GBXM=@-miiF)%QIqY>;Gcp?P3-3b&eAjPQ+3{i{>LBU{u
zKs*T&j*ka<Gd><{Mtpp3eoARhYJ5CI703=Si=O@tVrO7r5C$brP)x8f!c!S2X@FCi
zIw(&;auWkXE;yAj)-Zz7Qx=3|VrT|sFhqI+g#;uSgCe>#uOKlw8=TaFKtWf+$-uw>
zj)}C)oK$e!r=%7mrG&(y^kT3|aA1H5dWJ{|D54;aj!zQ@g$yWpGB64t!UiM&4jWy<
zVN=7vkj2c<%*?=ul;aQ~1TqR7J|IRAKPW?i!Y3uOC^fkxzo-)I8c_Jer({BMQc`JV
zPD*@UX>L+#5jbT9fpQ>ND>$sc1YH9R6w4q##HY#7I=DcoH90@8EVZZvT>1oovTX^d
zL<A+K;vhj#0D=^ir4}XS7pEcx5J)9BY`_Fv0|*qOP*=yNDPj#Hcy?1lNm7iULLFR)
zGc(jMGKe)ZLemi_x%g#*@+>5$fy&(Y__EZZ;>`TK_;_%M1<qs&s>R^ER{|<tf+RrU
z0}3v1<$@GCAPI25fC;*X4$R?cYAB%tax*A(fnt;yRJN{RWMC*^V8~)*Xl7vOWMJrE
zV8~(u*MLk6%?ymS4B&E!8C2_nYJ3)kW=6(ZMo`dYv4E=e6gIG8c2FIj!pYFg!~`nK
zKyqAQ32u-Eun;S#3NK*;naT*s!zsLAC43+ywM+~(Obj4>{9r)=kRT&eND$O+Na0{8
zVQ0wVV94SGs}O=%2GJx877~GLf>_3dY?&xni5N&pEi*$6GuSe5h7<{g6iKj@6hkv3
z6C+dttCi9aD<N8C7*b>zQsfv?<QbZo7{U4=wsIressJ`x5o{|9Lk$Z<7DN#bvLZ&X
zA|<dQR)!i@sG@cTaFa=yp^X8ox&u@rs4y@v_<;-gjMSV0aA^i@{6Nb1Vo?1W3a%m)
z!0ELZ6yLhKpdzmrl)QCQibWY17+g||OEU8kK`kK#MBxZZ7b&S}iKRIuC7?1@F9?(m
zib2&3xQ12$l?q_nLCq*|840#9C>2y*K`aas03|t)JA?A`OAv;GT012fsS1#)AT<S|
z8f-SidAcc?Ma4!Sx4{Z)g_3-Q;*$KLR0WVmuy+(Rpzc#pg|Re?HH$&*J6&CHQLYOq
z%8Nl6-w9N<E0iRrgG?$dPF2XvLoy1~b^sT6#qyvgAfy;nNKH>y$S+bT&&&h0c0d}z
z76*Ys4O}wjfhtsR@Msl-{OXpOlUfW?2Q8AoO+Ob*KY)!X#^C`_k*2E)EoC7QRaOFu
zx<qhm72Lo92St2IQE6%kD59WwyjYBZfgu3YwpD<NC?w{kD5O?omVkpLI3vGYp(G=-
zSOJt`!0i!G)Pk@us0aW>E-2fB5*b4<xb*V_lVCf+<yt&QCs+(zH-cH<04Sh;=>}>|
z*yJSUCZ#0Wxr0&~s7wQQ2*8;ku_(PDv8Xr|+~RjEN-xb#%_|82i4=i_5>ry*i%XNh
zYKn@%UIYn2_~4c`h?@x22o@+#Es2LFy5b;ELMs8~qx@oUJ}5{m$pFVwa%oXYW>FBR
z=@$fQ<pfDHFfeF<Vh|is#U-Ft1tjgqLu~_z6oGRNOax>)G!-EWLE{xB1j>`37=iM^
zaR82!AW++qu5}H_e-PhjgW|#f6d8;>j6zJJjG~O}jKYipOrng!jM8wnB$zD*76-{m
zGJzZXpz0b_je=W&#h^+RoE)L`54d)!Wn?H}0@XYzjGzW`u_3f-YGz<y%(G*t6a~p;
zv4BW$t<J;{4C%eGf_ray42-o*42&ggpo%7i8Csb%Gcq!Qdv7cZ!5Sb3_ys92Ffe3-
z`~i+%P=S{T$}1Y692#T+avCVdfIS@#E(t(+F(a`!v81FZ2vpsIO#t@;f}}voL4GT)
zEC#2N;*ylqq9Sku0vuW3`~*%QsgP&{Sxna$1T}ne6EpLCK=B7^(=jk|GV(C;Gx9Pq
zGx9QWF!D2sGiiVu(jbq<$EV~c!#iAQr6r|BsqyhaAZG_@g8HSPes7Qshy_X;;LeF_
zMRIBZsHTAg3Mi4I<r8qY2HAsh49KJb3JP%10_j8Afg=snh+|_CVB%rqVdP=vWEW%M
IWQ9US00gn-+5i9m

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/cli/convert.py b/venv/lib/python2.7/site-packages/wheel/cli/convert.py
new file mode 100644
index 00000000..f1a793a6
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/cli/convert.py
@@ -0,0 +1,269 @@
+import os.path
+import re
+import shutil
+import sys
+import tempfile
+import zipfile
+from distutils import dist
+from glob import iglob
+
+from ..bdist_wheel import bdist_wheel
+from ..wheelfile import WheelFile
+from . import WheelError, require_pkgresources
+
+egg_info_re = re.compile(r'''
+    (?P<name>.+?)-(?P<ver>.+?)
+    (-(?P<pyver>py\d\.\d)
+     (-(?P<arch>.+?))?
+    )?.egg$''', re.VERBOSE)
+
+
+class _bdist_wheel_tag(bdist_wheel):
+    # allow the client to override the default generated wheel tag
+    # The default bdist_wheel implementation uses python and abi tags
+    # of the running python process. This is not suitable for
+    # generating/repackaging prebuild binaries.
+
+    full_tag_supplied = False
+    full_tag = None  # None or a (pytag, soabitag, plattag) triple
+
+    def get_tag(self):
+        if self.full_tag_supplied and self.full_tag is not None:
+            return self.full_tag
+        else:
+            return bdist_wheel.get_tag(self)
+
+
+def egg2wheel(egg_path, dest_dir):
+    filename = os.path.basename(egg_path)
+    match = egg_info_re.match(filename)
+    if not match:
+        raise WheelError('Invalid egg file name: {}'.format(filename))
+
+    egg_info = match.groupdict()
+    dir = tempfile.mkdtemp(suffix="_e2w")
+    if os.path.isfile(egg_path):
+        # assume we have a bdist_egg otherwise
+        with zipfile.ZipFile(egg_path) as egg:
+            egg.extractall(dir)
+    else:
+        # support buildout-style installed eggs directories
+        for pth in os.listdir(egg_path):
+            src = os.path.join(egg_path, pth)
+            if os.path.isfile(src):
+                shutil.copy2(src, dir)
+            else:
+                shutil.copytree(src, os.path.join(dir, pth))
+
+    pyver = egg_info['pyver']
+    if pyver:
+        pyver = egg_info['pyver'] = pyver.replace('.', '')
+
+    arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_')
+
+    # assume all binary eggs are for CPython
+    abi = 'cp' + pyver[2:] if arch != 'any' else 'none'
+
+    root_is_purelib = egg_info['arch'] is None
+    if root_is_purelib:
+        bw = bdist_wheel(dist.Distribution())
+    else:
+        bw = _bdist_wheel_tag(dist.Distribution())
+
+    bw.root_is_pure = root_is_purelib
+    bw.python_tag = pyver
+    bw.plat_name_supplied = True
+    bw.plat_name = egg_info['arch'] or 'any'
+    if not root_is_purelib:
+        bw.full_tag_supplied = True
+        bw.full_tag = (pyver, abi, arch)
+
+    dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info))
+    bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir)
+    bw.write_wheelfile(dist_info_dir, generator='egg2wheel')
+    wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info)
+    with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf:
+        wf.write_files(dir)
+
+    shutil.rmtree(dir)
+
+
+def parse_wininst_info(wininfo_name, egginfo_name):
+    """Extract metadata from filenames.
+
+    Extracts the 4 metadataitems needed (name, version, pyversion, arch) from
+    the installer filename and the name of the egg-info directory embedded in
+    the zipfile (if any).
+
+    The egginfo filename has the format::
+
+        name-ver(-pyver)(-arch).egg-info
+
+    The installer filename has the format::
+
+        name-ver.arch(-pyver).exe
+
+    Some things to note:
+
+    1. The installer filename is not definitive. An installer can be renamed
+       and work perfectly well as an installer. So more reliable data should
+       be used whenever possible.
+    2. The egg-info data should be preferred for the name and version, because
+       these come straight from the distutils metadata, and are mandatory.
+    3. The pyver from the egg-info data should be ignored, as it is
+       constructed from the version of Python used to build the installer,
+       which is irrelevant - the installer filename is correct here (even to
+       the point that when it's not there, any version is implied).
+    4. The architecture must be taken from the installer filename, as it is
+       not included in the egg-info data.
+    5. Architecture-neutral installers still have an architecture because the
+       installer format itself (being executable) is architecture-specific. We
+       should therefore ignore the architecture if the content is pure-python.
+    """
+
+    egginfo = None
+    if egginfo_name:
+        egginfo = egg_info_re.search(egginfo_name)
+        if not egginfo:
+            raise ValueError("Egg info filename %s is not valid" % (egginfo_name,))
+
+    # Parse the wininst filename
+    # 1. Distribution name (up to the first '-')
+    w_name, sep, rest = wininfo_name.partition('-')
+    if not sep:
+        raise ValueError("Installer filename %s is not valid" % (wininfo_name,))
+
+    # Strip '.exe'
+    rest = rest[:-4]
+    # 2. Python version (from the last '-', must start with 'py')
+    rest2, sep, w_pyver = rest.rpartition('-')
+    if sep and w_pyver.startswith('py'):
+        rest = rest2
+        w_pyver = w_pyver.replace('.', '')
+    else:
+        # Not version specific - use py2.py3. While it is possible that
+        # pure-Python code is not compatible with both Python 2 and 3, there
+        # is no way of knowing from the wininst format, so we assume the best
+        # here (the user can always manually rename the wheel to be more
+        # restrictive if needed).
+        w_pyver = 'py2.py3'
+    # 3. Version and architecture
+    w_ver, sep, w_arch = rest.rpartition('.')
+    if not sep:
+        raise ValueError("Installer filename %s is not valid" % (wininfo_name,))
+
+    if egginfo:
+        w_name = egginfo.group('name')
+        w_ver = egginfo.group('ver')
+
+    return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver}
+
+
+def wininst2wheel(path, dest_dir):
+    with zipfile.ZipFile(path) as bdw:
+        # Search for egg-info in the archive
+        egginfo_name = None
+        for filename in bdw.namelist():
+            if '.egg-info' in filename:
+                egginfo_name = filename
+                break
+
+        info = parse_wininst_info(os.path.basename(path), egginfo_name)
+
+        root_is_purelib = True
+        for zipinfo in bdw.infolist():
+            if zipinfo.filename.startswith('PLATLIB'):
+                root_is_purelib = False
+                break
+        if root_is_purelib:
+            paths = {'purelib': ''}
+        else:
+            paths = {'platlib': ''}
+
+        dist_info = "%(name)s-%(ver)s" % info
+        datadir = "%s.data/" % dist_info
+
+        # rewrite paths to trick ZipFile into extracting an egg
+        # XXX grab wininst .ini - between .exe, padding, and first zip file.
+        members = []
+        egginfo_name = ''
+        for zipinfo in bdw.infolist():
+            key, basename = zipinfo.filename.split('/', 1)
+            key = key.lower()
+            basepath = paths.get(key, None)
+            if basepath is None:
+                basepath = datadir + key.lower() + '/'
+            oldname = zipinfo.filename
+            newname = basepath + basename
+            zipinfo.filename = newname
+            del bdw.NameToInfo[oldname]
+            bdw.NameToInfo[newname] = zipinfo
+            # Collect member names, but omit '' (from an entry like "PLATLIB/"
+            if newname:
+                members.append(newname)
+            # Remember egg-info name for the egg2dist call below
+            if not egginfo_name:
+                if newname.endswith('.egg-info'):
+                    egginfo_name = newname
+                elif '.egg-info/' in newname:
+                    egginfo_name, sep, _ = newname.rpartition('/')
+        dir = tempfile.mkdtemp(suffix="_b2w")
+        bdw.extractall(dir, members)
+
+    # egg2wheel
+    abi = 'none'
+    pyver = info['pyver']
+    arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_')
+    # Wininst installers always have arch even if they are not
+    # architecture-specific (because the format itself is).
+    # So, assume the content is architecture-neutral if root is purelib.
+    if root_is_purelib:
+        arch = 'any'
+    # If the installer is architecture-specific, it's almost certainly also
+    # CPython-specific.
+    if arch != 'any':
+        pyver = pyver.replace('py', 'cp')
+    wheel_name = '-'.join((dist_info, pyver, abi, arch))
+    if root_is_purelib:
+        bw = bdist_wheel(dist.Distribution())
+    else:
+        bw = _bdist_wheel_tag(dist.Distribution())
+
+    bw.root_is_pure = root_is_purelib
+    bw.python_tag = pyver
+    bw.plat_name_supplied = True
+    bw.plat_name = info['arch'] or 'any'
+
+    if not root_is_purelib:
+        bw.full_tag_supplied = True
+        bw.full_tag = (pyver, abi, arch)
+
+    dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info)
+    bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir)
+    bw.write_wheelfile(dist_info_dir, generator='wininst2wheel')
+
+    wheel_path = os.path.join(dest_dir, wheel_name)
+    with WheelFile(wheel_path, 'w') as wf:
+        wf.write_files(dir)
+
+    shutil.rmtree(dir)
+
+
+def convert(files, dest_dir, verbose):
+    # Only support wheel convert if pkg_resources is present
+    require_pkgresources('wheel convert')
+
+    for pat in files:
+        for installer in iglob(pat):
+            if os.path.splitext(installer)[1] == '.egg':
+                conv = egg2wheel
+            else:
+                conv = wininst2wheel
+
+            if verbose:
+                print("{}... ".format(installer))
+                sys.stdout.flush()
+
+            conv(installer, dest_dir)
+            if verbose:
+                print("OK")
diff --git a/venv/lib/python2.7/site-packages/wheel/cli/convert.pyc b/venv/lib/python2.7/site-packages/wheel/cli/convert.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1598be63fed6cb97009153693ec97b2468773276
GIT binary patch
literal 7962
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
Du&WnM

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/cli/pack.py b/venv/lib/python2.7/site-packages/wheel/cli/pack.py
new file mode 100644
index 00000000..af6e81c4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/cli/pack.py
@@ -0,0 +1,58 @@
+from __future__ import print_function
+
+import os.path
+import re
+import sys
+
+from wheel.cli import WheelError
+from wheel.wheelfile import WheelFile
+
+DIST_INFO_RE = re.compile(r"^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))\.dist-info$")
+
+
+def pack(directory, dest_dir, build_number):
+    """Repack a previously unpacked wheel directory into a new wheel file.
+
+    The .dist-info/WHEEL file must contain one or more tags so that the target
+    wheel file name can be determined.
+
+    :param directory: The unpacked wheel directory
+    :param dest_dir: Destination directory (defaults to the current directory)
+    """
+    # Find the .dist-info directory
+    dist_info_dirs = [fn for fn in os.listdir(directory)
+                      if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)]
+    if len(dist_info_dirs) > 1:
+        raise WheelError('Multiple .dist-info directories found in {}'.format(directory))
+    elif not dist_info_dirs:
+        raise WheelError('No .dist-info directories found in {}'.format(directory))
+
+    # Determine the target wheel filename
+    dist_info_dir = dist_info_dirs[0]
+    name_version = DIST_INFO_RE.match(dist_info_dir).group('namever')
+
+    # Add the build number if specific
+    if build_number:
+        name_version += '-' + build_number
+
+    # Read the tags from .dist-info/WHEEL
+    with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f:
+        tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')]
+        if not tags:
+            raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename'
+                             .format(dist_info_dir))
+
+    # Reassemble the tags for the wheel file
+    impls = sorted({tag.split('-')[0] for tag in tags})
+    abivers = sorted({tag.split('-')[1] for tag in tags})
+    platforms = sorted({tag.split('-')[2] for tag in tags})
+    tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)])
+
+    # Repack the wheel
+    wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline))
+    with WheelFile(wheel_path, 'w') as wf:
+        print("Repacking wheel as {}...".format(wheel_path), end='')
+        sys.stdout.flush()
+        wf.write_files(directory)
+
+    print('OK')
diff --git a/venv/lib/python2.7/site-packages/wheel/cli/pack.pyc b/venv/lib/python2.7/site-packages/wheel/cli/pack.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f47d975505e741e56be497f4a51d9429e9893bff
GIT binary patch
literal 3102
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/cli/unpack.py b/venv/lib/python2.7/site-packages/wheel/cli/unpack.py
new file mode 100644
index 00000000..2e9857a3
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/cli/unpack.py
@@ -0,0 +1,25 @@
+from __future__ import print_function
+
+import os.path
+import sys
+
+from ..wheelfile import WheelFile
+
+
+def unpack(path, dest='.'):
+    """Unpack a wheel.
+
+    Wheel content will be unpacked to {dest}/{name}-{ver}, where {name}
+    is the package name and {ver} its version.
+
+    :param path: The path to the wheel.
+    :param dest: Destination directory (default to current directory).
+    """
+    with WheelFile(path) as wf:
+        namever = wf.parsed_filename.group('namever')
+        destination = os.path.join(dest, namever)
+        print("Unpacking to: {}...".format(destination), end='')
+        sys.stdout.flush()
+        wf.extractall(destination)
+
+    print('OK')
diff --git a/venv/lib/python2.7/site-packages/wheel/cli/unpack.pyc b/venv/lib/python2.7/site-packages/wheel/cli/unpack.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4c7aa05119706514c580ac63d64640371fa73e01
GIT binary patch
literal 1182
zcmZSn%*&NH<x)&C0~9bZFfceUFftT-FfcHrFfgPrGUPBY<T5fuF)}cM_)H8rObk)X
zU^ym+92SNs7KRjNh7=Zt99D*0HijrR2F4Uth7>l27Dk3Bc7_xthF}eL1_p-A|NsC0
z*I;B|U?|~ZU|=XH%FHW?Pb<w!F3HT#^UDNT43XtzU|<N(NKMUg%gjkF0cp@n2FbEA
zFfed1FfcfSoL37nhk>DnfuWg^p+AwKmWiQ;i6M)TA&Uv*=4M8QT4sh4W`-;lhAdWw
z8b*d1W`<@ahFTVe5;l;Vve+4FSU`FqZf|B}WGvxe$l_$k;$moKU|<9p#tl`%7@oq)
z5Euc{$Oh5^@*l)c#eWzW7((+35|gtP5*5lpj@IMiQczG(0DC|oIX|x?HLpaWJToUp
zAt_a%6s$BgMWG~Lp*khCxTIFUIxjIdwN|&fEVZas2V_K1sscm|Y))peLP<ud0?3BM
z^i&0qVui%K6a}z)h0Ky-g|gJ5;>`R!sJ&JNiA9OI3I&NJ8CD7*V4WoyAnQP;KphBj
zA5<O44OR*+sl_Fkd5NHiP)NxvN=+`wFRE0~NJ&jgEX^qa=}s;!Dgt=~E~}{rc3uf6
zW<ibuxk4Bo7@2wL3MKhg3e~lGdU_?y3=9mZc_}5JB<5EFib{WP4ITyth9FSnmhgj8
zLt;^JYD#=sW=<-|v=UHUrx)dy7J!xK7niVr6_sRw8Cm(6d0-{rL{!4Yz`&4}UzD3z
z0=BBSvKTB>T#}MsS^`#=mQz}sQNjgsM@30dVsc4hPL2l1jv$a2*i2AJfGsOe3j#T~
zgd3Cr5CNkBay^(RPGw+V&@U*;EK4j&)h|md(of6JNl7g#*3T}~&n`AHH#aQIGBPhS
zv@kEusZ1}AH%T!uF)%PNNYB#`(J#m>(9O&%2Dw1DJkhc=Fhd_4El@H!CsQAiO7sdU
z!QO!IK$)T#ly4X~`5A>6MHwX-c^QS7G(Z^w?6LUxw9=B&qSW~KAdpMJ5tCo62TBM*
zAk9G_%_Sff*g8;1gM&Xvl!1W(>@NgCM<0URZ<Cv!Qks)$2TBdaAOQg;9!4G}0cHSc
Ch$J2W

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/metadata.py b/venv/lib/python2.7/site-packages/wheel/metadata.py
new file mode 100644
index 00000000..ab0c07e5
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/metadata.py
@@ -0,0 +1,141 @@
+"""
+Tools for converting old- to new-style metadata.
+"""
+
+import os.path
+import re
+import textwrap
+
+import pkg_resources
+
+from .pkginfo import read_pkg_info
+
+# Wheel itself is probably the only program that uses non-extras markers
+# in METADATA/PKG-INFO. Support its syntax with the extra at the end only.
+EXTRA_RE = re.compile(
+    r"""^(?P<package>.*?)(;\s*(?P<condition>.*?)(extra == '(?P<extra>.*?)')?)$""")
+
+
+def requires_to_requires_dist(requirement):
+    """Return the version specifier for a requirement in PEP 345/566 fashion."""
+    if getattr(requirement, 'url', None):
+        return " @ " + requirement.url
+
+    requires_dist = []
+    for op, ver in requirement.specs:
+        requires_dist.append(op + ver)
+    if not requires_dist:
+        return ''
+    return " (%s)" % ','.join(sorted(requires_dist))
+
+
+def convert_requirements(requirements):
+    """Yield Requires-Dist: strings for parsed requirements strings."""
+    for req in requirements:
+        parsed_requirement = pkg_resources.Requirement.parse(req)
+        spec = requires_to_requires_dist(parsed_requirement)
+        extras = ",".join(sorted(parsed_requirement.extras))
+        if extras:
+            extras = "[%s]" % extras
+        yield (parsed_requirement.project_name + extras + spec)
+
+
+def generate_requirements(extras_require):
+    """
+    Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement')
+    and ('Provides-Extra', 'extra') tuples.
+
+    extras_require is a dictionary of {extra: [requirements]} as passed to setup(),
+    using the empty extra {'': [requirements]} to hold install_requires.
+    """
+    for extra, depends in extras_require.items():
+        condition = ''
+        extra = extra or ''
+        if ':' in extra:  # setuptools extra:condition syntax
+            extra, condition = extra.split(':', 1)
+
+        extra = pkg_resources.safe_extra(extra)
+        if extra:
+            yield 'Provides-Extra', extra
+            if condition:
+                condition = "(" + condition + ") and "
+            condition += "extra == '%s'" % extra
+
+        if condition:
+            condition = ' ; ' + condition
+
+        for new_req in convert_requirements(depends):
+            yield 'Requires-Dist', new_req + condition
+
+
+def pkginfo_to_metadata(egg_info_path, pkginfo_path):
+    """
+    Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format
+    """
+    pkg_info = read_pkg_info(pkginfo_path)
+    pkg_info.replace_header('Metadata-Version', '2.1')
+    # Those will be regenerated from `requires.txt`.
+    del pkg_info['Provides-Extra']
+    del pkg_info['Requires-Dist']
+    requires_path = os.path.join(egg_info_path, 'requires.txt')
+    if os.path.exists(requires_path):
+        with open(requires_path) as requires_file:
+            requires = requires_file.read()
+
+        parsed_requirements = sorted(pkg_resources.split_sections(requires),
+                                     key=lambda x: x[0] or '')
+        for extra, reqs in parsed_requirements:
+            for key, value in generate_requirements({extra: reqs}):
+                if (key, value) not in pkg_info.items():
+                    pkg_info[key] = value
+
+    description = pkg_info['Description']
+    if description:
+        pkg_info.set_payload(dedent_description(pkg_info))
+        del pkg_info['Description']
+
+    return pkg_info
+
+
+def pkginfo_unicode(pkg_info, field):
+    """Hack to coax Unicode out of an email Message() - Python 3.3+"""
+    text = pkg_info[field]
+    field = field.lower()
+    if not isinstance(text, str):
+        if not hasattr(pkg_info, 'raw_items'):  # Python 3.2
+            return str(text)
+        for item in pkg_info.raw_items():
+            if item[0].lower() == field:
+                text = item[1].encode('ascii', 'surrogateescape') \
+                    .decode('utf-8')
+                break
+
+    return text
+
+
+def dedent_description(pkg_info):
+    """
+    Dedent and convert pkg_info['Description'] to Unicode.
+    """
+    description = pkg_info['Description']
+
+    # Python 3 Unicode handling, sorta.
+    surrogates = False
+    if not isinstance(description, str):
+        surrogates = True
+        description = pkginfo_unicode(pkg_info, 'Description')
+
+    description_lines = description.splitlines()
+    description_dedent = '\n'.join(
+        # if the first line of long_description is blank,
+        # the first line here will be indented.
+        (description_lines[0].lstrip(),
+         textwrap.dedent('\n'.join(description_lines[1:])),
+         '\n'))
+
+    if surrogates:
+        description_dedent = description_dedent \
+            .encode("utf8") \
+            .decode("ascii", "surrogateescape")
+
+    return description_dedent
diff --git a/venv/lib/python2.7/site-packages/wheel/metadata.pyc b/venv/lib/python2.7/site-packages/wheel/metadata.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c7b48420636c43996997252129ed6dbb0c7fbb66
GIT binary patch
literal 5114
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/pep425tags.py b/venv/lib/python2.7/site-packages/wheel/pep425tags.py
new file mode 100644
index 00000000..13b50731
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/pep425tags.py
@@ -0,0 +1,185 @@
+"""Generate and work with PEP 425 Compatibility Tags."""
+
+import distutils.util
+import platform
+import sys
+import sysconfig
+import warnings
+
+try:
+    from importlib.machinery import get_all_suffixes
+except ImportError:
+    from imp import get_suffixes as get_all_suffixes
+
+
+def get_config_var(var):
+    try:
+        return sysconfig.get_config_var(var)
+    except IOError as e:  # pip Issue #1074
+        warnings.warn("{0}".format(e), RuntimeWarning)
+        return None
+
+
+def get_abbr_impl():
+    """Return abbreviated implementation name."""
+    impl = platform.python_implementation()
+    if impl == 'PyPy':
+        return 'pp'
+    elif impl == 'Jython':
+        return 'jy'
+    elif impl == 'IronPython':
+        return 'ip'
+    elif impl == 'CPython':
+        return 'cp'
+
+    raise LookupError('Unknown Python implementation: ' + impl)
+
+
+def get_impl_ver():
+    """Return implementation version."""
+    impl_ver = get_config_var("py_version_nodot")
+    if not impl_ver or get_abbr_impl() == 'pp':
+        impl_ver = ''.join(map(str, get_impl_version_info()))
+    return impl_ver
+
+
+def get_impl_version_info():
+    """Return sys.version_info-like tuple for use in decrementing the minor
+    version."""
+    if get_abbr_impl() == 'pp':
+        # as per https://github.com/pypa/pip/issues/2882
+        return (sys.version_info[0], sys.pypy_version_info.major,
+                sys.pypy_version_info.minor)
+    else:
+        return sys.version_info[0], sys.version_info[1]
+
+
+def get_flag(var, fallback, expected=True, warn=True):
+    """Use a fallback method for determining SOABI flags if the needed config
+    var is unset or unavailable."""
+    val = get_config_var(var)
+    if val is None:
+        if warn:
+            warnings.warn("Config variable '{0}' is unset, Python ABI tag may "
+                          "be incorrect".format(var), RuntimeWarning, 2)
+        return fallback()
+    return val == expected
+
+
+def get_abi_tag():
+    """Return the ABI tag based on SOABI (if available) or emulate SOABI
+    (CPython 2, PyPy)."""
+    soabi = get_config_var('SOABI')
+    impl = get_abbr_impl()
+    if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'):
+        d = ''
+        m = ''
+        u = ''
+        if get_flag('Py_DEBUG',
+                    lambda: hasattr(sys, 'gettotalrefcount'),
+                    warn=(impl == 'cp')):
+            d = 'd'
+        if get_flag('WITH_PYMALLOC',
+                    lambda: impl == 'cp',
+                    warn=(impl == 'cp')):
+            m = 'm'
+        if get_flag('Py_UNICODE_SIZE',
+                    lambda: sys.maxunicode == 0x10ffff,
+                    expected=4,
+                    warn=(impl == 'cp' and
+                          sys.version_info < (3, 3))) \
+                and sys.version_info < (3, 3):
+            u = 'u'
+        abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u)
+    elif soabi and soabi.startswith('cpython-'):
+        abi = 'cp' + soabi.split('-')[1]
+    elif soabi:
+        abi = soabi.replace('.', '_').replace('-', '_')
+    else:
+        abi = None
+    return abi
+
+
+def get_platform():
+    """Return our platform name 'win32', 'linux_x86_64'"""
+    # XXX remove distutils dependency
+    result = distutils.util.get_platform().replace('.', '_').replace('-', '_')
+    if result == "linux_x86_64" and sys.maxsize == 2147483647:
+        # pip pull request #3497
+        result = "linux_i686"
+    return result
+
+
+def get_supported(versions=None, supplied_platform=None):
+    """Return a list of supported tags for each version specified in
+    `versions`.
+
+    :param versions: a list of string versions, of the form ["33", "32"],
+        or None. The first version will be assumed to support our ABI.
+    """
+    supported = []
+
+    # Versions must be given with respect to the preference
+    if versions is None:
+        versions = []
+        version_info = get_impl_version_info()
+        major = version_info[:-1]
+        # Support all previous minor Python versions.
+        for minor in range(version_info[-1], -1, -1):
+            versions.append(''.join(map(str, major + (minor,))))
+
+    impl = get_abbr_impl()
+
+    abis = []
+
+    abi = get_abi_tag()
+    if abi:
+        abis[0:0] = [abi]
+
+    abi3s = set()
+    for suffix in get_all_suffixes():
+        if suffix[0].startswith('.abi'):
+            abi3s.add(suffix[0].split('.', 2)[1])
+
+    abis.extend(sorted(list(abi3s)))
+
+    abis.append('none')
+
+    platforms = []
+    if supplied_platform:
+        platforms.append(supplied_platform)
+    platforms.append(get_platform())
+
+    # Current version, current API (built specifically for our Python):
+    for abi in abis:
+        for arch in platforms:
+            supported.append(('%s%s' % (impl, versions[0]), abi, arch))
+
+    # abi3 modules compatible with older version of Python
+    for version in versions[1:]:
+        # abi3 was introduced in Python 3.2
+        if version in ('31', '30'):
+            break
+        for abi in abi3s:   # empty set if not Python 3
+            for arch in platforms:
+                supported.append(("%s%s" % (impl, version), abi, arch))
+
+    # No abi / arch, but requires our implementation:
+    for i, version in enumerate(versions):
+        supported.append(('%s%s' % (impl, version), 'none', 'any'))
+        if i == 0:
+            # Tagged specifically as being cross-version compatible
+            # (with just the major version specified)
+            supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
+
+    # Major Python version + platform; e.g. binaries not using the Python API
+    for arch in platforms:
+        supported.append(('py%s' % (versions[0][0]), 'none', arch))
+
+    # No abi / arch, generic Python
+    for i, version in enumerate(versions):
+        supported.append(('py%s' % (version,), 'none', 'any'))
+        if i == 0:
+            supported.append(('py%s' % (version[0]), 'none', 'any'))
+
+    return supported
diff --git a/venv/lib/python2.7/site-packages/wheel/pep425tags.pyc b/venv/lib/python2.7/site-packages/wheel/pep425tags.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9ea959fa64d0281424ca22fc12ed68c414c3219e
GIT binary patch
literal 6669
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
Jc{r6gxd8Ciy;J}I

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/pkginfo.py b/venv/lib/python2.7/site-packages/wheel/pkginfo.py
new file mode 100644
index 00000000..115be45b
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/pkginfo.py
@@ -0,0 +1,43 @@
+"""Tools for reading and writing PKG-INFO / METADATA without caring
+about the encoding."""
+
+from email.parser import Parser
+
+try:
+    unicode
+    _PY3 = False
+except NameError:
+    _PY3 = True
+
+if not _PY3:
+    from email.generator import Generator
+
+    def read_pkg_info_bytes(bytestr):
+        return Parser().parsestr(bytestr)
+
+    def read_pkg_info(path):
+        with open(path, "r") as headers:
+            message = Parser().parse(headers)
+        return message
+
+    def write_pkg_info(path, message):
+        with open(path, 'w') as metadata:
+            Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message)
+else:
+    from email.generator import BytesGenerator
+
+    def read_pkg_info_bytes(bytestr):
+        headers = bytestr.decode(encoding="ascii", errors="surrogateescape")
+        message = Parser().parsestr(headers)
+        return message
+
+    def read_pkg_info(path):
+        with open(path, "r",
+                  encoding="ascii",
+                  errors="surrogateescape") as headers:
+            message = Parser().parse(headers)
+        return message
+
+    def write_pkg_info(path, message):
+        with open(path, "wb") as out:
+            BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message)
diff --git a/venv/lib/python2.7/site-packages/wheel/pkginfo.pyc b/venv/lib/python2.7/site-packages/wheel/pkginfo.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..00b42b9dbe01b82f0281130f4a9375608d592fcc
GIT binary patch
literal 2403
zcmZSn%*&NH<x)&C0~D|_FfceUFfbG^WME)OVPJ@2U`SzPNMT~gVPwc<Vu)g5V65b0
zNM&YVOl4t+Vr2-=6K7yaWn;+ZVkoj@U}R)WWd{l8F)~D?vN9AGfps%8<Zv+Laxz45
zGBBpFFtji*L~${su!0%f3@L121`k7?Hdr+~ST!$06fXl~3I|w@iy?&*%;087;Q}*w
z7*e<yf;D(RP7PsTU<k?2&nZ?&%P&$WN=;13%u82D%u7)yFUl+du>-u_bv^yu{1x;S
zd|g8vT^vIk70NS9GV)7H6p|B*GV{{85|cojl8jV^)V$<;kO_L3|NsC0uffQ`z)-@*
zz`ziYSX7)^1mSZsFfh2M=A{-TmgE;DgOq?U69WT-Gsr~(AUzBW%?u1#j0`ml49$!T
z!C;Mk8Xz@6pujHSU|?V<0GU}_0yUMLfq@~ZvLqEG08*j>B8rn37#Q>miZaU*OH%dA
z5{vZH@^eyBi;DHL3-z;$jm*sr3$u*O%M2~di*qW|%i~Q_OiT<63=Goq^h5LuG7EGw
z^NLFnb8>Xc6D>;vGxW<dQd4uFWI=X%W?ovpUO{DvFarYvDD2`3veV;1g7ILd@PqsV
zax?=Y*q_V{3=E*q0Q*x9;?EjzB57t~=$B-uWn?H}1pAzcp@tFU^I9f`@Dv7yz=#?q
zhG4M&{YpTgRiptjtAvGtfg!&jH4hRfp!5e06oh0!Vo62`C}=WL6G8q4vvX66ixbmR
z!65`D=oL)7=)oie3LsF3Ffa-+N-!pa!V2UuE?8o)Mh_%4hFT_2Ak{E|GFAx_LkcrP
z3JXIsBU2VLG|U(wA(q0x5Uc?T5=e-Zmw?iHZem_~PHKEwQGRYbRG<P9G&!kxnV=-2
z0SeO~keh-)0bK$z!7VYTI29apX*r1{C8>Gf01g5r!XS`S!O1Z<wInemu_O^3qF{nv
z!OF+LzyQjvsqo|{4hmP0M?m2U&O9X`MNXjnftvL|p$+mPJW19tFl2#~WC}cN8JMsp
zOmLC}>GcEqAC~pOA(mL2oS6yE`Kd)k`9;Mg;H*$uRFt2dSdyAroSayY3JyfDnv~S!
z{FGF1A`Sv20kBLE$Z0{G3=9n5Fb0Pxn4nXz27$s)78H=6#K6EP!6<~t#h@$&4l*m`
z1PTwb6jp|2CMF_sG{|VbAW$F%iGX}63L?Zn1Skq2;Q&$t2^)~D5HWDl8^EyPW?*1Y
z0)-7I`7<!`FtRc7&@cmo5=D7Z5UBhJ0wrYhoC+#`gFs0v2vmC@1rf-3C7^_qUs?iA
zJYa%eDF{@&X@Wutl$1bO(N6>9dT>b+AD@z+91kgkQgahCbM(MPcM&+I!757gGQrsb
z<S%eZA0H5DTmp)8zr@^BS5UqJ3x^byrh@Yq#F%tg)e0`Zz^OP06kS0e*93t=3LFLq
zf=;0UE+lMn^HWN5QtdzyS}X^u4w(d)m>F3ZxfppFxtQ1(1(-OQIazsF1eiEkIoSb3
Ci3(f*

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/util.py b/venv/lib/python2.7/site-packages/wheel/util.py
new file mode 100644
index 00000000..0afb54a4
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/util.py
@@ -0,0 +1,46 @@
+import base64
+import io
+import sys
+
+
+if sys.version_info[0] < 3:
+    text_type = unicode  # noqa: F821
+
+    StringIO = io.BytesIO
+
+    def native(s, encoding='utf-8'):
+        if isinstance(s, unicode):
+            return s.encode(encoding)
+        return s
+else:
+    text_type = str
+
+    StringIO = io.StringIO
+
+    def native(s, encoding='utf-8'):
+        if isinstance(s, bytes):
+            return s.decode(encoding)
+        return s
+
+
+def urlsafe_b64encode(data):
+    """urlsafe_b64encode without padding"""
+    return base64.urlsafe_b64encode(data).rstrip(b'=')
+
+
+def urlsafe_b64decode(data):
+    """urlsafe_b64decode without padding"""
+    pad = b'=' * (4 - (len(data) & 3))
+    return base64.urlsafe_b64decode(data + pad)
+
+
+def as_unicode(s):
+    if isinstance(s, bytes):
+        return s.decode('utf-8')
+    return s
+
+
+def as_bytes(s):
+    if isinstance(s, text_type):
+        return s.encode('utf-8')
+    return s
diff --git a/venv/lib/python2.7/site-packages/wheel/util.pyc b/venv/lib/python2.7/site-packages/wheel/util.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..19b0bb25fed036a2f87b08d394eafd614d123746
GIT binary patch
literal 2061
zcmZSn%*&NH<x)&C0~9bZFfceUFfbI)U|?WKVPHsMWXNG)h=Q{j8KM|r;!F%tObn?^
z3|Y(!DNGEKDa;Jn3=Bn~45=&(QLGH9j0{<93{mV1DJ%>rtPCxT3{e~mdD0B2oG@8-
zm@FGqHiey`g@GZ8iy?&r%;087;RG{y7*e>v3|^3ff;G4q7#K4D|NsBrFB9bMOlFXa
zSs54@N=wpoEs{Z=0AY}@Ge}B-fq|iffuV+hp@fm4nTerD2E@){VyIzcXl7&xu3=yZ
z)?j2{VDQrb=_%m?nO~flS6q^qmz-L{4l+3}GdVvcwS<j<fgv>y#MA&;Q3BFcT*3hp
z&CE;J067Uv6vs0#Fz6Q)WtJtDr0SO?7U`$u=cJ?-73*gg>Sq@lnVTCHW*M268CsYZ
z=TxSb$D5>>m>3us7^LUvhv*k%7U+VVkdvcZo@iMbn4w>uk(!zVB}+>(bMy)-!4Aqx
zEXgcO1%*m6$bAfq{EWPe6bC~P$Rj17U`?tlNi7E3l#&YfdJrh6f>;<B7{Hzd6ZG(L
z5XeO$plC(%D<~R37!)VqC>Mi7c@`rmrkfcVvY0?g2Nc=hcq>)}#c5Gaabj9(e3F?7
zBuW*^GfOh^OG^|A5>rw#^U}ewYYRyeAj^^xi&M=^N(8a#1qV-2aY<2T0XQj@fI=oE
zu_O^3Fkpf%p#w_0QlQWQ1qB0BGAvX;&H;yvCMah!g0d_mOEfbwq%bo$NQl%jg0crF
zS1^DwhB!E|K-$m)3z7)X11kuW2{J+I!TAvqYM?ZdlbRRA35pK1aDx~Fj*cK6kUU6n
zL1GFxtiS|a0*sG=fk7S=U?8V6Fi9|igA5dGAoqZS3}^X~f>eHh!rQMHlsLhq5ZM3V
zEEEJvIzga91e`Fy`3CGgFhLJLf(x|7;`mZXA*KrQEyz*Of&%1M5T=rUOTdwxT2T^T
zQdy811PYe{^EfC?CKkto3ova|Z)<=e9+EIYPRz_N0r|hUvbY447|T+NiZk=`;xqHo
z@`FHu69h`V;Htn0R2q8vgA4uOlA_GKbWeY9p#(9Yq$miK2ZO-I3otM+1PP&(k@Smo
skmqf3^HWN5Qtd!qC<c`aJd8YyJj}w3Y)qU?{H!37hmDh!lZ}%N0PU>5@Bjb+

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site-packages/wheel/wheelfile.py b/venv/lib/python2.7/site-packages/wheel/wheelfile.py
new file mode 100644
index 00000000..9a1c8d2a
--- /dev/null
+++ b/venv/lib/python2.7/site-packages/wheel/wheelfile.py
@@ -0,0 +1,168 @@
+from __future__ import print_function
+
+import csv
+import hashlib
+import os.path
+import re
+import time
+from collections import OrderedDict
+from distutils import log as logger
+from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile
+
+from wheel.cli import WheelError
+from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO
+
+# Non-greedy matching of an optional build number may be too clever (more
+# invalid wheel filenames will match). Separate regex for .dist-info?
+WHEEL_INFO_RE = re.compile(
+    r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.+?))(-(?P<build>\d[^-]*))?
+     -(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)\.whl$""",
+    re.VERBOSE)
+
+
+def get_zipinfo_datetime(timestamp=None):
+    # Some applications need reproducible .whl files, but they can't do this without forcing
+    # the timestamp of the individual ZipInfo objects. See issue #143.
+    timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time()))
+    return time.gmtime(timestamp)[0:6]
+
+
+class WheelFile(ZipFile):
+    """A ZipFile derivative class that also reads SHA-256 hashes from
+    .dist-info/RECORD and checks any read files against those.
+    """
+
+    _default_algorithm = hashlib.sha256
+
+    def __init__(self, file, mode='r'):
+        basename = os.path.basename(file)
+        self.parsed_filename = WHEEL_INFO_RE.match(basename)
+        if not basename.endswith('.whl') or self.parsed_filename is None:
+            raise WheelError("Bad wheel filename {!r}".format(basename))
+
+        ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True)
+
+        self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever'))
+        self.record_path = self.dist_info_path + '/RECORD'
+        self._file_hashes = OrderedDict()
+        self._file_sizes = {}
+        if mode == 'r':
+            # Ignore RECORD and any embedded wheel signatures
+            self._file_hashes[self.record_path] = None, None
+            self._file_hashes[self.record_path + '.jws'] = None, None
+            self._file_hashes[self.record_path + '.p7s'] = None, None
+
+            # Fill in the expected hashes by reading them from RECORD
+            try:
+                record = self.open(self.record_path)
+            except KeyError:
+                raise WheelError('Missing {} file'.format(self.record_path))
+
+            with record:
+                for line in record:
+                    line = line.decode('utf-8')
+                    path, hash_sum, size = line.rsplit(u',', 2)
+                    if hash_sum:
+                        algorithm, hash_sum = hash_sum.split(u'=')
+                        try:
+                            hashlib.new(algorithm)
+                        except ValueError:
+                            raise WheelError('Unsupported hash algorithm: {}'.format(algorithm))
+
+                        if algorithm.lower() in {'md5', 'sha1'}:
+                            raise WheelError(
+                                'Weak hash algorithm ({}) is not permitted by PEP 427'
+                                .format(algorithm))
+
+                        self._file_hashes[path] = (
+                            algorithm, urlsafe_b64decode(hash_sum.encode('ascii')))
+
+    def open(self, name_or_info, mode="r", pwd=None):
+        def _update_crc(newdata, eof=None):
+            if eof is None:
+                eof = ef._eof
+                update_crc_orig(newdata)
+            else:  # Python 2
+                update_crc_orig(newdata, eof)
+
+            running_hash.update(newdata)
+            if eof and running_hash.digest() != expected_hash:
+                raise WheelError("Hash mismatch for file '{}'".format(native(ef_name)))
+
+        ef = ZipFile.open(self, name_or_info, mode, pwd)
+        ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo)
+                             else name_or_info)
+        if mode == 'r' and not ef_name.endswith('/'):
+            if ef_name not in self._file_hashes:
+                raise WheelError("No hash found for file '{}'".format(native(ef_name)))
+
+            algorithm, expected_hash = self._file_hashes[ef_name]
+            if expected_hash is not None:
+                # Monkey patch the _update_crc method to also check for the hash from RECORD
+                running_hash = hashlib.new(algorithm)
+                update_crc_orig, ef._update_crc = ef._update_crc, _update_crc
+
+        return ef
+
+    def write_files(self, base_dir):
+        logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir)
+        deferred = []
+        for root, dirnames, filenames in os.walk(base_dir):
+            # Sort the directory names so that `os.walk` will walk them in a
+            # defined order on the next iteration.
+            dirnames.sort()
+            for name in sorted(filenames):
+                path = os.path.normpath(os.path.join(root, name))
+                if os.path.isfile(path):
+                    arcname = os.path.relpath(path, base_dir)
+                    if arcname == self.record_path:
+                        pass
+                    elif root.endswith('.dist-info'):
+                        deferred.append((path, arcname))
+                    else:
+                        self.write(path, arcname)
+
+        deferred.sort()
+        for path, arcname in deferred:
+            self.write(path, arcname)
+
+    def write(self, filename, arcname=None, compress_type=None):
+        with open(filename, 'rb') as f:
+            st = os.fstat(f.fileno())
+            data = f.read()
+
+        zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime))
+        zinfo.external_attr = st.st_mode << 16
+        zinfo.compress_type = ZIP_DEFLATED
+        self.writestr(zinfo, data, compress_type)
+
+    def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
+        ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type)
+        fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo)
+                 else zinfo_or_arcname)
+        logger.info("adding '%s'", fname)
+        if fname != self.record_path:
+            hash_ = self._default_algorithm(bytes)
+            self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest()))
+            self._file_sizes[fname] = len(bytes)
+
+    def close(self):
+        # Write RECORD
+        if self.fp is not None and self.mode == 'w' and self._file_hashes:
+            data = StringIO()
+            writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n')
+            writer.writerows((
+                (
+                    fname,
+                    algorithm + "=" + hash_,
+                    self._file_sizes[fname]
+                )
+                for fname, (algorithm, hash_) in self._file_hashes.items()
+            ))
+            writer.writerow((format(self.record_path), "", ""))
+            zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime())
+            zinfo.compress_type = ZIP_DEFLATED
+            zinfo.external_attr = 0o664 << 16
+            self.writestr(zinfo, as_bytes(data.getvalue()))
+
+        ZipFile.close(self)
diff --git a/venv/lib/python2.7/site-packages/wheel/wheelfile.pyc b/venv/lib/python2.7/site-packages/wheel/wheelfile.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..faa3f88dbf7998020054d2753e293c91206f2fed
GIT binary patch
literal 7456
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
X3NQ*V$}kBq>anmfF*EWo^RNQ|zP2zW

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/site.py b/venv/lib/python2.7/site.py
new file mode 100644
index 00000000..7969769c
--- /dev/null
+++ b/venv/lib/python2.7/site.py
@@ -0,0 +1,758 @@
+"""Append module search paths for third-party packages to sys.path.
+
+****************************************************************
+* This module is automatically imported during initialization. *
+****************************************************************
+
+In earlier versions of Python (up to 1.5a3), scripts or modules that
+needed to use site-specific modules would place ``import site''
+somewhere near the top of their code.  Because of the automatic
+import, this is no longer necessary (but code that does it still
+works).
+
+This will append site-specific paths to the module search path.  On
+Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
+appends lib/python<version>/site-packages as well as lib/site-python.
+It also supports the Debian convention of
+lib/python<version>/dist-packages.  On other platforms (mainly Mac and
+Windows), it uses just sys.prefix (and sys.exec_prefix, if different,
+but this is unlikely).  The resulting directories, if they exist, are
+appended to sys.path, and also inspected for path configuration files.
+
+FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
+Local addons go into /usr/local/lib/python<version>/site-packages
+(resp. /usr/local/lib/site-python), Debian addons install into
+/usr/{lib,share}/python<version>/dist-packages.
+
+A path configuration file is a file whose name has the form
+<package>.pth; its contents are additional directories (one per line)
+to be added to sys.path.  Non-existing directories (or
+non-directories) are never added to sys.path; no directory is added to
+sys.path more than once.  Blank lines and lines beginning with
+'#' are skipped. Lines starting with 'import' are executed.
+
+For example, suppose sys.prefix and sys.exec_prefix are set to
+/usr/local and there is a directory /usr/local/lib/python2.X/site-packages
+with three subdirectories, foo, bar and spam, and two path
+configuration files, foo.pth and bar.pth.  Assume foo.pth contains the
+following:
+
+  # foo package configuration
+  foo
+  bar
+  bletch
+
+and bar.pth contains:
+
+  # bar package configuration
+  bar
+
+Then the following directories are added to sys.path, in this order:
+
+  /usr/local/lib/python2.X/site-packages/bar
+  /usr/local/lib/python2.X/site-packages/foo
+
+Note that bletch is omitted because it doesn't exist; bar precedes foo
+because bar.pth comes alphabetically before foo.pth; and spam is
+omitted because it is not mentioned in either path configuration file.
+
+After these path manipulations, an attempt is made to import a module
+named sitecustomize, which can perform arbitrary additional
+site-specific customizations.  If this import fails with an
+ImportError exception, it is silently ignored.
+
+"""
+
+import sys
+import os
+try:
+    import __builtin__ as builtins
+except ImportError:
+    import builtins
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+# Prefixes for site-packages; add additional prefixes like /usr/local here
+PREFIXES = [sys.prefix, sys.exec_prefix]
+# Enable per user site-packages directory
+# set it to False to disable the feature or True to force the feature
+ENABLE_USER_SITE = None
+# for distutils.commands.install
+USER_SITE = None
+USER_BASE = None
+
+_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32
+_is_pypy = hasattr(sys, 'pypy_version_info')
+_is_jython = sys.platform[:4] == 'java'
+if _is_jython:
+    ModuleType = type(os)
+
+def makepath(*paths):
+    dir = os.path.join(*paths)
+    if _is_jython and (dir == '__classpath__' or
+                       dir.startswith('__pyclasspath__')):
+        return dir, dir
+    dir = os.path.abspath(dir)
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        if ((_is_jython and not isinstance(m, ModuleType)) or
+            hasattr(m, '__loader__')):
+            # only modules need the abspath in Jython. and don't mess
+            # with a PEP 302-supplied __file__
+            continue
+        f = getattr(m, '__file__', None)
+        if f is None:
+            continue
+        m.__file__ = os.path.abspath(f)
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+# XXX This should not be part of site.py, since it is needed even when
+# using the -S option for Python.  See http://www.python.org/sf/586680
+def addbuilddir():
+    """Append ./build/lib.<platform> in case we're running in the build dir
+    (especially for Guido :-)"""
+    from distutils.util import get_platform
+    s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
+    if hasattr(sys, 'gettotalrefcount'):
+        s += '-pydebug'
+    s = os.path.join(os.path.dirname(sys.path[-1]), s)
+    sys.path.append(s)
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            if line.startswith("import"):
+                exec(line)
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys_prefix, "local"), sys_prefix]
+    if exec_prefix != sys_prefix:
+        prefixes.append(os.path.join(exec_prefix, "local"))
+
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos') or _is_jython:
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif _is_pypy:
+                sitedirs = [os.path.join(prefix, 'site-packages')]
+            elif sys.platform == 'darwin' and prefix == sys_prefix:
+
+                if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python
+
+                    sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"),
+                                os.path.join(prefix, "Extras", "lib", "python")]
+
+                else: # any other Python distros on OSX work this way
+                    sitedirs = [os.path.join(prefix, "lib",
+                                             "python" + sys.version[:3], "site-packages")]
+
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python"),
+                            os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
+                lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
+                if (os.path.exists(lib64_dir) and
+                    os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]):
+                    if _is_64bit:
+                        sitedirs.insert(0, lib64_dir)
+                    else:
+                        sitedirs.append(lib64_dir)
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+                # Debian-specific dist-packages directories:
+                sitedirs.append(os.path.join(prefix, "local/lib",
+                                             "python" + sys.version[:3],
+                                             "dist-packages"))
+                if sys.version[0] == '2':
+                    sitedirs.append(os.path.join(prefix, "lib",
+                                                 "python" + sys.version[:3],
+                                                 "dist-packages"))
+                else:
+                    sitedirs.append(os.path.join(prefix, "lib",
+                                                 "python" + sys.version[0],
+                                                 "dist-packages"))
+                sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths)
+    return None
+
+def check_enableusersite():
+    """Check if user site directory is safe for inclusion
+
+    The function tests for the command line flag (including environment var),
+    process uid/gid equal to effective uid/gid.
+
+    None: Disabled for security reasons
+    False: Disabled by user (command line option)
+    True: Safe and enabled
+    """
+    if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False):
+        return False
+
+    if hasattr(os, "getuid") and hasattr(os, "geteuid"):
+        # check process uid == effective uid
+        if os.geteuid() != os.getuid():
+            return None
+    if hasattr(os, "getgid") and hasattr(os, "getegid"):
+        # check process gid == effective gid
+        if os.getegid() != os.getgid():
+            return None
+
+    return True
+
+def addusersitepackages(known_paths):
+    """Add a per user site-package to sys.path
+
+    Each user has its own python directory with site-packages in the
+    home directory.
+
+    USER_BASE is the root directory for all Python versions
+
+    USER_SITE is the user specific site-packages directory
+
+    USER_SITE/.. can be used for data.
+    """
+    global USER_BASE, USER_SITE, ENABLE_USER_SITE
+    env_base = os.environ.get("PYTHONUSERBASE", None)
+
+    def joinuser(*args):
+        return os.path.expanduser(os.path.join(*args))
+
+    #if sys.platform in ('os2emx', 'riscos'):
+    #    # Don't know what to put here
+    #    USER_BASE = ''
+    #    USER_SITE = ''
+    if os.name == "nt":
+        base = os.environ.get("APPDATA") or "~"
+        if env_base:
+            USER_BASE = env_base
+        else:
+            USER_BASE = joinuser(base, "Python")
+        USER_SITE = os.path.join(USER_BASE,
+                                 "Python" + sys.version[0] + sys.version[2],
+                                 "site-packages")
+    else:
+        if env_base:
+            USER_BASE = env_base
+        else:
+            USER_BASE = joinuser("~", ".local")
+        USER_SITE = os.path.join(USER_BASE, "lib",
+                                 "python" + sys.version[:3],
+                                 "site-packages")
+
+    if ENABLE_USER_SITE and os.path.isdir(USER_SITE):
+        addsitedir(USER_SITE, known_paths)
+    if ENABLE_USER_SITE:
+        for dist_libdir in ("lib", "local/lib"):
+            user_site = os.path.join(USER_BASE, dist_libdir,
+                                     "python" + sys.version[:3],
+                                     "dist-packages")
+            if os.path.isdir(user_site):
+                addsitedir(user_site, known_paths)
+    return known_paths
+
+
+
+def setBEGINLIBPATH():
+    """The OS/2 EMX port has optional extension modules that do double duty
+    as DLLs (and must use the .DLL file extension) for other extensions.
+    The library search path needs to be amended so these will be found
+    during module import.  Use BEGINLIBPATH so that these are at the start
+    of the library search path.
+
+    """
+    dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
+    libpath = os.environ['BEGINLIBPATH'].split(';')
+    if libpath[-1]:
+        libpath.append(dllpath)
+    else:
+        libpath[-1] = dllpath
+    os.environ['BEGINLIBPATH'] = ';'.join(libpath)
+
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        eof = 'Cmd-Q'
+    elif os.sep == '\\':
+        eof = 'Ctrl-Z plus Return'
+    else:
+        eof = 'Ctrl-D (i.e. EOF)'
+
+    class Quitter(object):
+        def __init__(self, name):
+            self.name = name
+        def __repr__(self):
+            return 'Use %s() or %s to exit' % (self.name, eof)
+        def __call__(self, code=None):
+            # Shells like IDLE catch the SystemExit, but listen when their
+            # stdin wrapper is closed.
+            try:
+                sys.stdin.close()
+            except:
+                pass
+            raise SystemExit(code)
+    builtins.quit = Quitter('quit')
+    builtins.exit = Quitter('exit')
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = open(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print(self.__lines[i])
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    try:
+                        key = raw_input(prompt)
+                    except NameError:
+                        key = input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    builtins.copyright = _Printer("copyright", sys.copyright)
+    if _is_jython:
+        builtins.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    elif _is_pypy:
+        builtins.credits = _Printer(
+            "credits",
+            "PyPy is maintained by the PyPy developers: http://pypy.org/")
+    else:
+        builtins.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    builtins.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    builtins.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def virtual_install_main_packages():
+    f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt'))
+    sys.real_prefix = f.read().strip()
+    f.close()
+    pos = 2
+    hardcoded_relative_dirs = []
+    if sys.path[0] == '':
+        pos += 1
+    if _is_jython:
+        paths = [os.path.join(sys.real_prefix, 'Lib')]
+    elif _is_pypy:
+        if sys.version_info > (3, 2):
+            cpyver = '%d' % sys.version_info[0]
+        elif sys.pypy_version_info >= (1, 5):
+            cpyver = '%d.%d' % sys.version_info[:2]
+        else:
+            cpyver = '%d.%d.%d' % sys.version_info[:3]
+        paths = [os.path.join(sys.real_prefix, 'lib_pypy'),
+                 os.path.join(sys.real_prefix, 'lib-python', cpyver)]
+        if sys.pypy_version_info < (1, 9):
+            paths.insert(1, os.path.join(sys.real_prefix,
+                                         'lib-python', 'modified-%s' % cpyver))
+        hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
+        #
+        # This is hardcoded in the Python executable, but relative to sys.prefix:
+        for path in paths[:]:
+            plat_path = os.path.join(path, 'plat-%s' % sys.platform)
+            if os.path.exists(plat_path):
+                paths.append(plat_path)
+    elif sys.platform == 'win32':
+        paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')]
+    else:
+        paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])]
+        hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
+        lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3])
+        if os.path.exists(lib64_path):
+            if _is_64bit:
+                paths.insert(0, lib64_path)
+            else:
+                paths.append(lib64_path)
+        # This is hardcoded in the Python executable, but relative to
+        # sys.prefix.  Debian change: we need to add the multiarch triplet
+        # here, which is where the real stuff lives.  As per PEP 421, in
+        # Python 3.3+, this lives in sys.implementation, while in Python 2.7
+        # it lives in sys.
+        try:
+            arch = getattr(sys, 'implementation', sys)._multiarch
+        except AttributeError:
+            # This is a non-multiarch aware Python.  Fallback to the old way.
+            arch = sys.platform
+        plat_path = os.path.join(sys.real_prefix, 'lib',
+                                 'python'+sys.version[:3],
+                                 'plat-%s' % arch)
+        if os.path.exists(plat_path):
+            paths.append(plat_path)
+    # This is hardcoded in the Python executable, but
+    # relative to sys.prefix, so we have to fix up:
+    for path in list(paths):
+        tk_dir = os.path.join(path, 'lib-tk')
+        if os.path.exists(tk_dir):
+            paths.append(tk_dir)
+
+    # These are hardcoded in the Apple's Python executable,
+    # but relative to sys.prefix, so we have to fix them up:
+    if sys.platform == 'darwin':
+        hardcoded_paths = [os.path.join(relative_dir, module)
+                           for relative_dir in hardcoded_relative_dirs
+                           for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')]
+
+        for path in hardcoded_paths:
+            if os.path.exists(path):
+                paths.append(path)
+
+    sys.path.extend(paths)
+
+def force_global_eggs_after_local_site_packages():
+    """
+    Force easy_installed eggs in the global environment to get placed
+    in sys.path after all packages inside the virtualenv.  This
+    maintains the "least surprise" result that packages in the
+    virtualenv always mask global packages, never the other way
+    around.
+
+    """
+    egginsert = getattr(sys, '__egginsert', 0)
+    for i, path in enumerate(sys.path):
+        if i > egginsert and path.startswith(sys.prefix):
+            egginsert = i
+    sys.__egginsert = egginsert + 1
+
+def virtual_addsitepackages(known_paths):
+    force_global_eggs_after_local_site_packages()
+    return addsitepackages(known_paths, sys_prefix=sys.real_prefix)
+
+def fixclasspath():
+    """Adjust the special classpath sys.path entries for Jython. These
+    entries should follow the base virtualenv lib directories.
+    """
+    paths = []
+    classpaths = []
+    for path in sys.path:
+        if path == '__classpath__' or path.startswith('__pyclasspath__'):
+            classpaths.append(path)
+        else:
+            paths.append(path)
+    sys.path = paths
+    sys.path.extend(classpaths)
+
+def execusercustomize():
+    """Run custom user specific code, if available."""
+    try:
+        import usercustomize
+    except ImportError:
+        pass
+
+
+def main():
+    global ENABLE_USER_SITE
+    virtual_install_main_packages()
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if (os.name == "posix" and sys.path and
+        os.path.basename(sys.path[-1]) == "Modules"):
+        addbuilddir()
+    if _is_jython:
+        fixclasspath()
+    GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt'))
+    if not GLOBAL_SITE_PACKAGES:
+        ENABLE_USER_SITE = False
+    if ENABLE_USER_SITE is None:
+        ENABLE_USER_SITE = check_enableusersite()
+    paths_in_sys = addsitepackages(paths_in_sys)
+    paths_in_sys = addusersitepackages(paths_in_sys)
+    if GLOBAL_SITE_PACKAGES:
+        paths_in_sys = virtual_addsitepackages(paths_in_sys)
+    if sys.platform == 'os2emx':
+        setBEGINLIBPATH()
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    if ENABLE_USER_SITE:
+        execusercustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+
+main()
+
+def _script():
+    help = """\
+    %s [--user-base] [--user-site]
+
+    Without arguments print some useful information
+    With arguments print the value of USER_BASE and/or USER_SITE separated
+    by '%s'.
+
+    Exit codes with --user-base or --user-site:
+      0 - user site directory is enabled
+      1 - user site directory is disabled by user
+      2 - uses site directory is disabled by super user
+          or for security reasons
+     >2 - unknown error
+    """
+    args = sys.argv[1:]
+    if not args:
+        print("sys.path = [")
+        for dir in sys.path:
+            print("    %r," % (dir,))
+        print("]")
+        def exists(path):
+            if os.path.isdir(path):
+                return "exists"
+            else:
+                return "doesn't exist"
+        print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE)))
+        print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE)))
+        print("ENABLE_USER_SITE: %r" %  ENABLE_USER_SITE)
+        sys.exit(0)
+
+    buffer = []
+    if '--user-base' in args:
+        buffer.append(USER_BASE)
+    if '--user-site' in args:
+        buffer.append(USER_SITE)
+
+    if buffer:
+        print(os.pathsep.join(buffer))
+        if ENABLE_USER_SITE:
+            sys.exit(0)
+        elif ENABLE_USER_SITE is False:
+            sys.exit(1)
+        elif ENABLE_USER_SITE is None:
+            sys.exit(2)
+        else:
+            sys.exit(3)
+    else:
+        import textwrap
+        print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
+        sys.exit(10)
+
+if __name__ == '__main__':
+    _script()
diff --git a/venv/lib/python2.7/site.pyc b/venv/lib/python2.7/site.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1fe510c81b824446df13e791695058817c905543
GIT binary patch
literal 24823
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/sre.py b/venv/lib/python2.7/sre.py
new file mode 120000
index 00000000..f329d6c2
--- /dev/null
+++ b/venv/lib/python2.7/sre.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/sre_compile.py b/venv/lib/python2.7/sre_compile.py
new file mode 120000
index 00000000..0640263a
--- /dev/null
+++ b/venv/lib/python2.7/sre_compile.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_compile.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/sre_constants.py b/venv/lib/python2.7/sre_constants.py
new file mode 120000
index 00000000..854a155b
--- /dev/null
+++ b/venv/lib/python2.7/sre_constants.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_constants.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/sre_parse.py b/venv/lib/python2.7/sre_parse.py
new file mode 120000
index 00000000..c0de5896
--- /dev/null
+++ b/venv/lib/python2.7/sre_parse.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_parse.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/stat.py b/venv/lib/python2.7/stat.py
new file mode 120000
index 00000000..19d1f391
--- /dev/null
+++ b/venv/lib/python2.7/stat.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/stat.pyc b/venv/lib/python2.7/stat.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f460066c2bfbab5742f10362afe5f23192776ae0
GIT binary patch
literal 2991
zcmZSn%**vS=vh=U0~9baFfceUFfbHXGcquwFfc?hFr+XtL@_d?Ffl|iF{CgvL@_g@
zurNfiFr=_DM6oiYurWljF{H3FM6olZa4<x1Fr;uYL~$~ta4|%2F{E%av@kG4aWkaw
zfEhdtDZC6(ybLLP3{iXxDf|pk{0u1q3{e6MDS`}9f($7_3{gT1DZ&g<!VD=QU@amH
zDWYJ8C_{=Em?6fHA`WJVGo(m>84?UBl3<1;Ly8obA;pj)%@8HckRrnnCBu*^!w@CQ
zkRr<vCC88=#}FmYkRs0zrNEG)z!0U#kfO*Cr34mN28*kJ#Z?(nlo+Da7*doOqSP5u
zR2ZT(z+Te?ds7SSeQj`n=zs%97fkAbMfAb424MAuV7*3QbBw{BHDO3mWr#9mNKs>m
zGGj<lXNWRqNYP-3vS3KjWQek4NYP>l*3bq;LOufngL8gfaY<rcNwI!fX<l+kW`16=
zLRx;2LS|k`YEeN^YDs2Zx<XNEacNFTu|j^DLVmGcaY<r{hNePdUJ8hp1L5j%aRryA
zr>7Q|q^2m87AK~sS}CLz<>xAZq!luA3-XIf6tuW9K?xxflngSN7#J8bnLz{#h+qW~
zY#@RiL~wuzP6h^sWRPMI2B~)jIU6KZ15P*&!5Sb@zs&#q3=A3|qcuP(OF#zZ=BK1W
zgh1lOCJYP=`k}?CMaB9_`GuMKsYQv!sYUu_sd;7kNtt>2dV2afnMwKul_eSZc}9BX
z`XG1f6;zghToWAc>Fe*}Dhje4WFZ41QLbY6fb6OukUOa1B2XX&$9uZ@hDabBlnKgL
znG6aH44DiGAff?82!MzMAmRYFkQ88GU?^c=s9|7eW@IQ~WXNV>2nL6sA2?itKz@Y<
zfSZeF5Lk|C{(y#TFvwtpM=(Q{Bv(3n(8!g}9zozt0}2yt@lTQ~oqW7$6P8Xs-g;CE
z%OF>G+PE^v)!mS4uJm;Cr>-kO<x6n9XRw>6n?I=7D5gr3`}ol)%6<I2%_$B{sGr?}
z{hg`oOsL7hAd{^S?#yK102NCtAc6@*FfuS?Hh>C!Q2QYB0ElY=;wpd$Q0B^HU|?j(
zWME(d5iB4=07NJ-_-TO51(#Ft@hSPq@$q1Ga7a9;&@KTNmm%?<e*Q3~i)&a3*jXX*
zem<Ul-Z1e{PZt=|-O~kTNU&#=D@?g#h^H@{<BQC3262KwwGX(|3<6bbL7+M<2vp1k
zfoifKZUzR1AYKr`4<bOdR1nB@K_JHjae>5mKm;F%0C^eWgm}+jkjp^kfRZKLY4NUp
zZoVOKHDMtUFm{luqYK2z@t)y9o*}L<3D*c$XBayuJR%g%4h;^1vBQzr5lHNy@CbL9
znjrU}02n(Qi5-E&4hoO(hp7qj5AlGp!;#n#AT}s$Lfzv1{9QtQ14=+45b751>FXOB
z;^^e#S^|}J3<z-bbAj>v0~`ZGT}wbA3f3A5iAYf3hPuT&`}+n2xdsQj!qt0ty12Od
zfz=1Q#XAN$dw7Pqx_~VUMz;*40Ad-)_+XIBpvFV_!G4Yb!5;o0h{_zyBEO9RihrBj
w{FKt1R69_rC@x}PU|?fmW5j?goXnhTD54+{W=<GnMUlhQ4-vs;G9w!!0MFAZE&u=k

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/types.py b/venv/lib/python2.7/types.py
new file mode 120000
index 00000000..4304f96f
--- /dev/null
+++ b/venv/lib/python2.7/types.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/types.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/types.pyc b/venv/lib/python2.7/types.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1e6ac94187571592a3b8a902f180c2e774073d58
GIT binary patch
literal 2893
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

literal 0
HcmV?d00001

diff --git a/venv/lib/python2.7/warnings.py b/venv/lib/python2.7/warnings.py
new file mode 120000
index 00000000..30f2d654
--- /dev/null
+++ b/venv/lib/python2.7/warnings.py
@@ -0,0 +1 @@
+/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/warnings.py
\ No newline at end of file
diff --git a/venv/lib/python2.7/warnings.pyc b/venv/lib/python2.7/warnings.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7d37943b17c1329ff79e5a85dd50ee9fd703713e
GIT binary patch
literal 14062
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

literal 0
HcmV?d00001

diff --git a/venv/pip-selfcheck.json b/venv/pip-selfcheck.json
new file mode 100644
index 00000000..aedfd865
--- /dev/null
+++ b/venv/pip-selfcheck.json
@@ -0,0 +1 @@
+{"last_check":"2019-05-08T08:33:39Z","pypi_version":"19.1.1"}
\ No newline at end of file
-- 
GitLab